Skip to content

Thách thức của hệ thống phân tán

Lời mở đầu

Khi một máy không đủ dùng, vấn đề mới thực sự bắt đầu. Hệ thống phân tán là nền tảng của Internet hiện đại — từ tin nhắn WeChat đến đặt hàng trên Taobao, phía sau đều là hàng trăm hàng nghìn máy tính phối hợp làm việc. Nhưng "phân tán" không phải là bữa trưa miễn phí, nó mang theo một loạt thách thức mà hệ thống đơn máy chưa từng gặp phải.

Bài viết này sẽ giúp bạn học được gì?

Sau khi học xong chương này, bạn sẽ đạt được:

  • Định lý cốt lõi: Hiểu định lý CAP và ảnh hưởng của nó đến thiết kế hệ thống
  • Mô hình nhất quán: Phân biệt nhất quán mạnh, nhất quán cuối cùng, nhất quán nhân quả
  • Tám thách thức lớn: Nắm vững các vấn đề cốt lõi mà hệ thống phân tán phải đối mặt
  • Thuật toán đồng thuận: Tìm hiểu ý tưởng cơ bản của Paxos, Raft và các thuật toán đồng thuận phân tán khác
  • Mẫu thực chiến: Quen thuộc với các giải pháp phổ biến như 2PC, Saga, CRDT
ChươngNội dungKhái niệm cốt lõi
Chương 1Tại sao cần phân tánKhả năng mở rộng, tính sẵn sàng, phân bố địa lý
Chương 2Định lý CAPNhất quán, khả dụng, dung lỗi phân vùng
Chương 3Mô hình nhất quánNhất quán mạnh, nhất quán cuối, nhất quán nhân quả
Chương 4Tám thách thức lớnMạng, đồng hồ, phân vùng, split-brain v.v.
Chương 5Thuật toán đồng thuậnPaxos, Raft, ZAB
Chương 6Giao dịch phân tán2PC, Saga, TCC

0. Bức tranh toàn cảnh: Tại sao cần hệ thống phân tán?

Hệ thống đơn máy đơn giản và đáng tin cậy, nhưng có ba giới hạn không thể vượt qua:

Giới hạnMô tảGiải pháp phân tán
Giới hạn hiệu suấtCPU, bộ nhớ, ổ đĩa đơn máy có giới hạn vật lýMở rộng ngang: thêm máy để phân tải
Điểm lỗi đơnMột máy hỏng, toàn bộ dịch vụ hỏngBản dự phòng: nhiều máy sao lưu cho nhau
Độ trễ địa lýNgười dùng ở khắp nơi trên thế giới, máy chỉ có thể ở một nơiTriển khai nhiều nơi: phục vụ người dùng ở gần

Cái giá của phân tán

Hệ thống phân tán giải quyết các vấn đề trên, nhưng mang thêm độ phức tạp mới: mạng không đáng tin cậy, đồng hồ không đồng bộ, lỗi cục bộ, nhất quán dữ liệu... Đây chính là những "thách thức" mà bài viết này sẽ thảo luận.

Tám sai lầm về tính toán phân tán của Peter Deutsch cho chúng ta biết rằng các giả định sau trong môi trường phân tán đều sai:

  1. Mạng là đáng tin cậy
  2. Độ trễ bằng không
  3. Băng thông là vô hạn
  4. Mạng là an toàn
  5. Cấu trúc liên kết không thay đổi
  6. Chỉ có một quản trị viên
  7. Chi phí truyền tải bằng không
  8. Mạng là đồng nhất

1. Định lý CAP: "Tam giác bất khả thi" của hệ thống phân tán

Năm 2000, Eric Brewer đưa ra phỏng đoán CAP (sau này được chứng minh là định lý): một hệ thống phân tán tối đa chỉ có thể đáp ứng đồng thời hai trong ba thuộc tính sau.

Thuộc tínhÝ nghĩaHiểu đơn giản
Consistency (Nhất quán)Tất cả các nút nhìn thấy cùng một dữ liệu tại cùng một thời điểmBạn kiểm tra số dư ở bất kỳ ATM nào, kết quả đều giống nhau
Availability (Khả dụng)Mọi yêu cầu đều nhận được phản hồi không lỗiHệ thống luôn có thể phản hồi, không bao giờ nói "dịch vụ không khả dụng"
Partition tolerance (Dung lỗi phân vùng)Hệ thống vẫn hoạt động khi mạng bị phân vùngNgay cả khi một số dây mạng bị đứt, hệ thống vẫn hoạt động
CAP Theorem Interactive Demo
Select two properties to inspect the corresponding system type
C
Consistency
All nodes see the same data
A
Availability
Every request receives a response
P
Partition tolerance
The system keeps running during network partitions
CA system (gives up partition tolerance)
When there is no network partition, the system can provide both consistency and availability. In distributed environments, partitions are unavoidable, so pure CA systems are rare in practice.
Typical systems: Single-node MySQL, PostgreSQL in single-node mode
Sacrifices: Partition tolerance (P): unavailable during network failures

Tại sao chỉ có thể chọn hai?

Trong môi trường phân tán, phân vùng mạng (P) là không thể tránh khỏi — cáp quang bị đào đứt, thiết bị chuyển mạch hỏng, trung tâm dữ liệu mất mạng. Do đó P là bắt buộc, lựa chọn thực tế là đánh đổi giữa C và A:

  • Chọn CP: Khi phân vùng, từ chối các yêu cầu không chắc chắn, đảm bảo dữ liệu chính xác → phù hợp tài chính, kho hàng
  • Chọn AP: Khi phân vùng, vẫn phục vụ, nhưng dữ liệu có thể tạm thời không nhất quán → phù hợp mạng xã hội, nội dung

CAP không phải đen hoặc trắng

Hệ thống thực tế không đơn giản là "CP hoặc AP". Nhiều hệ thống đưa ra các lựa chọn khác nhau cho các thao tác khác nhau — ví dụ cùng một cơ sở dữ liệu, thao tác đọc có thể là AP (cho phép đọc dữ liệu cũ), thao tác ghi có thể là CP (yêu cầu xác nhận từ đa số).


2. Mô hình nhất quán: "Mức độ nghiêm ngặt" của đồng bộ dữ liệu

Nhất quán không phải là một công tắc (có hoặc không), mà là một quang phổ. Các mô hình nhất quán khác nhau đánh đổi khác nhau giữa "tính chính xác" và "hiệu suất".

Consistency Model Comparison
Click to compare behavior across consistency models
Strong consistency
Eventual consistency
Causal consistency
Strong consistency
After a write succeeds, every node immediately returns the newest value, giving an experience like a single-machine database.
T1
Node A
v1
Node B
v1
Node C
v1
Initial state: all nodes are consistent
T2
Node A
v2 write
Node B
syncing...
Node C
syncing...
The client writes v2 and waits for every node to confirm
T3
Node A
v2
Node B
v2
Node C
v2
Only after all nodes confirm does the write succeed; any node reads v2
Trade-off: Higher latency because all nodes must confirm, and lower availability because node failures may block progress.

So sánh mô hình nhất quán

Mô hìnhĐảm bảoĐộ trễPhù hợp
Nhất quán mạnhGiá trị đọc được chắc chắn là giá trị ghi mới nhấtCao (cần chờ đồng bộ)Chuyển khoản ngân hàng, trừ kho
Nhất quán cuối cùngCuối cùng tất cả bản sao sẽ nhất quán, nhưng giữa chừng có thể đọc giá trị cũThấp (ghi xong trả về ngay)Bài đăng mạng xã hội, DNS
Nhất quán nhân quảCác thao tác có quan hệ nhân quả được đảm bảo thứ tựTrung bìnhTrả lời bình luận, chỉnh sửa cộng tác
Nhất quán tuyến tínhTất cả thao tác trông giống như thực hiện theo thứ tự trên một máyCao nhấtKhóa phân tán, bầu chọn leader
Nhất quán phiênTrong cùng một phiên đảm bảo đọc được dữ liệu mình vừa ghiThấp-TrungDữ liệu cá nhân người dùng

Nhất quán "đọc dữ liệu mình vừa ghi"

Nhu cầu thực tế phổ biến nhất là: sau khi người dùng sửa dữ liệu của mình, họ có thể ngay lập tức thấy cập nhật (nhưng người dùng khác có thể thấy sau). Đây gọi là nhất quán "Read Your Own Writes", là một cải tiến thực dụng của nhất quán cuối cùng.


3. Tám thách thức lớn: "Bãi mìn" của hệ thống phân tán

Độ phức tạp của hệ thống phân tán không đến từ một vấn đề đơn lẻ, mà từ nhiều vấn đề đan xen nhau. Dưới đây là tám thách thức cốt lõi nhất.

Eight Challenges in Distributed Systems
Click each challenge to inspect details and mitigation strategies
🔌
Unreliable network
Clock drift
✂️
Network partition
🔄
Data consistency
💥
Partial failure
🧠
Split brain
📋
Event ordering
🔐
Distributed transaction
🔌 Unreliable network
Nodes communicate over networks that may drop packets, delay messages, or disconnect at any time. This is the fundamental challenge of distributed systems: never assume the network is reliable.
Scenario: Service A calls service B and receives no response after 3 seconds. Did B miss the request, or did B process it and lose the response? A cannot tell.
Mitigation strategies:
  • Timeouts and retries with idempotency
  • Heartbeat checks to detect connection health
  • Circuit breakers to pause calls after repeated failures

Mối liên hệ giữa các thách thức

Tám thách thức này không độc lập, chúng liên quan chặt chẽ:

  • Mạng không đáng tin cậy → dẫn đến Phân vùng mạng → kích hoạt Đánh giá CAP
  • Đồng hồ không đồng bộ → dẫn đến Khó sắp xếp sự kiện → ảnh hưởng Nhất quán dữ liệu
  • Lỗi cục bộ → có thể dẫn đến Split-brain → cần Thuật toán đồng thuận để giải quyết
  • Nhất quán dữ liệu → cần Giao dịch phân tán → nhưng giao dịch lại bị ảnh hưởng bởi Mạng không đáng tin cậy

Không có viên đạn bạc

Hệ thống phân tán không có giải pháp "hoàn hảo", chỉ có sự đánh đổi "phù hợp". Hiểu bản chất của các thách thức này thì mới đưa ra được sự lựa chọn đúng đắn khi thiết kế hệ thống.


4. Thuật toán đồng thuận: Làm sao để nhiều máy "đạt được thống nhất"

Thuật toán đồng thuận là cốt lõi của hệ thống phân tán — vấn đề nó giải quyết là: nhiều nút làm sao đạt được thống nhất về một giá trị nào đó? Ngay cả khi một số nút lỗi hoặc mạng bị trễ.

4.1 Paxos

Leslie Lamport đưa ra năm 1990, là thuật toán đồng thuận đầu tiên được chứng minh tính chính xác một cách nghiêm ngặt.

Vai tròTrách nhiệm
ProposerĐề xuất proposal (giá trị)
AcceptorBình chọn chấp nhận hoặc từ chối proposal
LearnerHọc giá trị cuối cùng được chọn

Quy trình hai giai đoạn:

  1. Giai đoạn Prepare: Proposer gửi số proposal, Acceptor cam kết không chấp nhận proposal có số nhỏ hơn
  2. Giai đoạn Accept: Proposer gửi giá trị cụ thể, đa số Acceptor chấp nhận thì proposal thông qua

Vấn đề của Paxos

Paxos tuy chính xác nhưng nổi tiếng là khó hiểu và khó triển khai. Chính bài báo của Lamport đã dùng một phép ẩn dụ về nghị viện Hy Lạp, kết quả làm nhiều người càng bối rối hơn.

4.2 Raft: Ra đời vì khả năng hiểu được

Năm 2014 Diego Ongaro đưa ra Raft, mục tiêu là tạo ra một "Paxos dễ hiểu". Nó phân giải bài toán đồng thuận thành ba bài toán con:

Bài toán conMô tả
Bầu chọn LeaderBầu ra một Leader trong cụm, mọi thao tác ghi đều đi qua Leader
Sao chép nhật kýLeader sao chép nhật ký thao tác đến tất cả Follower
Tính an toànĐảm bảo nhật ký đã commit không bị ghi đè

Quy trình cốt lõi của Raft:

  1. Khi cụm khởi động, tất cả các nút đều là Follower
  2. Nếu Follower hết thời gian chờ không nhận được heartbeat từ Leader, sẽ trở thành Candidate và khởi động bầu cử
  3. Candidate nhận được đa số phiếu sẽ trở thành Leader mới
  4. Leader nhận yêu cầu từ client, sao chép nhật ký đến đa số nút rồi commit

4.3 So sánh thuật toán đồng thuận

Thuật toánNăm đề xuấtKhả năng hiểuHệ thống sử dụng
Paxos1990KhóGoogle Chubby
Raft2014Dễetcd, Consul, TiKV
ZAB2011Trung bìnhZooKeeper
EPaxos2013KhóChủ yếu là nghiên cứu học thuật

5. Giao dịch phân tán: "Tất cả hoặc không có gì" xuyên nút

Giao dịch của cơ sở dữ liệu đơn máy có thể thực hiện ACID thông qua khóa cục bộ và nhật ký. Nhưng khi một thao tác nghiệp vụ liên quan đến nhiều dịch vụ/cơ sở dữ liệu, làm sao đảm bảo tính nguyên tử?

5.1 Two-Phase Commit (2PC)

Giao thức giao dịch phân tán kinh điển nhất, chia thành hai giai đoạn:

Giai đoạnHành động của CoordinatorHành động của Participant
PrepareHỏi tất cả participant "có thể commit không?"Thực hiện thao tác nhưng không commit, trả lời Yes/No
CommitNếu tất cả Yes, gửi CommitCommit chính thức; nếu có No, tất cả rollback

Vấn đề của 2PC:

  • Chặn: Sau Prepare nếu coordinator hỏng, participant sẽ chờ mãi
  • Điểm lỗi đơn: Coordinator là điểm đơn, hỏng thì toàn bộ giao dịch bị treo
  • Hiệu suất kém: Cần nhiều lần truyền tin mạng, thời gian giữ khóa dài

5.2 Mô hình Saga

Saga chia một giao dịch lớn thành nhiều giao dịch cục bộ, mỗi giao dịch cục bộ có thao tác bù đắp tương ứng. Nếu một bước thất bại, sẽ thực hiện bù đắp theo thứ tự ngược lại.

Ví dụ Saga đặt hàng thương mại điện tử:

BướcThao tác thuậnThao tác bù đắp
T1Tạo đơn hàng (chờ thanh toán)Hủy đơn hàng
T2Trừ kho hàngKhôi phục kho
T3Trừ số dưHoàn trả số dư
T4Xác nhận đơn hàng (đã thanh toán)

Nếu T3 (trừ số dư) thất bại: thực hiện C2 (khôi phục kho) → C1 (hủy đơn hàng).

Hai cách điều phối:

  • Biên đạo (Choreography): Mỗi dịch vụ lắng nghe sự kiện, tự quyết định bước tiếp theo. Đơn giản nhưng khó theo dõi trạng thái toàn cục
  • Điều phối (Orchestration): Có một coordinator trung tâm điều khiển luồng. Rõ ràng nhưng coordinator là điểm đơn

5.3 TCC (Try-Confirm-Cancel)

TCC là triển khai 2PC ở tầng nghiệp vụ, chia mỗi thao tác thành ba giai đoạn:

Giai đoạnMô tảVí dụ (trừ kho)
TryDự trữ tài nguyên, nhưng không thực sự thực hiệnĐông lạnh 10 sản phẩm (kho khả dụng -10, kho đông lạnh +10)
ConfirmXác nhận thực hiện, tiêu thụ tài nguyên đã dự trữKho đông lạnh -10 (trừ thực sự)
CancelHủy dự trữ, giải phóng tài nguyênKho đông lạnh -10, kho khả dụng +10 (khôi phục)

5.4 So sánh ba phương án

Phương ánNhất quánHiệu suấtĐộ phức tạpPhù hợp
2PCNhất quán mạnhThấpTrung bìnhGiao dịch liên cơ sở dữ liệu ở tầng DB
SagaNhất quán cuốiCaoCaoQuy trình nghiệp vụ dài (đơn hàng, logistics)
TCCNhất quán cuốiTrung bìnhCao nhấtKịch bản tài chính độ tin cậy cao

Gợi ý lựa chọn thực tế

  • Có thể dùng giao dịch đơn cơ sở thì không nên dùng giao dịch phân tán
  • Hầu hết kịch bản nghiệp vụ dùng Saga + hàng đợi tin nhắn là đủ
  • TCC phù hợp với kịch bản tài chính yêu cầu nhất quán cực cao, nhưng chi phí phát triển rất cao
  • 2PC phù hợp cho middleware cơ sở dữ liệu (như ShardingSphere) xử lý tự động

Tổng kết

Hệ thống phân tán là hạ tầng của Internet hiện đại, nhưng độ phức tạp của nó vượt xa hệ thống đơn máy. Hiểu các thách thức này không phải để "giải quyết" chúng (nhiều vấn đề là mang tính bản chất), mà để đưa ra sự đánh đổi đúng đắn khi thiết kế hệ thống.

Ôn lại các điểm chính của chương này:

  1. Định lý CAP: Phân vùng mạng không thể tránh khỏi, lựa chọn thực tế là đánh đổi giữa nhất quán và khả dụng
  2. Mô hình nhất quán: Từ nhất quán mạnh đến nhất quán cuối là một quang phổ, chọn theo nhu cầu nghiệp vụ
  3. Tám thách thức lớn: Mạng không đáng tin cậy, đồng hồ không đồng bộ, phân vùng mạng, split-brain v.v. liên quan chặt chẽ
  4. Thuật toán đồng thuận: Raft là thuật toán đồng thuận thực dụng nhất hiện nay, etcd/Consul đều dựa trên nó
  5. Giao dịch phân tán: Saga phù hợp hầu hết kịch bản, TCC phù hợp kịch bản tài chính, 2PC phù hợp tầng cơ sở dữ liệu

Đọc thêm