Tôi nghĩ rằng đây xứng đáng một bản cập nhật kể từ khi Cassandra 1.2 ra mắt gần đây.
Tôi đã sử dụng Cassandra trong sản xuất trong 18 tháng qua cho các trò chơi xã hội.
Mặc dù tôi là bạn phải sử dụng Cassandra cho những điểm mạnh của nó.Vì vậy, một sự hiểu biết tốt về những gì và làm thế nào nó là nó cần thiết để xem mô hình dữ liệu để sử dụng hoặc thậm chí để xác định nếu một giải pháp DB là hữu ích hơn cho bạn.
OrderedPartitioner chỉ hữu ích nếu ứng dụng của bạn dựa vào các truy vấn phạm vi chính, NHƯNG bạn bỏ một trong những tính năng mạnh mẽ nhất của Cassandra cho điều đó: tự động sharding và cân bằng tải. Thay vì truy vấn phạm vi khóa hàng cố gắng triển khai cùng chức năng bạn cần bằng cách sử dụng phạm vi tên cột trong cùng một hàng. TL; DR đọc/ghi S W KHÔNG được cân bằng giữa các nút bằng cách sử dụng tính năng này.
RandomPartioner (md5 băm) và MurmurPartitioner (Murmur băm, tốt hơn và nhanh hơn) là cách bạn phải đi nếu bạn muốn hỗ trợ dữ liệu lớn và một tần số truy cập cao. Điều duy nhất bạn từ bỏ là các truy vấn phạm vi chính. Mọi thứ nằm trong cùng một hàng vẫn nằm trên cùng một nút trong cụm và bạn có thể sử dụng các truy vấn dãy so sánh và tên cột trên các cụm đó. TL; DR: SỬ DỤNG NÀY CHO CÂU HỎI THƯỜNG GẶP, bạn sẽ từ bỏ không có gì lớn.
điều bạn nên biết về cassandra:
Cassandra là cuối cùng nhất quán. Cassandra đã chọn để thương mại nhất quán cho tính sẵn sàng cao và phân vùng tuyệt vời (http://en.wikipedia.org/wiki/CAP_theorem). NHƯNG bạn có thể nhận được sự nhất quán từ cassandra, đó là tất cả về chính sách nhất quán của bạn khi bạn đọc và viết cho nó. Đây là một chủ đề khá quan trọng và phức tạp khi nói về việc sử dụng cassandra nhưng bạn có thể đọc chi tiết ở đây http://www.datastax.com/docs/1.2/dml/data_consistency.
Như một quy tắc chung (và để đơn giản) tôi đọc và viết tại QUORUM ConsistencyLevel (vì trong các ứng dụng của tôi đọc có xu hướng có cùng thứ tự tần suất như viết). Nếu ứng dụng của bạn là cực kỳ viết nặng và đọc xảy ra ít hơn rất nhiều sau đó sử dụng viết tại ONE và đọc tại TẤT CẢ. Hoặc nếu trường hợp sử dụng của bạn là ngược lại (viết ít thường xuyên hơn nhiều lần đọc) thì bạn có thể thử đọc trên ONE và viết trên TẤT CẢ. Sử dụng BẤT CỨ làm mức độ nhất quán để viết không phải là một ý tưởng tuyệt vời nếu tính nhất quán là những gì bạn đang cố gắng giải quyết, vì nó đảm bảo rằng đột biến đã đạt đến cụm nhưng không phải là nó đã được viết ở bất kỳ đâu. Đây là trường hợp duy nhất tôi ghi âm thầm vào cassandra.
Đó là những quy tắc đơn giản giúp bạn dễ dàng bắt đầu phát triển cassandra. Để có được sự nhất quán và hiệu suất nhất có thể từ một cụm sản xuất, bạn nên nghiên cứu chủ đề này một cách khó khăn và thực sự hiểu nó.
Nếu bạn cần một mô hình dữ liệu có thể đọc được con người với quan hệ phức tạp giữa các thực thể (bảng) thì tôi không nghĩ Cassandra là dành cho bạn. MySQL và có lẽ NewSQL có thể hữu ích hơn cho trường hợp sử dụng của bạn.
Điều tốt cần biết là cách, gần như, cassandra lưu và đọc dữ liệu. Bất cứ khi nào bạn viết (xóa thực sự là viết của một giá trị "tombstone" trong cassandra), hệ thống sẽ đặt giá trị mới và dấu thời gian của nó ở một vị trí vật lý mới.
Khi bạn đọc, cassandra cố gắng kéo tất cả ghi cho một vị trí khóa/cột nhất định và trả lại cho bạn gần đây nhất có thể tìm thấy (dấu có dấu thời gian cao nhất mà khách hàng đã cung cấp). Vì vậy, bộ nhớ cần thiết bởi một nút phụ thuộc trực tiếp vào tần số ghi. Có một quá trình nén chặt trong cassandra giúp chăm sóc làm sạch các đột biến cũ. Cassandra có một bộ nhớ đệm nội bộ được cập nhật trên lần đọc với giá trị mới nhất của vị trí.
Việc hợp nhất/nén chặt trên đĩa của SSTables (các cấu trúc dữ liệu lưu giữ dữ liệu) có thể bị kích động bởi các lần đọc, nhưng tốt hơn là không nên đếm nó. Việc làm sạch bia mộ và các cột hết hạn (sử dụng chức năng thời gian để sống) là một cơ chế khác được quản lý bởi bộ thu gom rác (xem cài đặt thời gian gia hạn GC để biết thêm chi tiết).
Điều này mang lại cho tôi điểm cuối cùng tôi muốn thực hiện: Đảm bảo rằng việc viết và đọc của bạn sẽ được cân bằng trên cụm của bạn!
Giả sử rằng tất cả người dùng của bạn cần phải cập nhật một vị trí duy nhất rất thường xuyên.
KHÔNG lập bản đồ vị trí đơn lý thuyết đó chỉ với một khóa hàng! Điều này sẽ làm cho tất cả các bài viết của bạn chỉ rơi vào một nút trong cụm của bạn. Nếu nó không mang lại mọi thứ xuống (bởi vì bạn có sysops rockstar) nó ít nhất sẽ làm tê liệt hiệu suất của cluster.
Lời khuyên của tôi là viết các bài viết của bạn vào đủ các khóa hàng khác nhau mà bạn sẽ phân phối các bài viết của bạn trên tất cả các nút trong cụm. Để lấy tất cả dữ liệu cho vị trí lý thuyết duy nhất đó, hãy sử dụng một multi_get trên tất cả các "khóa hàng phụ".
Ví dụ:
Tôi muốn có danh sách tất cả các phiên http đang hoạt động (có uuid được chỉ định cho họ). Không lưu tất cả vào một khóa hàng "phiên". Những gì tôi sử dụng như là một phím hàng cho cụm cassandra của tôi của 6 nút là: _sessions. Sau đó, tôi có một 16 phím nhỏ multi_get để lấy tất cả các phiên hoạt động, hoặc tôi vẫn có thể nói nếu một phiên hoạt động bằng cách sử dụng một đơn giản nhận được (nếu tôi biết uuid của khóa học). Nếu cụm của bạn lớn hơn rất nhiều, bạn có thể muốn sử dụng hàm băm cho các khóa nhóm tạo.
Tôi khuyên bạn nên tìm thêm thông tin về Mô hình hóa dữ liệu trong Cassandra. Tôi đã đọc http://www.cs.wayne.edu/andrey/papers/TR-BIGDATA-05-2015-CKL.pdf và http://www.datastax.com/dev/blog/basic-rules- mô hình dữ liệu-cassandra-mô hình hóa như các bài viết hữu ích trong trường hợp này. Chúng sẽ giúp bạn hiểu về mô hình hóa các bảng dựa trên các truy vấn của bạn (phương pháp truy vấn theo hướng dẫn) và sao chép dữ liệu và các ưu điểm/nhược điểm của nó. – Elnaz