2011-10-10 5 views
7

Tôi muốn sử dụng Cassandra để lưu trữ thông tin liên quan đến phiên. Tôi không có phiên HTTP thực - đó là giao thức khác nhau, nhưng cùng một khái niệm.Cassandra là cửa hàng phiên dưới tải nặng

Memcached sẽ ổn, nhưng tôi muốn tiếp tục lưu giữ dữ liệu.

Cassandra thiết lập:

  • phi nhân rộng không gian chính
  • Family Cột duy nhất, nơi quan trọng là session ID và mỗi cột trong các cửa hàng hàng phím duy nhất/giá trị - (Map<String,Set<String,String>>)
  • cột TTL = 10 phút
  • ghi CL = ONE
  • đọc CL = ONE
  • 2.000 viết/s
  • 5,000 lần đọc/s dụ

dữ liệu:

session1:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
..... 
    {propXXX:val3, TTL:10 min} 
}, 
session2:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
}, 
...... 
sessionXXXX:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
} 

Trong trường hợp này nhất quán không phải là một vấn đề, nhưng hiệu suất có thể, đặc biệt là đĩa IO.

Vì dữ liệu trong phiên của tôi xuất hiện trong một thời gian ngắn, tôi muốn tránh lưu trữ trên ổ đĩa cứng - ngoại trừ nhật ký cam kết.

Tôi có một số câu hỏi sau:

  1. Nếu cột sẽ hết hạn vào Memtable trước khi xả nước nó để SSTable, sẽ Cassandra nào lưu trữ cột như vậy trong SSTable (tuôn ra nó vào HDD)?
  2. Sao chép bị vô hiệu hóa cho Không gian khóa của tôi, trong trường hợp này lưu trữ cột đã hết hạn trong SSTable sẽ không cần thiết, phải không?
  3. Mỗi mũ CF tối đa 10 cột. Trong trường hợp này, tôi sẽ bật bộ nhớ cache hàng và tắt bộ đệm khóa. Nhưng tôi hy vọng dữ liệu của tôi vẫn là có sẵn trong Memtable, trong trường hợp này tôi có thể tắt toàn bộ bộ nhớ cache, đúng không?
  4. Bất kỳ gợi ý cấu hình Cassandra đối với trường hợp phiên lưu trữ sử dụng như vậy sẽ được thực sự đánh giá cao :)

Cảm ơn bạn, Maciej

+0

bạn nói bạn muốn lưu dữ liệu, nhưng cũng muốn TTL sau 10 phút. – sdolgy

+0

Đây là quá trình quan trọng và tôi muốn đảm bảo rằng không phá vỡ –

Trả lời

4

Dưới đây là những gì tôi đã làm - và nó hoạt động tốt:

  1. Set replication_factor xuống còn 1 - có nghĩa là vô hiệu hóa sao chép
  2. Đặt gc_grace to 0 - phương tiện xóa cột trên nén đầu tiên. Điều này là tốt, vì dữ liệu không được nhân rộng.
  3. Tăng kích thước memtable và giảm kích thước bộ nhớ cache. Chúng tôi muốn đọc dữ liệu từ memtable và bỏ qua cache - flushing dữ liệu vào HDD và đọc nó một lần nữa từ HDD vào cache.
  4. Ngoài ra cam kết bản ghi có thể bị vô hiệu hóa - durable_writes = false

Trong thiết lập này, dữ liệu sẽ được đọc từ memtable và bộ nhớ cache sẽ được không được sử dụng. Memtable có thể phân bổ đủ heap để giữ dữ liệu của tôi cho đến khi nó hết hạn hoặc thậm chí lâu hơn.

Sau khi xả dữ liệu vào SSTable, nén sẽ ngay lập tức xóa các hàng đã hết hạn, kể từ gc_grace=0.

+4

Tôi không thể nhìn thấy điểm trong việc này. Nếu bạn không sao chép, bạn có được những gì bạn đã có với memcached. Nếu nút dữ liệu của bạn cư trú trên đi xuống dữ liệu của bạn bị mất. Chắc chắn nó trong commitlog, nhưng xây dựng lại một nút trong 10 phút? Tui bỏ lỡ điều gì vậy? –

1

Xét trường hợp sử dụng của bạn nếu như tôi không sai bạn muốn có tất cả cặp giá trị khóa [sessionID => sessionData] của bạn trong bộ nhớ và các giá trị đó sẽ hết hạn sau mỗi 10 phút [Có nghĩa là bạn không muốn tồn tại].

Sau đó, tại sao bạn không thể thử một cái gì đó như redis là một cửa hàng trong bộ nhớ.

Từ tài liệu:

Redis là mã nguồn mở, khóa nâng cao giá trị nâng cao. Nó thường được gọi là một máy chủ cấu trúc dữ liệu vì các khóa có thể chứa chuỗi, băm, danh sách, tập hợp và các bộ sắp xếp.

Kể từ khi u không cần redis sao chép nắm vững kiến ​​trúc nô lệ thậm chí có thể không ảnh hưởng đến bạn

Redis hỗ trợ TTL cũng

AFAIK cassandra là tốt cho hàng chất béo rộng [More cột ít hàng] khá gầy hàng [ chuyển vị trước đó]. Trường hợp sử dụng của bạn không có vẻ như vậy.

Kính trọng, Tamil

+0

Chúng tôi đã ghi nhớ - điều này cũng sẽ tốt cho trường hợp sử dụng đó. Nhưng hãy nói rằng quy trình của tôi rất quan trọng và tôi muốn đảm bảo rằng dữ liệu đó sẽ không bị mất trong 10 phút đó - cũng có thể mất 30 phút. –

+0

Tất cả những gì bạn quan tâm là thực hiện đăng nhập cam kết trong Cassandra. Tôi hy vọng điều này sẽ giúp http://redis.io/topics/persistence, tôi dunno abt memcached anyways – Tamil