Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Làm chủ các khóa phân tán của Redis:Các mô hình đã được chứng minh, những cạm bẫy thường gặp và các ứng dụng thực tế

Làm chủ các khóa phân tán của Redis:Các mô hình đã được chứng minh, những cạm bẫy thường gặp và các ứng dụng thực tế

Giới thiệu

Khóa phân phối nghe có vẻ đơn giản cho đến khi bạn thực sự phụ thuộc vào chúng trong quá trình sản xuất.

Một quy trình cần quyền truy cập độc quyền vào một tài nguyên. Nhiều máy chủ đang chạy. Redis ngồi ở giữa. Ý tưởng có vẻ đơn giản:khóa Redis và tiếp tục.

Trong một thời gian, cách tiếp cận này có vẻ hiệu quả. Sau đó, quá trình gặp sự cố, xảy ra hiện tượng trễ mạng hoặc độ trễ tăng đột biến. Đột nhiên, hai quy trình yêu cầu cùng một khóa, không có quy trình nào sở hữu khóa đó hoặc khóa không bao giờ mở.

Hầu hết các sự cố khóa Redis không phải do chính Redis gây ra. Chúng xảy ra vì các khóa phân tán thường bị hiểu nhầm. Redis cung cấp một công cụ để phối hợp chứ không phải là sự đảm bảo về tính độc quyền hoàn hảo.

Khóa phân tán thực sự là gì

Khóa phân tán không giống như khóa mutex trong bộ nhớ. Nó không mang lại sự đảm bảo tuyệt đối và không thể loại bỏ thất bại.

Khóa phân tán là cơ chế phối hợp hoạt động trong môi trường không đáng tin cậy. Mạng bị lỗi, xử lý bị lỗi và đồng hồ bị trôi. Bất kỳ chiến lược khóa nào giả định hành vi hoàn hảo cuối cùng sẽ bị phá vỡ.

Khóa Redis là khóa nỗ lực tốt nhất. Khi được thiết kế chính xác, chúng cực kỳ hiệu quả. Khi được triển khai một cách tình cờ, chúng sẽ gây ra các điều kiện chủng tộc tinh vi và làm hỏng dữ liệu.

Bước đầu tiên để sử dụng khóa Redis một cách an toàn là điều chỉnh kỳ vọng.

Khi khóa Redis có ý nghĩa

Khóa phân phối Redis phù hợp khi:

  • Bạn cần ngăn việc thực thi đồng thời một phần quan trọng

  • Công việc phải được phối hợp trên nhiều máy chủ

  • Hoạt động này chỉ tồn tại trong thời gian ngắn

  • Có thể thử lại

Các trường hợp sử dụng phổ biến bao gồm loại bỏ trùng lặp công việc, điều phối tác vụ theo lịch trình, xây dựng lại bộ đệm và ngăn chặn xử lý kép.

Khóa Redis không phù hợp với các giao dịch kinh doanh kéo dài, quy trình công việc quan trọng mà người dùng phải đối mặt hoặc các hoạt động không thể thử lại một cách an toàn. Nếu việc thử lại không được chấp nhận thì khóa Redis là công cụ sai.

Tính năng khóa nguyên thủy an toàn duy nhất trong Redis

Nguyên thủy khóa Redis an toàn nhất là một lệnh nguyên tử duy nhất:

SET giá trị khóa NX EX ttl

Lệnh này chỉ tạo khóa nếu nó chưa tồn tại, gán giá trị chủ sở hữu duy nhất và đặt TTL để khóa tự động hết hạn.

Bất kỳ cách tiếp cận thay thế nào đều đưa ra các điều kiện về chủng tộc. Sử dụng SETNX mà không có TTL hoặc cài đặt hết hạn trong một bước riêng biệt sẽ không thành công. TTL là bắt buộc và bảo vệ hệ thống khi một quá trình gặp sự cố bất ngờ.

Tại sao khóa TTL là bắt buộc

Nếu không có TTL, khóa Redis có thể tồn tại mãi mãi. Nếu một quá trình gặp sự cố khi đang giữ khóa, hệ thống sẽ ngừng hoạt động một cách im lặng.

TTL làm cho ổ khóa có khả năng tự phục hồi. Khi xảy ra lỗi, khóa cuối cùng sẽ hết hạn và cho phép tiến trình tiếp tục. Điều này có thể dẫn đến sự chồng chéo trong thời gian ngắn nhưng sự đánh đổi đó là có chủ ý.

Những ổ khóa không bao giờ hết hạn còn nguy hiểm hơn là không có ổ khóa nào cả.

Khóa quyền sở hữu và giải phóng an toàn

Khóa Redis chỉ được giải phóng bởi quá trình đã lấy được nó. Đây là lý do tại sao giá trị khóa phải là giá trị nhận dạng duy nhất chứ không phải chuỗi cố định.

Việc mở khóa yêu cầu xác minh quyền sở hữu. Cách tiếp cận an toàn là sử dụng tập lệnh Lua để kiểm tra giá trị được lưu trữ và chỉ xóa khóa nếu nó khớp với chủ sở hữu dự kiến.

Điều này ngăn chặn tình trạng chạy đua trong đó khóa hết hạn, được một quy trình khác lấy lại và sau đó bị chủ sở hữu ban đầu vô tình xóa.

Chọn thời lượng khóa an toàn

Khóa TTL phải vượt quá thời gian thực hiện dự kiến tối đa của hoạt động được bảo vệ. Sử dụng thời gian thực hiện trung bình là không đủ.

Nếu khóa hết hạn trong khi công việc vẫn đang chạy, một quy trình khác có thể lấy khóa đó và thực hiện cùng một công việc đồng thời. Điều này có thể gây ra sự trùng lặp hoặc hỏng hóc.

Đồng thời, TTL quá dài sẽ làm chậm quá trình phục hồi khi có sự cố xảy ra. Thời lượng khóa là số dư tăng dần khi hệ thống thay đổi.

Giữ công việc bị khóa ở quy mô nhỏ và có giới hạn là cách tiếp cận an toàn nhất.

Khóa mở rộng và nhịp tim

Một số thao tác mất nhiều thời gian hơn dự kiến. Có thể mở rộng khóa bằng cách làm mới TTL định kỳ, nhưng nó làm tăng thêm độ phức tạp và các chế độ lỗi mới.

Chỉ chủ sở hữu khóa mới được phép gia hạn TTL và việc gia hạn phải dừng ngay lập tức nếu mất quyền sở hữu.

Trong nhiều trường hợp, việc thiết kế lại công việc thành các phần nhỏ hơn sẽ an toàn hơn việc triển khai logic mở rộng khóa.

Cuộc tranh luận về khóa đỏ

Redlock là một thuật toán sử dụng nhiều phiên bản Redis để cải thiện độ an toàn của khóa. Nó cũng gây tranh cãi và phức tạp về mặt vận hành.

Đối với hầu hết các hệ thống, Redlock mang đến sự phức tạp hơn là lợi ích. Nó dựa vào các giả định về thời gian rất khó đảm bảo trong môi trường thực tế.

Nếu yêu cầu đảm bảo ở cấp độ Redlock thì Redis có thể không phải là công cụ thích hợp. Cơ sở dữ liệu có hệ thống khóa giao dịch hoặc điều phối chuyên biệt có thể phù hợp hơn.

Đối với hầu hết các trường hợp sử dụng Redis, một phiên bản Redis duy nhất có khóa dựa trên TTL thích hợp là đủ.

Khóa không phải là giao dịch

Khóa Redis không thực hiện các hoạt động giao dịch. Chúng không cung cấp khả năng khôi phục tự động hoặc đảm bảo tính nhất quán khi xảy ra lỗi trong quá trình hoạt động.

Khóa giảm tính đồng thời; họ không loại bỏ thất bại. Các phần quan trọng phải được thiết kế bình thường để việc thực hiện lặp lại không gây hại.

Nguyên tắc thiết kế này làm giảm đáng kể nguy cơ xảy ra lỗi liên quan đến khóa.

Điều gì xảy ra khi Redis ngừng hoạt động

Khi Redis ngừng hoạt động hoặc khởi động lại, tất cả các khóa sẽ biến mất. Đây là hành vi được mong đợi.

Khi Redis trực tuyến trở lại, nhiều quy trình có thể nhận được khóa đồng thời và bắt đầu hoạt động. Các hệ thống phải chấp nhận khả năng này.

Nếu mất khóa trong quá trình khởi động lại Redis dẫn đến hỏng hóc thì thiết kế khóa không an toàn và cần được xem xét lại.

Giám sát khóa trong sản xuất

Khóa Redis không bao giờ được ẩn đi. Các nhóm nên theo dõi số lượng khóa tồn tại, thời gian tồn tại của chúng và tần suất việc thu thập khóa không thành công.

Các khóa tồn tại lâu bất thường cho thấy các quá trình bị đình trệ. Việc thu thập dữ liệu không thành công thường xuyên cho thấy có sự tranh chấp hoặc thiết kế khóa không chính xác.

Tầm nhìn là cần thiết để vận hành an toàn.

Các mẫu chống khóa Redis phổ biến

Các lỗi phổ biến bao gồm sử dụng SETNX mà không có TTL, sử dụng các giá trị không đổi cho quyền sở hữu khóa, xóa khóa một cách mù quáng, giữ khóa cho các tác vụ chạy dài và cho rằng khóa đảm bảo tính chính xác.

Những mô hình phản đối này xuất hiện thường xuyên trong các đợt ngừng sản xuất trong thế giới thực.

Danh sách kiểm tra khóa thực tế

Việc triển khai khóa Redis an toàn bao gồm:

  • Khóa phím bằng TTL

  • Giá trị quyền sở hữu khóa duy nhất

  • Xác minh quyền sở hữu khi phát hành

  • Các phần quan trọng tồn tại trong thời gian ngắn

  • Hoạt động bình thường

  • Đã kiểm tra đường dẫn lỗi

Nếu thiếu bất kỳ yếu tố nào trong số này thì thiết kế khóa phải được xem xét lại.

Mô hình tinh thần lành mạnh cho Redis Lock

Khóa Redis là dây an toàn, không phải túi khí. Chúng làm giảm thiệt hại nhưng không ngăn chặn hoàn toàn tai nạn.

Khi sử dụng cẩn thận, chúng sẽ đơn giản hóa việc phối hợp trong các hệ thống phân tán. Được sử dụng một cách ngẫu nhiên, chúng gây ra các lỗi tinh vi và dai dẳng.

Tóm tắt

Khóa phân tán là khó khăn vì thất bại là không thể tránh khỏi. Redis cung cấp cơ chế khóa nhanh, đơn giản và thực dụng, chứ không phải cơ chế hoàn hảo.

Thiết kế để xử lý lỗi, giữ khóa ngắn, sử dụng TTL một cách nhất quán và đảm bảo các hoạt động được an toàn để thử lại. Khi được sử dụng đúng cách, khóa phân phối Redis là công cụ đáng tin cậy và hiệu quả trong hệ thống sản xuất.