2012-04-23 41 views
63

Tôi hiện đang sử dụng db (mysql) để lưu trữ các phiên của mình. Nó hoạt động tốt nhưng nó hơi chậm.Làm thế nào an toàn để lưu phiên với Redis?

Tôi đã được yêu cầu sử dụng Redis, nhưng tôi tự hỏi nếu đó là một ý tưởng hay vì tôi đã nghe Redis trì hoãn việc viết hoạt động, vì vậy tôi hơi sợ vì phiên cần phải là thời gian thực.

Bạn có gặp phải sự cố như vậy không?

+1

Vì Redis nói rằng nó có độ bền tùy chọn, sau đó tôi muốn sử dụng nó an toàn nếu bạn chọn kiên trì trên HDD. Tuy nhiên, đối với dữ liệu phiên - tôi chắc chắn sẽ lưu chúng vào RAM (có nghĩa là tôi sẽ không lo lắng về phần độ bền của toàn bộ thử nghiệm). Điều tồi tệ nhất sẽ xảy ra trong trường hợp bạn mất dữ liệu phiên là có người dùng đăng xuất. –

+1

vâng nhưng đây là một phần của yêu cầu của tôi, người dùng không cần phải đăng nhập lại, bằng cách một số dữ liệu người dùng được duy trì trong phiên trong khi người dùng không đăng nhập (người dùng khách). Họ sẽ đi cho Redis RAM nhưng với đăng nhập và/hoặc sao lưu được kích hoạt. Nếu chúng ta bị mất một số phiên thì có thể chấp nhận được. – Trent

+0

Vâng, nếu bạn đang sử dụng bộ nhớ đĩa cứng, điểm của việc sử dụng Redis là gì? Nó có thể trì hoãn cam kết thực sự vào đĩa để tăng hiệu suất, điều tương tự mà MySQL có thể làm nếu cấu hình theo cách đó. Bạn có cân nhắc việc chuyển MySQL sang hệ thống con I/O nhanh hơn không?Nó không giống như Redis sẽ làm việc một cách kỳ diệu nhanh gấp 50 lần trên cùng một phần cứng, nếu nó phải sử dụng cùng một tầng chứa I/O. –

Trả lời

110

Redis là hoàn hảo cho việc lưu trữ phiên. Tất cả các hoạt động được thực hiện trong bộ nhớ, vì vậy việc đọc và ghi sẽ nhanh chóng.

Khía cạnh thứ hai là tính kiên trì của trạng thái phiên. Redis cung cấp cho bạn rất nhiều tính linh hoạt trong cách bạn muốn duy trì trạng thái phiên cho đĩa cứng của mình. Bạn có thể đi qua http://redis.io/topics/persistence để tìm hiểu thêm, nhưng ở mức độ cao, đây là lựa chọn của bạn -

  1. Nếu bạn không thể đủ khả năng mất bất kỳ phiên, thiết appendfsync always trong tập tin cấu hình của bạn. Với điều này, Redis đảm bảo rằng mọi thao tác ghi được lưu vào đĩa. Điểm bất lợi là các thao tác ghi sẽ chậm hơn.
  2. Nếu bạn không hài lòng với việc mất khoảng 1s dữ liệu, hãy sử dụng appendfsync everysec. Điều này sẽ mang lại hiệu suất tuyệt vời với các dữ liệu hợp lý đảm bảo
9

Về cơ bản có hai loại chính: snapsnots không đồng bộ và fsync(). Chúng được gọi là RDB và AOF tương ứng. Thêm thông tin về số persistence modes on the official page.

Việc xử lý tín hiệu của quy trình được sao chép đồng bộ hóa với đĩa khi nó nhận được SIGTERM chẳng hạn, vì vậy dữ liệu sẽ vẫn ở đó sau khi khởi động lại. Tôi nghĩ rằng daemon hoặc hệ điều hành đã sụp đổ trước khi bạn sẽ thấy một tham nhũng toàn vẹn, ngay cả với các thiết lập mặc định (ảnh chụp nhanh RDB).

Cài đặt AOF sử dụng Tệp phụ chỉ ghi nhật ký các lệnh mà máy chủ nhận được và tạo lại DB từ đầu khi khởi động nguội, từ tệp đã lưu. Chính sách đồng bộ hóa đĩa mặc định là xóa mỗi giây một lần (IIRC) nhưng có thể được đặt để khóa và ghi trên mọi lệnh.

Sử dụng cả ảnh chụp nhanh và nhật ký gia tăng dường như cung cấp cả phương pháp tiếp cận dài hạn không-mind-if-I-miss-a-vài giây của dữ liệu với một cách an toàn hơn, nhưng tốn kém nhật ký gia tăng. Redis hỗ trợ phân cụm ra khỏi hộp, vì vậy sao chép có thể được thực hiện quá dường như.

Tôi đang sử dụng cài đặt RDB mặc định của mình và lưu ảnh chụp nhanh vào FTP từ xa. Tôi chưa thấy một lỗi nào gây ra mất dữ liệu. Lỗi phần cứng cấp tính hoặc mất điện rất có thể, nhưng tôi được lưu trữ trên VPS. Cơ hội mỏng xảy ra :)

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