4.1 Mô tả

Apache Cassandra là một hệ thống quản lý cơ sở dữ liệu phân tán thuộc lớp hệ thống NoSQL và được thiết kế để tạo ra các kho lưu trữ mảng dữ liệu khổng lồ có khả năng mở rộng và đáng tin cậy cao được trình bày dưới dạng hàm băm.

Ban đầu, dự án được phát triển trong lòng Facebook và vào năm 2009 được chuyển giao dưới sự bảo trợ của Quỹ phần mềm Apache, tổ chức này tiếp tục phát triển dự án. Các giải pháp công nghiệp dựa trên Cassandra được triển khai để cung cấp dịch vụ cho các công ty như Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter và Spotify. Đến năm 2011, cụm máy chủ lớn nhất phục vụ một cơ sở dữ liệu dưới tên Cassandra có hơn 400 máy và chứa hơn 300 TB dữ liệu.

Được viết bằng ngôn ngữ Java , nó triển khai một hệ thống băm phân tán tương tự như DynamoDB, cung cấp khả năng mở rộng gần như tuyến tính với khối lượng dữ liệu ngày càng tăng. Nó sử dụng mô hình lưu trữ dữ liệu dựa trên một họ cột, khác với các hệ thống như MemcacheDB, chỉ lưu trữ dữ liệu trong một cặp khóa-giá trị, bởi khả năng lưu trữ các giá trị băm với nhiều cấp độ lồng nhau.

Thuộc loại DBMS chịu lỗi: dữ liệu được đặt trong cơ sở dữ liệu được tự động sao chép tới một số nút của mạng phân tán hoặc thậm chí được phân phối đồng đều trong một số trung tâm dữ liệu. Khi một nút bị lỗi, các chức năng của nó sẽ được các nút khác chọn nhanh chóng, việc thêm các nút mới vào cụm và cập nhật phiên bản Cassandra được thực hiện nhanh chóng mà không cần can thiệp thủ công bổ sung và cấu hình lại các nút khác.

Tuy nhiên, bạn nên tạo lại các khóa (nhãn) cho mỗi nút, kể cả các nút hiện có, để duy trì chất lượng cân bằng tải. Có thể tránh tạo khóa cho các nút hiện có trong trường hợp số lượng nút tăng lên nhiều lần (2 lần, 3 lần, v.v.).

4.2 Mô hình dữ liệu

Theo thuật ngữ Cassandra, một ứng dụng hoạt động với một không gian khóa, tương ứng với khái niệm lược đồ cơ sở dữ liệu trong mô hình quan hệ. Không gian khóa này có thể chứa một số họ cột, tương ứng với khái niệm bảng quan hệ.

Đổi lại, các họ cột chứa các cột (column), được kết hợp bằng cách sử dụng khóa (phím hàng) trong bản ghi (hàng). Cột bao gồm ba phần: tên (tên cột), dấu thời gian (timestamp) và giá trị (value). Các cột trong một bản ghi được sắp xếp theo thứ tự. Không giống như cơ sở dữ liệu quan hệ, không có giới hạn nào về việc bản ghi (và về mặt cơ sở dữ liệu, đây là các hàng) có chứa các cột có cùng tên như trong các bản ghi khác hay không - không.

Các họ cột có thể có nhiều loại, nhưng trong bài viết này, chúng tôi sẽ bỏ qua chi tiết này. Ngoài ra, trong các phiên bản mới nhất của Cassandra, có thể thực hiện các truy vấn để xác định và thay đổi dữ liệu (DDL, DML) bằng ngôn ngữ CQL, cũng như tạo các chỉ mục phụ.

Giá trị cụ thể được lưu trữ trong cassandra được xác định bởi:

  • keyspace là một ràng buộc với ứng dụng (miền). Cho phép bạn lưu trữ dữ liệu từ các ứng dụng khác nhau trên cùng một cụm;
  • một họ cột là một ràng buộc đối với một truy vấn;
  • khóa là một liên kết với một nút cụm. Khóa xác định các cột đã lưu sẽ kết thúc trên các nút nào;
  • tên cột là một ràng buộc với một thuộc tính trong bản ghi. Cho phép bạn lưu trữ nhiều giá trị trong một lần nhập.

Mỗi giá trị được liên kết với một dấu thời gian, một số do người dùng chỉ định được sử dụng để giải quyết xung đột trong quá trình ghi: số càng lớn, cột mới được xem xét và khi được so sánh, nó sẽ ghi đè lên các cột cũ.

4.3 Các kiểu dữ liệu

Theo kiểu dữ liệu: keyspace và column family là các chuỗi (tên); dấu thời gian là một số 64 bit; và khóa, tên cột và giá trị cột là một mảng byte. Cassandra cũng có khái niệm về kiểu dữ liệu. Các loại này có thể được chỉ định (tùy chọn) bởi nhà phát triển khi tạo một họ cột.

Đối với tên cột, đây được gọi là bộ so sánh, đối với giá trị và khóa, nó được gọi là trình xác thực. Cái đầu tiên xác định giá trị byte nào được phép cho tên cột và cách sắp xếp chúng. Thứ hai là giá trị byte nào có giá trị đối với giá trị cột và khóa.

Nếu các loại dữ liệu này không được đặt, thì cassandra sẽ lưu trữ các giá trị và so sánh chúng dưới dạng chuỗi byte (BytesType) vì trên thực tế, chúng được lưu trữ nội bộ.

Các kiểu dữ liệu là:

  • BytesType : bất kỳ chuỗi byte nào (không xác thực)
  • AsciiType : chuỗi ASCII
  • UTF8Type : chuỗi UTF-8
  • IntegerType : số có kích thước tùy ý
  • Int32Type : số 4 byte
  • LongType : số 8 byte
  • UUIDType : UUID loại 1 hoặc 4
  • TimeUUIDType : Loại 1 UUID
  • DateType : giá trị dấu thời gian 8 byte
  • BooleanType : hai giá trị: true = 1 hoặc false = 0
  • FloatType : số dấu phẩy động 4 byte
  • DoubleType : số dấu phẩy động 8 byte
  • DecimalType : một số có kích thước tùy ý và dấu phẩy động
  • CounterColumnType : bộ đếm 8 byte

Trong cassandra, tất cả các thao tác ghi dữ liệu luôn là thao tác ghi lại, nghĩa là, nếu một cột có cùng khóa và tên đã tồn tại thuộc họ cột và dấu thời gian lớn hơn dấu thời gian được lưu, thì giá trị sẽ bị ghi đè . Các giá trị được ghi không bao giờ thay đổi, chỉ là các cột mới hơn có giá trị mới.

Viết cho cassandra nhanh hơn đọc. Điều này thay đổi cách tiếp cận được thực hiện trong thiết kế. Nếu chúng ta xem xét cassandra từ quan điểm thiết kế một mô hình dữ liệu, thì sẽ dễ dàng hình dung một họ cột không phải là một bảng mà là một dạng xem cụ thể hóa - một cấu trúc biểu thị dữ liệu của một truy vấn phức tạp nào đó, nhưng lưu trữ nó trên đó đĩa.

Thay vì cố gắng sắp xếp dữ liệu theo một cách nào đó bằng cách sử dụng các truy vấn, tốt hơn là cố gắng lưu trữ mọi thứ có thể cần cho truy vấn này trong họ mục tiêu. Nghĩa là, cần phải tiếp cận không phải từ khía cạnh quan hệ giữa các thực thể hoặc quan hệ giữa các đối tượng, mà từ khía cạnh truy vấn: trường nào được yêu cầu chọn; hồ sơ nên đi theo thứ tự nào; dữ liệu nào liên quan đến dữ liệu chính nên được yêu cầu cùng nhau - tất cả dữ liệu này đã được lưu trữ trong họ cột.

Số cột trong một bản ghi về mặt lý thuyết được giới hạn ở mức 2 tỷ. Đây là một sự lạc đề ngắn và bạn có thể tìm thêm chi tiết trong bài viết về kỹ thuật thiết kế và tối ưu hóa. Và bây giờ chúng ta hãy đi sâu vào quá trình lưu dữ liệu vào cassandra và đọc nó.