2015-12-11 19 views
9

Tôi mới ở Cassandra và tôi đã đọc rằng Cassandra khuyến khích việc không chuẩn hóa và sao chép dữ liệu. Điều này khiến tôi bối rối một chút. Chúng ta hãy tưởng tượng các tình huống sau:Làm thế nào để đảm bảo tính nhất quán dữ liệu trong Cassandra trên các bảng khác nhau?

Tôi có một keyspace với bốn bảng: A, B, C và D.

CREATE TABLE A ( tableID int, column1 int, column2 varchar, column3 varchar, column4 varchar, column5 varchar, PRIMARY KEY (column1, tableID) );

Chúng ta hãy tưởng tượng rằng các bảng khác (B, C, D) có cấu trúc giống nhau và cùng một dữ liệu mà bảng A, chỉ với một khóa chính khác, để trả lời các truy vấn khác.

Nếu tôi nâng cấp một hàng trong bảng A làm thế nào tôi có thể đảm bảo tính nhất quán của dữ liệu trong các bảng khác có cùng dữ liệu?

Trả lời

6

Cassandra cung cấp BATCH cho mục đích này. Từ documentation:

Một tuyên bố BATCH kết hợp nhiều ngôn ngữ sửa đổi dữ liệu (DML) báo cáo (INSERT, UPDATE, DELETE) vào một hoạt động hợp lý duy nhất, và đặt một dấu thời gian khách hàng được cung cấp cho tất cả các cột được viết bởi những điều khoản trong lô. Batching nhiều câu lệnh có thể lưu các trao đổi mạng giữa máy khách/máy chủ và điều phối/bản sao máy chủ. Tuy nhiên, do bản chất phân tán của Cassandra, nên yêu cầu lan truyền qua các nút lân cận càng nhiều càng tốt để tối ưu hóa hiệu suất. Sử dụng các lô để tối ưu hóa hiệu suất thường không thành công, như được mô tả trong phần Sử dụng và sử dụng sai mục. Để biết thông tin về cách tải dữ liệu nhanh nhất, hãy xem "Cassandra: Tải hàng loạt mà không có từ khóa Hàng loạt".

Lô theo mặc định là nguyên tử. Trong bối cảnh của một loạt hoạt động Cassandra, nguyên tử có nghĩa là nếu bất kỳ lô nào thành công, tất cả sẽ thành công. Để đạt được nguyên tử, Cassandra đầu tiên viết lô serialized cho bảng hệ thống batchlog mà tiêu thụ hàng loạt được tuần tự hóa dưới dạng dữ liệu blob. Khi các hàng trong lô đã được ghi thành công và vẫn tồn tại (hoặc được gợi ý), dữ liệu lôgic sẽ bị xóa. Có một hình phạt hiệu suất cho nguyên tử. Nếu bạn không muốn phải chịu hình phạt này, ngăn chặn Cassandra từ văn bản cho hệ thống batchlog bằng cách sử dụng tùy chọn UNLOGGED: BEGIN BATCH UNLOGGED

BATCH UNLOGGED là hầu như luôn luôn mong muốn và tôi tin được lấy ra trong các phiên bản trong tương lai. Các lô thông thường cung cấp chức năng mà bạn mong muốn.

1

Bạn cũng có thể khám phá một tính năng mới từ Cassandra 3,0 gọi materialized views:

quy tắc cơ bản của mô hình dữ liệu trong Cassandra liên quan đến tay denormalizing dữ liệu vào các bảng riêng biệt dựa trên các truy vấn mà sẽ được chạy chống lại bảng đó. Hiện tại, cách duy nhất để truy vấn một cột mà không chỉ định khóa phân vùng là sử dụng các chỉ mục phụ, nhưng chúng không thay thế cho việc không chuẩn hóa dữ liệu thành các bảng mới vì chúng không phù hợp với dữ liệu cardinality cao. Truy vấn chỉ mục thứ cấp số lượng lớn cao thường yêu cầu phản hồi từ tất cả các nút trong vòng, điều này làm tăng độ trễ cho mỗi yêu cầu. Thay vào đó, việc chuẩn hóa phía máy khách và nhiều bảng độc lập được sử dụng, có nghĩa là cùng một mã được viết lại cho nhiều người dùng khác nhau.

Trong 3.0, Cassandra sẽ giới thiệu một tính năng mới được gọi là Chế độ xem vật hoá. Khung nhìn vật hoá xử lý tự động hóa phía máy chủ tự động, loại bỏ nhu cầu xử lý phía khách hàng của việc không chuẩn hóa này và đảm bảo tính nhất quán cuối cùng giữa dữ liệu cơ sở và chế độ xem. Sự không chuẩn hóa này cho phép tra cứu dữ liệu rất nhanh trong mỗi khung nhìn bằng cách sử dụng đường dẫn đọc Cassandra bình thường.

Ý tưởng chính xác giống như đề xuất của Jeff Jirsa, nhưng nó sẽ không yêu cầu bạn xử lý tất cả logic nhất quán trong bảng, Cassandra sẽ tự động làm điều đó cho bạn.

+2

Hãy cẩn thận khi đi xuống con đường này, bởi vì các khung nhìn vật chất được cập nhật không đồng bộ, có nghĩa là ứng dụng của bạn cần phải có khả năng xử lý sự nhất quán cuối cùng. Cách tiếp cận hàng loạt có thể cho phép bạn đảm bảo sự nhất quán tốt hơn cho loại vấn đề này, với chi phí phức tạp của ứng dụng. – awinder

Các vấn đề liên quan