DAG rõ ràng thay vì Đồng hồ Vector để đồng bộ hóa


13

Tôi đã bắt đầu xem xét các cách tiếp cận để đồng bộ hóa dữ liệu giữa một nhóm các đồng nghiệp. Các đồng nghiệp phải có khả năng làm việc theo cách bị ngắt kết nối và sau đó đồng bộ hóa với nhau để hợp nhất các thay đổi cục bộ của họ.

Các đồng nghiệp có thể hợp nhất các cập nhật cục bộ với "hợp nhất ba chiều" . Vì vậy, tại các đồng nghiệp đồng nghiệp nên biết những sự kiện nào gần đây hơn, nhưng nếu không có thứ tự nghiêm ngặt, họ sẽ có thể hợp nhất các sự kiện dựa trên gốc chung.

Khi các đồng nghiệp độc lập thực hiện thay đổi, họ có thể "đóng dấu thời gian" cho họ bằng "đồng hồ". Tôi sử dụng thuật ngữ "đồng hồ" và "dấu thời gian" nhưng tôi không có nghĩa là đồng hồ treo tường. Tôi có nghĩa là một số loại trật tự một phần của các sự kiện mà làm cho quan hệ nhân quả rõ ràng. Đó là mối quan hệ "đã xảy ra trước đây" giữa các sự kiện hình thành một biểu đồ chu kỳ có hướng (DAG).

Có vẻ như cách "thông thường" để xây dựng thứ tự từng phần này là sử dụng đồng hồ vector . Chúng có thể trở nên rất lớn, tuy nhiên. Nhiều phát triển gần đây như đồng hồ cây khoảng cung cấp lưu trữ tem thời gian nhỏ gọn hơn.

Điều tôi không rõ ràng là tại sao các giao thức đồng bộ hóa dường như không "đơn giản" lưu trữ DAG một cách rõ ràng. (Hay là họ?)

Các đồng nghiệp có thể độc lập tạo dấu thời gian bằng cách tạo ngẫu nhiên UUID (hoặc bằng các phương tiện khác, chẳng hạn như <peer-name> + <local-monotonically-increasing-counter>). Thứ tự của dấu thời gian này là hoàn toàn rõ ràng với đồng nghiệp đó.

Khi 2 đồng nghiệp đồng bộ với nhau, họ có thể đồng ý về dấu thời gian mới. Một lần nữa, thứ tự của dấu thời gian này là rõ ràng cho cả các đồng nghiệp.

Hiện tại có một yêu cầu để vượt qua xảy ra trước DAG giữa các đồng nghiệp, nhưng yêu cầu lưu trữ và băng thông của điều này là nhỏ. Điểm thời gian là đỉnh đồ thị. Như vậy, chúng có 1 hoặc 2 cạnh đến (1 cho một sự kiện trên máy khách và 2 cho đồng bộ giữa các máy khách). Điều này được giới hạn và độc lập với số lượng đồng nghiệp trong mạng.

Để sử dụng một điểm thời gian riêng lẻ, bạn cần có biểu đồ về các điểm thời gian dẫn đến điều này. Tuy nhiên, theo như tôi có thể thấy, bất kỳ đồng nghiệp nào có thể biết về một điểm thời gian (nó đã tự tạo hoặc tạo nó với một đồng đẳng khác hoặc đã được một đồng nghiệp khác nói với nó khi đồng bộ hóa với nó) cũng đã có một cơ hội để biết về lịch sử dẫn đến thời điểm đó. Tôi nghĩ có lẽ có một bằng chứng quy nạp cho việc này.

Cho rằng việc lưu trữ và đồng bộ DAG rõ ràng có vẻ đơn giản: điều này có được sử dụng trong thực tế không? Nếu không, tại sao đồng hồ vector được ưa thích?


Ghi chú

Ngang ngang

Tôi muốn một giải pháp ngang hàng hơn một giải pháp máy chủ.

Cấu trúc liên kết cuối có khả năng sẽ có nhiều máy khách kết nối với một nhóm máy chủ nhỏ hơn nhiều bản sao chúng. Tuy nhiên, thật tuyệt khi có một giải pháp chung hỗ trợ cấu trúc liên kết cụ thể này hơn là một giải pháp yêu cầu cấu trúc liên kết cụ thể này.


Tôi có thể đang hiểu sai những gì bạn đang nói, nhưng không rõ làm thế nào một biểu đồ của tất cả các sự kiện dẫn đến một trạng thái có thể nhỏ hơn một vectơ của bộ đếm. Trừ khi bạn ở trong một hệ thống có số lượng nút cực lớn và số lượng thay đổi cực kỳ nhỏ.
kdgregory

Cảm ơn @kdgregory - điểm tốt. Để có thể tính toán hợp nhất ba cách trong tương lai, bạn cần biết quá khứ (và có thể xác định DAG của các điểm thời gian trong quá khứ). Vì vậy, nếu bạn đang lưu trữ các điểm thời gian trong quá khứ thì việc lưu trữ DAG rõ ràng là rẻ hơn. Nếu bạn không lưu trữ các điểm thời gian trong quá khứ thì bạn không thể tính toán hợp nhất ba cách của dữ liệu. - Tôi tự hỏi nếu yêu cầu ba cách này có thể là điều? Nếu bạn không muốn 3 chiều, có lẽ đồng hồ vector tốt hơn DAG rõ ràng?
Stewohn

Tôi cho rằng đây có thể là điểm quan trọng @kdgregory, vì vậy tôi đã thêm một chút về câu hỏi đó. Tôi giả định rằng có thể thực hiện hợp nhất 3 chiều, điều này cũng ngụ ý rằng tất cả lịch sử đã được biết đến. Nếu tất cả lịch sử đã biết thì (tôi nghĩ) một DAG rõ ràng sẽ rẻ hơn. Nếu lịch sử bị cắt ngắn, thì đồng hồ vector có lẽ là cách tiếp cận ít tốn kém hơn.
Stewohn

1
Vâng, sự hiểu biết của tôi về đồng hồ vector là chúng chỉ nhằm mục đích đưa ra quyết định chấp nhận / từ chối: "nút C đang cố cập nhật đoạn dữ liệu này, nhưng nó không biết về cập nhật của nút B".
kdgregory

Câu trả lời:


1

Theo như tôi có thể nói, các hệ thống kiểm soát phiên bản như Git và Mercurial sử dụng phương pháp DAG thay vì đồng hồ vector.


1
Nếu không có lời giải thích, câu trả lời này có thể trở nên vô dụng trong trường hợp nếu người khác đăng một ý kiến ​​trái ngược. Ví dụ: nếu ai đó đăng một yêu cầu như "Hệ thống kiểm soát chuyển đổi như Git và Mercurial sử dụng đồng hồ vectơ thay vì phương pháp DAG" , câu trả lời này sẽ giúp người đọc chọn ra hai ý kiến ​​trái ngược nhau như thế nào? Xem xét chỉnh sửa ing nó thành một hình dạng tốt hơn, để đáp ứng Làm thế nào để trả lời các tiêu chuẩn chất lượng.
gnat

2
Theo cách tôi hiểu câu hỏi, họ đã hỏi liệu có bất kỳ ví dụ thực tế nào về nơi DAG được sử dụng thay vì đồng hồ vector.
bikeman868

1
Cả Git và Mecurial đều là những ví dụ thực tế về đồng bộ hóa thay đổi ngang hàng bằng DAG và tôi hy vọng rằng benjohn sẽ thấy câu trả lời của tôi hữu ích ngay cả khi bạn bỏ phiếu.
bikeman868

Xin chào @ bikeman868 Tôi đã bình chọn cho bạn một mạng 0 (xin lỗi). Câu trả lời của bạn hữu ích, ngay cả khi diễn đạt với sự không chắc chắn! Trong khi các tài liệu tham khảo hoặc câu trả lời có thẩm quyền luôn tốt đẹp, trao đổi ngăn xếp không bắt buộc điều đó! Đề xuất của bạn có ý nghĩa tốt với các điểm trong nhận xét về câu hỏi. Có vẻ như khi bạn muốn lưu trữ lịch sử và có thể hợp nhất lịch sử, thì một DAG là phù hợp. Khi bạn không lưu trữ lịch sử và muốn đồng bộ hóa và đồng thuận về trạng thái hiện tại, thì đồng hồ vector là thứ bạn cần.
Stewohn 21/8/2016

1

Hãy xem xét vấn đề đồng thuận . Tùy thuộc vào yêu cầu nhiệm vụ của bạn (như bạn có bao nhiêu dữ liệu, bao nhiêu nút đồng bộ hóa, tần suất, v.v.) các giải pháp hiện có cho vấn đề đó (như "Raft") có thể phù hợp với trường hợp của bạn.

Một cách tiếp cận khác (có thể tiếp tuyến) cho vấn đề này là thiết kế CRDT .


Braid HTTP đang cố gắng tạo giao thức đồng bộ hóa trạng thái dựa trên CRDT thông qua việc tăng cường HTTP. Họ có một hình dung tuyệt vời về DAG thời gian và DAG không gian, và làm thế nào hai khái niệm này liên quan đến nhau để đạt được sự thống nhất cuối cùng.
Duane J
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.