5.1 Phân phối dữ liệu
Hãy xem xét cách dữ liệu được phân phối tùy thuộc vào khóa giữa các nút cụm. Cassandra cho phép bạn thiết lập chiến lược phân phối dữ liệu. Chiến lược đầu tiên như vậy sẽ phân phối dữ liệu tùy thuộc vào giá trị khóa md5 - một trình phân vùng ngẫu nhiên. Cái thứ hai tính đến biểu diễn bit của chính khóa - đánh dấu thứ tự (bộ phân vùng theo thứ tự byte).
Chiến lược đầu tiên, phần lớn, mang lại nhiều lợi thế hơn, vì bạn không cần phải lo lắng về việc phân phối dữ liệu đồng đều giữa các máy chủ và các vấn đề như vậy. Chiến lược thứ hai được sử dụng trong một số ít trường hợp, ví dụ: nếu cần truy vấn khoảng thời gian (quét phạm vi). Điều quan trọng cần lưu ý là việc lựa chọn chiến lược này được thực hiện trước khi tạo cụm và trên thực tế không thể thay đổi nếu không tải lại hoàn toàn dữ liệu.
Cassandra sử dụng một kỹ thuật được gọi là băm nhất quán để phân phối dữ liệu. Cách tiếp cận này cho phép bạn phân phối dữ liệu giữa các nút và đảm bảo rằng khi thêm và xóa một nút mới, lượng dữ liệu được truyền sẽ nhỏ. Để thực hiện việc này, mỗi nút được gán một nhãn (mã thông báo), nhãn này sẽ chia tập hợp tất cả các giá trị khóa md5 thành các phần. Vì RandomPartitioner được sử dụng trong hầu hết các trường hợp nên chúng ta hãy xem xét nó.
Như tôi đã nói, RandomPartitioner tính toán md5 128 bit cho mỗi khóa. Để xác định dữ liệu sẽ được lưu trữ trong các nút nào, nó chỉ cần duyệt qua tất cả các nhãn của các nút từ nhỏ nhất đến lớn nhất và khi giá trị của nhãn trở nên lớn hơn giá trị của khóa md5, thì nút này cùng với một số nút tiếp theo (theo thứ tự nhãn) được chọn để lưu trữ. Tổng số nút được chọn phải bằng hệ số sao chép. Mức sao chép được thiết lập cho mỗi keyspace và cho phép bạn điều chỉnh độ dư thừa của dữ liệu (data redundancy).
![](https://cdn.codegym.cc/images/article/0bc059bf-5aec-4de6-8367-fa98a80b761b/1024.jpeg)
Trước khi một nút có thể được thêm vào cụm, nó phải được gán nhãn. Tỷ lệ phần trăm khóa bao phủ khoảng cách giữa nhãn này và nhãn tiếp theo xác định lượng dữ liệu sẽ được lưu trữ trên nút. Toàn bộ nhãn cho một cụm được gọi là một vòng.
Đây là một minh họa sử dụng tiện ích nodetool tích hợp để hiển thị một vòng cụm gồm 6 nút với các nhãn cách đều nhau.
![](https://cdn.codegym.cc/images/article/51a9b82a-d1e9-40df-b6c3-143968efb3b9/1024.jpeg)
5.2 Tính nhất quán của dữ liệu khi ghi
Các nút cụm Cassandra là tương đương và các máy khách có thể kết nối với bất kỳ nút nào trong số chúng, cả để viết và đọc. Các yêu cầu trải qua giai đoạn phối hợp, trong đó, sau khi tìm ra với sự trợ giúp của khóa và đánh dấu xem dữ liệu sẽ được định vị trên các nút nào, máy chủ sẽ gửi yêu cầu đến các nút này. Chúng ta sẽ gọi nút thực hiện điều phối là điều phối viên và các nút được chọn để lưu bản ghi với khóa đã cho là các nút bản sao . Về mặt vật lý, một trong các nút bản sao có thể là điều phối viên - nó chỉ phụ thuộc vào khóa, đánh dấu và nhãn.
Đối với mỗi yêu cầu, cả về đọc và viết, có thể đặt mức độ nhất quán của dữ liệu.
Đối với ghi, mức này sẽ ảnh hưởng đến số lượng nút bản sao sẽ chờ xác nhận hoàn thành thành công thao tác (dữ liệu được ghi) trước khi trả lại quyền kiểm soát cho người dùng. Đối với bản ghi, có các mức nhất quán sau:
- MỘT - điều phối viên gửi yêu cầu đến tất cả các nút bản sao, nhưng sau khi chờ xác nhận từ nút đầu tiên, sẽ trả lại quyền kiểm soát cho người dùng;
- HAI - giống nhau, nhưng điều phối viên đợi xác nhận từ hai nút đầu tiên trước khi trả lại quyền kiểm soát;
- BA - tương tự, nhưng điều phối viên chờ xác nhận từ ba nút đầu tiên trước khi trả lại quyền kiểm soát;
- QUORUM - một đại biểu được thu thập: điều phối viên đang chờ xác nhận bản ghi từ hơn một nửa số nút sao chép, cụ thể là vòng (N / 2) + 1, trong đó N là mức sao chép;
- LOCAL_QUORUM - Điều phối viên đang chờ xác nhận từ hơn một nửa số nút bản sao trong cùng một trung tâm dữ liệu nơi đặt điều phối viên (có thể khác nhau đối với mỗi yêu cầu). Cho phép bạn loại bỏ sự chậm trễ liên quan đến việc gửi dữ liệu đến các trung tâm dữ liệu khác. Các vấn đề làm việc với nhiều trung tâm dữ liệu được xem xét trong bài viết này;
- EACH_QUORUM - Điều phối viên đang chờ xác nhận từ hơn một nửa số nút bản sao trong mỗi trung tâm dữ liệu, một cách độc lập;
- TẤT CẢ - điều phối viên chờ xác nhận từ tất cả các nút bản sao;
- BẤT CỨ - cho phép ghi dữ liệu, ngay cả khi tất cả các nút bản sao không phản hồi. Điều phối viên đợi phản hồi đầu tiên từ một trong các nút sao chép hoặc dữ liệu được lưu trữ bằng cách sử dụng chuyển giao gợi ý trên điều phối viên.
![](https://cdn.codegym.cc/images/article/192a8b9b-4bc0-48ff-994b-36b324277212/1024.jpeg)
5.3 Tính nhất quán của dữ liệu khi đọc
Đối với số lần đọc, mức độ nhất quán sẽ ảnh hưởng đến số lượng nút bản sao sẽ được đọc từ đó. Để đọc, có các mức nhất quán sau:
- MỘT - điều phối viên gửi yêu cầu đến nút bản sao gần nhất. Phần còn lại của các bản sao cũng được đọc để đọc sửa chữa với xác suất được chỉ định trong cấu hình cassandra;
- HAI là như nhau, nhưng điều phối viên gửi yêu cầu đến hai nút gần nhất. Giá trị có dấu thời gian lớn nhất được chọn;
- BA - tương tự như tùy chọn trước, nhưng có ba nút;
- QUORUM - một đại biểu được thu thập, nghĩa là điều phối viên gửi yêu cầu tới hơn một nửa số nút sao chép, cụ thể là vòng (N/2) + 1, trong đó N là mức sao chép;
- LOCAL_QUORUM - một đại biểu được thu thập trong trung tâm dữ liệu nơi diễn ra sự phối hợp và dữ liệu có dấu thời gian mới nhất được trả về;
- EACH_QUORUM - Điều phối viên trả về dữ liệu sau cuộc họp của đại biểu trong mỗi trung tâm dữ liệu;
- TẤT CẢ - Điều phối viên trả về dữ liệu sau khi đọc từ tất cả các nút bản sao.
![](https://cdn.codegym.cc/images/article/a39054d5-5e53-4e3f-b670-451e75541bfb/1024.jpeg)
Như vậy, có thể điều chỉnh độ trễ thời gian của các thao tác đọc ghi và điều chỉnh độ nhất quán (tuneconsistency), cũng như tính khả dụng (availability) của từng loại thao tác. Trên thực tế, tính khả dụng có liên quan trực tiếp đến mức độ nhất quán của việc đọc và ghi, vì nó xác định số lượng nút bản sao có thể ngừng hoạt động và vẫn được xác nhận.
Nếu số nút mà từ đó xác nhận ghi đến, cộng với số nút mà quá trình đọc được thực hiện, lớn hơn mức sao chép, thì chúng tôi đảm bảo rằng giá trị mới sẽ luôn được đọc sau khi ghi và điều này được gọi là tính nhất quán mạnh (strongconsistent). Trong trường hợp không có tính nhất quán cao, có khả năng thao tác đọc sẽ trả về dữ liệu cũ.
Trong mọi trường hợp, giá trị cuối cùng sẽ lan truyền giữa các bản sao, nhưng chỉ sau khi thời gian chờ phối hợp kết thúc. Sự lan truyền này được gọi là tính nhất quán cuối cùng. Nếu không phải tất cả các nút bản sao đều có sẵn tại thời điểm viết, thì sớm hay muộn các công cụ khôi phục như đọc khắc phục và sửa chữa nút chống entropy sẽ phát huy tác dụng. Thêm về điều này sau.
Do đó, với mức độ nhất quán đọc và ghi QUORUM, tính nhất quán cao sẽ luôn được duy trì và đây sẽ là sự cân bằng giữa độ trễ đọc và ghi. Với TẤT CẢ các lần ghi và MỘT lần đọc sẽ có tính nhất quán cao và các lần đọc sẽ nhanh hơn và khả dụng hơn, tức là số nút bị lỗi mà một lần đọc vẫn sẽ được hoàn thành có thể lớn hơn so với QUORUM.
Đối với các thao tác ghi, tất cả các nút nhân bản sao sẽ được yêu cầu. Khi viết MỘT, đọc TẤT CẢ, cũng sẽ có tính nhất quán nghiêm ngặt và thao tác ghi sẽ nhanh hơn và khả năng ghi sẽ lớn, bởi vì chỉ cần xác nhận rằng thao tác ghi diễn ra trên ít nhất một trong các máy chủ là đủ, trong khi đọc chậm hơn và yêu cầu tất cả các nút sao chép. Nếu một ứng dụng không có yêu cầu về tính nhất quán nghiêm ngặt, thì có thể tăng tốc cả thao tác đọc và ghi, cũng như cải thiện tính khả dụng bằng cách đặt các mức nhất quán thấp hơn.