Công nghệ ngày càng phát triển, hệ thống ngày càng mở rộng, các ứng dụng thường vượt quá khả năng của một máy chủ đơn lẻ. Hệ thống phân tán xuất hiện như một giải pháp hiệu quả khi chúng ta cần mở rộng quy mô vượt ra ngoài khả năng của từng máy riêng lẻ và đảm bảo tính khả dụng, khả năng mở rộng và khả năng chịu lỗi trên toàn mạng máy tính.
Kiến thức cơ bản về điện toán phân tán
1. Điện toán phân tán là gì?
Điện toán phân tán đề cập đến một hệ thống mà trong đó nhiều máy tính độc lập (hoặc các nút) hoạt động cùng nhau để đạt được một mục tiêu chung. Các hệ thống này thường trải dài trên nhiều vị trí và có thể được tạo thành từ các máy móc khác nhau như máy chủ, máy ảo hoặc thậm chí là các thiết bị biên. Mỗi máy xử lý một tập hợp con của tổng khối lượng công việc và cùng nhau, chúng tạo thành một đơn vị gắn kết.
2. Đặc điểm chính của hệ thống phân tán
- Phân quyền: Không có máy nào chịu trách nhiệm cho tất cả các nhiệm vụ; thay vào đó, mỗi nút đóng góp vào chức năng tổng thể của hệ thống.
- Khả năng mở rộng: Hệ thống phân tán có thể xử lý khối lượng công việc ngày càng tăng bằng cách thêm nhiều nút vào mạng.
- Khả năng chịu lỗi: Nếu một máy bị lỗi, các máy khác có thể tiếp tục hoạt động, đảm bảo hệ thống vẫn hoạt động.
- Tính đồng thời: Nhiều tác vụ được thực thi song song, cho phép xử lý nhanh hơn và sử dụng tài nguyên hiệu quả hơn.
- Độ trễ: Giao tiếp giữa các nút chậm hơn so với hệ thống máy đơn lẻ do chi phí mạng, điều này có thể gây ra độ trễ trong việc chia sẻ dữ liệu và phối hợp.
Ví dụ thực tế:
- Điện toán đám mây: AWS, Google Cloud và Azure là những ví dụ điển hình của hệ thống phân tán. Các nhà cung cấp đám mây này phân phối lưu trữ dữ liệu và tính toán trên các trung tâm dữ liệu trên toàn thế giới.
- Mạng phân phối nội dung (CDN): Các dịch vụ như Akamai hoặc Cloudflare phân phối nội dung trên toàn cầu để đảm bảo phân phối nhanh bằng cách lưu trữ nội dung trên nhiều máy chủ gần với người dùng.
Phối hợp trong hệ thống phân tán
1. Những thách thức trong phối hợp
Trong các hệ thống phân tán, phối hợp giữa các nút là một trong những khía cạnh phức tạp nhất. Không giống như trong hệ thống máy đơn lẻ, nơi mọi thứ được kiểm soát ở một nơi, hệ thống phân tán phải đồng bộ hóa giữa các nút khác nhau để duy trì tính nhất quán và đảm bảo hoạt động trơn tru.
Các thách thức phối hợp chính bao gồm:
- Tính nhất quán dữ liệu: Đảm bảo rằng tất cả các nút đều có cùng một phiên bản dữ liệu tại bất kỳ thời điểm nào, ngay cả trong trường hợp xảy ra lỗi.
- Đồng bộ hóa: Các nút phải phối hợp với nhau để hoàn thành nhiệm vụ. Việc đảm bảo rằng mỗi nút đều biết những gì các nút khác đang làm là rất quan trọng để tránh xung đột hoặc trùng lặp công việc.
- Lỗi: Vì các nút có thể bị lỗi bất cứ lúc nào, hệ thống phải tiếp tục hoạt động mà không ảnh hưởng đến độ tin cậy tổng thể.
2. Cơ chế phối hợp
- Bầu cử trưởng nhóm: Trong nhiều hệ thống phân tán, một nút được chọn làm trưởng nhóm để điều phối các tác vụ giữa các nút khác. Ví dụ: trong cơ sở dữ liệu phân tán, một nút có thể được chọn để xử lý các hoạt động ghi để tránh xung đột.
- Khóa và loại trừ tương hỗ: Khi nhiều nút cần truy cập vào cùng một tài nguyên, các cơ chế khóa phân tán (như ZooKeeper) giúp đảm bảo rằng chỉ một nút có thể truy cập tài nguyên tại một thời điểm.
- Nhịp tim và kiểm tra sức khỏe: Các nút thường xuyên gửi tín hiệu (nhịp tim) để cho biết rằng chúng đang hoạt động. Nếu một nút không gửi được nhịp tim trong một khoảng thời gian xác định, hệ thống có thể kích hoạt các cơ chế chuyển đổi dự phòng.
Ví dụ thực tế: Khóa phân tán với ZooKeeper: ZooKeeper là một dịch vụ phối hợp phân tán được nhiều hệ thống sử dụng để quản lý cấu hình, đồng bộ hóa và đặt tên. Trong kiến trúc microservices, bạn có thể sử dụng ZooKeeper để đảm bảo rằng chỉ có một phiên bản dịch vụ hoạt động như trưởng nhóm hoặc để tạo các khóa phân tán ngăn hai dịch vụ thực hiện các thay đổi xung đột đối với tài nguyên được chia sẻ.
Thuật toán đồng thuận (Paxos, Raft, v.v.)
1. Sự cần thiết của đồng thuận
Trong các hệ thống phân tán, nhiều nút thường cần thống nhất về một giá trị hoặc trạng thái cụ thể - ví dụ: thứ tự của các giao dịch trong cơ sở dữ liệu hoặc nút nào nên là trưởng nhóm. Tuy nhiên, việc đạt được sự đồng thuận trong môi trường phân tán trở nên phức tạp do độ trễ mạng, lỗi nút và thiếu thẩm quyền trung tâm. Đây là lúc các thuật toán đồng thuận phát huy tác dụng.
2. Thuật toán Paxos
Tổng Quan: Paxos là một trong những thuật toán đồng thuận sớm nhất và nổi tiếng nhất, được thiết kế để giúp các hệ thống phân tán thống nhất về một giá trị duy nhất, ngay cả khi đối mặt với lỗi nút và giao tiếp không đáng tin cậy.
Cách thức hoạt động: Paxos hoạt động theo ba giai đoạn:
- Chuẩn bị: Người đề xuất gửi đề xuất đến một tập hợp các nút (người chấp nhận) yêu cầu họ hứa không chấp nhận các đề xuất có số thấp hơn số đang được đề xuất.
- Hứa hẹn: Những người chấp nhận phản hồi bằng một lời hứa rằng họ sẽ không chấp nhận các đề xuất có số thấp hơn. Họ cũng chia sẻ bất kỳ giá trị nào đã được chấp nhận trước đó.
- Chấp nhận: Nếu người đề xuất nhận được đủ lời hứa, nó sẽ gửi thông báo "chấp nhận" với giá trị được đề xuất của nó. Sau đó, những người chấp nhận cập nhật trạng thái của họ.
Thách thức: Mặc dù Paxos đảm bảo sự đồng thuận, nhưng nó được biết đến là khó thực hiện và hiểu do tính phức tạp của nó.
3. Thuật toán Raft
Tổng quan: Raft là một thuật toán đồng thuận được thiết kế để dễ hiểu và triển khai hơn so với Paxos. Raft chia sự đồng thuận thành ba thành phần riêng biệt: bầu cử trưởng nhóm, nhân bản nhật ký và an toàn.
Bầu cử trưởng nhóm: Một trong các nút được bầu làm trưởng nhóm và tất cả các thay đổi đều thông qua trưởng nhóm để đảm bảo tính nhất quán.
Nhân bản nhật ký: Trưởng nhóm nhận các bản cập nhật từ máy khách và nhân bản chúng sang các nút khác (người theo dõi). Khi phần lớn các nút thừa nhận thay đổi, nó được coi là đã được xác nhận.
An toàn: Raft đảm bảo rằng một khi một mục nhật ký đã được xác nhận, nó không thể bị ghi đè hoặc mất.
Ví dụ thực tế: Etcd và Consul, được sử dụng rộng rãi trong kiến trúc microservices để khám phá dịch vụ và cấu hình phân tán, đều sử dụng thuật toán Raft để bầu cử trưởng nhóm và nhất quán.
Ứng dụng thực tế của thuật toán đồng thuận
- Cơ sở dữ liệu phân tán: Các thuật toán đồng thuận được sử dụng để đảm bảo rằng tất cả các bản sao của cơ sở dữ liệu đều có cùng trạng thái, ngay cả trong trường hợp phân vùng mạng hoặc lỗi nút.
- Khám phá dịch vụ: Trong kiến trúc microservices, các thuật toán đồng thuận giúp quản lý các cơ chế khám phá dịch vụ, đảm bảo rằng tất cả các dịch vụ đều thống nhất về nút nào chịu trách nhiệm cho tác vụ nào.
Lưu trữ và nhân bản dữ liệu phân tán
1. Lưu trữ dữ liệu phân tán
Khi một máy đơn lẻ không còn có thể lưu trữ hoặc quản lý lượng dữ liệu ngày càng tăng, bạn cần có bộ lưu trữ dữ liệu phân tán. Điều này liên quan đến việc lưu trữ dữ liệu trên nhiều máy (nút), mỗi máy chịu trách nhiệm cho một tập hợp con của dữ liệu.
Thách thức trong lưu trữ dữ liệu phân tán:
- Tính nhất quán dữ liệu: Giữ cùng một phiên bản dữ liệu trên tất cả các nút là một thách thức, đặc biệt là trong trường hợp các nút có thể bị lỗi hoặc bị ngắt kết nối.
- Phân vùng: Chia dữ liệu thành các phần nhỏ hơn và phân phối nó trên các nút (ví dụ: phân vùng ngang) là cần thiết để mở rộng quy mô, nhưng việc quyết định cách phân vùng dữ liệu một cách hiệu quả là điều khó khăn.
2. Nhân bản
Nhân bản đề cập đến việc tạo các bản sao của cùng một dữ liệu trên các nút khác nhau để đảm bảo khả năng chịu lỗi và tính khả dụng. Nếu một nút bị lỗi, một nút khác có thể tiếp quản, đảm bảo hệ thống vẫn hoạt động.
Các loại nhân bản:
- Nhân bản đồng bộ:
- Trong nhân bản đồng bộ, dữ liệu được sao chép sang nhiều nút ngay lập tức. Khi máy khách ghi dữ liệu, thao tác ghi chỉ được coi là thành công sau khi tất cả các bản sao đều thừa nhận thao tác.
- Trường hợp sử dụng: Nhân bản đồng bộ đảm bảo tính nhất quán mạnh mẽ, nhưng nó có thể gây ra độ trễ, đặc biệt là trong các hệ thống phân tán theo địa lý.
Ví dụ thực tế: Trong hệ thống ngân hàng, nhân bản đồng bộ đảm bảo rằng số dư tài khoản luôn nhất quán trên các trung tâm dữ liệu khác nhau.
- Nhân bản không đồng bộ:
- Trong nhân bản không đồng bộ, nút chính xử lý thao tác ghi và trả về thành công ngay lập tức, trong khi quá trình nhân bản sang các nút phụ diễn ra trong nền.
- Trường hợp sử dụng: Nhân bản không đồng bộ cải thiện hiệu suất nhưng có nguy cơ không nhất quán tạm thời nếu nút chính bị lỗi trước khi quá trình nhân bản hoàn tất.
Ví dụ thực tế: Các nền tảng truyền thông xã hội có thể sử dụng nhân bản không đồng bộ cho các bài đăng của người dùng, trong đó việc chậm trễ một chút trong quá trình lan truyền là có thể chấp nhận được.
Ví dụ thực tế: Lưu trữ tệp phân tán với HDFS
Hệ thống tệp phân tán Hadoop (HDFS) là một hệ thống lưu trữ phân tán được sử dụng rộng rãi, chia các tệp thành các khối và lưu trữ chúng trên nhiều nút. Mỗi khối được nhân bản để đảm bảo khả năng chịu lỗi. Nếu một nút bị lỗi, hệ thống sẽ tự động nhân bản khối đó sang một nút khác để duy trì hệ số nhân bản mong muốn.
Nhân bản và định lý CAP: Nhân bản gắn liền với Định Lý CAP, trong đó nói rằng các hệ thống phân tán chỉ có thể cung cấp hai trong số ba đảm bảo sau:
- Tính nhất quán: Tất cả các nút đều thấy cùng một dữ liệu cùng một lúc.
- Tính khả dụng: Mọi yêu cầu đều nhận được phản hồi, ngay cả khi một số nút bị lỗi.
- Khả năng chịu lỗi phân vùng: Hệ thống tiếp tục hoạt động ngay cả khi giao tiếp giữa các nút bị gián đoạn.
Trong thực tế, các hệ thống thường chọn giữa tính nhất quán và tính khả dụng, tùy thuộc vào trường hợp sử dụng. Ví dụ: hệ thống ngân hàng ưu tiên tính nhất quán, trong khi hệ thống truyền thông xã hội có thể ưu tiên tính khả dụng.
Kết hợp mọi thứ lại với nhau
Hệ thống phân tán tạo ra sự phức tạp không tồn tại trong các ứng dụng nút đơn lẻ, nhưng chúng cũng mang đến khả năng mở rộng quy mô, cung cấp khả năng chịu lỗi và cải thiện hiệu suất. Bằng cách hiểu các nguyên tắc cơ bản của phối hợp, thuật toán đồng thuận và lưu trữ dữ liệu phân tán, bạn có thể thiết kế các hệ thống mạnh mẽ, có khả năng mở rộng đáp ứng nhu cầu của các ứng dụng hiện đại.
Cảm ơn các bạn đã theo dõi.