Chuẩn bị môi trường cho các Node phụ (Data Nodes)
Trước khi mở rộng cluster, bạn cần chuẩn bị các máy ảo (VM) mới đóng vai trò là Data Node. Giả sử ta có 2 máy VM mới với IP là 192.168.1.102 và 192.168.1.103. Máy chủ hiện tại (Master Node) có IP 192.168.1.101 đã được cấu hình ở các phần trước.
Tiến hành cài đặt OpenSearch trên các máy mới này. Sử dụng repository chính thức và chỉ cài gói opensearch, không cần cài opensearch-dashboards trên các node này để tiết kiệm tài nguyên.
sudo apt update
sudo apt install -y opensearch
Kết quả mong đợi: Quá trình cài đặt hoàn tất, package opensearch được thêm vào hệ thống. Dịch vụ chưa chạy lúc này vì chưa có cấu hình cluster.
Cấu hình hostname và file hosts
Để các node giao tiếp với nhau, OpenSearch cần phân giải hostname thành IP. Bạn cần đặt tên cho từng node và thêm vào file /etc/hosts trên TẤT CẢ các máy trong cluster (cả Master và Data nodes).
Trên máy Master (192.168.1.101), chỉnh sửa file hosts để bao gồm cả các node mới:
sudo nano /etc/hosts
Thêm các dòng sau vào file (giả sử tên node là os-node1, os-node2, os-node3):
192.168.1.101 os-node1
192.168.1.102 os-node2
192.168.1.103 os-node3
Thực hiện tương tự trên máy os-node2 và os-node3 để đảm bảo chúng có thể phân giải được IP của nhau và của Master.
Verify kết quả: Chạy lệnh ping os-node2 từ máy Master, phải thấy response thành công.
Cấu hình Discovery để hình thành Cluster
Đây là bước quan trọng nhất. Bạn cần cấu hình file opensearch.yml để chỉ định các node nào sẽ tham gia vào cluster và cách chúng tìm nhau (discovery).
Trên Master Node (os-node1)
Mở file cấu hình chính của OpenSearch. Đường dẫn mặc định trên Ubuntu là /etc/opensearch/opensearch.yml.
sudo nano /etc/opensearch/opensearch.yml
Sửa các tham số sau. Lưu ý: cluster.name phải giống hệt trên tất cả các node. node.name phải duy nhất.
cluster.name: my-opensearch-cluster
node.name: os-node1
# Danh sách các node sẽ tham gia discovery (bao gồm cả chính nó)
discovery.seed_hosts:
- "os-node1"
- "os-node2"
- "os-node3"
# Danh sách các node Master (đầu tiên được khởi động sẽ là master)
cluster.initial_master_nodes:
- "os-node1"
# Cấu hình giao tiếp (giữ nguyên nếu đã cấu hình SSL ở phần 3)
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
Trên các Data Node (os-node2 và os-node3), cấu hình tương tự nhưng loại bỏ phần cluster.initial_master_nodes và đổi node.name cho phù hợp.
File cấu hình cho os-node2 (/etc/opensearch/opensearch.yml):
cluster.name: my-opensearch-cluster
node.name: os-node2
discovery.seed_hosts:
- "os-node1"
- "os-node2"
- "os-node3"
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
File cấu hình cho os-node3 (/etc/opensearch/opensearch.yml):
cluster.name: my-opensearch-cluster
node.name: os-node3
discovery.seed_hosts:
- "os-node1"
- "os-node2"
- "os-node3"
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
Kết quả mong đợi: Các file cấu hình đã đồng bộ, sẵn sàng để khởi động dịch vụ và bắt đầu quá trình discovery.
Khởi động dịch vụ
Khởi động dịch vụ OpenSearch trên tất cả các node. Bắt đầu từ Master Node trước, sau đó đến các Data Node.
sudo systemctl daemon-reload
sudo systemctl enable opensearch
sudo systemctl start opensearch
Thực hiện lệnh tương tự trên os-node2 và os-node3.
Verify kết quả: Chạy sudo systemctl status opensearch trên từng máy, trạng thái phải là active (running).
Tối ưu hóa Firewall và Network
OpenSearch sử dụng 2 cổng chính để giao tiếp: 9200 (HTTP - giao tiếp với client) và 9300 (Transport - giao tiếp giữa các node). Nếu firewall chặn cổng 9300, cluster sẽ không thể hình thành hoặc bị chia tách (split-brain).
Cấu hình UFW trên Ubuntu 24.04
Trên TẤT CẢ các node (Master và Data), mở cổng 9300 để cho phép giao tiếp nội bộ.
sudo ufw allow 9200/tcp
sudo ufw allow 9300/tcp
Kết quả mong đợi: Lệnh trả về Rules updated. Nếu UFW đang ở chế độ active, các gói tin giữa các node sẽ được cho phép.
Disable Single Node Discovery (nếu cần)
Trên các Data Node, nếu bạn muốn đảm bảo chúng chỉ tham gia cluster khi Master sẵn sàng, hãy kiểm tra file opensearch.yml đảm bảo không có dòng discovery.type: single-node. Dòng này thường được bật mặc định khi cài đặt đơn lẻ.
Verify kết quả: Chạy lệnh grep -r "single-node" /etc/opensearch/. Không nên thấy kết quả nào trên các file cấu hình cluster.
Kiểm tra trạng thái Cluster và Phân bổ Shard
Sau khi tất cả các node đã chạy, bạn cần kiểm tra xem cluster đã hình thành chưa và trạng thái sức khỏe (Health Status) như thế nào.
Kiểm tra danh sách Node
Sử dụng curl để gọi API _cat/nodes từ Master Node (hoặc bất kỳ node nào trong cluster). Lệnh này liệt kê các node đang tham gia.
curl -k -X GET "https://localhost:9200/_cat/nodes?v&h=host,node,role"
Giải thích:
- -k: Bỏ qua kiểm tra SSL certificate (cần thiết nếu bạn đã bật SSL ở phần 3).
- -X GET: Phương thức HTTP.
- v: Hiển thị tiêu đề cột.
- h=host,node,role: Chỉ hiển thị các cột Host, Tên Node và Vai trò (Role).
Kết quả mong đợi: Bạn phải thấy 3 dòng tương ứng với os-node1, os-node2, os-node3. Vai trò của os-node1 thường có m (master), còn os-node2 và os-node3 có d (data).
Kiểm tra Trạng thái Sức khỏe (Cluster Health)
API _cluster/health trả về trạng thái tổng quan của cluster.
curl -k -X GET "https://localhost:9200/_cluster/health?pretty"
Kết quả mong đợi:
- "status": "green": Tất cả shard chính (primary) và shard dự phòng (replica) đều đã được phân bổ.
- "status": "yellow": Tất cả shard chính đã hoạt động, nhưng thiếu shard dự phòng. Điều này là bình thường nếu bạn chưa cấu hình số lượng replica > 0.
- "status": "red": Có shard chính bị mất hoặc không thể phân bổ. Cần kiểm tra log.
Để chuyển từ Yellow sang Green, bạn cần tăng số lượng replica lên ít nhất 1 (với 2 data nodes).
curl -k -X PUT "https://localhost:9200/_settings" -H 'Content-Type: application/json' -d '{"index.number_of_replicas": 1}'
Chú ý: Lệnh trên áp dụng cho tất cả index mới. Với index cũ, bạn cần chỉ định tên index cụ thể: curl -k -X PUT "https://localhost:9200/tên-index/_settings" ...
Phân bổ Shard trên các Node
Để xem dữ liệu đang được phân bổ như thế nào giữa các node, dùng lệnh _cat/shards.
curl -k -X GET "https://localhost:9200/_cat/shards?v&h=index,shard,replica,node,doc_count"
Kết quả mong đợi: Bạn sẽ thấy các shard (0, 1, 2...) của các index được phân bổ ngẫu nhiên hoặc theo hash trên os-node2 và os-node3. Nếu thấy tất cả shard đều nằm trên os-node1, có thể do chưa có index nào mới hoặc cấu hình replica chưa đúng.
Để kiểm tra chi tiết hơn về phân bổ shard trên từng node:
curl -k -X GET "https://localhost:9200/_cat/allocation?v&h=node,host,shards,store"
Kết quả mong đợi: Cột shards và store (dung lượng) sẽ hiển thị trên cả os-node2 và os-node3, chứng tỏ cluster đang cân bằng tải dữ liệu.
Điều hướng series:
Mục lục: Series: Triển khai Database Search với OpenSearch và Ubuntu 24.04
« Phần 5: Quản lý Index và Mapping dữ liệu cơ bản
Phần 7: Triển khai Kibana Plugin và tích hợp Logstash »