Hệ thống Phân tán Zookeeper: Tổng quan và Ứng dụng

Tổng quan về Zookeeper

Định nghĩa Zookeeper

Zookeeper là dịch vụ điều phối (Coordination) phân tán, hiệu năng cao, mã nguồn mở, được phát triển dựa trên Chubby của Google. Đây là thành phần quan trọng trong hệ sinh thái Hadoop và Hbase, cung cấp giải pháp đảm bảo tính nhất quán dữ liệu cho hệ thống phân tán.

Các tình huống sử dụng

Zookeeper cung cấp dịch vụ lưu trữ và điều phối phân tán với hiệu năng cao, khả dụng tốt và kiểm soát truy cập chặt chẽ.

  • Quản lý cấu hình tập trung
  • Dịch vụ khóa phân tán
  • Quản trị cụm máy chủ
  • Tạo ID duy nhất phân tán

Quản lý cấu hình tập trung

Ứng dụng phân tán thường cần chia sẻ cấu hình chung (như URL database, thông tin đăng nhập). Zookeeper giải quyết vấn đề này bằng giao thức Zab, đảm bảo đồng bộ dữ liệu cấu hình trên tất cả máy chú. Ví dụ: Kafka sử dụng Zookeeper để quản lý cấu hình.

Dịch vụ khóa phân tán

Khi nhiều máy chủ trong cụm cần phối hợp thực hiện thao tác độc quyền, Zookeeper cung cấp cơ chế khóa phân tán. Khi máy chủ sở hữu khóa gặp sự cố, khóa sẽ tự động chuyển sang máy khác.

Quản trị cụm máy chủ

Zookeeper theo dõi trạng thái cụm, tự động thông báo thay đổi thành viên (máy chủ thêm/bớt) cho các máy còn lại. Đồng thời, hệ thống cố gắng chẩn đoán và khắc phục sự cố máy chủ.

Tạo ID duy nhất phân tán

Trong hệ thống phân tán, việc tạo ID tự tăng như cơ sở dữ liệu truyền thống không khả thi. Zookeeper giải quyết bằng cách:

  1. Tạo nút tuần tự bền vững (persistent sequential node)
  2. Lấy số thứ tự nút làm ID duy nhất
  3. Xóa các nút có số thứ tự nhỏ hơn

Mô hình dữ liệu Zookeeper

Cấu trúc dữ liệu

Zookeeper tổ chức dữ liệu dạng cây với mỗi nút gọi là ZNode. Mỗi ZNode chứa:

  • Dữ liệu nút (tối đa 1MB)
  • Danh sách nút con
  • Thông tin trạng thái (cZxid, ctime, ...)

Loại nút

Hai loại nút chính trong Zookeeper:

  1. Nút tạm thời (ephemeral): Tự động xóa khi phiên kết thúc
  2. Nút bền vững (persistent): Yêu cầu xóa thủ công

Thao tác Zookeeper bằng Shell

Tạo nút mới

create [-s] [-e] đường_dẫn dữ_liệu

Tạo nút liên tục với dữ liệu:

create /hadoop "123456"

Tạo nút tuần tự:

create -s /test "data"

Cập nhật nút

set đường_dẫn dữ_liệu [phiên_bản]

Kiểm soát phiên bản bằng cơ chế optimistic locking:

set /hadoop "new_data" 5

Xóa nút

delete đường_dẫn [phiên_bản]
rmr đường_dẫn  // Đệ quy

Kiểm tra nút

get đường_dẫn
stat đường_dẫn
ls đường_dẫn
ls2 đường_dẫn // Chi tiết hơn

Theo dõi sự kiện

Zookeeper hỗ trợ ba cơ chế theo dõi:

get /path watch    // Dữ liệu thay đổi
stat /path watch   // Trạng thái thay đổi
ls /path watch     // Nút con thay đổi

Kiểm soát truy cập (ACL)

Cú pháp ACL: scheme:id:permission. Các quyền bao gồm:

  • create (c): Tạo nút con
  • delete (d): Xóa nút con
  • read (r): Đọc
  • write (w): Ghi
  • admin (a): Quản lý ACL

Chế độ cấp phép

setAcl /path ip:192.168.1.1:cdrwa
addauth digest user:password
setAcl /path auth:user:cdrwa
setAcl /path digest:user:password:cdrwa

Tương tác Zookeeper bằng Go

Tạo kết nối

conn, _, _ := zk.Connect(servers, timeout)

Thao tác cơ bản

conn.Create("/path", data, flags, acl)
conn.Get("/path")
conn.Set("/path", newData, version)
conn.Delete("/path", version)

Cấu hình cụm Zookeeper

Thiết lập Docker

docker run -d --name zk \
  -p 2181:2181 -p 2888:2888 -p 3888:3888 \
  -v /data:/data -v /conf:/conf \
  zookeeper:3.5.7

Lựa chọn leader

Giai đoạn khởi động:

  1. Máy chủ bầu chọn leader với (myid, zxid)
  2. So sánh zxid lớn nhất, nếu bằng nhau so sánh myid
  3. Thống nhất khi đa số đồng ý

Giai đoạn vận hành khi leader lỗi tương tự quy trình trên.

Giao thức Zab

Quy trình cam kết hai giai đoạn:

  1. Leader nhận yêu cầu ghi
  2. Đề xuất giao dịch với ZXID duy nhất
  3. Đa số đồng ý thì thực hiện cam kết

Thẻ: Hệ thống phân tán tính đồng bộ điều phối dịch vụ quản lý cấu hình Khóa Phân Tán

Đăng vào ngày 21 tháng 9 lúc 18:56