Thursday, November 21, 2024

Thêm Data Node vào Cluster Elasticsearch với Docker Compose

-

1. Tổng quan.

Trong bài viết này, chúng ta sẽ hướng dẫn chi tiết cách thêm một data node mới vào cluster Elasticsearch hiện có bằng cách sử dụng Docker Compose. Quy trình bao gồm việc chuẩn bị môi trường, tạo và cấu hình các tệp cần thiết và khởi động container Elasticsearch trên node mới. Chúng ta cũng sẽ giải quyết các vấn đề phổ biến có thể gặp phải trong quá trình này, như cấu hình hệ thống không đủ đáp ứng yêu cầu của Elasticsearch.

2. Cấu hình cơ bản.

Trỏ file /etc/hosts (thực hiện trên tất cả các node).

cat >> /etc/hosts << 'OEF'
10.237.7.81 es-master1-81
10.237.7.82 es-master2-82
10.237.7.83 es-master3-83
10.237.7.84 es-worker1-84
10.237.7.85 es-worker2-85
10.237.7.86 es-worker3-86
10.237.7.87 es-worker4-87 # thêm node mới
OEF

Cài đặt hostname.

# Trên worker 4
hostnamectl set-hostname es-worker4-87

Cài đặt Docker CE, Containerd.

Thêm danh sách gói liên quan đến Docker cho OS.

apt-get install ca-certificates curl gnupg lsb-release -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

Cập nhật danh sách gói vừa thêm và cài đặt Docker.

apt-get update
apt-get install docker-ce docker-ce-cli containerd.io -y

Phân quyền 666 cho /var/run/docker.sock.

chmod 666 /var/run/docker.sock

Cài đặt Docker Compose.

curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Check lại version mình đã cài.

shell> docker-compose -v
Docker Compose version v2.6.0

Nếu sử dụng Proxy hãy config tiếp các lệnh dưới, nhớ trỏ đúng proxy server của bạn.

mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << 'OEF'
[Service]
Environment="HTTP_PROXY=http://10.237.7.250:3128" "HTTPS_PROXY=http://10.237.7.250:3128" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
OEF

Khởi động lại Docker.

systemctl daemon-reload
systemctl restart docker
systemctl enable docker

Turning OS .

swapoff -a
sysctl -w vm.swappiness=1;
sysctl -w vm.max_map_count=262144;
sysctl -w net.ipv4.tcp_retries2=5

Chú ý lưu persistence các sysctl config vào /etc/sysctl.conf.

sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf

3. Tạo chứng chỉ cho worker mới (để cho tiện thì nên thực hiện trên node master mà trước đó chúng ta đã thực hiện).

Tóm tắt quy trình.

  • Khai báo file /opt/elasticsearch/instances.yml:
    • Tạo file và khai báo các node Elasticsearch với địa chỉ IP tương ứng.
  • Tạo Docker Compose file /opt/elasticsearch/create-certs.yml:
    • Tạo file Docker Compose để định nghĩa dịch vụ create_certs sử dụng hình ảnh Elasticsearch và ánh xạ các thư mục cần thiết.
  • Chạy Docker Compose:
    • Sử dụng lệnh Docker Compose để tạo và giải nén chứng chỉ.
  • Kiểm tra kết quả:
    • Kiểm tra thư mục /opt/elasticsearch/certs để đảm bảo rằng các chứng chỉ đã được tạo và giải nén đúng cách.

Chi tiết quy trình.

Bước 1: Khai báo file /opt/elasticsearch/instances.yml

Chỉnh sửa file file /opt/elasticsearch/instances.yml thêm nội dung của worker mới (es-worker4-87) như sau:

    - name: es-worker4-87
      ip:
        - 10.237.7.87

Sau khi thêm ta có kết quả.

instances:
  - name: es-master1-81
    ip:
      - 10.237.7.81
  - name: es-master2-82
    ip:
      - 10.237.7.82
  - name: es-master3-83
    ip:
      - 10.237.7.83
  - name: es-worker1-84
    ip:
      - 10.237.7.84
  - name: es-worker2-85
    ip:
      - 10.237.7.85
  - name: es-worker3-86
    ip:
      - 10.237.7.86
  - name: es-worker4-87
    ip:
      - 10.237.7.87

Bước 2: Tạo Docker Compose file.

Tạo file Docker Compose file /opt/elasticsearch/create-certs.yml với nội dung như sau:

version: '2.2'

services:
  create_certs:
    container_name: create_certs
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.14

    volumes:
      - /opt/elasticsearch/certs:/usr/share/elasticsearch/config/certs
      - /opt/elasticsearch/instances.yml:/usr/share/elasticsearch/config/certificates/instances.yml

    command: >
      bash -c '
      echo "Creating certs";
      /usr/share/elasticsearch/bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certificates/instances.yml --days 10950 --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
      unzip -n config/certs/certs.zip -d config/certs;
      echo "Setting file permissions";
      chown -R root:root config/certs;
      find . -type d -exec chmod 750 \{\} \;;
      find . -type f -exec chmod 640 \{\} \;;
      '

    user: "0"

    working_dir: /usr/share/elasticsearch

Để quá trình giải nén tự động bỏ qua các file đã tồn tại và chỉ tạo các file mới, bạn phải sử dụng tùy chọn -n của lệnh unzip. Tùy chọn này sẽ bỏ qua các file đã tồn tại mà không ghi đè lên chúng.

Với cấu trúc này, lệnh unzip -n config/certs/certs.zip -d config/certs sẽ giải nén các file từ certs.zip vào thư mục config/certs và bỏ qua các file đã tồn tại mà không ghi đè lên chúng.

Đây là cấu trúc thư mục và file sau khi chúng ta chuẩn bị xong.

/opt/elasticsearch
├── certs
│   ├── ca
│   │   ├── ca.crt
│   │   └── ca.key
│   ├── ca.zip
│   ├── certs.zip
│   ├── es-master1-81
│   │   ├── es-master1-81.crt
│   │   └── es-master1-81.key
│   ├── es-master2-82
│   │   ├── es-master2-82.crt
│   │   └── es-master2-82.key
│   ├── es-master3-83
│   │   ├── es-master3-83.crt
│   │   └── es-master3-83.key
│   ├── es-worker1-84
│   │   ├── es-worker1-84.crt
│   │   └── es-worker1-84.key
│   ├── es-worker2-85
│   │   ├── es-worker2-85.crt
│   │   └── es-worker2-85.key
│   └── es-worker3-86
│       ├── es-worker3-86.crt
│       └── es-worker3-86.key
├── create-certs.yml
├── docker-compose.yml
└── instances.yml

Bước 3: Chạy Docker Compose để tạo và giải nén chứng chỉ.

Chạy lệnh Docker Compose để tạo và giải nén chứng chỉ:

shell> docker compose -f /opt/elasticsearch/create-certs.yml run --rm create_certs
Creating certs
ERROR: Output file '/usr/share/elasticsearch/config/certs/certs.zip' already exists
Archive:  config/certs/certs.zip
   creating: config/certs/es-worker4-87/
  inflating: config/certs/es-worker4-87/es-worker4-87.crt
  inflating: config/certs/es-worker4-87/es-worker4-87.key
Setting file permissions

Bước 4: Kiểm tra kết quả

Kiểm tra thư mục /opt/elasticsearch/certs trên máy host để đảm bảo rằng các chứng chỉ đã được tạo và giải nén đúng cách. Bạn nên thấy các thư mục và file chứng chỉ cho các node, bao gồm es-worker4-87.

/opt/elasticsearch
├── certs
│   ├── ca
│   │   ├── ca.crt
│   │   └── ca.key
│   ├── ca.zip
│   ├── certs.zip
│   ├── es-master1-81
│   │   ├── es-master1-81.crt
│   │   └── es-master1-81.key
│   ├── es-master2-82
│   │   ├── es-master2-82.crt
│   │   └── es-master2-82.key
│   ├── es-master3-83
│   │   ├── es-master3-83.crt
│   │   └── es-master3-83.key
│   ├── es-worker1-84
│   │   ├── es-worker1-84.crt
│   │   └── es-worker1-84.key
│   ├── es-worker2-85
│   │   ├── es-worker2-85.crt
│   │   └── es-worker2-85.key
│   ├── es-worker3-86
│   │   ├── es-worker3-86.crt
│   │   └── es-worker3-86.key
│   └── es-worker4-87
│       ├── es-worker4-87.crt
│       └── es-worker4-87.key
├── create-certs.yml
├── docker-compose.yml
└── instances.yml

9 directories, 21 files

Quy trình này sẽ giúp bạn tạo và quản lý chứng chỉ cho các node Elasticsearch một cách tự động và hiệu quả.

3. Thêm worker mới vào cluster.

Tóm tắt quy trình.

  • Chuẩn bị môi trường trên node es-worker4-87:
    • Tắt swap và thiết lập các thông số hệ thống.
    • Tạo thư mục dữ liệu và thiết lập quyền sở hữu.
    • Sao chép chứng chỉ từ node master.
  • Tạo file Docker Compose cho es-worker4-87:
    • Tạo file Docker Compose với cấu hình tương tự như các node khác.
  • Khởi động container Elasticsearch trên es-worker4-87:
    • Sử dụng Docker Compose để khởi động container Elasticsearch.

Đầu tiên chúng ta nên verify một số thông tin về cluster ví dụ như status đang là green, cluster chúng ta có 6 node và có 3 data node.

shell> curl -X GET --user elastic:Password@123 "http://10.237.7.81:9200/_cluster/health?pretty"
{
  "cluster_name" : "new-meta",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 6,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 9,
  "active_shards" : 18,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

Để thêm es-worker4-87 vào cluster Elasticsearch của bạn như một data node, bạn cần thực hiện các bước sau:

  • Chuẩn bị môi trường trên node es-worker4-87:
    • Tạo thư mục dữ liệu.
    • Thiết lập quyền sở hữu thư mục.
    • Sao chép chứng chỉ từ node master.
  • Tạo file Docker Compose cho es-worker4-87:
    • Tạo file Docker Compose với cấu hình tương tự như các node khác.
  • Khởi động container Elasticsearch trên es-worker4-87:
    • Sử dụng Docker Compose để khởi động container Elasticsearch.

Dưới đây là các bước chi tiết:

Bước 1: Chuẩn bị môi trường trên node es-worker4-87

Chạy các lệnh sau trên node es-worker4-87:

Tạo thư mục dữ liệu và thiết lập quyền sở hữu

mkdir -p /opt/elasticsearch
mkdir -p /data/elasticsearch/es-data-sda
chown -R 1000:root /data/elasticsearch/es-data-sda

Sao chép chứng chỉ từ node master (node mà chúng ta đã lấy cert cho es-worker4-87 ở các bước trên).

cd /opt/elasticsearch
scp -r -o StrictHostKeyChecking=no root@es-master1-81:/opt/elasticsearch/certs /opt/elasticsearch

Bước 2: Tạo file Docker Compose cho es-worker4-87.

Tạo file /opt/elasticsearch/docker-compose-es-worker4-87.yml với nội dung sau:

cat > /opt/elasticsearch/docker-compose-es-worker4-87.yml << 'OEF'
services:
  es-data:
    container_name: es-worker4-87
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.14
    volumes:
      - ./certs:/usr/share/elasticsearch/config/certs
      - /data/elasticsearch/es-data-sda:/usr/share/elasticsearch/data
    network_mode: host
    environment:
      - node.name=es-worker4-87
      - cluster.name=new-meta
      - discovery.seed_hosts=10.237.7.81:9300,10.237.7.82:9300,10.237.7.83:9300
      - "ES_JAVA_OPTS=-Xms3g -Xmx3g"
      - node.roles=data,data_content
      - http.port=9201
      - transport.tcp.port=9301
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es-worker4-87/es-worker4-87.key
      - xpack.security.transport.ssl.certificate=certs/es-worker4-87/es-worker4-87.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=basic
    ulimits:
      memlock:
        soft: -1
        hard: -1
    logging:
      driver: "json-file"
      options:
        max-size: "248m"
OEF

Kết quả sau khi chúng ta chuẩn bị xong các file và thư mục sẽ có cấu trúc sau.

/opt/elasticsearch/
├── certs
│   ├── ca
│   │   ├── ca.crt
│   │   └── ca.key
│   ├── ca.zip
│   ├── certs.zip
│   ├── es-master1-81
│   │   ├── es-master1-81.crt
│   │   └── es-master1-81.key
│   ├── es-master2-82
│   │   ├── es-master2-82.crt
│   │   └── es-master2-82.key
│   ├── es-master3-83
│   │   ├── es-master3-83.crt
│   │   └── es-master3-83.key
│   ├── es-worker1-84
│   │   ├── es-worker1-84.crt
│   │   └── es-worker1-84.key
│   ├── es-worker2-85
│   │   ├── es-worker2-85.crt
│   │   └── es-worker2-85.key
│   ├── es-worker3-86
│   │   ├── es-worker3-86.crt
│   │   └── es-worker3-86.key
│   └── es-worker4-87
│       ├── es-worker4-87.crt
│       └── es-worker4-87.key
└── docker-compose-es-worker4-87.yml

9 directories, 19 files

Bước 3: Khởi động container Elasticsearch trên es-worker4-87.

Chạy các lệnh sau trên node es-worker4-87:

cd /opt/elasticsearch
docker compose -f docker-compose-es-worker4-87.yml up -d

Bạn có thử sử dụng docker logs -f <container_name> để xem log nếu cần.

docker logs -f es-worker4-87

Quy trình này sẽ giúp bạn thêm es-worker4-87 vào cluster Elasticsearch của bạn như một data node.

Bây giờ hãy xác minh lại kết quả, chúng ta có status của cluster đang là green, cluster chúng ta có 7 node và có 4 data node.

shell> curl -X GET --user elastic:Password@123 "http://10.237.7.81:9200/_cluster/health?pretty"
{
  "cluster_name" : "new-meta",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 7,
  "number_of_data_nodes" : 4,
  "active_primary_shards" : 9,
  "active_shards" : 18,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

4. Kết luận.

Việc thêm một data node mới vào cluster Elasticsearch có thể được thực hiện một cách dễ dàng và hiệu quả bằng cách sử dụng Docker Compose. Bằng cách tuân theo các bước hướng dẫn chi tiết trong bài viết này, bạn có thể mở rộng cluster của mình một cách nhanh chóng và đảm bảo rằng các node mới được cấu hình đúng cách và sẵn sàng hoạt động. Điều này giúp tăng cường khả năng xử lý dữ liệu và độ tin cậy của hệ thống Elasticsearch của bạn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories