Kể từ khi tôi hoàn thành phần trên của chủ đề nàytỉ lệ cược, trong đầu tôi như vỡ ra hàng loạt tiếng động nhỏ, cứ mãi đọng lại không tan. 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) vốn dĩ phức tạp và đầy rẫy những điều nhỏ nhặt, và mỗi lời nói từ mọi người dường như đều mang một lý lẽ nhất định.
Hôm naybacarat, chúng ta sẽ tiếp tục khám phá phần sau của chủ đề này. Trong bài viết này, 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ẽ đi sâu vào một số cuộc thảo luận xuất hiện trê Tiếp theo, chúng ta sẽ 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 ta sẽ lắng nghe tóm tắt của Martin về sự kiện này. Trong phần đầu tiên, Antirez đã đưa ra những lập luận sắc bén để phản bác lại quan điểm của Martin, nhấn mạnh vào những điểm mà ông cho rằng cần được làm rõ thêm. Những ý kiến này đã tạo nên một cuộc tranh luận sôi nổi trong cộng đồng lập trình viên, và trên Hacker News, nhiều người dùng đã chia sẻ suy nghĩ cá nhân, góp phần làm sáng tỏ thêm vấn đề. Tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về các hệ thống như Zookeeper và Chubby – hai nền tảng nổi tiếng trong việc cung cấp dịch vụ khóa phân tán. Chúng ta sẽ xem xét cách hoạt động của chúng, cũng như những ưu nhược điểm khi sử dụng trong môi trường thực tế. Sau đó, chúng tôi sẽ đặt chúng bên cạnh Redlock để phân tích sự khác biệt giữa các phương pháp này. Cuối cùng, Martin sẽ có những nhận định tổng kết về toàn bộ câu chuyện, đưa ra cái nhìn toàn diện hơn về vấn đề mà chúng ta đang bàn luận. Đây là phần không thể bỏ qua, vì nó giúp chúng ta có cái nhìn rõ ràng và toàn diện hơn về những gì đã xảy ra. Hy vọng qua bài viết này, bạn đọc sẽ có thêm kiến thức và góc nhìn mới mẻ về chủ đề thú vị này!
Những bạn chưa đọc phần trênbacarat, vui lòng đọc trước:
Martin đã đăng bài phân tích về khóa phân tán ( How to do distributed locking Sau đótỉ lệ cược, 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 antirez - tác giả của Redlock sẽ có phản ứng hay quan điểm như thế nào trước những ý kiến này.
Bài viết của Martin được công bố vào ngày 8 tháng 2 năm 2016tỉ lệ cược, nhưng theo lời Martin chia sẻ, một tuần trước khi bài viết được phát hành công khai, anh ấy đã gửi bản thảo cho antirez để xem xét và họ đã tiến hành thảo luậ Điều mà Martin có lẽ không ngờ được là phản ứng của antirez đối với sự việc diễn ra khá nhanh chóng. Chỉ một ngày sau khi bài viết của Martin xuất hiện, antirez đã đăng ngay một bài viết phản bác trên blog của mình với tựa đề " " tại địa chỉ sau đây: [Antirez's Blog Post - ] (Địa chỉ URL sẽ được thay thế bằng một liên kết hợp lệ nếu cần thiết.)
Đây thực sự 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à súc tíchbacarat, đồng thời lồng ghép vô số chi tiết quan trọng. Theo antirez, những chỉ trích mà Martin đưa ra về Redlock có thể được tóm lược thành hai điểm chính (tương ứng với hai phần đầu và cuối trong bài viết của Martin):
antirez đã phản bác lại hai khía cạnh này.
Đầu tiênbacarat, 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 sẵn sàng hoạt động khi khóa bị lỗi và vẫn đảm bảo quyền truy cập độc quyền cho tài nguyên, tại sao lại cần sử dụng một bộ khóa phân tán (distributed lock) với những yêu cầu bảo mật mạnh mẽ đến vậy? Ngay cả khi ta giả sử rằng Redlock không thể cung cấp "token fencing" tăng dần như Martin đề xuất, thì việc sử dụng chuỗi ngẫu nhiên do Redlock tạo ra cũng đủ để giải quyết vấn đề rồi. Ngoài ra, việc áp dụng các chuỗi ngẫu nhiên này không chỉ đơn thuần là thay thế cho token mà còn có thể mang lại nhiều lợi ích khác. Chẳng hạn, chúng giúp tránh được các xung đột không mong muốn trong quá trình đồng bộ dữ liệu giữa các nút. Hơn nữa, việc sử dụng chuỗi ngẫu nhiên có thể giảm bớt gánh nặng khi triển khai, vì nó không yêu cầu cơ chế quản lý phức tạp như việc duy trì và kiểm soát các giá trị tăng dần. Điều này làm nổi bật tính linh hoạt và hiệu quả của Redlock trong các trường hợp cụ thể.
my_random_value
Kiểm tra và Thiết lập
When starting to work with a shared resourcebacarat, we set its state to “
<token></token>
”tỉ lệ cược, then we operate the read-modify-write only if the token is still the same when we write.
(Bản dịch: Khi bắt đầu tương tác với tài nguyên chia sẻtỉ lệ cược, chúng ta đặt trạng thái của nó thành “<token></token>
bacarat, sau đó chỉ thực hiện thao tác
Khi lần đầu tiên đọc mô tả nàybacarat, tôi cảm thấy khá bối rối và không thực sự hiểu rõ. "Check and Set" (Kiểm tra và Thiết lập) chắc chắn là một thuật ngữ quen thuộc với CAS - thao tác kiểm tra trước khi thiết lập, nhưng cách nó hoạt động trong ngữ cảnh này thì antirez lại không đi sâu giải thích (chúng ta sẽ nhắc lại điều này khi thảo luận về cuộc tranh luận trên Hacker News sau này). Điều thú vị ở đây là CAS không chỉ đơn thuần là một kỹ thuật cơ bản mà còn mang đến những khía cạnh phức tạp hơn trong các hệ thống phân tán hoặc đồng bộ hóa dữ liệu. Nó đóng vai trò như một cơ chế đảm bảo tính nhất quán giữa nhiều luồng hoặc máy chủ khác nhau, giúp tránh xung đột dữ liệu. Điều này đặc biệt hữu ích khi có nhiều yêu cầu truy cập vào cùng một tài nguyên và cần kiểm soát quyền truy cập để tránh lỗi hoặc dữ liệu không chính xác.
Tiếp theomua thẻ trực tuyến, phản biện của antirez tập trung chủ yếu 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 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 nàytỉ lệ cược, điều thực sự nguy hiểm nhất đối với Redlock chính là điểm đầu tiên: sự nhảy đột ngột của đồng hồ. Khi điều này xảy ra, Redlock sẽ không thể hoạt động đúng cách. Đối với hai trường hợp còn lại, khi thiết kế ban đầu của Redlock đã tính đến các tác động tiềm ẩn từ những vấn đề đó, và nó có khả năng kháng cự ở một mức độ nhất định. Do đó, antirez tập trung giải thích rằng bằng cách quản trị hệ thống một cách hợp lý, hoàn toàn có thể tránh được những thay đổi lớn về thời gian trên đồng hồ, và yêu cầu về độ chính xác thời gian của Redlock hoàn toàn có thể đáp ứng được trong môi trường hệ thống thực tế. Trong thực tế, các nhà vận hành có thể áp dụng nhiều biện pháp để đảm bảo đồng hồ luôn ổn định, chẳng hạn như sử dụng NTP (Network Time Protocol) để đồng bộ hóa thời gian giữa các máy chủ hoặc thậm chí kết hợp với giải pháp PTP (Precision Time Protocol) trong trường hợp yêu cầu độ chính xác cao hơn. Điều này giúp giảm thiểu rủi ro mà sự nhảy đột ngột của đồng hồ có thể gây ra, từ đó tăng cường khả năng hoạt động đáng tin cậ
Khi Martin đề cập đến bước nhảy của đồng hồmua thẻ trực tuyến, ông đưa ra hai ví dụ cụ thể có thể gây ra bước nhảy của đồng hồ:
antirez phản bác rằng:
Redlock không yêu cầu đồng hồ phải chính xác hoàn hảobacarat, mà chỉ cần nó tương đối chính xác là được. Ví dụ, khi muốn đếm thời gian 5 giây, có thể thực tế chỉ đếm được 4,5 giây hoặc 5,5 giây, dẫn đến một chút sai lệch. Tuy nhiên, miễn là sai số nằm trong giới hạn cho phép, điều đó sẽ không ảnh hưởng đến hoạt động của Redlock. Antirez cho rằng, việc không đặt nặng yêu cầu độ chính xác tuyệt đối đối với đồng hồ như vậy là rất hợp lý trong môi trường thực tế. Trong thực tế, các hệ thống thường chịu đựng được mức sai số nhỏ này mà vẫn vận hành ổn định, và điều đó giúp Redlock trở nên linh hoạt hơn trong nhiều tình huống khác nhau.
Được rồibacarat, đế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 hợp lý và dễ hiểu hơn nhiều.
Về hai trường hợp cuối cùng mà Martin đã đề cậpmua thẻ trực tuyến, có khả năng khiến Redlock không còn hiệu lực, khi phân tích những tình huống này, Martin lại vô tình mắc phải một sai lầm (ở phần...). Điều đáng chú ý là sai sót này không thực sự liên quan đến bản chất của Redlock mà xuất phát từ cách anh ấy áp dụng ví dụ. Thực tế, Redlock được thiết kế với mục đích cung cấp tính năng bảo vệ tài nguyên trong hệ thống phân tán, nhưng nếu không hiểu rõ cơ chế hoạt động hoặc cách sử dụng đúng cách, thì ngay cả người có kinh nghiệm như Martin cũng có thể gặp phải nhầm lẫn. Điều quan trọng ở đây không chỉ là nhận ra sai sót mà còn phải học hỏi cách tránh các tình huống tương tự trong tương lai. Phần trên của bài viết này Điều đã được đề cập trước đó (như đã nói). Trong ví dụ mà Martin đưa ra về trường hợp Redlock không hoạt động do chu kỳ tạm dừng GC (garbage collection) trên clientmua thẻ trực tuyến, hậu quả của sự tạm dừng này có thể được coi là đã tạo ra một độ trễ lớn trong việc truyền thông giữa máy chủ lưu trữ khóa và client. Tuy nhiên, Redlock có khả năng xử lý tình huống này. Hãy cùng xem xét lại quy trình cụ thể của thuật toán Redlock: nó cơ bản bao gồm 5 bước chính để thực hiện.
Trong ví dụ mà Martin đưa ratỉ lệ cược, việc GC pause hoặc độ trễ mạng xảy ra thực sự nằm giữa bước 1 và bước 3. Dù nguyên nhân gây ra sự chậm trễ lớn trong khoảng thời gian này là do dừng tiến trình hay độ trễ mạng, thì ở bước thứ 4, mọi vấn đề đều có thể được phát hiện. Điều này đảm bảo rằng người dùng cuối không nhận được một khóa mà họ nghĩ là còn hiệu lực nhưng trên thực tế đã hết hạn. Tất nhiên, điều này chỉ đúng khi đồng hồ hệ thống không có sự nhảy vọt bất thường. Đó cũng chính là lý do vì sao Antirez đã phải giải thích về điều kiện của đồng hồ trước đó. Ngoài ra, điều quan trọng cần lưu ý là việc duy trì tính nhất quán của khóa phụ thuộc rất nhiều vào việc giám sát thời gian chính xác. Nếu đồng hồ bị sai lệch lớn, nó có thể dẫn đến các vấn đề khó kiểm soát, chẳng hạn như xung đột quyền sở hữu khóa hoặc các trạng thái không mong muốn khác. Vì vậy, các hệ thống phân tán thường có các cơ chế để tự động điều chỉnh và kiểm tra lại đồng hồ định kỳ nhằm giảm thiểu rủi ro này.
Người ta có thể nói rằngmua thẻ trực tuyến, ngay cả sau bước thứ ba, sự chậm trễ vẫn có thể xảy ra. Đúng vậy, antirez thừa nhận điều đó và ông ấy đã đưa ra một lập luận khá thú vị về vấn đề này. Những gì ông ấy nói như sau:
The delay can only happen after steps 3tỉ lệ cược, 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 tỉ lệ cược, and how the token as a solution is both unrealistic and can be used with Redlock as well.
Sự trễ chỉ có thể xảy ra sau bước 3mua thẻ trực tuyến, 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 trở 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 chung trước khi khóa hết hạn. Để làm rõ thêm một lần nữa, vấn đề này liên quan đến... Tất cả các thực hiện khóa phân tán Điều này là phổ biến và việc áp dụng giải pháp dựa trên token thường không khả thimua thẻ trực tuyến, nhưng nó vẫn có thể được kết hợp cùng 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ínhmua thẻ trực tuyến, trong đó phần đầu tiên không liên quan trực tiếp đến Redlock mà tập trung vào việc 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 mà không cung cấp cơ chế fencing đều có thể thất bại. Những gì antirez đang 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, áp dụng cho tất cả các loại khóa phân tán, không chỉ riê 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 thể cung cấp loại token tăng dần mà Martin đề xuất. Tuy nhiên, antirez đã phân tích trước đó rằng cách lập luận này về token thực chất là "không khả thi" hoặc ít nhất là, token duy nhất mà Redlock cung cấp cũng đạt được hiệu quả tương tự.
Độ trễ cao thực sự làm suy yếu hiệu quả của Redlock. Điều đó có nghĩa là gì đối với hệ thống phân tán?
antirez :
@martinkl so I wonder if after my replybacarat, 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.(Bản dịch:
antirez Bạn có thể cho tôi biết khôngbacarat, sau khi tôi gửi phản hồi, liệu chúng ta có thể đồng ý với nhau về một điểm: rằng việc trì hoãn tin nhắn lớn sẽ không gây ra bất kỳ tổn hại nào đến hoạt động của Redlock hay không? Tôi thực sự muốn hiểu rõ hơn về vấn đề này và xem liệu có cách nào để đảm bảo tính ổn định trong mọi tình huống hay không.
Martin Phản hồi: Tôi đồng ý với quan điểm của bạn về độ trễ giữa máy khách và máy chủ khóa. Tuy nhiênmua thẻ trực tuyến, độ trễ giữa máy khách và tài nguyên được truy cập vẫn còn tồn tại vấn đề đáng lo ngại. Thực tế cho thấy, dù chúng ta đã tối ưu hóa kết nối giữa các máy chủ, nhưng việc cải thiện tốc độ phản hồi trực tiếp từ máy khách đến nguồn tài nguyên vẫn cần thêm nỗ lực. Điều này đặc biệt quan trọng khi mà người dùng mong đợi trải nghiệm mượt mà và thời gian tải gần như tức thì trong mọi hoạt động.
Từ đoạn hội thoại nàytỉ lệ cược, có thể thấy rằng Martin tán thành cách Redlock kiểm tra tính hiệu lực của khóa ở bước thứ tư. Tuy nhiên, ô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 đề. Những gì Martin nói ở đây hơi mơ hồ. Giống như 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 phương án triển khai khóa phân tán, không chỉ riê Đây thực sự là một thách thức chung mà bất kỳ giải pháp nào cũng cần đối mặt trong hệ thống phân tán.
Đây là nội dung chính mà antirez đã đề cập trong blog của mình. Có một số điểm đáng chú ý:
Đến đây trong cuộc thảo luậnbacarat, việc Martin và antirez ai đúng ai sai không còn quan trọng nữa. Điều quan trọng là chúng ta cần hiểu rõ đến đâu Redlock (hoặc các cơ chế khóa phân tán khác) có thể đảm bảo an toàn. Khi đã nắm được điều đó, chúng ta sẽ tự mình đưa ra quyết định phù hợp nhất. Thực tế, việc hiểu sâu về ưu và nhược điểm của công cụ này không chỉ giúp ích cho việc sử dụng hiện tại mà còn mở ra nhiều hướng tiếp cận mới trong tương lai.
Liên quan đến hai bài viết blog của Martin và antirezmua thẻ trực tuyến, nhiều kỹ sư phần mềm đã tham gia vào những 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 trang Hacker Newsbacarat, antirez đã tích cực tham gia vào các cuộc thảo luận sôi nổi, trong khi Martin lại chọn cách đứng ngoài mọi chuyện, không hề để lại dấu vết tham gia nào. Có lẽ Martin đang có những suy nghĩ riêng hoặc đơn giản là cảm thấy chưa cần thiết phải bày tỏ quan điểm tại thời điểm này. Dù thế nào đi nữa, sự hiện diện của antirez đã góp phần làm cho cuộc trò chuyện trở nên đa dạng và hấp dẫn hơn bao giờ hết.
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ừ cuộc thảo luận nàybacarat, đặc biệt là những phần liên quan đến cơ chế củ Đây thực sự là một chủ đề hấp dẫn để cùng nhau tìm hiểu sâu hơn.
Kiểm tra và Thiết lập
You want to modify locked resource X. You set X.currlock = token. Then you readmua thẻ trực tuyến, 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 sang tiếng Việt có thể hiểu như sau: Giả sử bạn muốn sửa đổi tài nguyên Xbacarat, thì hãy tuân theo các bước được định nghĩa trong mã giả dưới đây.
Ngay sau đótỉ lệ cược, 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 trình bày một chuỗi thực thi như sau:
ghi nếu currlock == token
Kiểm tra và Thiết lập
Về điểm khác biệt trước đóbacarat, trong phần phân tích tiếp theo, chúng ta sẽ thấy rằng nếu cả máy chủ tài nguyên cũng được triển khai theo kiểu phân tán, thì việc sử dụng các token fencing tăng dần cũng cần phải được thực hiện qua hai bước. Điều này xuất phát từ thực tế rằng khi có nhiều máy chủ tham gia, việc quản lý trạng thái và đảm bảo tính nhất quán trở nên phức tạp hơn, do đó đòi hỏi một quy trình cụ thể để tránh xung đột hoặc lỗi không mong muốn.
Thứ tự thực hiện không phải là vấn đề trọng tâm. Điều cần thiết ở đây là đảm bảo rằng các thao tác luôn được thực hiện một cách đồng bộ và không xảy ra xung đột. Nếu hệ thống có khả năng duy trì trạng thái an toàn trong mọi tình huốngtỉ lệ cược, thì việc thay đổi thứ tự chỉ mang tính chất hình thức.
So the goal istỉ lệ cược, when race conditions happen, to avoid them in some way.
……
Note also that when it happens thatmua thẻ trực tuyến, 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.
(Bản dịch: Mục tiêu của chúng ta làmua thẻ trực tuyến, khi điều kiện cạnh tranh xuất hiện, có thể tránh bằng cách nào đó xung đột.
……
Điều quan trọng cần lưu ý là khi điều kiện cạnh tranh xuất hiệnmua thẻ trực tuyến, chẳng hạn như do sự chậm trễ, và nhiều client cùng lúc cố gắng truy cập hệ thống, thứ tự của ID khóa (lock ID) sẽ không liên quan gì đến thứ tự mà các hoạt động thực tế muốn 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 quản lý cẩn thận, vì thứ tự thực thi có thể bị đảo lộn và gây ra các vấn đề không mong muốn trong quá trình vận hành.
ID khóa ở đâytỉ lệ cược, giống như token tăng dần mà Martin nói.
thêm tên vào danh sách
Bạn thấy đấybacarat, hai máy khách (thực chất là các máy chủ web) đang thực hiện thao tác "thêm tên". Ban đầu, A vốn được đặt trước B, nhưng thứ tự nhận được khóa lại là B nằm trước A. Do đó, Antirez cho rằng thứ tự của ID khóa và thứ tự mà các hoạt động thực sự muốn thực thi không có liên hệ gì với nhau cả. Điều quan trọng ở đây là phải tạo ra được một thứ tự nào đó để đảm bảo quyền truy cập độc quyền. Vậy nên, liệu ID khóa có tăng dần hay chỉ đơn giản là một mã thông báo ngẫu nhiên cũng không còn quá quan trọng nữa.
token ngẫu nhiên
Trong thời đại số hóa ngày naytỉ lệ cược, chúng ta thường bị cuốn vào vòng xoáy của công nghệ và đôi khi quên mất rằng mọi thứ đều có giới hạn. Công cụ nào cũng vậy, dù có hiện đại đến đâu, nếu không sử dụng đúng cách thì cũng chỉ là đồ vô dụng. Tôi nghĩ điều quan trọng không phải là chạy đua theo công nghệ mới nhất mà là hiểu rõ mình cần gì và tìm cách khai thác tối đa những gì đang có.
…… 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 distributedmua thẻ trực tuyến, 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àngbacarat, vì tài nguyên được bảo vệ và cách truy cập vào nó không đượ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 vậy, liệu dịch vụ tài nguyên có phương thức nào đó để đảm bảo rằng token sẽ tăng dần trên tất cả các nút không? Và trong trường hợp 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ó khả năng hoàn tác tác động của điều này không? Ngoài ra, cần xem xét thêm rằng nếu hệ thống có nhiều phiên bản đồng thời của cùng một tài nguyên, làm thế nào để đảm bảo tính nhất quán giữa các phiên bản khi xảy ra xung đột? Điều này cũng đặt ra câu hỏi về khả năng tự động điều chỉnh của hệ thống trong việc xử lý các token lỗi thời hoặc mâu thuẫn giữa các nút khác nhau trong mạng lưới phân tán.
Những câu hỏi này vẫn chưa có ai trên Hacker News đưa ra câu trả lời thỏa đáng. Còn về cách hệ thống tài nguyên phân tán xử lý các "fencing tokens"tỉ lệ cược, một chuyên gia khác trong lĩnh vực hệ thống phân tán đã chia sẻ quan điểm của mình. Ông nhấn mạnh rằng việc quản lý fencing tokens đòi hỏi một chiến lược rõ ràng và linh hoạt, đặc biệt khi các node trong mạng lưới có thể gặp sự cố hoặc bị phân mảnh. Theo ông, việc xác thực và kiểm soát quyền truy cập không chỉ là vấn đề kỹ thuật mà còn liên quan đến việc xây dựng cơ chế bảo mật bền vững để đảm bảo tính toàn vẹn và khả năng chịu lỗi của toàn bộ hệ thống. Đây là thách thức lớn đối với các nhà phát triển đang làm việc trong lĩnh vực này. Flavio Junqueira Điều này đã được đề cập trong một bài viết của ông (chúng ta sẽ đề cập lại sau).
Về vấn đề được đề cập ở (2)mua thẻ trực tuyến, một người dùng có tên reza_n trên trang Hacker News đã đưa ra thắc mắc như sau:
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 rằng khi hai client cùng lúc nhận được khóamua thẻ trực tuyến, cách mà fencing token ngăn chặn thứ tự bất thường hoạt động như thế nào. Tuy nhiên, nếu có hai thao tác ghi xảy ra gần như đồng thời và chúng đang chỉnh sửa cùng một giá trị, điều gì sẽ xảy ra? Liệu nó không vẫn phụ thuộc vào cơ chế kiểm soát phiên bản dữ liệu hoặc khóa lạc quan? Điều này không khiến cho việc sử dụng khóa phân tán trở nên thừa thãi sao? Trong thực tế, ngay cả khi có sự can thiệp của phiên bản dữ liệu hoặc cơ chế khóa lạc quan, vấn đề về tính nhất quán và bảo vệ quyền truy cập vẫn cần được giải quyết một cách toàn diện. Khóa phân tán không chỉ đơn giản là để ngăn các thao tác xung đột, mà còn đảm bảo rằng các hệ thống khác nhau trong mạng lưới có thể phối hợp hiệu quả và tránh các tình huống không mong muốn. Cơ chế fencing token và phiên bản dữ liệu thường đi đôi với nhau để tạo thành một lớp bảo vệ vững chắc hơn. Trong trường hợp hai thao tác cùng diễn ra, fencing token đóng vai trò như một "chứng nhận" duy nhất, giúp xác định xem thao tác nào đã được thực hiện trước và thao tác nào sau. Điều này làm tăng cường khả năng kiểm soát và giảm thiểu nguy cơ lỗi do xung đột dữ liệu gây ra. Vì vậy, mặc dù cơ chế khóa lạc quan và phiên bản dữ liệu là rất quan trọng, nhưng khái niệm khóa phân tán vẫn giữ vai trò thiết yếu trong việc duy trì tính toàn vẹn của hệ thống phân tán. Nó cung cấp một lớp bảo vệ bổ sung, đặc biệt hữu ích khi các hệ thống lớn phải đối mặt với nhiều yêu cầu đồng thời và phức tạp.
Một người dùng Hacker News tên Terr_ trả lời:
I believe the “first” write failstỉ lệ cược, because the token being passed in is no longer “the lastest”, which indicates their lock was already released or expired.
phiên bản mới nhất
Liệu câu trả lời của Terr_ có chính xác hay không thì chưa chắc chắntỉ lệ cược, điều này phụ thuộc vào cách thức chi tiết mà máy chủ tài nguyên kiểm tra cá Hãy cùng nhau phân tích một chút để hiểu rõ hơn nhé. Trước tiên, cần hiểu rằng việc sử dụng fencing token thường nhằm mục đích đảm bảo tính toàn vẹn và bảo mật trong quá trình giao tiếp giữa các dịch vụ. Tuy nhiên, cách thức mà mỗi máy chủ tài nguyên xử lý chúng có thể khác nhau. Một số có thể chỉ kiểm tra tính hợp lệ dựa trên định dạng, trong khi những trường hợp khác có thể thêm các bước kiểm tra phức tạp hơn, chẳng hạn như so sánh với lịch sử token đã được sử dụng trước đó hoặc đối chiếu với thông tin đăng ký từ phía client. Do đó, để đánh giá xem câu trả lời của Terr_ có đúng hay không, chúng ta cần biết thêm về cách mà hệ thống của bạn đang triển khai và quản lý các token này. Điều này cũng giúp chúng ta xác định liệu có bất kỳ yếu tố nào bị bỏ sót hoặc sai sót trong quá trình triển khai hay không.
Để đơn giản hóa vấn đềmua thẻ trực tuyến, hãy giả sử rằng có một máy chủ thực hiện truy cập từ xa đến máy chủ tệp thông qua RPC mà không hỗ trợ quyền truy cập độc quyền đối với các tệp (nếu có hỗ trợ thì chúng ta sẽ không cần phải triển khai khóa phân tán). Bây giờ, theo cách tiếp cận mà Martin đề xuất, chúng ta sẽ thêm logic kiểm tra cho vé ngăn chặn (fencing token). Tuy nhiên, Martin chưa mô tả chi tiết cụ thể về cách thức hoạt động của nó, vì vậy chúng ta có thể suy đoán rằng có ít nhất hai khả năng có thể xảy ra. Có thể đầu tiên là việc sử dụng một mã xác thực duy nhất được gửi cùng với yêu cầu để đảm bảo rằng chỉ những phiên bản hợp lệ mới có thể thực hiện thao tác. Khả năng thứ hai là tạo ra một cơ chế giám sát thời gian thực để theo dõi trạng thái của các khóa và đảm bảo rằng không có xung đột nào xảy ra trong quá trình xử lý. Cả hai phương án này đều hướng tới mục tiêu duy trì tính toàn vẹn và ổn định của hệ thống khi giải quyết vấn đề cạnh tranh giữa các nút.
Cách tiếp cận đầu tiêntỉ lệ cược, chúng tôi đã chỉnh sửa mã nguồn của máy chủ tệp để nó có thể xử lý thêm một tham số liên quan đế Sau đó, chúng tôi thêm vào một đoạn logic kiểm tra đơn giản trước khi thực hiện bất kỳ hoạt động nào khác, đảm bảo rằng chỉ khi fencing token nhận được lớn hơn giá trị trước đó thì yêu cầu mới được phép tiến hành các bước tiếp theo. Tuy nhiên, một khi yêu cầu vượt qua được thử thách này, toàn bộ quy trình xử lý sau đó vẫn giữ nguyên như ban đầu, không có sự thay đổi nào xảy ra.
Hãy tưởng tượng đến khung cảnh mà Reza_n đã mô tả: cả hai client 1 và client 2 đều gặp phải sự tạm dừng do thu gom rác (GC pause)bacarat, 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, và vẫn giữ đúng thứ tự ban đầu. Vậy, logic đánh giá mới mà chúng ta vừa thêm vào cần phải chấp nhận cả hai yêu cầu, và sau khi được chấp nhận, chúng sẽ thực hiện thao tác trên tệp 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 xảy ra xung đột này có thể xuất phát từ việc chúng ta hiểu sai về cơ chế hoạt động của nó. Có lẽ, nguyên lý mà token bảo vệ mang lại còn phức tạp hơn so với những gì chúng ta nghĩ.
Cũng có một khả năng thứ haimua thẻ trực tuyến, đó là chúng tôi đã thực hiện những thay đổi đáng kể đố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ản ánh chính xác hơn cách hiểu của antirez. Trong trường hợp này, cả hai hoạt động ghi trong kịch bản mà reza_n mô tả đều nên được thực hiện thành công. Ngoài ra, việc đưa hai bước quan trọng này vào một giao dịch nguyên tử không chỉ giúp tránh xung đột dữ liệu mà còn đảm bảo tính nhất quán cao trong hệ thống. Điều này đặc biệt hữu ích khi có nhiều yêu cầu cùng lúc cần truy cập và cập nhật tệp, giảm thiểu rủi ro lỗi hoặc trạng thái không mong muốn xảy ra.
Rất nhiều người (bao gồm cả Martin) đều cho rằngbacarat, nếu bạn muốn xây dựng một khóa phân tán an toàn hơn, thì nên sử dụng ZooKeeper thay vì Redis. Để so sánh mục đích, hãy tạm thời rời xa chủ đề chính của bài viết này và cùng thảo luận xem khóa phân tán dựa trên ZooKeeper có thực sự mang lại tính bảo mật tuyệt đối hay không? Nó có cần được bảo vệ bằng cơ chế fencing token hay không? Nói cách khác, khi nói đến việc đảm bảo an toàn cho dữ liệu trong môi trường phân tán, ZooKeeper thường được xem là một lựa chọn đáng tin cậy. Tuy nhiên, điều này không đồng nghĩa với việc nó hoàn toàn miễn nhiễm trước các rủi ro. Một số nhà phát triển cho rằng việc thêm vào cơ chế fencing token - một phương pháp kiểm soát quyền truy cập nhằm ngăn chặn các hành động không mong muốn từ phiên bản cũ hoặc đã bị xâm phạm - sẽ tăng cường khả năng bảo mật. Vậy, tại sao chúng ta lại phải cân nhắc đến fencing token khi sử dụng ZooKeeper để tạo khóa phân tán? Liệu đây có phải là một giải pháp cần thiết hay chỉ là một bước dự phòng không bắt buộc? Hãy cùng tìm hiểu sâu hơn về vấn đề này để đưa ra quyết định đúng đắn!
Chúng ta không thể không nhắc đến chuyên gia phân tán Flavio Junqueira Ghi chú về kiếm thuật và khóa phân tán
Flavio Junqueira là một trong những tác giả của ZooKeeperbacarat, và bài viết blog này của anh ấy được viết vào những ngày mà Martin và antirez đang tranh luận. Trong bài viết, anh đã trình bày cách xây dựng một locks 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 đómua thẻ trực tuyến, client đầu tiên sẽ tạo thành công và giành được quyền khóa; trong khi các client khác sẽ tạo thất bại (vì znode đã tồn tại), dẫn đến việc không thể có được quyền khóa. Như một phép ẩn dụ, điều này giống như khi bạn và nhóm của mình cố gắng vào một cuộc thi, chỉ có người đầu tiên đến nơi mới thực sự giành được cơ hội để tham gia. Những người còn lại dù cố gắng nhưng vẫn không thể tham gia vì chỗ đã đầy.Khóa này có vẻ hoàn hảomua thẻ trực tuyến, không gặp vấn đề về thời gian hết hạn như Redlock và tự động giải phóng khi cần thiết. Tuy nhiên, nếu nhìn kỹ hơn, sự thật không hoàn toàn như vậy. Có những điểm ẩn mà ta cần khám phá thêm để hiểu rõ hơn về tính năng này.
ZooKeeper làm thế nào để phát hiện ra rằng một client đã sụp đổ? Thực tếbacarat, mỗi client sẽ duy trì một phiên (Session) với một trong những máy chủ của ZooKeeper, và phiên này phụ thuộc vào các tín hiệu heartbeat định kỳ để tiếp tục tồn tại. Nếu ZooKeeper không nhận được heartbeat từ client trong khoảng thời gian nhất định (được gọi là thời gian hết hạn phiên), nó sẽ kết luận rằng phiên đã hết hạn. Khi điều đó xảy ra, tất cả các nút znode có kiểu ephemeral được tạo ra thông qua phiên này sẽ tự động bị xóa khỏi hệ thống. Điều thú vị là, khi phiên kết thúc, không chỉ dữ liệu liên quan đến phiên bị xóa mà còn có thể kích hoạt các hành động dự phòng hoặc tự động hóa khác trong hệ thống. Điều này giúp đảm bảo tính ổn định và độ tin cậy của các ứng dụng sử dụng ZooKeeper như một cơ sở dữ liệu phân tán.
Tưởng tượng chuỗi thực thi sau:
/lock
, nhận được khóa.
/lock
bị xóa tự động.
/lock
bacarat, do đó nhận được khóa.Cuối cùngtỉ lệ cược, 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 giống như tình huống mà Martin đã đề cập trong bài viết của mình, nơi các khóa phân tán bị vô hiệu hóa do thời gian tạm dừng garbage collection (GC pause). Trong trường hợp này, cả hai client đều dựa trên thông tin không đồng bộ từ hệ thống phân tán, khiến chúng không nhận ra rằng đối phương cũng đang cố gắng sử dụng cùng một tài nguyên. Điều này nhấn mạnh tầm quan trọng của việc thiết kế lại cơ chế kiểm soát khóa để tránh những vấn đề tương tự trong môi trường hoạt động phức tạp hơn.
Có vẻ như việc sử dụng ZooKeeper để triển khai một khóa phân tán không đảm bảo hoàn toàn an toàn. Nó vẫn có những vấn đề mà bất kỳ giải pháp nào cũng gặp phải. Tuy nhiênbacarat, ZooKeeper là một framework được thiết kế đặc biệt cho các ứng dụng phân tán, mang đến những tính năng tuyệt vời mà các giải pháp khác như Redis không có. Ví dụ như chức năng tự động xóa của loại nút znode "ephemeral" mà chúng ta đã đề cập trước đó là một minh chứng điển hình. Thêm vào đó, với khả năng quản lý đồng bộ hóa dữ liệu giữa nhiều máy chủ, ZooKeeper cung cấp một cơ chế mạnh mẽ để đảm bảo tính nhất quán trong hệ thống phân tán. Điều này giúp nó trở thành một lựa chọn đáng cân nhắc khi cần xử lý các giao dịch nhạy cảm về thời gian hoặc yêu cầu sự đồng bộ cao giữa các nút. Tuy nhiên, việc hiểu rõ cách hoạt động của nó và cách cấu hình đúng là vô cùng quan trọng để tránh những rủi ro tiềm ẩn. Nói chung, mặc dù không hoàn hảo, nhưng ZooKeeper vẫn là một công cụ mạnh mẽ trong toolbox của các nhà phát triển làm việc với kiến trúc phân tán. Việc tận dụng tối đa các tính năng đặc biệt mà nó cung cấp sẽ giúp tối ưu hiệu suất và độ tin cậy của hệ thống.
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ử khi client cố gắng tạo một nút mới trong cây phân cấp của hệ thốngtỉ lệ cược, nó có thể đăng ký một watcher để nhận thông báo khi sự kiện liên quan đến nút đó xảy ra. Điều thú vị là watcher này sẽ chỉ hoạt động một lần và tự động bị hủy kích hoạt sau khi nhận được sự kiện đầu tiên. Ví dụ, nếu bạn đang theo dõi trạng thái của một nút cụ thể và nó bị xóa đi, watcher sẽ gửi tín hiệu cho client ngay lập tức, cho phép ứng dụng phản hồi linh hoạt trước các thay đổi bất ngờ trong cấu trúc dữ liệu. Điều này đặc biệt hữu ích khi bạn cần xây dựng các hệ thống phân tán yêu cầu khả năng đồng bộ dữ liệu tức thời giữa các node.
/lock
Khi đótỉ lệ cược, 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à máy khách sẽ ngay lập tức thông báo cho hệ thống bên ngoài về sự thất bại trong việc lấy khóa. Thay vào đó, máy khách có thể chuyển sang trạng thái chờ, chờ đợi thời điểm thích hợp khi nào điều kiện để tiếp tục xử lý được đáp ứng.
/lock
Khi một nút bị xóamua thẻ trực tuyến, ZooKeeper sẽ thông báo cho nó thông qua cơ chế theo dõi (watch), từ đó cho phép nó tiếp tục hoàn thành hoạt động tạo ra nút (như việc lấy khóa). Tính năng này giúp việc sử dụng khóa phân tán trong các client giống như đang làm việc với một khóa cục bộ: nếu không thể lấy được khóa, nó sẽ bị chặn lại và chờ đến khi có thể lấy được khóa. Đặc tính này là điều mà thuật toán Redlock không thể thực hiện được.
Tóm lạibacarat, khi so sánh việc sử dụng ZooKeeper để thực hiện khóa (lock) và việc sử dụng Redis để thực hiện khóa, có hai điểm khác biệt chính về đặc tính triển khai: Thứ nhất, **ZooKeeper** cung cấp một mô hình phân tán mạnh mẽ hơn với cơ chế đồng bộ hoàn toàn giữa các nút trong hệ thống. Điều này có nghĩa là khi một nút nắm giữ khóa, nó sẽ đảm bảo rằng tất cả các nút khác đều nhận thức được trạng thái của khóa mà không cần thêm bước kiểm tra bổ sung. Điều này tạo ra một môi trường an toàn cao cho các kịch bản yêu cầu độ tin cậy tuyệt đối. Thứ hai, **Redis** lại mang đến sự linh hoạt và tốc độ cao hơn trong việc xử lý các yêu cầu. Với cơ chế khóa dựa trên lệnh SETNX (SET if Not Exists), Redis cho phép các ứng dụng dễ dàng quản lý khóa và giải phóng chúng một cách nhanh chóng, giúp tối ưu hóa hiệu suất trong các hệ thống có khối lượng giao dịch lớn. Tuy nhiên, điều này cũng có thể dẫn đến rủi ro nếu không có cơ chế giám sát và quản lý đầy đủ.
Một điều cần lưu ý là việc triển khai bộ khóa phân tán dựa trên ZooKeeper như đã trình bày không phải là tối ưu nhất. Thực tếbacarat, nó có thể gây ra hiện tượng "hiệu ứng đàn" (herd effect), làm giảm hiệu suất khi cố gắng 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 quay trở lại phân tích của Flavio Junqueira về cơ chế Theo Flaviobacarat, bản chất của fencing token yêu cầu mỗi client phải thực hiện một thao tác "đánh dấu" (mark) trước khi có thể thực hiện bất kỳ hoạt động nào trên tài nguyên được chia sẻ. Thao tác đánh dấu này đảm bảo rằng các yêu cầu từ client cũ (nếu bị trễ và vẫn đang mang khóa cũ) sẽ không thể tiếp tục thao tác trên tài nguyên đó. Có nhiều cách để thực hiện việc đánh dấu này, và fencing token là một trong những phương pháp phổ biến nhất. Điều thú vị là việc sử dụng fencing token không chỉ đơn giản là một cơ chế bảo vệ, mà còn giúp ngăn chặn các vấn đề như xung đột dữ liệu hoặc trạng thái không đồng bộ giữa các client. Trong thực tế, thao tác đánh dấu có thể bao gồm việc thêm một giá trị thời gian, một con số tăng dần, hoặc thậm chí là một mã nhận dạng duy nhất vào tài nguyên. Điều này giúp hệ thống dễ dàng phát hiện ra liệu yêu cầu hiện tại có phù hợp với trạng thái hiện tại của tài nguyên hay không. Tóm lại, cơ chế fencing token đóng vai trò quan trọng trong việc duy trì sự nhất quán và an toàn trong môi trường làm việc với tài nguyên chia sẻ, đồng thời nó cũng là một phần không thể thiếu trong các giải pháp quản lý xung đột và đồng bộ hóa.
Sau đóbacarat, Flavio Junqueira đề xuất sử dụng số thứ tự epoch tăng dần (tương đương với token fencing của Martin) để bảo vệ tài nguyên được chia sẻ. Đối với tài nguyên phân tán, để tiện cho việc thảo luận, giả sử 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. 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 vào từng 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 (hay nói cách khác, nhỏ hơn) không thể thực hiện bất kỳ thao tác nào đối với dữ liệu. Điều thú vị là, việc áp dụng số thứ tự epoch không chỉ giúp ngăn chặn các xung đột trong việc cập nhật tài nguyên mà còn tạo ra một cơ chế hiệu quả để quản lý quyền truy cập đồng thời. Khi một nút nhận được yêu cầu ghi mới nhất, nó sẽ kiểm tra xem số thứ tự epoch của yêu cầu đó có lớn hơn số thứ tự hiện tại hay không. Nếu đúng như vậy, nút sẽ cập nhật dữ liệu và tăng số thứ tự epoch lên. Ngược lại, nếu số thứ tự epoch nhỏ hơn, nút sẽ từ chối yêu cầu và báo cáo lỗi. Điều này tạo ra một lớp bảo vệ vững chắc chống lại các xung đột giữa các nút, đặc biệt là trong môi trường có nhiều sự kết nối và ngắt kết nối giữa các nút.
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àybacarat, khi client thực hiện thao tác ghi sau khi đánh dấu hoàn thành, các nút của dịch vụ lưu trữ cần kiểm tra 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 á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 mô tả của Flavio Junqueira, chúng ta tin rằng điều đó là đúng - nó nên là một hoạt động nguyên tử. Tuy nhiên, nếu nguồn tài nguyên bản thân đã cung cấp khả năng thực hiện hoạt động nguyên tử để đảm bảo sự loại trừ xung đột, liệu việc sử dụng ổ khóa phân tán còn ý nghĩa gì không? Câu trả lời là có. Client có thể tận dụng ổ khóa phân tán để tránh xung đột một cách hiệu quả và chờ cơ hội để thực hiện ghi, điều này đặc biệt hữu ích cho các nguồn tài nguyên phân tán bao gồm nhiều nút (tất nhiên, lý do chính là vì hiệu suất).
Khi nói đến khóa phân tánbacarat, không thể không nhắc đến Chubby của Google.
The Chubby lock service for loosely-coupled distributed systems
Ngoài rabacarat, trên YouTube có một talk về Chubby rất tốt, địa chỉ phát:
Chubby tấ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 Rmua thẻ trực tuyến, 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 nắm giữ khóa L và gửi yêu cầu Rmua thẻ trực tuyến, nhưng yêu cầu này đã bị từ chố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ố thao tác 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ể sẽ thực hiện các hoạt động mà không có sự bảo vệ của khóa L, tạo ra nguy cơ tiềm ẩn về sự không nhất quán dữ liệu. Kịch bản này cho thấy tầm quan trọng của việc quản lý khóa trong hệ thống đa luồng hoặc đa tiến trình. Khi không có cơ chế đồng bộ hóa phù hợp, các hành động của các tiến trình có thể chồng chéo và dẫn đến kết quả không mong muốn. Một cách tiếp cận tốt hơn là đảm bảo rằng chỉ duy nhất một tiến trình có quyền truy cập vào tài nguyên nào đó tại bất kỳ thời điểm nào, tránh tình trạng xung đột và mất an toàn dữ liệu.
Điều này không khác mấy so với phân tích của Martin.
Chubby đề xuất một cơ chế được gọi là trình tự (sequencer) để giải quyết vấn đề nàymua thẻ trực tuyến, tương tự như cơ chế token chống trùng lặp (fencing token). Người nắm giữ khóa có thể yêu cầu một trình tự (sequencer) vào bất kỳ thời điểm nào. Trình tự này là một chuỗi byte và được chia thành ba phần chính: Thứ nhất, phần đầu tiên xác định thời gian tạo trình tự, giúp theo dõi tính thời gian thực của dữ liệu. Thứ hai, phần thứ hai là một giá trị ngẫu nhiên nhằm tăng cường tính bảo mật và ngăn chặn các hành vi tấn công giả mạo. Cuối cùng, phần thứ ba lưu trữ thông tin nhận dạng liên quan đến khóa hiện tại, đảm bảo rằng mọi thao tác đều được thực hiện bởi chủ sở hữu hợp lệ.
Sau khi khách hàng nhận được sequencermua thẻ trực tuyến, họ sẽ gửi nó đến máy chủ tài nguyên trong quá trình thao tác với các tài nguyên. Tiếp theo, máy chủ tài nguyên sẽ đảm nhiệm việc kiểm tra tính hợp lệ củ Có hai cách để thực hiện kiểm tra này: Thứ nhất, máy chủ có thể đối chiếu giá trị sequencer với một cơ sở dữ liệu đã được mã hóa trước đó để xác minh xem nó có khớp với thông tin đã lưu hay không. Thứ hai, hệ thống cũng có thể sử dụng một thuật toán xác thực đặc biệt để so sánh tính toàn vẹn của sequencer, từ đó đảm bảo rằng không có bất kỳ can thiệp nào từ bên ngoài làm ảnh hưởng đến tính chính xác của nó.
Trong trường hợp do vấn đề tương thích mà dịch vụ tài nguyên không dễ dàng được chỉnh sửabacarat, Chubby cũng cung cấp một cơ chế thay thế:
Rõ ràngtỉ lệ cược, để đối phó với vấn đề lỗi khóa (lock failure), Chubby cung cấp ba cách xử lý: CheckSequencer() để kiểm tra, so sánh với giá trị sequencer mới nhất trước đó và sử dụng cơ chế lock-delay. Ba phương pháp này đảm bảo an toàn theo thứ tự từ cao xuống thấp. Ngoài ra, các phương pháp này không tự động cam kết về tính đúng đắn tuyệt đối (correctness). Tuy nhiên, Chubby thực sự cung cấp một chuỗi số hiệu tạo khóa (lock generation number) tăng dần theo thời gian, điều này cho phép máy chủ tài nguyên có thể tận dụng nó để nâng cao mức độ bảo mật khi cần thiết. Thêm vào đó, việc duy trì một số hiệu khóa tăng dần giúp hệ thống tránh được tình trạng xung đột hoặc nhầm lẫn trong quá trình quản lý tài nguyên. Điều này đặc biệt quan trọng trong môi trường phân tán nơi mà nhiều node có thể cùng lúc truy cập và yêu cầu quyền truy nhập vào cùng một tài nguyên. Với khả năng này, Chubby không chỉ giải quyết các vấn đề về sự đồng bộ hóa mà còn đảm bảo rằng mỗi bước tiến hành đều được ghi nhận một cách rõ ràng và minh bạch.
Trong cuộc tranh luận giữa Martin và antireztỉ lệ cược, vấn đề gây tranh cãi 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 không thể tránh khỏi những sự nhảy vọt (đ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 tin rằng trong thực tế, đồng hồ hệ thống có thể được đảm bảo hoạt động ổn định mà không có những thay đổi lớn. Ngoài ra, Martin nhấn mạnh rằng trong môi trường phân tán, việc xem xét những tình huống bất thường như sự nhảy vọt của thời gian là điều cần thiết để xây dựng một hệ thống đáng tin cậy, còn antirez lại cho rằng bằng cách tối ưu hóa phần cứng và phần mềm, chúng ta hoàn toàn có thể giảm thiểu những rủi ro liên quan đến vấn đề này.
Martin đã đưa ra những suy nghĩ sau (bản gốc):
Somua thẻ trực tuyến, 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ựu chung lạibacarat, cuộc tranh luận này cuối cùng đã quy về một điểm then chốt: liệu giả định về việc đặt thời gian nhằm đảm bảo an toàn có thực sự hợp lý hay không. Theo tôi, điều đó là không hợp lý, nhưng với antirez thì ngược lại — và điều đó cũng không sao cả. Trong lĩnh vực kỹ thuật, hiếm khi có một đáp án đúng duy nhất cho mọi tình huống. Điều quan trọng ở đây không phải là việc ai đúng ai sai, mà là cách chúng ta tiếp cận vấn đề và khả năng tìm ra giải pháp phù hợp dựa trên những ý tưởng khác nhau. Mỗi người đều có góc nhìn riêng, và việc thảo luận giúp chúng ta mở rộng tầm nhìn và khám phá nhiều hướng đi mới mẻ hơn. Điều này càng làm nổi bật vai trò của sự đa dạng trong suy nghĩ, vì nó mang đến cơ hội để cải thiện và tối ưu hóa công trình theo những cách chưa từng được nghĩ tới trước đây.
Vậymua thẻ trực tuyến, trong hệ thống thực tế, liệu đồng hồ có đáng tin cậy không? Về vấn đề này, Julia Evans TIL: skew của đồng hồ tồn tại
Julia Evans rút ra kết luận cuối cùng trong bài viết của mình rằng:
clock skew is real (sự lệch giờ thực sự tồn tại trong thực tế)
Chúng ta đã đề cập trước đó rằngbacarat, khi các bên đang tranh cãi sôi nổi, Martin hầu như luôn đứng ngoài cuộc. Tuy nhiên, sau khi sự việc lắng xuống, anh ấy đã tóm tắt toàn bộ diễn biến của sự kiện này thành một câu chuyện dài với đầy đủ các mối liên kết. Nếu bạn muốn hiểu rõ nhất về những gì xảy ra trước và sau sự kiện này, chúng tôi khuyên bạn nên dành thời gian đọc kỹ bản tóm tắt mà Martin đã chuẩn bị:
Cuối cùngmua thẻ trực tuyến, Martin viết rất nhiều bình luận cảm xúc trong phần kết luận câu chuyện này:
For memua thẻ trực tuyến, 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 meanstỉ lệ cược, 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.(Bản dịch:
Điều quan trọng nhất với tôi là: tôi không quá bận tâm xem ai đúng ai sai trong cuộc tranh luận này – điều tôi thực sự quan tâm là những gì có thể học hỏi từ công việc của người khácmua thẻ trực tuyến, để chúng ta có thể tránh được những sai lầm trong quá khứ và tạo ra một tương lai tốt đẹp hơn. Những người đi trước đã mang đến cho chúng ta nhiều thành tựu tuyệt vời: bằng cách đứng trên vai những người khổng lồ, chúng ta có thể xây dựng phần mềm thậm chí còn xuất sắc hơn nữa. Tôi tin rằng mỗi một bước tiến nhỏ mà chúng ta đạt được đều là kết quả của việc kế thừa những thành tựu trước đây, đồng thời cải thiện và phát triển thêm từ đó. Chính sự kết nối giữa các thế hệ đã giúp nhân loại tiến bộ không ngừng, và tôi rất mong muốn đóng góp vào chuỗi đó, dù chỉ là một mảnh ghép nhỏ.
……
Với bất kỳ ý tưởng nàotỉ lệ cược, điều quan trọng là phải kiểm tra cẩn thận và xem xét chúng qua các lập luận, đồng thời đảm bảo rằng chúng có thể chịu được sự soi xét kỹ lưỡng từ người khác. Đây chính là một phần trong quá trình học hỏi. Tuy nhiên, mục tiêu không nên chỉ đơn thuần là thuyết phục người khác tin rằng bạn đúng, mà phải hướng đến việc đạt được kiến thức thực sự. Đôi khi, điều đó chỉ có nghĩa là dừng lại và dành thời gian để suy ngẫm thật sâu sắc về vấn đề.
Cuộc tranh luận về khóa phân tán nàytỉ lệ cược, 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 khóa (locking)bacarat, nếu chỉ hướng đến tối ưu hóa hiệu suất (efficiency), bạn có thể tự do lựa chọn một cách thực hiện bộ phân tán (distributed lock) mà mình ưa thích. Tuy nhiên, bạn cần hiểu rõ những thiếu sót về mặt bảo mật mà giải pháp đó mang lại và tác động tiềm ẩn mà nó có thể gây ra. Ngược lại, nếu mục tiêu là đảm bảo tính đúng đắn (correctness), thì bạn cần cân nhắc rất cẩn trọng. Trong bài viết này, khi đề cập đến tính đúng đắn của bộ phân tán khóa, chúng tôi đã đi sâu nhất vào việc phân tích các cơ chế khóa 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 dành thời gian để xem xét kỹ lưỡng các lập luận liên quan. Điều thú vị là, khi nói đến ZooKeeper, nhiều hệ thống phân tán sử dụng nó như một công cụ đáng tin cậy để quản lý trạng thái toàn cầu. Điều này giúp giảm thiểu nguy cơ xung đột giữa các nút trong mạng lưới. Tuy nhiên, việc duy trì một số thứ tự epoch tăng dần đòi hỏi sự cẩn thận đặc biệt, vì bất kỳ sai sót nào cũng có thể dẫn đến tình trạng tranh chấp quyền kiểm soát không mong muốn. Đồng thời, việc đánh dấu tài nguyên phân tán không chỉ đơn thuần là một quy trình kỹ thuật mà còn yêu cầu hiểu biết sâu sắc về ngữ cảnh hoạt động của hệ thống. Hãy nhớ rằng, dù bạn có chọn phương án nào đi chăng nữa, việc hiểu rõ các rủi ro và hậu quả của nó là điều vô cùng quan trọng. Không gì tệ hơn là phải đối mặt với các vấn đề bảo mật hoặc hiệu suất do sự thiếu hiểu biết về cơ chế mà bạn đang sử dụng.
Designing Data-Intensive Applications
Cuối cùngmua thẻ trực tuyến, tôi tin rằng cuộc thảo luận này vẫn chưa đi đến hồi kết. Khóa phân tán (Distributed Locks) và các giải pháp tương ứng như fencing có thể được xem như một chủ đề dài hạn, mà theo thời gian, khi chúng ta ngày càng hiểu rõ hơn về hệ thống phân tán, có thể sẽ quay lại để nghiên cứu nó một cách từ từ. Chúng ta có thể tìm hiểu thêm về bản chất sâu xa của nó cũng như cách chứng minh lý thuyết liên quan, từ đó đưa ra những cải tiến mới. Tôi nghĩ rằng việc tiếp tục nghiên cứu vấn đề này không chỉ giúp cải thiện hiệu quả của các hệ thống phân tán hiện tại mà còn mở ra nhiều hướng phát triển mới trong tương lai. Mỗi hệ thống phân tán đều có những thách thức riêng biệt, và việc hiểu rõ về khóa phân tán sẽ giúp chúng ta có cái nhìn toàn diện hơn về cách xử lý các vấn đề đồng bộ hóa và bảo vệ tài nguyên trong môi trường phân tán phức tạp. Bằng cách áp dụng các phương pháp mới và sáng tạo, chúng ta có thể giải quyết các tình huống ngoại lệ hoặc lỗi bất ngờ xảy ra trong quá trình vận hành. Điều này đòi hỏi sự phối hợp chặt chẽ giữa các nhà thiết kế hệ thống và các chuyên gia nghiên cứu để có thể tạo ra các giải pháp bền vững và hiệu quả hơn. Tôi tin rằng với sự kiên nhẫn và sự tò mò không ngừng, chúng ta sẽ đạt được những bước tiến đáng kể trong lĩnh vực này.
(Kết thúc)
Xin cảm ơn :
Xin chân thành cảm ơn các bạn đã dành thời gian quý báu để xem lại bản thảo này: Fu Leitỉ lệ cược, tác giả của CacheCloud, Li Weibo từ Kuaishou, và Li Bo từ Alibaba. Tất nhiên, bất kỳ sai sót nào còn sót lạ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 :