Làm thế nào an toàn để lưu trữ các phiên với Redis?


92

Tôi hiện đang sử dụng 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.

Tôi đã được yêu cầu sử dụng Redis, nhưng tôi đang tự hỏi liệu đó có phải là ý kiến ​​hay không vì tôi nghe nói rằng Redis làm chậm các thao tác ghi. Tôi hơi sợ vì các phiên cần phải theo thời gian thực.

Có ai đã trải qua những vấn đề như vậy?


1
Vì Redis nói rằng nó có độ bền tùy chọn, nên tôi muốn nói rằng sẽ an toàn khi sử dụng nó nếu bạn chọn sử dụng lâu dài 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ề độ bền của toàn bộ thử thách). Đ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à người dùng của bạn đã đăng xuất.
NB

1
vâng nhưng đây là một phần 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 này một số dữ liệu người dùng được duy trì trong suốt phiên trong khi người dùng không đăng nhập (người dùng khách). Họ sẽ sử dụng RAM Redis nhưng có bật tính năng ghi nhật ký và / hoặc sao lưu. Nếu chúng tôi bị mất một số phiên thì có thể chấp nhận được.
Trent

1
mối quan tâm chính của tôi là về việc ghi bị trì hoãn, điều gì sẽ xảy ra nếu người dùng đăng nhập và phiên được viết chậm, anh ta sẽ được chuyển hướng nhưng không đăng nhập
Trent

2
Hãy tưởng tượng một trang web thương mại điện tử, nếu phiên bị mất, giỏ hàng hiện tại cũng bị mất, điều đó không có gì ghê gớm nhưng điều đó có thể là kỳ quặc đối với người dùng. Người dùng khách chỉ được xác định trong một phiên nên không có cách nào để khôi phục giỏ hàng của họ.
Boris Guéry

1
@ BorisGuéry - không phải tôi không đồng ý, nhưng nếu phải tăng hiệu suất - thì phải đặt ra các thỏa hiệp khi có sự cố. Vâng, sẽ rất kỳ lạ nếu người dùng đột nhiên bị đăng xuất, đó là điều chắc chắn - nhưng câu hỏi đặt ra là tần suất nó xảy ra như thế nào? Nếu một hoặc hai lần một năm mà tất cả các nút Redis đều bị hỏng, thì tôi không có lý do gì để giảm hiệu suất trong một vài thời điểm riêng lẻ khi toàn bộ cụm không khả dụng. Nhưng đó chỉ là tôi.
NB

Câu trả lời:


147

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

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

  1. Nếu bạn không có khả năng mất bất kỳ phiên nào, hãy đặt appendfsync alwaystrong tệp 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 đều được lưu vào đĩa. Nhược điểm là thao tác ghi sẽ chậm hơn.
  2. Nếu bạn không sao với việc mất khoảng 1 giây 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 đảm bảo dữ liệu hợp lý

14

Về cơ bản, có hai loại chính có sẵn: không đồng bộ snapsnots và fsync(). Chúng được gọi là RDB và AOF tương ứng. Thông tin thêm về các chế độ bền bỉ trên trang chính thức .

Xử lý tín hiệu của quá trình daemonized đồ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 phải gặp sự cố trước khi bạn sẽ thấy lỗi toàn vẹn, ngay cả với cài đặt mặc định (ảnh chụp nhanh RDB).

Cài đặt AOF sử dụng tệp chỉ nối 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ột lần mỗi giây (IIRC) nhưng có thể được đặt để khóa và ghi trên mọi lệnh.

Việc 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ữ liệu dài hạn mà không cần phải bận tâm nếu tôi bỏ lỡ một vài giây với một nhật ký gia tăng an toàn hơn nhưng tốn kém. Redis hỗ trợ phân cụm ra khỏi hộp, vì vậy có vẻ như việc sao chép cũng có thể được thực hiện.

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


12

Câu hỏi này thực sự là về các phiên thời gian thực, và dường như đã phát sinh một phần do sự hiểu nhầm về cụm từ 'hoạt động viết bị trì hoãn'. ..

Bạn sẽ không gặp vấn đề gì khi triển khai các phiên thời gian thực.

Redis là một kho lưu trữ khóa-giá trị trong bộ nhớ với khả năng lưu trữ tùy chọn vào đĩa. 'Thao tác ghi bị trì hoãn' đề cập đến việc ghi vào đĩa , không phải cơ sở dữ liệu nói chung, tồn tại trong bộ nhớ. Nếu bạn ĐẶT cặp khóa / giá trị, bạn có thể NHẬN ngay lập tức (tức là trong thời gian thực). Chính sách bạn chọn liên quan đến tính bền bỉ (mức độ bạn trì hoãn việc ghi) sẽ xác định giới hạn trên cho lượng dữ liệu có thể bị mất khi gặp sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.