Virus xâm nhập: Giao thức Gossip và nhất quán cuối cùng trong hệ phân tán

1. Bối cảnh

Tôi là một con virus nhỏ, các virus khác đều gọi tôi là B nhỏ.

Hiện tại tôi đã có kích thước 100 nm, tôi có nhiều xúc tu, con người gọi những xúc tu của tôi là vương miện, nên đặt cho tôi một cái tên học thuật: coronavirus. Với cái tên học thuật này, tôi luôn không hài lòng, sao có thể đặt tên dựa trên ngoại hình chứ, đây là lấy ngoại hình đánh giá virus.

Tôi sinh ra trên một con dơi, mỗi đêm, con vật này đi khắp nơi kiếm ăn, nó thích nhất là kiếm ăn trong rừng, nhưng gần đây phạm vi rừng giảm mạnh, nó buộc phải đến thành phố nơi con người sinh sống để kiếm ăn, nhìn những ánh đèn rực rỡ, tôi say mê như điếu đổ.

Con dơi này mang hơn 100 loại virus, ví dụ virus Ebola, virus MERS, tôi ngày ngày vui chơi cùng những virus này. Virus SARS là họ hàng gần của tôi, năm 2002, nó còn gây ra một đợt dịch bệnh không nhỏ, làm chấn động cả giới virus, con người gọi nó là SARS.

2. Bất ngờ

Đêm hôm đó, mây đen dày đặc, không khí đục ngầu, dơi bay vào sâu trong rừng rậm, đột nhiên toàn thân bị một luồng điện giật trúng, ngã xuống, một tấm lưới lớn bắt được nó, theo sau là một người mặc áo khoác đen nhốt dơi vào lồng.

Những ngày sau đó, dơi luôn bị nhốt trong lồng, cho đến một ngày, dơi được đưa đến một nơi có thể thấy động vật hoang dã ở khắp nơi, nhưng những con vật này hoặc bị trói bằng dây thừng thô, hoặc bị nhốt trong lồng sắt. Một người đàn ông béo tai to mặt lớn bước đến gần dơi, sau khi đưa một xấp tiền lớn trong tay cho người áo đen, hắn mang dơi đi.

Dơi có thể đã tiếp xúc quá gần với người đàn ông béo, tôi bị truyền sang tay của con người, sau đó qua thức ăn mà hắn tiếp xúc vào miệng hắn, rồi đi vào cơ thể hắn.

3. Nút hạt giống

Sau khi vào cơ thể người, tôi đánh lừa hệ miễn dịch của con người, thuận lợi xâm nhập vào tế bào người, giải phóng RNA của mình, dùng RNA polymerase của tế bào bình thường để sao chép RNA của mình, từ đó sao chép ra nhiều virus hơn, rồi tấn công cơ quan phổi của người.

Vài ngày sau, người này xuất hiện hiện tượng sốt, kèm theo triệu chứng ho, đồng bọn của tôi cũng qua hắt hơi truyền sang cơ thể người khác, cũng bắt đầu sao chép ồ ạt chính mình.

Một truyền mười, mười truyền trăm, thành phố cấp địa khu này đã có hàng nghìn người bị virus lây nhiễm. Còn tôi được gọi là nút hạt giống, và người đàn ông đó được gọi là bệnh nhân số 0.

4. Giao thức Gossip

Các tế bào bình thường trong cơ thể con người rất hứng thú với khả năng lây nhiễm của tôi.

Tế bào bình thường: "Anh Corona, sao anh có thể lây lan nhanh như vậy?"

Tôi: "Thực ra tôi đã lợi dụng giao thức Gossip."

Tôi: Gossip chủ yếu có ba chức năng: gửi trực tiếp, chống entropy, lan truyền tin đồn.

Gossip có nghĩa là lời đồn đại, giao thức này giống như lời đồn đại, lợi dụng một cách ngẫu nhiên, có tính lây nhiễm, để truyền thông tin đến toàn bộ mạng, và trong một khoảng thời gian nhất định, khiến dữ liệu của tất cả các nút trong hệ thống nhất quán. Đây chính là giao thức thực hiện nhất quán cuối cùng.

4.1 Gửi trực tiếp

Gửi trực tiếp dữ liệu cần cập nhật đến các nút khác, khi dữ liệu gửi thất bại, sẽ cache dữ liệu lại, sau đó gửi lại. Như hình dưới đây, người A trực tiếp lây virus cho C và E, còn B và D không bị lây, cần lây lại.

Gửi trực tiếp

Ưu điểm: Dễ triển khai, đồng bộ dữ liệu kịp thời.

Nhược điểm: Có thể mất dữ liệu do hàng đợi cache thử lại đầy. Không thể đạt nhất quán cuối cùng.

Vậy làm sao để đạt nhất quán cuối cùng? Thì cần dùng chức năng thứ hai: chống entropy.

4.2 Chống entropy

Chống entropy nên hiểu thế nào?

Entropy chỉ mức độ hỗn loạn, chống entropy là loại bỏ sự khác biệt dữ liệu giữa các nút, nâng cao độ tương đồng dữ liệu giữa các nút.

Quá trình chống entropy:

  • (1) Các nút trong cluster, cứ sau một khoảng thời gian lại ngẫu nhiên chọn một nút khác.
  • (2) Trao đổi toàn bộ dữ liệu của mình với nhau để loại bỏ khác biệt giữa hai bên.
  • (3) Thực hiện nhất quán cuối cùng của dữ liệu.

Dưới đây lấy ví dụ lây nhiễm virus để minh họa chống entropy.

Đầu tiên người A bị lây hai loại virus, lần lượt là virus T và virus R, như hình dưới:

Người A bị lây nhiễm hai loại virus

Người E bị lây ba loại virus, lần lượt là virus T, virus S, virus Y, như hình dưới:

Người E bị lây nhiễm ba loại virus

Người A lây virus T và R mà mình mang cho người E, còn E vốn đã mang virus T, nên cuối cùng sẽ bị lây bốn loại virus: T, S, Y, R. Nói cách khác, thông qua cách chống entropy, đã sửa chữa virus R bị thiếu ở người E. Như hình dưới:

Người E bị lây nhiễm bốn loại virus

Thực ra, chống entropy chủ yếu có ba cách: đẩy, kéo, đẩy và kéo.

4.2.1 Đẩy

Đẩy: Đẩy bản sao dữ liệu của mình cho đối tượng, sửa chữa entropy trong bản sao của đối phương.

Như hình dưới, người A lây (đẩy) virus R cho người E, trong E sẽ chứa tất cả virus của A.

Đẩy

4.2.2 Kéo

Kéo: Kéo toàn bộ dữ liệu bản sao từ đối phương, sửa chữa entropy trong bản sao của mình.

Như hình dưới: Người A chỉ có virus T và R, sau khi chủ động kéo, đồng bộ virus S và virus Y của người E sang người A, cuối cùng, người A mang bốn loại virus: T, R, S, Y.

Cách kéo

4.2.3 Đẩy-kéo

Đẩy-kéo: Đồng thời sửa chữa entropy trong bản sao của mình và bản sao của đối tượng.

Như hình dưới: Người A và người E thông qua cách đẩy-kéo cuối cùng đều bị lây cùng bốn loại virus: T, R, S, Y.

Đẩy-kéo

4.2.4 Nhược điểm của chống entropy

(1) Qua cách đẩy, kéo, đẩy-kéo ở trên, chúng ta có thể thấy, chống entropy cần các nút trao đổi và so sánh toàn bộ dữ liệu của mình theo từng cặp, như vậy, chi phí liên lạc rất cao, nên không khuyến nghị thực hiện chống entropy thường xuyên trong tình huống thực tế.

Vậy có cách nào giảm số lần chống entropy không?

Câu trả lời là có, chúng ta có thể thông qua việc đưa vào cơ chế như checksum để giảm lượng dữ liệu cần so sánh và thông tin liên lạc.

(2) Khi thực hiện chống entropy, các nút liên quan đều đã biết, và số lượng nút không thể quá nhiều. Nếu nút thay đổi động hoặc số lượng nút quá nhiều, chống entropy sẽ không phù hợp.

Vậy có cách nào giải quyết nhất quán cuối cùng cho động, nhiều nút không?

Câu trả lời là có, thì cần dùng chức năng lan truyền thứ ba của giao thức Gossip, lan truyền tin đồn hay còn gọi là lan truyền dịch bệnh.

4.3 Lan truyền dịch bệnh

4.3.1 Quá trình

Chức năng lan truyền thứ ba của giao thức Gossip, lan truyền dịch bệnh, tức là lan rộng virus.

Như hình dưới: A lây cho B và E, B lây cho C và D, D lây cho F và G. Cuối cùng ABCDEFG đều bị lây.

Quá trình lan truyền dịch bệnh

Trong hệ phân tán, khi một nút có dữ liệu mới, nút này trở thành trạng thái hoạt động, và định kỳ liên hệ các nút khác để gửi dữ liệu mới cho chúng, cho đến khi tất cả các nút đều lưu trữ dữ liệu đó, có thể hiểu là cách đẩy trong chống entropy đã nói trước đó. Như hình dưới:

Cách lan truyền dịch bệnh & nguồn ảnh từ internet

4.3.2 Nhược điểm

Cách lan truyền dịch bệnh có các nhược điểm sau:

  • Thời gian ngẫu nhiên: Tất cả các nút đạt nhất quán là một xác suất ngẫu nhiên. Có thể cải tiến quy trình chống entropy: sử dụng sửa chữa vòng kín.
  • Dư thừa thông điệp: Cùng một nút sẽ nhận cùng một thông điệp nhiều lần, tăng áp lực xử lý thông điệp, mỗi lần liên lạc đều gây tải cho băng thông mạng, tài nguyên CPU, từ đó ảnh hưởng đến thời gian đạt nhất quán cuối cùng.
  • Vấn đề Byzantine: Nếu có nút độc hại xuất hiện, các nút khác cũng sẽ gặp vấn đề. Nên cần sửa chữa nút lỗi trước.

4.3.3 Ưu điểm

  • Hỗ trợ động, nhiều nút: Cho phép tăng hoặc giảm nút động, hỗ trợ rất nhiều nút.
  • Đa số nút: Không cần đa số nút hoạt động bình thường cũng có thể đạt nhất quán cuối cùng.
  • Chịu lỗi: Bất kỳ nút nào khởi động lại hoặc ngừng hoạt động đều không ảnh hưởng đến hoạt động của giao thức Gossip, đặc tính chịu lỗi tự nhiên của hệ phân tán.
  • Phi tập trung: Các nút đều bình đẳng, không có nút đặc biệt. Bất kỳ nút nào gặp vấn đề đều không ngăn các nút khác tiếp tục thực hiện chống entropy.
  • Tốc độ nhanh: Vì mỗi nút đều có thể lan truyền, nên tốc độ là cấp số mũ, giống như virus Corona hiện nay.

Vì giao thức Gossip là thuật toán chịu lỗi có dư thừa, nhằm đảm bảo thuật toán nhất quán cuối cùng. Mặc dù thời điểm tất cả các nút đạt nhất quán không rõ ràng, nhưng cũng có thể thông qua cải tiến quá trình thực hiện chống entropy để đạt được dự đoán được, ví dụ chống entropy vòng kín (không mở rộng trong bài này).

5. Tổng kết

Bài viết này thông qua câu chuyện một con dơi mang coronavirus lây nhiễm cho con người để giải thích giao thức Gossip.

  • Giao thức Gossip là một giao thức sửa chữa bất đồng bộ, thực hiện nhất quán cuối cùng. Ưu tiên xem xét chống entropy.

  • Chống entropy được dùng khá nhiều trong thành phần lưu trữ. Ví dụ Cassandra, InfluxDB.

  • Lan truyền tin đồn (lan truyền dịch bệnh) có tính lây nhiễm, các nút lây nhiễm lẫn nhau. Phù hợp với hệ phân tán thay đổi động. Ví dụ Cassandra quản lý động trạng thái nút của cluster.

  • Trong tình huống thực tế, gửi trực tiếp nhất định phải được thực hiện, tiêu hao hiệu năng thấp nhất. Thông qua gửi dữ liệu cập nhật hoặc cache gửi lại có thể sửa chữa sự không nhất quán của dữ liệu.

  • Trong thành phần lưu trữ, các nút đã biết, sử dụng chống entropy để sửa chữa sự không nhất quán của bản sao dữ liệu.

  • Khi nút cluster thay đổi, hoặc khi có nhiều nút, sử dụng cách lan truyền tin đồn, để đồng bộ cập nhật dữ liệu của nhiều nút, thực hiện nhất quán cuối cùng.

  • Ba chức năng của Gossip thực ra đều nhằm thực hiện chống entropy, cách thứ nhất dùng hàng đợi thông điệp, cách thứ hai dùng thông điệp đẩy-kéo, cách thứ ba dùng lan truyền tin đồn.

  • Nếu nút xuất hiện lỗi, cần sửa chữa nút lỗi trước.

Thẻ: Gossip Protocol Eventual Consistency Anti-Entropy Epidemic Protocol Byzantine Fault Tolerance

Đăng vào ngày 1 tháng 10 lúc 14:44