I. Yêu Cầu Hạ Tầng Và Chuẩn Bị
Để xây dựng một cụm Zookeeper ổn định, cần chuẩn bị tối thiểu ba máy chủ ảo hoặc vật lý đã được cài đặt sẵn môi trường Java (JDK). Trong hướng dẫn này, chúng ta sẽ sử dụng Ubuntu 16.04 Server làm hệ điều hành nền tảng.
Danh sách địa chỉ IP dự kiến cho ba nút trong cụm:
- Nút 1: 192.168.10.41
- Nút 2: 192.168.10.42
- Nút 3: 192.168.10.43
Đảm bảo rằng JDK 8 và Maven đã được cài đặt thành công trên cả ba máy trước khi tiến hành các bước tiếp theo.
II. Tải Về Và Cài Đặt Zookeeper
Trên mỗi máy chủ, tạo thư mục gốc để chứa ứng dụng. Chúng ta sẽ sử dụng đường dẫn /opt/apps/zookeeper thay vì thư mục gốc để dễ dàng quản lý quyền hạn.
mkdir -p /opt/apps/zookeeper
cd /opt/apps/zookeeper
Tải về phiên bản binary của Zookeeper 3.6.3 từ máy chủ chủ thức hoặc truyền file đã tải sẵn lên server:
wget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
Giải nén gói tải về vào thư mục hiện tại:
tar zxvf apache-zookeeper-3.6.3-bin.tar.gz
Tiếp theo, tạo các thư mục để lưu trữ dữ liệu snapshot và nhật ký giao dịch. Việc tách biệt hai thư mục này giúp tối ưu hiệu suất ghi.
mkdir -p /opt/apps/zookeeper/data
mkdir -p /opt/apps/zookeeper/logs
mkdir -p /opt/apps/zookeeper/logs/trans
Mỗi nút trong cụm cần một định danh duy nhất. Tạo file myid trong thư mục data và ghi số thứ tự tương ứng với từng máy:
# Thực hiện trên máy 192.168.10.41
echo "1" > /opt/apps/zookeeper/data/myid
# Thực hiện trên máy 192.168.10.42
echo "2" > /opt/apps/zookeeper/data/myid
# Thực hiện trên máy 192.168.10.43
echo "3" > /opt/apps/zookeeper/data/myid
III. Cấu Hình Cluster
Di chuyển vào thư mục cấu hình và sao chép file mẫu thành file cấu hình chính thức:
cd /opt/apps/zookeeper/apache-zookeeper-3.6.3-bin/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
Nội dung file zoo.cfg cần được đồng bộ trên cả ba máy chủ, chỉ khác nhau ở file myid đã tạo ở bước trước. Dưới đây là cấu hình chi tiết:
# Thời gian tick cơ bản (ms)
tickTime=2000
# Số lượng tick cho phép đồng bộ hóa khi khởi động
initLimit=10
# Số lượng tick cho phép trễ nhịp tim giữa các node
syncLimit=5
# Thư mục lưu trữ snapshot và file myid
dataDir=/opt/apps/zookeeper/data
# Thư mục lưu trữ transaction logs riêng biệt
dataLogDir=/opt/apps/zookeeper/logs/trans
# Cổng kết nối cho client
clientPort=2181
# Giới hạn số kết nối đồng thời từ client
maxClientCnxns=60
# Cấu hình cụm máy chủ
# Format: server.id=host:peerPort:electionPort
server.1=192.168.10.41:2888:3888
server.2=192.168.10.42:2888:3888
server.3=192.168.10.43:2888:3888
# Cho phép thực thi các lệnh 4 chữ cái (dùng cho monitoring)
4lw.commands.whitelist=*
Lưu ý rằng các cổng 2888 và 3888 được sử dụng cho giao tiếp nội bộ giữa các node Leader và Follower.
IV. Khởi Động Và Kiểm Tra Trạng Thái
Đi đến thư mục bin và thực thi script khởi động:
cd /opt/apps/zookeeper/apache-zookeeper-3.6.3-bin/bin/
./zkServer.sh start
Sau khi khởi động trên cả ba máy, kiểm tra trạng thái của từng node để xác định vai trò (Leader hoặc Follower):
./zkServer.sh status
Kết quả mong đợi sẽ hiển thị một máy là Leader và hai máy còn lại là Follower.
V. Tích Hợp Systemd Để Khởi Động Cùng Hệ Thống
Để đảm bảo Zookeeper tự động chạy khi server khởi động lại, cần tạo một unit file cho systemd. Trước hết, cấu hình biến môi trường Java trong script của Zookeeper:
vi /opt/apps/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkEnv.sh
Thêm dòng sau vào đầu file để chỉ định đường dẫn JDK:
export JAVA_HOME="/opt/jdk1.8.0_231/"
Tạo file dịch vụ mới trong thư mục systemd:
cd /etc/systemd/system
vi zookeeper.service
Nội dung cấu hình dịch vụ:
[Unit]
Description=Apache Zookeeper Coordination Service
After=network.target
[Service]
Type=forking
ExecStart=/opt/apps/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start
ExecStop=/opt/apps/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop
ExecReload=/opt/apps/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh restart
User=root
Group=root
[Install]
WantedBy=multi-user.target
Nạp lại cấu hình systemd và kích hoạt dịch vụ:
systemctl daemon-reload
systemctl enable zookeeper.service
systemctl start zookeeper.service
Có thể kiểm tra trạng thái hoạt động của service bằng lệnh systemctl status zookeeper.service.
VI. Xử Lý Một Số Sự Cố Thường Gặp
Lỗi Class Not Found: Nếu gặp lỗi Could not find or load main class, hãy kiểm tra lại gói tải về. Đảm bảo sử dụng phiên bản có hậu tố -bin.tar.gz thay vì phiên bản source code.
Lỗi 4lw Commands: Khi sử dụng lệnh echo stat | nc 127.0.0.1 2181 để kiểm tra nhanh mà bị từ chối, nguyên nhân là do tính năng bảo mật mặc định. Cần thêm cấu hình 4lw.commands.whitelist=* vào file zoo.cfg như đã hướng dẫn ở mục III.
Lỗi UnknownHostException: Trong môi trường cluster, nếu các node không phân giải được tên host của nhau, quá trình bầu chọn có thể thất bại hoặc chậm. Cần cập nhật file /etc/hosts trên tất cả các máy client và server để ánh xạ địa chỉ IP sang hostname tương ứng:
192.168.10.41 zk-node-1
192.168.10.42 zk-node-2
192.168.10.43 zk-node-3