Giới Thiệu Tổng Quan
ZooKeeper là một dự án mã nguồn mở thuộc tổ chức Apache, chuyên cung cấp các dịch vụ điều phối cho môi trường phân tán. Nó giúp giải quyết các vấn đề phổ biến trong kiến trúc microservice và hệ thống cluster như đồng bộ trạng thái, quản lý cấu hình tập trung và đảm bảo tính nhất quán.
Các Chức Năng Chính
Dịch vụ cung cấp bao gồm:
- Quản lý tên định danh phân tán (Naming Service).
- Hệ thống cấu hình tập trung (Configuration Management).
- Kiểm soát sự sống còn của node (Health Check).
- Lắng nghe thay đổi (Notification Mechanism).
- Phân tải nhẹ (Soft Load Balancing).
Kết Nối Tải Về
Ghi nhớ đường dẫn chính thức để cập nhật tài nguyên mới nhất từ trang chủ Apache Foundation.
Hướng Dẫn Cài Đặt Mô Hình Đơn
Để bắt đầu với phiên bản standalone, hãy tuân thủ các bước chuẩn bị môi trường sau:
1. Chuẩn Bị Môi Trường
- Cài đặt JDK trên server đích.
- Tải gói cài đặt và đưa vào thư mục Linux mong muốn.
- Giải nén file vào thư mục mục tiêu, ví dụ:
/opt/app-services/.
tar xzf apache-zookeeper-3.9.0-bin.tar.gz -C /opt/app-services/
2. Cấu Hình Tham Số
Thay đổi tên file cấu hình mẫu thành tên mặc định:
mv conf/zoo_sample.cfg conf/zoo.cfg
Chỉnh sửa file zoo.cfg để chỉ định nơi lưu trữ dữ liệu:
vim conf/zoo.cfg
Bổ sung dòng tham số dưới đây:
dataDir=/opt/app-services/data-zk
Tạo thư mục chứa dữ liệu nếu chưa tồn tại:
mkdir -p /opt/app-services/data-zk
3. Khởi Động Và Kiểm Tra
Thực thi lệnh khởi động dịch vụ background:
bin/zkServer.sh start
Xác nhận quá trình chạy bằng công cụ theo dõi tiến trình JPS:
jps
1234 QuorumPeerMain
Kiểm tra trạng thái hoạt động chi tiết:
bin/zkServer.sh status
Mode: standalone
Có thể tương tác trực tiếp qua giao thức giao hàng (CLI):
bin/zkCli.sh
Đăng nhập ra ngoài khi hoàn tất sử dụng lệnh quit, và tắt dịch vụ bằng bin/zkServer.sh stop.
3. Giải Mã Thông Số Cấu Hình Quan Trọng
| Thông Số | Mô Tả Chi Tiết |
|---|---|
| tickTime | Thời gian giữa hai lần gửi heartbeat cơ bản, tính bằng mili-giây. Ảnh hưởng đến thời gian timeout tối thiểu của session. |
| initLimit | Số lượng心跳 tối đa mà Follower có thể mất để kết nối ban đầu với Leader trước khi bị coi là không ổn định. |
| syncLimit | Giới hạn thời gian phản hồi tối đa giữa Leader và Follower. |
| clientPort | Cổng TCP mà client sử dụng để kết nối, thường mặc định là 2181. |
Nguyên Lý Kiến Trúc Bên Trong
Mechanism Bầu Cử
Một cụm ZooKeeper yêu cầu tính nhất quán của đa số. Cụm sẽ hoạt động bình thường nếu hơn một nửa số lượng máy chủ đang chạy. Do đó, khuyến nghị triển khai số lượng node lẻ (3, 5...) để tránh deadlock trong bầu cử.
Quy trình hoạt động:
- Mỗi instance bắt đầu ở chế độ LOOKING.
- Khi khởi động, chúng trao đổi thông tin ID và epoch hiện tại.
- Instance nào có giá trị cao nhất và được đa số xác nhận sẽ trở thành Leader.
- Các node còn lại đóng vai trò Follower.
Loại Node Và Trạng Thái (Stat)
Mỗi thực thể trong hệ thống đều có metadata đi kèm được gọi là Stat. Các thuộc tính chính bao gồm:
- cxid/mzxid/pzxid: Transaction IDs liên quan đến việc tạo, chỉnh sửa và cập nhật child.
- ctime/mtime: Thời điểm tạo và chỉnh sửa cuối cùng (Unix timestamp).
- version: Version cho data và children.
- ephemeralOwner: Session ID sở hữu node tạm thời (nếu có).
Giao Thức Chờ Sự Kiện (Watcher)
Client có thể đăng ký lắng nghe (Watch) đối với path bất kỳ. Khi dữ liệu hoặc cấu trúc con tại path đó thay đổi, server sẽ gửi notification ngược lại cho client tương ứng. Đây là cơ chế cốt lõi giúp xây dựng các ứng dụng tự động hóa.
Cài Đặt Chế Độ cụm (Clustering)
Để nâng cao khả năng chịu lỗi, triển khai mô hình 3 node trên các host khác nhau. Ví dụ: node-alpha, node-beta, node-gamma.
Thiết Lập Cơ Sở Dữ Liệu
Trên mỗi máy chủ, tạo thư mục dữ liệu riêng biệt:
mkdir -p /var/lib/zookeeper/data
Tạo file đánh dấu ID duy nhất cho từng máy trong thư mục dữ liệu đã tạo. File này tên là myid và phải chứa số nguyên tương ứng.
echo 1 > /var/lib/zookeeper/data/myid
Lưu ý: Đảm bảo không dùng ký tự đặc biệt hay encode sai trong môi trường Windows trước khi copy sang Linux.
Cấu Hình Mạng lưới
Sửa file zoo.cfg để định nghĩa topology của cụm:
# Kết nối nội bộ
dataDir=/var/lib/zookeeper/data
# Định nghĩa các thành viên trong cluster
server.1=node-alpha:2888:3888
server.2=node-beta:2888:3888
server.3=node-gamma:2888:3888
Trong đó:
- Giá trị đầu tiên là số hiệu ID trùng với file
myid. - Địa chỉ IP hoặc hostname của server.
- Cổng giao tiếp Leader-Follower (2888) và cổng bầu cử (3888).
Vận Hành Qua Giao Diện Command Line
Khởi động công cụ quản trị:
bin/zkCli.sh
Các lệnh thao tác nút (Node) cơ bản như sau:
| Lệnh | Hành Động | Tham Số Mở Rộng |
|---|---|---|
ls [path] |
Liệt kê con cái trực tiếp | + watch: bật chế độ thông báo |
get [path] |
Nội dung và metadata node | + watch |
create [path] [data] |
Tạo node mới | -s (Sequential), -e (Ephemeral/Tạm thời) |
set [path] [data] |
Cập nhật giá trị nội dung | -v (version kiểm tra) |
delete [path] |
Xóa node | Chỉ xóa được node trống (trừ khi dùng rmr) |
Ví Dụ Thực Tế Thao Tác
Tạo cấu trúc cây:**
create /app/config "production-settings"
Tạo node chuỗi tự động tăng (Sequential):
create -s /queue/task "task-data-01"
Created /queue/task/task_data_0000000001
Kiểm Tra Thay Đổi Dữ Liệu (Watcher Data):
Cơ chế thứ nhất trên Node A chờ sự kiện:
get -w /app/config
Cơ chế thứ hai trên Node B thực hiện thay đổi:
set /app/config "staging-settings"
Cơ chế thứ nhất sẽ nhận ngay thông báo:
WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/app/config
Kiểm Tra Thay Đổi Cây Con (Watcher Children):
Lắng nghe sự thêm/xóa child node của folder parent:
ls -w /queue
Sau đó thêm một task mới ở nền khác, Node gốc sẽ báo hiệu cập nhật cấu trúc con.
Xóa Dữ Liệu Tạm Thời (Ephemeral):
Node có cờ -e sẽ tự biến mất khi session client hết hạn hoặc disconnect:
create -e /temp/heartbeat "alive"
Khi bạn thoát client (quit), node này sẽ mất khỏi hệ thống ngay lập tức.