Skip to content

4.1.1 Bật Spring Data Cassandra

Để bắt đầu sử dụng Spring Data Cassandra, bạn cần thêm phần phụ thuộc starter của Spring Boot dành cho Spring Data Cassandra không reactive. Thực tế có hai phần phụ thuộc starter khác nhau dành cho Spring Data Cassandra để bạn lựa chọn: một dành cho xử lý dữ liệu reactive và một dành cho xử lý dữ liệu tiêu chuẩn (không reactive).

Chúng ta sẽ bàn thêm về việc viết repository reactive trong chương 15. Còn bây giờ, chúng ta sẽ sử dụng starter không reactive trong phần cấu hình build như sau:

html
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>

Phần phụ thuộc này cũng có thể được thêm vào bằng cách sử dụng Spring Initializr và tích chọn ô Cassandra.

Điều quan trọng là bạn cần hiểu rằng phần phụ thuộc này sẽ thay thế cho phần phụ thuộc starter Spring Data JPA hoặc Spring Data JDBC mà chúng ta đã dùng trong chương trước. Thay vì lưu trữ dữ liệu Taco Cloud vào một cơ sở dữ liệu quan hệ bằng JPA hoặc JDBC, giờ đây bạn sẽ dùng Spring Data để lưu trữ dữ liệu vào cơ sở dữ liệu Cassandra. Do đó, bạn nên xóa các phần phụ thuộc starter của Spring Data JPA hoặc JDBC và các phần phụ thuộc cơ sở dữ liệu quan hệ (như trình điều khiển JDBC hoặc phụ thuộc H2) khỏi file build.

Phần phụ thuộc starter của Spring Data Cassandra sẽ mang theo một số thư viện cần thiết, đặc biệt là thư viện Spring Data Cassandra. Do Spring Data Cassandra đã có mặt trong classpath tại thời điểm runtime, nên cơ chế cấu hình tự động (autoconfiguration) sẽ được kích hoạt để tạo các repository Cassandra. Điều này có nghĩa là bạn có thể bắt đầu viết repository Cassandra với rất ít cấu hình tường minh.

Cassandra hoạt động như một cụm (cluster) các node kết hợp lại để tạo thành một hệ thống cơ sở dữ liệu hoàn chỉnh. Nếu bạn chưa có một cụm Cassandra để làm việc, bạn có thể khởi động một cụm đơn-node phục vụ mục đích phát triển bằng Docker như sau:

bash
$ docker network create cassandra-net
$ docker run --name my-cassandra \
      --network cassandra-net \
      -p 9042:9042 \
      -d cassandra:latest

Lệnh này sẽ khởi động cụm đơn-node và mở cổng của node (9042) ra bên ngoài máy host để ứng dụng của bạn có thể truy cập.

Tuy nhiên, bạn sẽ cần cấu hình một vài thiết lập nhỏ. Ít nhất, bạn cần chỉ định tên của một keyspace mà trong đó các repository của bạn sẽ hoạt động. Để làm được điều đó, bạn cần tạo một keyspace.

Trong Cassandra, một keyspace là một nhóm các bảng trong một node Cassandra. Nó tương tự như cách các bảng, view và ràng buộc được nhóm lại trong cơ sở dữ liệu quan hệ.

Mặc dù bạn có thể cấu hình Spring Data Cassandra để tự động tạo keyspace, nhưng cách đơn giản hơn là tự tạo bằng tay (hoặc dùng một keyspace đã có sẵn). Sử dụng CQL shell (Cassandra Query Language), bạn có thể tạo một keyspace cho ứng dụng Taco Cloud. Bạn có thể khởi động CQL shell bằng Docker như sau:

bash
docker run -it --network cassandra-net --rm cassandra cqlsh my-cassandra

Nếu lệnh này không khởi động được CQL shell và hiển thị lỗi “Unable to connect to any servers,” hãy chờ một đến hai phút rồi thử lại. Bạn cần đảm bảo rằng cụm Cassandra đã hoàn toàn khởi động trước khi CQL shell có thể kết nối.

Khi shell đã sẵn sàng, sử dụng lệnh CREATE KEYSPACE như sau:

bash
cqlsh> create keyspace tacocloud
    ... with replication={'class':'SimpleStrategy', 'replication_factor':1}
    ... and durable_writes=true;

Nói một cách đơn giản, lệnh trên sẽ tạo một keyspace tên là tacocloud với chế độ nhân bản đơn giản (simple replication) và ghi bền vững (durable writes). Khi đặt hệ số nhân bản (replication factor) là 1, bạn yêu cầu Cassandra lưu một bản sao của mỗi hàng dữ liệu. Chiến lược nhân bản (replication strategy) quyết định cách việc nhân bản được xử lý. Chiến lược SimpleStrategy phù hợp với môi trường sử dụng đơn trung tâm dữ liệu (single data center) hoặc mã ví dụ, nhưng bạn có thể cân nhắc sử dụng NetworkTopologyStrategy nếu cụm Cassandra của bạn được triển khai trên nhiều trung tâm dữ liệu. Tôi khuyên bạn nên tham khảo tài liệu chính thức của Cassandra tại http://cassandra.apache.org/doc/latest/ để hiểu rõ hơn về cách hoạt động của các chiến lược nhân bản và các cách tạo keyspace khác.

Giờ bạn đã tạo xong keyspace, hãy cấu hình thuộc tính spring.data.cassandra.keyspace-name để Spring Data Cassandra biết sử dụng keyspace đó, như sau:

yaml
spring:
  data:
    cassandra:
      keyspace-name: taco_cloud
      schema-action: recreate
      local-datacenter: datacenter1

Ở đây, bạn cũng đặt spring.data.cassandra.schema-actionrecreate. Thiết lập này rất hữu ích trong môi trường phát triển vì nó đảm bảo rằng mọi bảng và kiểu dữ liệu do người dùng định nghĩa sẽ bị xóa và tạo lại mỗi khi ứng dụng khởi động. Giá trị mặc định là none, không thực hiện hành động nào với lược đồ cơ sở dữ liệu và thường được dùng trong môi trường production nơi bạn không muốn xóa tất cả bảng khi ứng dụng khởi động lại.

Cuối cùng, thuộc tính spring.data.cassandra.local-datacenter xác định tên của data center cục bộ, dùng để thiết lập chính sách cân bằng tải của Cassandra. Trong cấu hình node đơn, giá trị "datacenter1" là giá trị nên dùng. Để biết thêm thông tin về chính sách cân bằng tải của Cassandra và cách cấu hình local datacenter, hãy xem tài liệu của trình điều khiển Cassandra từ DataStax: http://mng.bz/XrQM.

Đây là những thuộc tính duy nhất bạn cần thiết lập để làm việc với Cassandra đang chạy cục bộ. Tuy nhiên, tùy vào cấu hình cụm Cassandra của bạn, bạn có thể cần thêm một số thiết lập khác.

Theo mặc định, Spring Data Cassandra giả định rằng Cassandra đang chạy cục bộ và lắng nghe tại cổng 9042. Nếu không phải vậy (ví dụ như trong môi trường production), bạn nên thiết lập thêm spring.data.cassandra.contact-pointsspring.data.cassandra.port như sau:

yaml
spring:
  data:
    cassandra:
      keyspace-name: tacocloud
      local-datacenter: datacenter1
      contact-points:
      - casshost-1.tacocloud.com
      - casshost-2.tacocloud.com
      - casshost-3.tacocloud.com
      port: 9043

Lưu ý rằng spring.data.cassandra.contact-points là nơi bạn khai báo tên host của các node Cassandra. Mỗi "contact point" là một host nơi có một node Cassandra đang chạy. Mặc định là localhost, nhưng bạn có thể chỉ định danh sách các hostname. Spring sẽ thử từng contact point cho đến khi kết nối thành công. Điều này giúp loại bỏ điểm lỗi đơn lẻ và đảm bảo ứng dụng luôn có thể kết nối đến cụm Cassandra thông qua ít nhất một trong các contact point đó.

Bạn cũng có thể cần cấu hình tên người dùng và mật khẩu để kết nối đến cụm Cassandra. Việc này được thực hiện thông qua các thuộc tính sau:

yaml
spring:
  data:
    cassandra:
      ...
      username: tacocloud
      password: s3cr3tP455w0rd

Đây là những thiết lập cơ bản để làm việc với Cassandra cục bộ. Tuy nhiên, nếu cấu hình của bạn phức tạp hơn, bạn có thể cần thêm các thuộc tính khác.

Giờ đây, khi Spring Data Cassandra đã được kích hoạt và cấu hình trong dự án của bạn, bạn gần như đã sẵn sàng để ánh xạ các kiểu miền (domain types) của mình vào các bảng Cassandra và viết repository. Nhưng trước tiên, hãy cùng xem qua một vài khái niệm cơ bản về mô hình dữ liệu trong Cassandra.

Released under the MIT License.