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:
- Tạo nút tuần tự bền vững (persistent sequential node)
- Lấy số thứ tự nút làm ID duy nhất
- 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:
- Nút tạm thời (ephemeral): Tự động xóa khi phiên kết thúc
- 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:
- Máy chủ bầu chọn leader với (myid, zxid)
- So sánh zxid lớn nhất, nếu bằng nhau so sánh myid
- 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:
- Leader nhận yêu cầu ghi
- Đề xuất giao dịch với ZXID duy nhất
- Đa số đồng ý thì thực hiện cam kết