Câu chuyện những nhà thám hiểm và nguyên lý C-A-P của hệ phân tán
Distributed System
7
White

Nghia Minh Le viết ngày 26/09/2016

Có 5 nhà thám hiểm cùng đi tìm một di tích cổ xưa giữa một một vùng rừng núi rộng lớn.
Các nhà thám hiểm đi theo 5 hướng khác nhau, sử dụng radio để liên lạc với nhau.
Do địa hình phức tạp, tín hiệu radio của các nhà thám hiểm không được ổn định. Càng đi sâu vào rừng, tín hiệu càng chập chờn.
Có những thời điểm tín hiệu radio liên lạc giữa các nhà thám hiểm mất hoàn toàn. Khi đó các nhà thám hiểu phải làm gì?

  • Họ dừng lại cho tới khi tín hiệu liên lạc giữa các nhà thám hiểm được nối lại hoàn toàn, như vậy họ sẽ không bị lạc và có thể cùng xác định được chính xác di tích thất lạc. Nhưng như vậy họ buộc phải dừng lại lâu hơn, thậm chí phải chờ qua đêm tối nguy hiểm.
  • Họ tiếp tục tìm kiếm theo các hướng của mình trong khi chờ tín hiệu thông suốt trở lại. Như vậy họ vẫn có thể tranh thủ thời gian trong rừng sâu, nhưng đối mặt với nguy cơ mất phương hướng, không rõ các nhà thám hiểm khác đã tìm được di tích hay chưa.

Câu chuyện trên thật đơn giản, nhưng lại là một ví dụ trực quan của ba tính chất vô cùng quan trọng của hệ phân tán. Ba tính chất đó là:

  • Consistency: tất cả các node phải có dữ liệu đồng nhất với nhau.
  • Availability: tính sẵn sàng hoạt động của các node. Hệ thống có thể vẫn hoạt động được không khi một số node bị chết.
  • Partition Fault Tolerance: trạng thái hoạt động của hệ thống khi đường mạng giữa các node bị đứt.

Trong câu chuyện trên thì:

  • Phương hướng các nhà thám hiểm và dữ liệu về vị trí di tích thể hiển thính consitency data.
  • Việc các nhà thám hiểm tiếp tục tìm kiếm hay không tìm kiếm thể hiện tính availability
  • Tín hiệu radio chập chờn thể hiện tính chất Partion Fault Tolerance là việc tìm kiếm của tất cả dừng lại hay tiếp tục.

Qua cậu chuyện trên thì ta có thể dễ dàng thấy là không thể đạt được cùng một lúc cả ba yếu tố trên:

  • Nếu mạng giữa các node bị đứt mà muốn hệ thống vẫn chạy được, thì các node phải available, nhưng do các node không kết nối với nhau được nên dữ liệu giữa các node sẽ không được đồng nhất. Phải hiểu từ đồng nhất theo nghĩa rộng, nó không đơn giản là dữ liệu giống nhau mà thể hiến tính tương đồng. Ví dụ trong một ứng dụng thương mại điện tử, khi 1 đơn hàng được ghi vào database thì tương ứng mặt hàng bị trừ đi một số lượng phù hợp, đồng thời kho hàng nhận được 1 ticket xuất hàng. Muốn dữ liệu đồng nhất và các node vẫn ở trạng thái available thì buộc toàn hệ thống phải dừng lại. Ví dụ khi kết nối từ website tới database bị đứt thì khi đó web application vẫn sống, database vẫn sống, nhưng hệ thống không thể hoạt động được. Thông thường chúng ta làm website thì không để ý ra nguyên lý này, khi bị đứt kết nối tới database thì chúng ta báo luôn cho người dùng là site gặp lỗi hệ thống. Nhưng thực ra thì lúc đó site vẫn hoạt động được bình thường, chính việc không có dữ liệu hiển thị, hoặc không biết ghi dữ liệu đi đâu thể hiện tính không đồng nhất dữ liệu giữa hai node là: web application và database. Trường hợp này có A và C nhưng không có P.

  • Còn mạng bị mất và hệ thống vẫn hoạt động được, các node vẫn available thì buộc phải chấp nhận dữ liệu khồng đồng nhất. Ví dụ giữa module đơn hàng và module quản lý tài khoản tiền của người dùng. Nếu bị đứt kết nối thì tiền có thể trừ mà đơn hàng vẫn không được submit thành công. Nhưng các node này vẫn hoạt động và thực hiện được các nghiệp vụ của từng module. Trường hợp này có A và P nhưng không có C.

  • Trường hợp cuối mạng giữa các node bị mất nhưng một hoặc một vài node bị mất và dữ liệu vẫn phải đảm bảo consistency. Trường hợp này có thể có được khi việc xử lý dữ liệu giữa các node là độc lập. Còn đương nhiên nếu xử lý cần hai node tham gia mà một node không available thì không thể thực hiện được. Ví dụ website đọc báo đứt kết nối tới database, nhưng người dùng vẫn đọc được vì dữ liệu báo đã được cache trong RAM. Trường hợp này có C và P nhưng không có A.

Hệ thống phân tán không phải cái gì xa xôi, khi bạn có từ hai quá trình xử lý độc lập chạy trên hai process khác nhau (dù cho là trên cùng một server vật lý) là bạn đã có một hệ phân tán rồi. Bạn có web application, có database, có cache, mobile app, trình duyệt... Tất cả đó là các node tạo thành một hệ thống phân tán. Vì vậy bạn cần nắm được nguyên CAP (CAP Theorem) để có thể thiết kế hệ thống phù hợp với yêu cầu nghiệp vụ.

Thông thường, người ta thường đánh đổi yếu tố C để lấy hai yếu tố A và P. Khi đó họ sẽ thay thế Consistency thành eventually consistency. Làm như thế hệ thống sẽ có hiệu năng tốt hơn. Còn tại sao thì anh em chém gió sau ^^

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nghia Minh Le

10 bài viết.
115 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
29 0
1. Nguyên lý consistency của relational database – SQL Server. SQL Server nói riêng và các database quan hệ nói chung là dạng database có độ nhất...
Nghia Minh Le viết gần 2 năm trước
29 0
White
19 0
Nhân đọc cuốn The Pragmatic Programmer Lập trình viên thực dụng, note lại mấy dòng về tính thực dụng trong thiết kế. Có một câu chuyện vui: có căn...
Nghia Minh Le viết hơn 1 năm trước
19 0
White
16 2
Mô hình Event Sourcing là một mô hình thiết kế hệ thống mà theo đó sẽ lưu giữ trạng thái thay đổi của một đối tượng là một chuỗi các thay đổi đã xả...
Nghia Minh Le viết gần 2 năm trước
16 2
Bài viết liên quan
White
9 1
Transaction và Distributed Transaction là các vấn đề phải đối mặt rất nhiều trong xây dựng các hệ thống lớn Enterprise Software. Nó ảnh hưởng rất l...
Nghia Minh Le viết gần 2 năm trước
9 1
White
5 0
Tranh chấp tài nguyên là vấn đề lớn cần phải giải quyết trong việc xây dựng hệ thống lớn. Việc tranh chấp tài nguyên ảnh hưởng lớn tới hiệu năng và...
Nghia Minh Le viết gần 2 năm trước
5 0
White
2 0
Khi xây dựng hệ thống xử lý bất đồng bộ dựa trên message thì việc monitor có tính chất cốt tử. Đó là một thách thức rất khó khăn, không có một hệ t...
Nghia Minh Le viết gần 2 năm trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
115 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!