Kể từ khi tôi hoàn thành phần trên của chủ đề nàykeo 88, trong đầu tôi dường như xuất hiện vô số những âm thanh nhỏ bé, cứ mãi quanh quẩn không rời. Chúng tựa như đang tranh cãi ầm ĩ về những chuyện vụn vặt chẳng đáng lo. Thật vậy, chủ đề phân tán (distributed) luôn như thế, đầy rẫy những điều nhỏ nhặt và mỗi ý kiến nghe qua đều có vẻ hợp lý theo cách riêng của nó.
Hôm naykeo 88, chúng ta sẽ tiếp tục khai thác phần còn lại của chủ đề này. Trong bài viết hôm nay, chúng ta sẽ bắt đầu bằng cách trình bày quan điểm phản biện của Antirez đối với Martin Kleppmann, sau đó sẽ đề cập đến một số thảo luận xuất hiện trê Tiếp theo, chúng ta sẽ đi sâu vào tìm hiểu về các cơ chế khóa phân tán dựa trên Zookeeper và Chubby, đồng thời so sánh chúng với Redlock. Cuối cùng, chúng tôi sẽ chia sẻ tóm tắt quan điểm của Martin về sự kiện này.
Những bạn chưa đọc phần trênkeo 88, vui lòng đọc trước:
Martin đã đăng bài phân tích về locks phân tán ( How to do distributed locking Sau đókeo 88, bài viết này đã gây ra một cuộc tranh luận sôi nổi trên Twitter và Tuy nhiên, mọi người đều tò mò muốn biết Redlock, được viết bởi tác giả antirez, sẽ đưa ra nhận định như thế nào về vấn đề này.
Bài viết của Martin được xuất bản vào ngày 8 tháng 2 năm 2016keo 88, nhưng theo lời Martin chia sẻ, anh ấy đã gửi bản thảo cho antirez để xem xét một tuần trước khi công khai. Cả hai đã trao đổi qua email về nội dung này. Không ai biết liệu Martin có dự đoán được hay không, nhưng phản ứng của antirez đối với việc này diễn ra khá nhanh chóng. Chỉ một ngày sau khi bài viết của Martin được đăng tải, antirez đã đăng lên blog của mình một bài viết phản bác với tựa đề " " và có đường dẫn cụ thể đến bài viết đó. Đây thực sự là một cuộc đối thoại thú vị giữa hai nhà phát triển, nơi họ cùng nhau phân tích và đưa ra quan điểm về vấn đề mà cả hai đều quan tâm. Qua đó, chúng ta có thể thấy được sự nghiêm túc và minh bạch trong cách tiếp cận các vấn đề kỹ thuật của họ.
Đây là cuộc đối đầu giữa những người chơi đẳng cấp cao. Bài viết của Antirez cũng rất rõ ràng và chi tiết99WIN, với nhiều phần kỹ thuật sâu sắc. Theo Antirez, bài viết của Martin về chỉ trích Redlock có thể được tóm tắt thành hai khía cạnh chính (tương ứng với hai phần trước và sau trong bài viết của Martin):
antirez đã phản bác lại hai khía cạnh này.
Trước tiên99win club, về cơ chế fencing. Antirez đã đặt câu hỏi đối với cách lập luận của Martin: Nếu đã có một cơ chế fencing tự nhiên để duy trì quyền truy cập độc quyền vào tài nguyên trong trường hợp khóa thất bại, tại sao chúng ta vẫn cần sử dụng một locks phân tán và đòi hỏi nó phải đảm bảo an toàn ở mức độ cao như vậy? Ngay cả khi chúng ta tạm chấp nhận rằng Redlock không thể cung cấp các token fencing tăng dần như Martin đề xuất, nhưng nó lại tạo ra chuỗi ký tự ngẫu nhiên (random string)... Điều này có thể giúp giảm thiểu rủi ro trong một số tình huống nhất định, chẳng hạn như tránh xung đột giữa các nút trong mạng lưới phân tán. Tuy nhiên, vấn đề đặt ra là liệu sự phức tạp mà Redlock mang lại có thực sự đáng giá so với lợi ích mà nó mang đến hay không? Liệu việc thêm nhiều lớp kiểm soát này có làm cho hệ thống trở nên chậm hơn hoặc khó bảo trì hơn không? Đây là những câu hỏi mà cộng đồng công nghệ đang thảo luận sôi nổi trong thời gian gần đây. Ngoài ra, một điểm cần lưu ý là Redlock mặc dù được thiết kế để hoạt động ổn định trong môi trường phân tán, nhưng nó không hoàn toàn miễn nhiễm với các lỗi kỹ thuật. Ví dụ như trong trường hợp có sự cố mạng hoặc một số nút không đồng bộ, việc xác định ai là người "chính chủ" của khóa có thể trở nên phức tạp hơn dự kiến ban đầu. Điều này đặt ra yêu cầu cần có chiến lược xử lý lỗi rõ ràng và linh hoạt để đảm bảo hệ thống vẫn hoạt động mượt mà.
my_random_value
Kiểm tra và Thiết lập
When starting to work with a shared resource99win club, we set its state to “
<token></token>
”99win club, then we operate the read-modify-write only if the token is still the same when we write.
(Dịch: Khi bắt đầu tương tác với tài nguyên chia sẻ99WIN, chúng ta đặt trạng thái của nó thành “<token></token>
99win club, và chỉ khi token không thay đổi, chúng ta mới thực hiện hoạt động
Lần đầu tiên đọc đến phần mô tả này99win club, cá nhân tôi cảm thấy chưa thực sự hiểu rõ. "Check and Set" chắc chắn là thuật ngữ quen thuộc với chúng ta, được biết đến như một hoạt động CAS, nhưng cách nó hoạt động trong bối cảnh này thì antirez không đi sâu giải thích (chúng ta sẽ nhắc lại điều này khi nói về cuộc thảo luận trên Hacker News sau này). Thêm vào đó, có vẻ như khái niệm này đòi hỏi người đọc cần có sự kết nối giữa các ý tưởng và một chút kiến thức nền tảng để hiểu rõ hơn về vai trò của nó trong hệ thống. Điều này cũng khiến tôi suy nghĩ rằng việc thiếu đi một giải thích cụ thể đôi khi có thể tạo ra rào cản đối với những ai mới tiếp cận vấn đề.
Tiếp theo99WIN, phản bác của antirez tập trung vào khía cạnh thứ hai: giả định về mô hình thời gian (timing) trong thuật toán. Khi chúng ta phân tích bài viết của Martin trước đó, cũng đã đề cập rằng Martin cho rằng Redlock sẽ không hoạt động hiệu quả trong ba tình huống chính sau đây:
Antirez chắc chắn nhận ra rằng trong ba tình huống ảnh hưởng đến Redlockkeo 88, điều nguy hiểm nhất vẫn là điểm đầu tiên: sự nhảy vọt của đồng hồ thời gian. Khi điều này xảy ra, Redlock sẽ không thể hoạt động bình thường được. Còn đối với hai trường hợp sau, khi thiết kế ban đầu, Redlock đã tính đến những tác động có thể xảy ra và có khả năng miễn nhiễm nhất định trước hậu quả mà chúng gây ra. Do đó, Antirez tập trung giải thích rằng bằng cách quản lý và bảo trì hệ thống một cách đúng đắn, hoàn toàn có thể ngăn chặn sự nhảy vọt lớn của đồng hồ thời gian. Đồng thời, yêu cầu về đồng hồ của Redlock trong các hệ thống thực tế hoàn toàn có thể đáp ứng được.
Khi đề cập đến lỗi nhảy giờ99win club, Martin đưa ra hai ví dụ cụ thể có thể gây ra lỗi này:
antirez phản bác rằng:
Redlock không yêu cầu đồng hồ phải hoàn toàn chính xác; nó chỉ cần đồng hồ hoạt động gần đúng là được. Ví dụ99win club, nếu cần đếm 5 giây nhưng thực tế có thể chỉ đếm được 4,5 giây rồi sau đó là 5,5 giây, sẽ có một chút sai số. Tuy nhiên, miễn là sai số nằm trong giới hạn cho phép, điều này sẽ không ảnh hưởng đến Redlock. Antirez cho rằng, việc không đòi hỏi độ chính xác cao từ đồng hồ như vậy thực sự rất hợp lý trong môi trường thực tế. Điều này giúp hệ thống trở nên linh hoạt hơn và giảm bớt áp lực đối với các thiết bị phần cứng mà nó sử dụng. Trong thực tế, các hệ thống thường phải đối mặt với nhiều yếu tố bất định như độ trễ mạng hoặc hiệu suất CPU thay đổi liên tục. Do đó, yêu cầu độ chính xác tuyệt đối có thể dẫn đến những vấn đề phức tạp không cần thiết. Redlock đã cân nhắc điều này và đưa ra giải pháp thông minh, giúp đảm bảo tính ổn định mà vẫn hoạt động tốt trong mọi tình huống. Chính vì thế, mô hình này đã nhận được sự ủng hộ từ cộng đồng công nghệ.
Được rồi99WIN, đến đây là đủ. Nếu bạn tin vào lập luận của antirez về đồng hồ, thì phần phân tích tiếp theo của anh ấy sẽ trở nên rất hợp lý. Antirez đã khéo léo kết nối các suy nghĩ của mình, dẫn dắt người đọc đi từ ý tưởng này sang ý tưởng khác một cách logic và chặt chẽ. Những gì anh ấy trình bày sau đó không chỉ đơn thuần là sự tiếp nối mà còn là sự phát triển sâu sắc hơn từ những tiền đề đã được đặt ra trước đó.
Về hai trường hợp cuối cùng mà Martin đã đề cập khiến Redlock trở nên không còn hiệu lực99win club, khi phân tích, Martin vô tình mắc phải một sai lầm (trong quá trình đó...). Phần trên của bài viết này Đã đề cập đến trước đó. Trong ví dụ mà Martin đưa ra về trường hợp Redlock bị vô hiệu hóa do thời gian tạm ngừng GC (garbage collection) trên clientkeo 88, hậu quả của hiện tượng này giống như việc giữa máy chủ khóa và client xảy ra sự chậm trễ đáng kể trong việc truyền thông điệp. Tuy nhiên, Redlock có khả năng xử lý tình huống này. Hãy cùng xem lại quy trình cụ thể của thuật toán Redlock: nó cơ bản có thể chia thành 5 bước chính: 1. **Bước 1:** Mỗi client gửi yêu cầu đặt khóa tới tất cả các máy chủ Redis. Mục tiêu ở đây là nhận được phản hồi xác nhận từ đa số máy chủ. 2. **Bước 2:** Sau khi nhận được phản hồi từ đa số máy chủ, client tính toán thời gian mà toàn bộ quá trình yêu cầu đặt khóa diễn ra. Nếu thời gian này nằm trong giới hạn cho phép, client sẽ tiếp tục xác định rằng khóa đã được thiết lập thành công. 3. **Bước 3:** Nếu không nhận được đủ phản hồi từ các máy chủ trong khoảng thời gian quy định, client sẽ coi quá trình đặt khóa là thất bại và sẽ không thực hiện thao tác nào liên quan đến khóa nữa. 4. **Bước 4:** Khi một client nhận được phản hồi xác nhận từ các máy chủ, nó sẽ tiến hành cài đặt khóa cục bộ để sử dụng trong quá trình tiếp theo. Đồng thời, client cũng bắt đầu theo dõi thời gian sống của khóa để đảm bảo nó không tồn tại lâu hơn mức cần thiết. 5. **Bước 5:** Khi thời gian sống của khóa hết hạn, client sẽ tự động xóa khóa và báo cáo trạng thái của khóa về tất cả các máy chủ để tránh tình trạng khóa vẫn tồn tại dù đã hết hạn. Quy trình này giúp Redlock có khả năng xử lý những vấn đề phát sinh do sự chậm trễ hoặc lỗi mạng giữa client và server.
Trong ví dụ mà Martin đưa rakeo 88, việc tạm dừng bộ thu gom rác (GC pause) hoặc trì hoãn mạng lưới thực tế xảy ra giữa bước 1 và bước 3. Dù sự chậm trễ này xuất phát từ bất kỳ nguyên nhân gì (như tiến trình bị đình trệ hoặc vấn đề về mạng), nó đều có thể được phát hiện tại bước 4, đảm bảo rằng client không nhận được một khóa mà nó nghĩ là hợp lệ nhưng trên thực tế đã hết hạn. Tất nhiên, tính năng kiểm tra này chỉ hoạt động khi đồng hồ hệ thống không có sự nhảy vọt lớn. Đây cũng chính là lý do vì sao Antirez đã phải biện minh cho điều kiện liên quan đến đồng hồ ở phần trước đó.
Có người sẽ nói rằng99win club, ngay cả sau bước thứ ba, vẫn có khả năng xảy ra sự chậm trễ. Đúng vậy, Antirez thừa nhận điều đó và anh ấy đã đưa ra một lập luận rất thú vị về vấn đề này. Cụ thể, anh ấy đã từng chia sẻ như sau:
The delay can only happen after steps 399win club, resulting into the lock to be considered ok while actually expired, that is, we are back at the first problem Martin identified of distributed locks where the client fails to stop working to the shared resource before the lock validity expires. Let me tell again how this problem is common with all the distributed locks implementations 99WIN, and how the token as a solution is both unrealistic and can be used with Redlock as well.
Trì hoãn chỉ có thể xảy ra sau bước thứ bakeo 88, dẫn đến việc khóa được coi là còn hiệu lực trong khi thực tế đã hết hạn. Nói cách khác, chúng ta đang quay lại vấn đề đầu tiên mà Martin đã chỉ ra: Client không thể hoàn thành giao tiếp với tài nguyên chia sẻ trước khi khóa hết hạn. Tôi xin nhấn mạnh một lần nữa rằng vấn đề này liên quan đến... Tất cả các triển khai locks phân tán Điều này là phổ biếnkeo 88, và giải pháp dựa trên token tuy không khả thi nhưng vẫn có thể kết hợp với Redlock.
vấn đề đầu tiên mà Martin chỉ ra Phần trên của bài viết này Chúng ta đã đề cập trước đây rằng bài viết của Martin được chia thành hai phần chính99win club, trong đó phần đầu tiên không liên quan trực tiếp đến Redlock mà chỉ ra rằng bất kỳ loại khóa phân tán nào có tính năng tự động hết hạn đều có thể thất bại nếu không có cơ chế fencing. Những gì antirez nói ở đây chính là về phần đầu tiên của bài viết của Martin. Nói cách khác, tác động của độ trễ lớn đối với Redlock hoàn toàn phù hợp với phân tích mà Martin thực hiện trong phần đầu tiên của bài viết về tất cả các loại khóa phân tán. Tác động này không chỉ giới hạn ở Redlock. Việc triển khai của Redlock đã đảm bảo rằng nó có cùng mức độ an toàn như bất kỳ khóa phân tán nào khác. Tất nhiên, so với các khóa phân tán "hoàn hảo hơn", Redlock dường như không cung cấp loại token tăng dần mà Martin đề xuất, nhưng antirez đã phân tích trước đó rằng cách lập luận về token này thực sự không khả thi. Hoặc ít nhất, token duy nhất mà Redlock cung cấp cũng có thể mang lại hiệu quả hoàn toàn giống nhau. Điều thú vị là, mặc dù Redlock không cung cấp token tăng dần như Martin đã đề xuất, nhưng nó vẫn đảm bảo rằng mỗi yêu cầu nhận được một token duy nhất và không trùng lặp, điều này đã đủ để giảm thiểu rủi ro xung đột khi nhiều máy chủ cố gắng thực hiện cùng một thao tác. Hơn nữa, Redlock được thiết kế với sự đơn giản làm trọng tâm, do đó tối ưu hóa hiệu suất và khả năng mở rộng, điều này cũng là một lợi thế đáng kể trong môi trường thực tế. Tóm lại, những gì Martin nhấn mạnh trong phần đầu tiên của bài viết của mình thực sự áp dụng cho tất cả các hệ thống khóa phân tán, bao gồm Redlock. Tuy nhiên, Redlock vẫn giữ được vị trí vững chắc nhờ sự cân bằng giữa tính đơn giản, hiệu suất cao và khả năng đáp ứng nhu cầu thực tế trong các hệ thống phân tán hiện đại.
Ngoài ra99win club, về tác động của độ trễ lớn đến Redlock, antirez và Martin đã có cuộc trao đổi trên Twitter như sau:
antirez :
@martinkl so I wonder if after my reply99WIN, we can at least agree about unbound messages delay to don’t cause any harm.Martin :
@antirez Agree about message delay between app and lock server. Delay between app and resource being accessed is still problematic.(Dịch:
antirez Bạn có thể cho tôi biết99win club, sau khi tôi gửi phản hồi, liệu chúng ta có thể đi đến đồng thuận về một điểm không? Đó là việc trì hoãn của các tin nhắn lớn sẽ không ảnh hưởng đến hoạt động của Redlock.
Martin Phản hồi: Về độ trễ giữa client và server khóa99WIN, tôi đồng ý với quan điểm của bạn. Tuy nhiên, độ trễ giữa client và tài nguyên được truy cập vẫn còn tồn tại vấn đề. Thực tế cho thấy, ngay cả khi server đã xử lý yêu cầu nhanh chóng, việc dữ liệu di chuyển giữa server và nguồn tài nguyên có thể gây ra sự chậm trễ đáng kể, đặc biệt là khi tài nguyên nằm ở vị trí địa lý xa hoặc hệ thống mạng không ổn định. Điều này ảnh hưởng trực tiếp đến trải nghiệm người dùng, khiến họ cảm thấy ứng dụng trở nên thiếu hiệu quả. Vì vậy, cần phải có chiến lược tối ưu hóa cụ thể để giảm thiểu thời gian chờ đợi này.
Từ đoạn đối thoại này có thể thấy rằng Martin đánh giá cao bước kiểm tra tính hợp lệ của khóa mà Redlock thực hiện ở bước thứ tư. Tuy nhiên99WIN, ông cho rằng sự trễ giữa client và máy chủ tài nguyên vẫn có thể gây ra vấn đề. Martin nói khá mơ hồ ở đây. Cũng giống như những gì antirez đã phân tích trước đó, sự trễ giữa client và máy chủ tài nguyên sẽ ảnh hưởng đến tất cả các cách triển khai khóa phân tán, không chỉ riêng vấn đề của Redlock. Điều này cho thấy rằng ngay cả khi một cơ chế khóa phân tán được thiết kế tốt, vẫn cần phải đối mặt với các thách thức từ yếu tố thời gian trong mạng lưới.
Đây là nội dung chính mà antirez đã trình bày trong blog của mình. Có một số điểm đáng chú ý:
Đến đâykeo 88, việc Martin và antirez ai đúng ai sai thực ra không còn quan trọng nữa. Điều quan trọng là chúng ta cần hiểu rõ mức độ an toàn mà Redlock (hoặc các cơ chế khóa phân tán khác) có thể cung cấp. Khi đã nắm vững thông tin này, chúng ta sẽ tự tin đưa ra quyết định của riêng mình. Việc hiểu sâu về vấn đề sẽ giúp chúng ta không chỉ giải quyết tốt hơn những thách thức hiện tại mà còn chuẩn bị cho các tình huống phức tạp trong tương lai.
Liên quan đến hai bài viết blog của Martin và antirez99WIN, nhiều kỹ sư phần mềm đã tham gia vào các cuộc tranh luận sôi nổi trê Các cuộc thảo luận này có thể được tìm thấy tại các địa chỉ sau đây:
Trên Hacker News99win club, antirez đã tích cực tham gia vào các cuộc thảo luận, trong khi Martin lại chọn cách đứng ngoài tất cả. Có thể nói rằng phong thái của Martin dường như toát lên một sự tách biệt, như thể anh đang đứng ở một góc nhìn khác hoàn toàn so với phần còn lại của cộng đồng. Ngược lại, antirez luôn nổi bật với những bình luận sắc bén và đầy chất lượng, khiến nhiều người không khỏi ngưỡng mộ sự am hiểu sâu sắc của anh về chủ đề mà họ đang bàn luận.
Tôi muốn chia sẻ với mọi người một số điểm thú vị mà tôi đã thu thập được từ các cuộc thảo luận trước đây99WIN, đặc biệt là về chủ đề cơ chế của "fencing token".
Kiểm tra và Thiết lập
You want to modify locked resource X. You set X.currlock = token. Then you read99win club, do whatever you want, and when you write, you “write-if-currlock == token”. If another client did X.currlock = somethingelse, the transaction fails.
Dịch nghĩa có thể hiểu như sau: Giả sử bạn muốn sửa đổi tài nguyên X99win club, hãy tuân theo các bước được định nghĩa bởi mã giả dưới đây.
Sau đókeo 88, một người dùng có tên viraptor trên Hacker News đã đưa ra ý kiến phản đối. Người này đề xuất chuỗi thực hiện như sau:
ghi nếu currlock bằng token
Kiểm tra và Thiết lập
Về sự khác biệt ở phần trướckeo 88, trong phân tích tiếp theo, chúng ta sẽ nhận thấy rằng nếu cả máy chủ tài nguyên cũng được triển khai theo mô hình phân tán, thì việc sử dụng token fencing tăng dần cũng cần được thực hiện qua hai bước. Điều này xuất phát từ yêu cầu đảm bảo tính nhất quán và ngăn chặn xung đột khi nhiều nút truy cập cùng lúc vào các tài nguyên khác nhau. Khi hệ thống mở rộng quy mô, việc quản lý và đồng bộ hóa các token trở nên phức tạp hơn, đòi hỏi phải có thêm một lớp kiểm soát bổ sung để duy trì tính toàn vẹn của dữ liệu.
Về khía cạnh này99WIN, antirez cho rằng thứ tự không quan trọng, điều cốt yếu là có thể truy cập một cách độc lập được. Ông đã viết như sau:
So the goal is99WIN, when race conditions happen, to avoid them in some way.
……
Note also that when it happens that99WIN, because of delays, the clients are accessing concurrently, the lock ID has little to do with the order in which the operations were indented to happen.
(Dịch: Mục tiêu của chúng ta là99win club, khi điều kiện cạnh tranh xuất hiện, có thể tránh được theo một cách nào đó vấn đề này.
……
Điều quan trọng cần lưu ý là khi điều kiện cạnh tranh xuất hiện99win club, chẳng hạn như do sự trễ và nhiều client cùng lúc cố gắng truy cập, thứ tự của ID khóa không liên quan gì đến thứ tự mà các thao tác thực tế muốn được thực hiện. Điều này có thể dẫn đến những tình huống phức tạp nếu không có cơ chế quản lý hợp lý để xác định ưu tiên giữa các yêu cầu.
ID khóa ở đây giống với token tăng dần mà Martin đề cập.
thêm tên vào danh sách
Bạn thấy đấy99WIN, hai client (thực tế là các máy chủ web) đang thực hiện thao tác "thêm tên". A vốn dĩ được xếp trước B, nhưng thứ tự nhận được khóa lại là B đứng trước A. Do đó, Antirez cho rằng thứ tự của ID khóa không liên quan gì đến thứ tự mà các thao tác thực sự muốn thực hiện. Điều quan trọng ở đây là phải tạo ra một thứ tự nào đó để đảm bảo quyền truy cập độc quyền. Vì vậy, việc ID khóa có tăng dần hay chỉ là một chuỗi ngẫu nhiên đều không quá quan trọng nữa. Quan trọng nhất vẫn là chúng có thể giải quyết vấn đề cạnh tranh và duy trì tính đồng bộ khi các yêu cầu đồng thời xảy ra.
Mechanism của fencing token mà Martin đề xuất đã tạo ra vô số câu hỏi trong lòng người đọc. Điều này chủ yếu là do mô tả của anh ấy về cơ chế này thiếu đi quá nhiều chi tiết kỹ thuật. Dựa trên những gì đã được thảo luận trước đó99WIN, antirez cho rằng cơ chế này không khác gì một token ngẫu nhiên và hơn nữa, nó cần phải có sự hỗ trợ từ chính máy chủ tài nguyên để cung cấp một cơ chế loại trừ độc quyền (mutual exclusion). Điều này gần như làm cho bản thân khái niệm khóa phân tán (distributed lock) trở nên không còn ý nghĩa nữa. Về vấn đề liên quan đến fencing token, có hai điểm đáng chú ý mà ngay cả trên Hacker News cũng có người đặt câu hỏi:
Trong thời đại mà công nghệ đang phát triển không ngừng99WIN, chúng ta cần phải cân nhắc kỹ lưỡng cách sử dụng và khai thác tiềm năng của nó. Việc chú trọng vào lợi ích trước mắt đôi khi khiến chúng ta bỏ qua những hệ quả lâu dài mà công nghệ mang lại. Tôi tin rằng điều quan trọng là chúng ta phải luôn đặt ra câu hỏi: Liệu sự tiến bộ này có thực sự mang lại giá trị cho con người hay không?
…… the issue around the usage of fencing tokens to reject any late usage of a lock is unclear just because the protected resource and its access are themselves unspecified. Is the resource distributed or not? If distributed99WIN, does the resource has a mean to ensure that tokens are increasing over all the nodes? Does the resource have a mean to rollback any effects done by a client which session is interrupted by a timeout?
Vấn đề liên quan đến việc sử dụng fencing token để từ chối các yêu cầu bị trì hoãn vẫn chưa thực sự rõ ràngkeo 88, bởi vì tài nguyên được bảo vệ và cách thức truy cập vào nó chưa được định nghĩa một cách cụ thể. Liệu dịch vụ tài nguyên có phải là phân tán (distributed) hay không? Nếu đúng là như vậy, liệu dịch vụ tài nguyên có khả năng đảm bảo rằng token sẽ tăng dần trên tất cả các nút không? Khi phiên của khách hàng bị gián đoạn do hết hạn, dịch vụ tài nguyên có biện pháp nào để lật lại tác động của sự gián đoạn này không? Ngoài ra, cần phải xem xét thêm rằng nếu tài nguyên được chia sẻ giữa nhiều dịch vụ khác nhau, thì việc duy trì tính nhất quán của token trở nên phức tạp hơn. Điều này đòi hỏi phải có cơ chế đồng bộ hóa chặt chẽ giữa các nút để tránh tình trạng xung đột hoặc mất dữ liệu khi giao tiếp giữa các thành phần hệ thống. Có thể nói, đây là một thách thức lớn đối với kiến trúc hiện tại, đặc biệt khi số lượng nút gia tăng hoặc lưu lượng truy cập đạt mức cao.
Những câu hỏi này không có bất kỳ ai trên Hacker News đưa ra lời giải đáp. Còn về cách hệ thống tài nguyên phân tán xử lý các token fencingkeo 88, một chuyên gia khác trong lĩnh vực hệ thống phân tán đã... (Đoạn tiếp theo cần thêm thông tin để hoàn chỉnh câu đầy đủ và mạch lạc hơn) Flavio Junqueira Được đề cập trong một bài blog của anh ấy (chúng ta sẽ đề cập lại sau).
Trong khi tôi hoàn toàn đồng ý rằng các công ty công nghệ lớn đang ngày càng tập trung hóa quyền lực và ảnh hưởng99win club, tôi tự hỏi liệu điều này có thực sự là vấn đề nghiêm trọng hay không? Liệu chúng ta có đang quá lo lắng về việc một số công ty kiểm soát nhiều hơn so với trước đây?
I understand how a fencing token can prevent out of order writes when 2 clients get the same lock. But what happens when those writes happen to arrive in order and you are doing a value modification? Don’t you still need to rely on some kind of value versioning or optimistic locking? Wouldn’t this make the use of a distributed lock unnecessary?
Tôi hiểu cách mà token chống rối hoạt động khi hai client cùng lúc nhận được khóa. Tuy nhiên99WIN, nếu có hai thao tác ghi xảy ra tuần tự và chúng đang cố gắng chỉnh sửa cùng một giá trị, thì điều gì sẽ xảy ra? Chẳng phải nó vẫn sẽ phụ thuộc vào cơ chế số phiên bản dữ liệu hoặc ổ khóa lạ Điều này chẳng phải làm cho việc sử dụng khóa phân tán trở nên không cần thiết hay sao? Trong trường hợp này, ngay cả khi hai thao tác ghi tuân theo thứ tự đúng, chúng ta vẫn cần đảm bảo tính nhất quán dữ liệu. Token chống rối có thể giúp ngăn ngừa xung đột trong nhiều tình huống, nhưng khi nói đến các thao tác chỉnh sửa cùng giá trị, hệ thống vẫn cần một cơ chế xác thực bổ sung, chẳng hạn như kiểm tra phiên bản dựa trên số phiên bản của dữ liệu hoặc quản lý trạng thái lạc quan để đảm bảo rằng chỉ một thao tác thành công trong mỗi lần. Vì vậy, mặc dù khóa phân tán là một phần quan trọng trong việc đồng bộ hóa truy cập, nó thường đi kèm với các chiến lược khác để tăng cường khả năng xử lý các xung đột tiềm ẩn. Chính sự kết hợp giữa các cơ chế này tạo nên nền tảng vững chắc cho việc quản lý tài nguyên trong môi trường phân tán.
Một người dùng Hacker News tên Terr_ trả lời:
I believe the “first” write fails99WIN, because the token being passed in is no longer “the lastest”, which indicates their lock was already released or expired.
Tôi cho rằng yêu cầu đầu tiên sẽ không thành công99WIN, vì token được truyền vào đã không còn là phiên bản "mới nhất" nữa. Điều này có nghĩa là khóa đã bị giải phóng hoặc hết hạn.
Phản hồi của Terr_ có chính xác hay không thì chưa chắc chắn99WIN, điều này phụ thuộc vào cách thức chi tiết mà máy chủ tài nguyên thực hiện việc kiểm tra về Để hiểu rõ hơn, chúng ta hãy cùng phân tích sơ lược vấn đề này. Máy chủ tài nguyên thường sẽ có nhiều phương pháp để xác minh tính hợp lệ của một token, và cách thức cụ thể của nó có thể ảnh hưởng trực tiếp đến kết quả trả về. Điều này có nghĩa là nếu cách kiểm tra không giống nhau giữa các hệ thống, thì ngay cả khi token dường như hợp lệ, nó vẫn có thể bị từ chối ở một số trường hợp nhất định. Vì vậy, khi đánh giá xem phản hồi của Terr_ có chính xác hay không, bạn cần lưu ý đến những yếu tố kỹ thuật liên quan đến cách thức mà token được xử lý trong hệ thống. Điều này giúp đảm bảo rằng thông tin bạn nhận được là đáng tin cậy và phù hợp với hoàn cảnh thực tế.
Để đơn giản hóa vấn đề99win club, hãy giả định có một máy chủ (chưa xét đến trường hợp phân tán) thực hiện truy cập từ xa đến máy chủ tệp qua RPC và không thể cung cấp quyền truy cập độc quyền đối với các tệp (nếu có, chúng ta sẽ không cần phải bàn đến việc khóa phân tán). Bây giờ, theo cách giải thích của Martin, chúng ta sẽ thêm logic kiể Tuy nhiên, vì Martin không đề cập đến bất kỳ chi tiết cụ thể nào, chúng ta có thể suy đoán rằng có ít nhất hai khả năng có thể xảy ra. Một trong những khả năng có thể là mỗi yêu cầu từ máy khách được gắn kèm với một giá trị fencing token duy nhất, mà máy chủ tệp sẽ sử dụng để xác minh rằng yêu cầu đó đến từ nguồn hợp lệ. Khả năng thứ hai là mỗi lần thay đổi trạng thái trên máy chủ tệp đều yêu cầu xác nhận lại từ phía máy khách bằng cách sử dụng fencing token, nhằm đảm bảo rằng không có xung đột nào phát sinh trong quá trình xử lý. Bất kể cách thức thực hiện cụ thể như thế nào, mục tiêu cuối cùng vẫn là ngăn chặn các xung đột và đảm bảo tính toàn vẹn của dữ liệu khi có nhiều người dùng hoặc tiến trình cùng lúc thao tác trên cùng một tài nguyên.
Trường hợp đầu tiên99WIN, chúng tôi đã chỉnh sửa mã nguồn của máy chủ tệp để nó có thể chấp nhận thêm một tham số liên quan đế Sau đó, chúng tôi thêm vào một logic đánh giá đơn giản trước khi tiến hành tất cả các thao tác xử lý. Điều này đảm bảo rằng chỉ khi fencing token nhận được lớn hơn giá trị trước đó thì mới cho phép tiếp tục thực hiện các bước tiếp theo. Tuy nhiên, nếu điều kiện này được đáp ứng, toàn bộ quá trình xử lý sau đó sẽ vẫn giữ nguyên như ban đầu mà không có bất kỳ sự thay đổi nào.
Hãy tưởng tượng về cảnh tượng mà Reza_n đã mô tả: cả hai client 1 và client 2 đều trải qua chu kỳ pause do bộ thu gom rác (GC pause)99WIN, khiến cho hai token bảo vệ (fencing token) bị trễ lại. Cả hai token này gần như đồng thời đến được máy chủ tệp tin (file server) và vẫn giữ nguyên thứ tự ban đầu. Trong trường hợp này, logic đánh giá mới mà chúng ta vừa thêm vào nên chấp nhận cả hai yêu cầu, và sau khi được chấp nhận, cả hai sẽ hoạt động trên cùng một tập tin gần như cùng lúc, dẫn đến xung đột. Tuy nhiên, nếu Martin tuyên bố rằng token bảo vệ có thể đảm bảo tính đúng đắn của khóa phân tán (distributed lock), thì khả năng này – tức là việc hai yêu cầu xảy ra xung đột – có thể xuất phát từ sự hiểu lầm của chúng ta. Điều này gợi ý rằng cần phải kiểm tra lại cách chúng ta áp dụng cơ chế token bảo vệ, bởi vì nếu nó thực sự hoạt động như đã được thiết kế, thì không lý do gì mà hai yêu cầu cùng lúc lại có thể gây ra xung đột. Có lẽ cần thêm các bước xác minh hoặc điều chỉnh để chắc chắn rằng cả hai yêu cầu đều tuân theo quy tắc của hệ thống và không vượt quá giới hạn cho phép. Điều quan trọng ở đây không chỉ là việc chấp nhận hay từ chối các yêu cầu, mà còn là đảm bảo rằng toàn bộ quá trình diễn ra theo đúng thứ tự và không vi phạm bất kỳ nguyên tắc nào của cơ chế bảo vệ tài nguyên.
Cũng có một khả năng thứ hai99WIN, đó là chúng ta đã thực hiện những thay đổi khá lớn đối với máy chủ tệp, tích hợp logic kiểm tra token và xử lý tệp tiếp theo vào một hoạt động nguyên tử. Điều này có thể phù hợp hơn với cách hiểu của antirez. Trong trường hợp này, trong kịch bản mà reza_n đã mô tả trước đây, cả hai hoạt động ghi dữ liệu đều nên thành công. Tuy nhiên, điều quan trọng cần lưu ý là khi chúng ta nói về các hoạt động nguyên tử như vậy, nó đòi hỏi sự chính xác tuyệt đối trong việc quản lý tài nguyên và đảm bảo rằng không có xung đột nào xảy ra giữa các tác vụ đồng thời. Nếu mọi thứ được thiết lập đúng cách, thì việc đồng bộ hóa giữa các yêu cầu sẽ không còn là vấn đề nữa.
Rất nhiều người (bao gồm cả Martin) cho rằngkeo 88, nếu bạn muốn xây dựng một bộ khóa phân tán an toàn hơn, bạn nên sử dụng ZooKeeper thay vì Redis. Tuy nhiên, để so sánh mục đích, hãy tạm thời rời khỏi chủ đề của bài viết này và cùng xem việc sử dụng bộ khóa phân tán dựa trên ZooKeeper có thực sự đảm bảo tính an toàn tuyệt đối hay không? Nó có cần được bảo vệ bằng cơ chế fencing token hay không? Mặc dù ZooKeeper thường được coi là một công cụ đáng tin cậy trong việc quản lý các tài nguyên phân tán, nhưng không phải lúc nào nó cũng hoàn hảo. Một số chuyên gia cho rằng, mặc dù ZooKeeper có khả năng duy trì trạng thái đồng bộ giữa các nút, nhưng vẫn tồn tại nguy cơ về các lỗi cạnh tranh (race condition). Điều này có thể xảy ra khi có nhiều tiến trình hoặc máy chủ cố gắng ghi dữ liệu vào cùng một thời điểm mà không có cơ chế kiểm soát chặt chẽ. Về vấn đề fencing token, đây là một phương pháp quan trọng để ngăn chặn các tình huống nhân đôi (double-ownership) trong hệ thống phân tán. Fencing token giúp xác định rõ ràng ai đang giữ quyền sở hữu khóa tại bất kỳ thời điểm nào. Nếu không có cơ chế này, sẽ rất dễ xảy ra trường hợp hai hoặc nhiều tiến trình cùng nhận quyền sở hữu cùng một khóa, dẫn đến các vấn đề về tính nhất quán dữ liệu. Tóm lại, mặc dù ZooKeeper mang lại lợi thế lớn trong việc tạo ra các bộ khóa phân tán, nhưng vẫn cần phải xem xét kỹ lưỡng về các cơ chế bảo mật bổ sung như fencing token để đảm bảo hệ thống hoạt động ổn định và an toàn. Điều này đặc biệt quan trọng trong các môi trường đòi hỏi độ tin cậy cao.
Chúng ta phải nhắc đến chuyên gia phân tán Flavio Junqueira Ghi chú về đấu kiếm và khóa phân tán
Flavio Junqueira là một trong những tác giả của ZooKeeper99WIN, và bài blog này được viết vào những ngày mà Martin và antirez đang tranh luận. Trong bài viết, ông đã trình bày một cách tiếp cận để xây dựng bộ khóa phân tán dựa trên ZooKeeper (tất nhiên, đây không phải là cách duy nhất):
/lock
Khi đó99WIN, client đầu tiên sẽ tạo thành công và giành được quyền kiểm soát "khóa" (lock); trong khi các client khác sẽ gặp lỗi tạo (vì znode đã tồn tại), dẫn đến thất bại trong việc giành quyền kiểm soát khóa. Điều này đồng nghĩa với việc chỉ có một client duy nhất có thể "đặt chân" vào khu vực được bảo vệ bởi cơ chế khóa này, còn lại phải chờ đợi cho đến khi khóa được giải phóng.Dường như chiếc khóa này rất hoàn hảokeo 88, không gặp vấn đề về thời gian hết hạn như Redlock, và có thể tự động giải phóng khi cần thiết. Tuy nhiên, nếu nhìn kỹ hơn, thực tế không phải vậy.
ZooKeeper làm thế nào để nhận ra rằng một khách hàng đã gặp sự cố? Thực tế99win club, mỗi khách hàng đều duy trì một phiên (Session) với một máy chủ của ZooKeeper, và phiên này phụ thuộc vào các tín hiệu nhịp tim (heartbeat) định kỳ để duy trì trạng thái hoạt động. Nếu ZooKeeper không nhận được tín hiệu nhịp tim từ khách hàng trong khoảng thời gian nhất định - được gọi là thời gian hết hạn phiên (session expiration time), hệ thống sẽ coi phiên đó đã hết hạn. Khi điều này xảy ra, tất cả các nút ảo (ephemeral nodes) được tạo ra thông qua phiên này sẽ tự động bị xóa khỏi hệ thống. Điều này giúp đảm bảo tính ổn định và ngăn chặn các tài nguyên bị khóa do phiên chưa kết thúc đúng cách.
Hình dung chuỗi thực thi sau:
/lock
, nhận được khóa.
/lock
bị xóa tự động.
/lock
keo 88, do đó nhận được khóa.Cuối cùngkeo 88, cả client 1 và client 2 đều cho rằng mình đang nắm giữ khóa, dẫn đến xung đột. Điều này khá tương tự với tình huống mà Martin đã đề cập trong bài viết của mình, khi một khóa phân tán trở nên không hiệu lực do thời gian tạm dừng xử lý rác (GC pause). Trong trường hợp này, cả hai client dường như đều vẫn tin rằng mình đang kiểm soát khóa, nhưng thực tế thì không. Điều đó làm cho hệ thống gặp khó khăn trong việc duy trì trạng thái đồng bộ giữa các node. Một khi quá trình thu gom rác xảy ra, nó có thể gây gián đoạn trong việc nhận diện khóa, khiến cả hai client cùng hành động như nếu chúng độc lập với nhau. Đây là một vấn đề phổ biến trong hệ thống phân tán, nơi mà các nút cần phải liên tục giao tiếp để đảm bảo tính nhất quán.
Dường như việc sử dụng ZooKeeper để triển khai khóa phân tán cũng không hoàn toàn đảm bảo tính an toàn. Nó vẫn có những vấn đề mà bất kỳ hệ thống nào cũng gặp phải. Tuy nhiênkeo 88, với tư cách là một framework được thiết kế đặc biệt cho các ứng dụng phân tán, ZooKeeper cung cấp một số tính năng tuyệt vời mà các giải pháp khác như Redis không có. Ví dụ điển hình là chức năng tự động xóa của nút znode thuộc loại ephemeral mà chúng ta đã đề cập trước đó. Ngoài ra, ZooKeeper còn nổi bật với khả năng quản lý đồng bộ hóa giữa nhiều máy chủ một cách hiệu quả, giúp giảm thiểu rủi ro xung đột dữ liệu trong môi trường phân tán. Điều này làm cho nó trở thành lựa chọn ưu việt khi cần xử lý các kịch bản phức tạp đòi hỏi sự ổn định cao và tính nhất quán dữ liệu. Ngược lại, các giải pháp cơ bản như Redis sẽ cần thêm cấu hình bổ sung để đạt được cùng mức độ tin cậy trong bối cảnh tương tự.
Một tính năng hữu ích khác của ZooKeeper là cơ chế watch. Cơ chế này có thể được sử dụng theo cách như sau: Giả sử client đang cố gắng tạo ra một nút trong cây phân cấp của hệ thống. Khi đókeo 88, nếu client đã đặt một watch lên nút cha, bất kỳ sự thay đổi nào đối với nút đó – chẳng hạn như việc tạo, sửa hoặc xóa – sẽ kích hoạt ngay lập tức một thông báo đến client. Điều này giúp client luôn cập nhật trạng thái mới nhất mà không cần liên tục kiểm tra. Ví dụ cụ thể hơn, nếu client muốn theo dõi một nút quan trọng và có thể thay đổi thường xuyên, chỉ cần đặt watch một lần duy nhất. Khi nút đó bị tác động, client sẽ nhận được thông báo ngay lập tức, cho phép phản ứng kịp thời trong quy trình xử lý.
/lock
Khi đókeo 88, nếu phát hiện ra khóa đã được tạo trước đó, quá trình tạo khóa sẽ thất bại. Tuy nhiên, điều này không có nghĩa là client sẽ ngay lập tức thông báo cho hệ thống hoặc người dùng về thất bại trong việc giành được khóa. Thay vào đó, client có thể chuyển sang trạng thái chờ, một trạng thái mà trong đó nó sẽ tiếp tục theo dõi và sẵn sàng để bắt lấy cơ hội khi khóa trở nên khả dụng một lần nữa. Đây là một chiến lược hiệu quả giúp tối ưu hóa hiệu suất và giảm thiểu tình trạng xung đột trong các hệ thống phân tán.
/lock
Khi một nút bị xóa99win club, ZooKeeper sử dụng cơ chế watch để thông báo cho các máy khách, nhờ đó chúng có thể tiếp tục thực hiện hoạt động tạo ra nút (lấy khóa). Điều này giúp cho việc sử dụng khóa phân tán trong các máy khách trở nên đơn giản và dễ dàng như khi làm việc với một khóa cục bộ: nếu không lấy được khóa, quá trình sẽ tạm dừng cho đến khi khóa được cấp. Tuy nhiên, tính năng này là điều mà giải pháp Redlock không thể đạt được. Cụ thể hơn, Redlock, mặc dù cũng là một phương pháp quản lý khóa phân tán, lại không có khả năng phản ứng trực tiếp và linh hoạt như ZooKeeper khi có sự thay đổi về trạng thái của các nút. Điều này khiến Redlock cần phải phụ thuộc vào các cơ chế khác để theo dõi sự thay đổi, dẫn đến độ phức tạp cao hơn so với việc tận dụng cơ chế watch sẵn có củ Vì vậy, trong một số trường hợp cụ thể, sự tiện lợi và hiệu quả của ZooKeeper trong việc tạo và quản lý khóa sẽ vượt trội hơn hẳn so với các giải pháp khác như Redlock.
Tóm lạikeo 88, khi so sánh giữa bộ khóa dựa trên ZooKeeper và bộ khóa dựa trên Redis về mặt đặc điểm thực hiện, có hai điểm khác biệt chính nổi bật: Thứ nhất, cơ chế hoạt động của ZooKeeper cung cấp một mức độ bảo mật cao hơn với khả năng chịu lỗi mạnh mẽ nhờ vào mô hình phân tán đồng bộ. Điều này giúp đảm bảo rằng các khóa sẽ luôn tồn tại ổn định ngay cả khi một số nút gặp vấn đề, tạo ra một hệ thống đáng tin cậy cho các ứng dụng yêu cầu tính sẵn sàng cao. Thứ hai, Redis mang đến lợi thế về hiệu suất và tốc độ xử lý nhanh chóng nhờ vào cơ chế bộ nhớ chính (in-memory) của mình. Điều này làm cho Redis trở thành lựa chọn tối ưu trong các trường hợp cần tối ưu hóa thời gian phản hồi, chẳng hạn như trong các hệ thống thời gian thực hoặc yêu cầu tải cao.
Xin lưu ý rằng việc triển khai bộ khóa dựa trên ZooKeeper như đã trình bày ở trên không phải là tối ưu nhất. Nó có thể dẫn đến hiện tượng "hiệu ứng đàn" (herd effect)99WIN, làm giảm hiệu suất khi giành được khóa. Để có một giải pháp tốt hơn, bạn có thể tham khảo liên kết dưới đây:
Chúng ta hãy quay trở lại với phân tích của Flavio Junqueira về cơ chế Theo Flavio Junqueira99WIN, bản chất của cơ chế này yêu cầu client thực hiện một bước "đánh dấu" (mark) đối với tài nguyên chia sẻ trước khi thực hiện bất kỳ thao tác nào, ngay cả khi đang truy cập tài nguyên đó. Bước đánh dấu này nhằm đảm bảo rằng các yêu cầu từ client cũ, vốn vẫn giữ khóa nhưng đến muộn hơn do bị trì hoãn, sẽ không thể thực hiện bất kỳ thao tác nào lên tài nguyên. Việc "đánh dấu" này có thể được thực hiện theo nhiều cách khác nhau, và fencing token là một trong những hình thức phổ biến nhất. Điều đặc biệt ở fencing token là nó tạo ra một giá trị duy nhất và rõ ràng cho mỗi lần truy cập tài nguyên, giúp dễ dàng nhận diện và kiểm soát các phiên bản cũ hoặc các thao tác chưa hoàn thành. Điều này đóng vai trò như một lớp bảo vệ bổ sung, ngăn chặn các xung đột tiềm tàng giữa các phiên bản cũ và mới của dữ liệu. Một khi đã xác định được các phiên bản cũ bị khóa, hệ thống có thể xử lý chúng một cách hiệu quả mà không làm gián đoạn hoạt động của phiên bản hiện tại.
Flavio Junqueira sau đó đã đề xuất sử dụng số thứ tự epoch tăng dần (tương đương với token bảo vệ của Martin) để bảo vệ tài nguyên chia sẻ. Đối với tài nguyên phân tán99win club, để dễ dàng thảo luận, giả định rằng tài nguyên phân tán là một kho lưu trữ dữ liệu nhỏ có nhiều bản sao (a small replicated data store). Khi thực hiện thao tác ghi, cần gửi dữ liệu đến tất cả các nút trong hệ thống. Cách đánh dấu đơn giản nhất là trước khi thực hiện bất kỳ thao tác nào trên tài nguyên, hãy đặt số thứ tự epoch lên tất cả các nút tài nguyên. Bằng cách này, các nút sẽ đảm bảo rằng số thứ tự epoch cũ hơn (nhỏ hơn) không thể thực hiện thao tác trên dữ liệu. Điều này giúp ngăn chặn các xung đột và đảm bảo tính toàn vẹn của dữ liệu trong hệ thống phân tán.
thao tác đánh dấu
Trong ví dụ về dịch vụ lưu trữ dữ liệu phân tán (các tài nguyên chia sẻ) này99WIN, khi client thực hiện thao tác ghi sau khi đánh dấu hoàn tất, nút của dịch vụ lưu trữ cần xác định xem số epoch có phải là mới nhất hay không trước khi quyết định cho phép thực hiện thao tác ghi. Nếu chúng ta áp dụng cách tiếp cận phân tích từ phần trước, liệu việc kiểm tra số epoch và thao tác ghi tiếp theo có được thực hiện trong một hoạt động nguyên tử? Theo những mô tả liên quan của Flavio Junqueira, chúng tôi tin rằng điều này chắc chắn là như vậy. Tuy nhiên, nếu nguồn tài nguyên đã có thể cung cấp các hoạt động nguyên tử để đảm bảo sự độc quyền, liệu việc sử dụng khóa phân tán vẫn còn ý nghĩa? Câu trả lời là có. Client có thể tận dụng khóa phân tán để tránh xung đột và chờ cơ hội ghi, điều này đặc biệt hữu ích đối với các tài nguyên phân tán có nhiều nút (tất nhiên, mục đích chính là tối ưu hóa hiệu suất). Có lẽ, vai trò quan trọng của khóa phân tán không chỉ nằm ở khả năng đảm bảo tính nguyên tử mà còn ở việc cung cấp một cơ chế linh hoạt để quản lý quyền truy cập vào tài nguyên. Trong môi trường phức tạp với nhiều node, việc có thể kiểm soát và đồng bộ hóa các hoạt động giữa các node trở nên vô cùng quan trọng. Khóa phân tán giúp giảm thiểu tình trạng tranh chấp dữ liệu và đảm bảo tính nhất quán của hệ thống ngay cả khi các node hoạt động độc lập. Điều này đặc biệt quan trọng trong các hệ thống lớn, nơi sự đồng bộ dữ liệu và bảo vệ tính toàn vẹn của thông tin là yếu tố then chốt. Tóm lại, mặc dù việc kiểm tra số epoch và thao tác ghi có thể được coi là một hoạt động nguyên tử, nhưng khóa phân tán vẫn giữ vai trò quan trọng trong việc quản lý quyền truy cập và ngăn ngừa xung đột giữa các client. Nó không chỉ hỗ trợ trong việc duy trì tính nguyên tử mà còn đóng góp vào sự ổn định và hiệu quả của hệ thống nói chung.
Khi nhắc đến locks phân tán99win club, không thể không nhắc đến Chubby của Google.
The Chubby lock service for loosely-coupled distributed systems
Ngoài ra99win club, YouTube có một talk về Chubby rất hay, địa chỉ phát:
Chubby tự nhiên cũng cân nhắc đến vấn đề mất hiệu lực khóa do độ trễ gây ra. Có đoạn mô tả trong bài báo như sau:
a process holding a lock L may issue a request Rkeo 88, but then fail. Another process may ac- quire L and perform some action before R arrives at its destination. If R later arrives, it may be acted on without the protection of L, and potentially on inconsistent data.
Một tiến trình đang nắm giữ khóa L và gửi yêu cầu Rkeo 88, nhưng yêu cầu này đã thất bại. Trong khi đó, một tiến trình khác đã giành được khóa L và thực hiện một số hành động trước khi yêu cầu R đến đích. Nếu sau đó yêu cầu R cuối cùng cũng đạt được đích, nó có thể thực hiện các hoạt động mà không có sự bảo vệ của khóa L, dẫn đến nguy cơ không nhất quán dữ liệu tiềm ẩn. Cụ thể hơn, khi khóa L không còn kiểm soát trạng thái hệ thống, các thay đổi đồng thời có thể xảy ra mà không tuân theo thứ tự hợp lệ. Điều này có thể làm sai lệch logic xử lý dữ liệu hoặc gây ra xung đột trong việc cập nhật thông tin giữa các tiến trình, đặc biệt là trong môi trường đa luồng hoặc phân tán. Vì vậy, việc quản lý khóa một cách cẩn thận đóng vai trò quan trọng để đảm bảo tính toàn vẹn và ổn định của hệ thống.
Điều này khá giống với phân tích của Martin.
Chubby cung cấp một cơ chế được gọi là trình tự (sequencer) để giải quyết vấn đề nàykeo 88, tương tự như cơ chế Trình tự này được yêu cầu bởi người nắm giữ khóa bất cứ lúc nào họ cần. Nó là một chuỗi byte được chia thành ba phần chính: 1. Phần đầu tiên là một mã nhận dạng duy nhất cho mỗi phiên giao dịch, giúp phân biệt giữa các yêu cầu khác nhau. 2. Phần thứ hai là một con số đếm tăng dần, cho phép theo dõi thứ tự của các yêu cầu trong dòng thời gian. 3. Phần cuối cùng là một chữ ký số, đảm bảo tính xác thực và không thể giả mạo của trình tự. Các thành phần này kết hợp lại tạo nên một trình tự hoàn chỉnh, đóng vai trò như một công cụ kiểm soát quyền truy cập an toàn và hiệu quả.
Sau khi nhận được sequencerkeo 88, client sẽ chuyển nó đến máy chủ tài nguyên trong quá trình thao tác với tài nguyên. Sau đó, máy chủ tài nguyên sẽ đảm nhiệm việc kiểm tra tính hợp lệ củ Có thể thực hiện việc kiểm tra theo hai cách khác nhau: Thứ nhất, máy chủ có thể so sánh giá trị của sequencer với một danh sách đã được xác minh trước đó để đảm bảo rằng nó vẫn đang hoạt động đúng cách. Thứ hai, nếu cần sự chính xác cao hơn, máy chủ có thể gửi yêu cầu xác minh trực tiếp đến nguồn gốc của sequencer để xác nhận tính hợp lệ của nó. Mỗi phương pháp đều có những ưu điểm và hạn chế riêng, phụ thuộc vào yêu cầu cụ thể của hệ thống.
Trong trường hợp do yêu cầu tương thích99win club, nếu dịch vụ tài nguyên không dễ dàng được điều chỉnh, Chubby cũng cung cấp một cơ chế thay thế:
Rõ ràng99WIN, để đối phó với vấn đề khóa bị hỏng, Chubby cung cấp ba cách xử lý: CheckSequencer() để kiểm tra, so sánh với số sequencer mới nhất từ lần trước và sử dụng lock-delay. Các phương pháp này đảm bảo an toàn theo thứ tự từ mạnh đến yếu. Hơn nữa, chính các phương pháp này cũng không đảm bảo tính đúng đắn tuyệt đối (correctness). Tuy nhiên, Chubby thực sự cung cấp một chuỗi tăng dần về số hiệu của khóa, điều này cho phép máy chủ tài nguyên có thể tận dụng nó vào những lúc cần thiết để tăng cường mức độ bảo mật. Điều đáng chú ý là, mặc dù ba cách xử lý trên không đảm bảo tính hoàn hảo, nhưng sự kết hợp giữa chúng cùng với khả năng sinh ra số hiệu khóa tăng dần đã tạo nên một hệ thống linh hoạt và mạnh mẽ. Điều này giúp người dùng hoặc nhà phát triển có thêm lựa chọn trong việc cân bằng giữa hiệu suất và độ tin cậy. Ngoài ra, việc duy trì số hiệu khóa tăng dần còn đóng vai trò như một cơ chế phòng ngừa lỗi, giúp ngăn chặn các xung đột không mong muốn khi nhiều tiến trình cùng cạnh tranh quyền truy cập vào tài nguyên.
Trong cuộc tranh luận giữa Martin và antirezkeo 88, điểm gây tranh cãi lớn nhất chính là việc giả định về đồng hồ hệ thống có hợp lý hay không. Martin cho rằng đồng hồ hệ thống sẽ không thể tránh khỏi những bước nhảy bất ngờ (điều này phù hợp với mô hình bất đồng trong các thuật toán phân tán), trong khi antirez lại cho rằng trong thực tế, đồng hồ hệ thống hoàn toàn có thể được đảm bảo không có những bước nhảy đáng kể. Antirez nhấn mạnh rằng với các kỹ thuật quản lý thời gian hiện đại như đồng bộ NTP (Network Time Protocol), sự chính xác của đồng hồ hệ thống đã được cải thiện đáng kể, giảm thiểu tối đa rủi ro xảy ra sai lệch lớn. Ngược lại, Martin lập luận rằng dù có sử dụng các phương pháp như vậy, trong một môi trường phân tán phức tạp, vẫn luôn tồn tại khả năng xảy ra các vấn đề không mong muốn liên quan đến đồng bộ thời gian.
Martin đưa ra quan điểm sau (nguyên văn):
So99WIN, fundamentally, this discussion boils down to whether it is reasonable to make timing assumptions for ensuring safety properties. I say no, Salvatore says yes — but that’s ok. Engineering discussions rarely have one right answer.
Từ góc độ cốt lõi99win club, cuộc tranh luận cuối cùng đã quy về một điểm: giả định về thời gian để đảm bảo an toàn có thực sự hợp lý hay không? Tôi cho rằng điều đó không hợp lý, còn antirez lại cho rằng hợp lý — nhưng điều đó không quan trọng. Việc thảo luận các vấn đề kỹ thuật thường không chỉ có một đáp án đúng duy nhất. Có lẽ, sự khác biệt trong ý kiến chính là điều giúp chúng ta khám phá ra nhiều giải pháp sáng tạo hơn và nhìn nhận vấn đề từ nhiều khía cạnh mới mẻ.
Vậy99WIN, trong hệ thống thực tế, đồng hồ có thực sự tin cậy không? Đối với vấn đề này, Julia Evans TIL: clock skew exists
Julia Evans rút ra kết luận cuối cùng trong bài viết:
clock skew is real (sự lệch giờ thực sự tồn tại trong thực tế)
Chúng tôi từng đề cập trước đây99WIN, khi các bên đang kịch liệt tranh cãi, Martin dường như luôn đứng ngoài cuộc. Tuy nhiên, sau khi sự việc kết thúc, anh ấy đã tóm tắt toàn bộ diễn biến của vụ việc thành một câu chuyện dài với nhiều chi tiết phức tạp. Nếu bạn muốn hiểu rõ và toàn diện về những gì đã xảy ra từ đầu đến cuối, thì tốt nhất nên dành thời gian đọc kỹ bản tóm tắt này của Martin:
Cuối cùng99win club, trong bài tổng kết này, Martin viết nhiều bình luận cảm xúc:
For me99WIN, this is the most important point: I don’t care who is right or wrong in this debate — I care about learning from others’ work, so that we can avoid repeating old mistakes, and make things better in future. So much great work has already been done for us: by standing on the shoulders of giants, we can build better software.
……
By all means99WIN, test ideas by arguing them and checking whether they stand up to scrutiny by others. That’s part of the learning process. But the goal should be to learn, not to convince others that you are right. Sometimes that just means to stop and think for a while.(Dịch:
Điều quan trọng nhất với tôi là: tôi không thực sự bận tâm xem bên nào đúng hay sai trong cuộc tranh luận này – tôi chỉ quan tâm đến việc học hỏi từ những nỗ lực của người kháckeo 88, để chúng ta có thể tránh lặp lại những sai lầm trong quá khứ và xây dựng một tương lai tốt đẹp hơn. Tiền nhân đã mang đến cho chúng ta vô số thành tựu vĩ đại: dựa trên những gì họ đã làm, chúng ta có thể tạo ra các phần mềm thậm chí còn xuất sắc hơn nữa. Và điều thú vị là, mỗi khi nhìn lại lịch sử, chúng ta nhận ra rằng, dù những sai sót từng xảy ra, nhưng đó cũng chính là cơ hội để chúng ta tiến xa hơn, mạnh mẽ hơn.
……
Khi đối mặt với bất kỳ ý tưởng nào99WIN, điều quan trọng là phải kiểm tra cẩn thận, thông qua việc đưa ra lập luận và xác minh xem nó có đứng vững trước sự đánh giá chi tiết của người khác hay không. Đây chính là một phần trong quá trình học hỏi. Tuy nhiên, mục tiêu cuối cùng không nên chỉ để thuyết phục người khác rằng bạn đúng, mà nên hướng tới việc đạt được kiến thức thực thụ. Đôi khi, đó chỉ đơn giản đồng nghĩa với việc tạm dừng lại, dành thời gian để suy ngẫm một cách sâu sắc hơn.
Cuộc tranh luận về locks phân tán nàykeo 88, chúng ta đã tổng hợp và phân tích đầy đủ.
Dựa trên hai mục đích chính của việc sử dụng khóa (lock)99win club, nếu bạn chỉ quan tâm đến hiệu quả (efficiency), thì bạn có thể tự do chọn một cách thực hiện phân tán (distributed lock) mà bạn ưa thích. Tuy nhiên, bạn cần hiểu rõ những điểm yếu về mặt bảo mật của nó và tác động tiềm ẩn mà nó có thể gây ra. Còn nếu mục tiêu của bạn là đảm bảo tính đúng đắn (correctness), thì hãy cẩn trọng hơn bao giờ hết. Trong nội dung bài viết này, khi nói đến vấn đề tính đúng đắn trong khóa phân tán, chúng ta đã đi sâu nhất vào việc phân tích về khóa phân tán dựa trên ZooKeeper, số thứ tự epoch tăng dần và cách đánh dấu tài nguyên phân tán. Hãy xem xét cẩn thận các lập luận liên quan. Bạn có thể thấy rằng, trong trường hợp tập trung vào hiệu suất, việc đưa ra quyết định không phải lúc nào cũng đơn giản. Đôi khi, một giải pháp có vẻ tối ưu hóa tốt hơn lại tiềm ẩn nguy cơ rủi ro lớn đối với hệ thống. Do đó, việc hiểu rõ bản chất của từng lựa chọn rất quan trọng. Ngược lại, khi đặt ưu tiên lên tính đúng đắn, chúng ta buộc phải cân nhắc kỹ lưỡng hơn cả về hiệu suất lẫn độ an toàn của hệ thống. Điều này đòi hỏi sự kiểm tra nghiêm ngặt để đảm bảo rằng mọi khía cạnh của hệ thống đều hoạt động chính xác như mong đợi. Một lưu ý nhỏ nữa là, khi nói đến các công cụ như ZooKeeper, điều quan trọng không chỉ là việc áp dụng chúng mà còn là cách bạn kết nối chúng với các thành phần khác trong hệ thống. Sự tương tác giữa các thành phần phải luôn được giám sát chặt chẽ để tránh bất kỳ lỗi nào có thể xảy ra. Với khóa phân tán dựa trên ZooKeeper, việc quản lý số thứ tự epoch và cách thức ghi nhận tài nguyên phân tán cần phải được thực hiện một cách nhất quán và minh bạch. Điều này giúp đảm bảo rằng mọi yêu cầu truy cập đều được xử lý theo thứ tự hợp lý và không có xung đột.
Designing Data-Intensive Applications
Cuối cùng99WIN, tôi tin rằng cuộc thảo luận này vẫn chưa kết thúc. Khóa phân tán (Distributed Locks) và các giải pháp liên quan đến fencing có thể được xem như một chủ đề dài hạn, mà chúng ta có thể tiếp tục nghiên cứu khi hiểu biết về hệ thống phân tán của mình ngày càng sâu sắc hơn. Chúng ta có thể từ từ khám phá thêm về bản chất sâu xa của nó cũng như những chứng minh lý thuyết đằng sau. Điều này không chỉ giúp mở rộng kiến thức mà còn mang lại cái nhìn mới mẻ về cách thức hoạt động của công nghệ hiện đại trong tương lai.
(Kết thúc)
Cảm ơn :
Xin chân thành cảm ơn những người bạn đã dành thời gian quý báu để xem xét bản thảo này: Fu Lei99WIN, tác giả của CacheCloud; Li Weibo từ Kuaishou; và Li Bo từ Alibaba. Tất nhiên, mọi sai sót còn tồn tại trong bài viết đều là trách nhiệm của riêng tôi ^-^.
Các bài viết được chọn lọc khác :