Wednesday, September 18, 2024

Cài đặt Elasticsearch Cluster sử dụng Docker Compose

-

1. Tổng quan.

Elasticsearch là một NoSQL database, một search engine phân tán, dựa trên phần mềm Lucene. Elasticsearch có nhiều công cụ với giao diện web HTTP và hỗ trợ dữ liệu JSON. Elasticsearch là một công cụ tìm kiếm phổ biến nhất hiện nay.

Elasticsearch cung cấp công cụ tìm tiếm và phân tích gần như là thời gian thực, áp dụng với mọi kiểu dữ liệu – văn bản có cấu trúc hoặc phi cấu trúc, số, thông tin địa lý… Elasticsearch sẽ tự lưu trữ và đánh chỉ mục chúng để tìm kiếm hiệu quả. Vì Elasticsearch là một search engine phân tán nên bạn có thể dễ dàng mở rộng khi dữ liệu mở rộng.

2. Quy trình cài đặt.

2.1. Trỏ file /etc/hosts và cài đặt name (thực hiện trên tất cả các node).

Trỏ file host.

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
OEF

Cài đặt hostname.

# Trên master 1
hostnamectl set-hostname es-master1-81

# Trên master 2
hostnamectl set-hostname es-master2-82

# Trên master 3
hostnamectl set-hostname es-master3-83

# Trên worker 1
hostnamectl set-hostname es-worker1-84

# Trên worker 2
hostnamectl set-hostname es-worker2-85

# Trên worker 3
hostnamectl set-hostname es-worker3-86

2.2. Cài đặt Docker CE, Containerd (thực hiện trên tất cả các node).

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

2.3. Cài đặt Docker Compose (thực hiện trên tất cả các node).

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

2.4. Turning 1 chút cho OS (thực hiện trên tất cả các node).

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

2.5. Tạo certs (thực hiện ở 1 node master bất kỳ, ví dụ của mình là node es-master1-81).

Tại es-master1-81 hãy tạo thư mục cấu hình:

mkdir /opt/elasticsearch
cd /opt/elasticsearch

Tạo file config cert /opt/elasticsearch/instances.yml nội dung ví dụ như dưới để khai báo danh sách node name/ip cho phù hợp.

cat > /opt/elasticsearch/instances.yml << 'OEF'
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
OEF

Tạo file /opt/elasticsearch/create-certs.yml.

cat > /opt/elasticsearch/create-certs.yml << 'OEF'
version: '2.2'

services:
    create_certs:
        container_name: create_certs
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.14
        volumes:
            - ./certs:/usr/share/elasticsearch/config/certs
            - .:/usr/share/elasticsearch/config/certificates
        command: >
            bash -c '
                if [ ! -f config/certs/ca.zip ]; then
                    echo "Creating CA, please keep ca.zip in safe place!";
                    /usr/share/elasticsearch/bin/elasticsearch-certutil ca --silent --days 10950 --pem -out config/certs/ca.zip;
                    unzip config/certs/ca.zip -d config/certs;
                fi;
                if [ ! -f config/certs/certs.zip ]; then
                    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 config/certs/certs.zip -d config/certs;
                fi;
                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
OEF

Tạo cert bằng lệnh:

docker compose -f create-certs.yml run --rm create_certs

Nếu không gặp lỗi gì, output của bạn trông giống như vậy.

shell> docker compose -f create-certs.yml run --rm create_certs
WARN[0000] /opt/elasticsearch/create-certs.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Creating 1/0
 ✔ Network elasticsearch_default  Created                                                                                      0.1s
[+] Running 11/11
 ✔ create_certs Pulled                                                                                                                                                                                                                                            356.9s
   ✔ f9175e7b73a4 Already exists                                                                                                                                                                                                                                    0.0s
   ✔ 5554e1a3574b Pull complete                                                                                                                                                                                                                                    23.6s
   ✔ fa31645a5670 Pull complete                                                                                                                                                                                                                                    23.6s
   ✔ 89732bc75041 Pull complete                                                                                                                                                                                                                                    23.6s
   ✔ abcb33a8db97 Pull complete                                                                                                                                                                                                                                   312.5s
   ✔ bfaf05422aaa Pull complete                                                                                                                                                                                                                                   312.5s
   ✔ 6080ea97dfc5 Pull complete                                                                                                                                                                                                                                   312.6s
   ✔ f85837b82c46 Pull complete                                                                                                                                                                                                                                   312.6s
   ✔ 2dc4537d05c6 Pull complete                                                                                                                                                                                                                                   312.6s
   ✔ 453482f77361 Pull complete                                                                                                                                                                                                                                   312.6s
Creating CA, please keep ca.zip in safe place!
Archive:  config/certs/ca.zip
   creating: config/certs/ca/
  inflating: config/certs/ca/ca.crt
  inflating: config/certs/ca/ca.key
Creating certs
Archive:  config/certs/certs.zip
   creating: config/certs/es-master1-81/
  inflating: config/certs/es-master1-81/es-master1-81.crt
  inflating: config/certs/es-master1-81/es-master1-81.key
   creating: config/certs/es-master2-82/
  inflating: config/certs/es-master2-82/es-master2-82.crt
  inflating: config/certs/es-master2-82/es-master2-82.key
   creating: config/certs/es-master3-83/
  inflating: config/certs/es-master3-83/es-master3-83.crt
  inflating: config/certs/es-master3-83/es-master3-83.key
   creating: config/certs/es-worker1-84/
  inflating: config/certs/es-worker1-84/es-worker1-84.crt
  inflating: config/certs/es-worker1-84/es-worker1-84.key
   creating: config/certs/es-worker2-85/
  inflating: config/certs/es-worker2-85/es-worker2-85.crt
  inflating: config/certs/es-worker2-85/es-worker2-85.key
   creating: config/certs/es-worker3-86/
  inflating: config/certs/es-worker3-86/es-worker3-86.crt
  inflating: config/certs/es-worker3-86/es-worker3-86.key
Setting file permissions

Và sau khi chạy xong sẽ xuất hiện /opt/elasticsearch/certs. Mình sẽ nén thư mục này lại để backup để dùng sau này.

tar -zcvf ~/cert.tar.gz certs

Tạo thư mục /opt/elasticsearch trên các node còn lại.

ssh -o StrictHostKeychecking=no es-master2-82 'mkdir /opt/elasticsearch'
ssh -o StrictHostKeychecking=no es-master3-83 'mkdir /opt/elasticsearch'
ssh -o StrictHostKeychecking=no root@10.237.7.84 'mkdir /opt/elasticsearch'
ssh -o StrictHostKeychecking=no root@10.237.7.85 'mkdir /opt/elasticsearch'
ssh -o StrictHostKeychecking=no root@10.237.7.86 'mkdir /opt/elasticsearch'

Đồng bộ file cert.tar.gz này sang /opt/elasticsearch/ cho tất cả các node còn lại, bao gồm cả Master và Worker.

scp ~/cert.tar.gz es-master2-82:/opt/elasticsearch/
scp ~/cert.tar.gz es-master3-83:/opt/elasticsearch/
scp ~/cert.tar.gz root@10.237.7.84:/opt/elasticsearch/
scp ~/cert.tar.gz root@10.237.7.85:/opt/elasticsearch/
scp ~/cert.tar.gz root@10.237.7.86:/opt/elasticsearch/

2.6. Cài đặt các master node (thực hiện ở trên các master node).

Tại node es-master1-81.

Tạo thư mục /data/elasticsearch/es-master và phân quyền 1000 cho nó.

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

Bạn có thể mount vào ổ đĩa khác nếu cần, thông thường master data sẽ < 1GB, có thể dùng chung với disk OS cũng được. Tạo file /opt/elasticsearch/docker-compose.yml , nội dung ví dụ như sau:

cat > /opt/elasticsearch/docker-compose.yml << 'OEF'
services:
    es-master:
        container_name: es-master1-81
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.14
        volumes:
            - ./certs:/usr/share/elasticsearch/config/certs
            - /data/elasticsearch/es-master:/usr/share/elasticsearch/data
        network_mode: host
        environment:
            - node.name=es-master1-81
            - cluster.name=new-meta
            - cluster.initial_master_nodes=10.237.7.81,10.237.7.82,10.237.7.83
            - discovery.seed_hosts=10.237.7.84,10.237.7.85,10.237.7.86
            - "ES_JAVA_OPTS=-Xms3g -Xmx3g"
            - node.roles=master
            - http.port=9200
            - transport.tcp.port=9300
            - 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-master1-81/es-master1-81.key
            - xpack.security.transport.ssl.certificate=certs/es-master1-81/es-master1-81.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
  • Một số lưu ý:
    • Sửa lại tất cả các chuỗi es-master1-81 thành tên node trên product của bạn.
    • Dùng network_mode: host, http.port=9200, transport.tcp.port=9300.
    • Sửa cluster.initial_master_nodes, discovery.seed_hosts theo danh sách master thực tế
    • ES_JAVA_OPTS hãy cấu hình theo đúng thiết kế default 3gb (ES_JAVA_OPTS=-Xms3g -Xmx3g).
docker compose -f /opt/elasticsearch/docker-compose.yml up -d

Tại node es-master2-82.

Tạo thư mục /data/elasticsearch/es-master và phân quyền cho nó.

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

Bạn có thể mount vào ổ đĩa khác nếu cần, thông thường master data sẽ < 1GB, có thể dùng chung OS. Tạo file /opt/elasticsearch/docker-compose.yml , nội dung ví dụ như sau:

cat > /opt/elasticsearch/docker-compose.yml << 'OEF'
services:
    es-master:
        container_name: es-master2-82
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.14
        volumes:
            - ./certs:/usr/share/elasticsearch/config/certs
            - /data/elasticsearch/es-master:/usr/share/elasticsearch/data
        network_mode: host
        environment:
            - node.name=es-master2-82
            - cluster.name=new-meta
            - cluster.initial_master_nodes=10.237.7.81,10.237.7.82,10.237.7.83
            - discovery.seed_hosts=10.237.7.81,10.237.7.82,10.237.7.83
            - "ES_JAVA_OPTS=-Xms3g -Xmx3g"
            - node.roles=master
            - http.port=9200
            - transport.tcp.port=9300
            - 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-master2-82/es-master2-82.key
            - xpack.security.transport.ssl.certificate=certs/es-master2-82/es-master2-82.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
  • Một số lưu ý:
    • Sửa lại tất cả các chuỗi es-master2-82 thành tên node trên product của bạn.
    • Dùng network_mode: host, http.port=9200, transport.tcp.port=9300.
    • Sửa cluster.initial_master_nodes, discovery.seed_hosts theo danh sách master thực tế
    • ES_JAVA_OPTS hãy cấu hình theo đúng thiết kế default 3gb (ES_JAVA_OPTS=-Xms3g -Xmx3g).
docker compose -f /opt/elasticsearch/docker-compose.yml up -d

Tại node es-master3-83.

Tạo thư mục /data/elasticsearch/es-master và phân quyền cho nó.

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

Bạn có thể mount vào ổ đĩa khác nếu cần, thông thường master data sẽ < 1GB, có thể dùng chung OS. Tạo file /opt/elasticsearch/docker-compose.yml , nội dung ví dụ như sau:

cat > /opt/elasticsearch/docker-compose.yml << 'OEF'
services:
    es-master:
        container_name: es-master3-83
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.14
        volumes:
            - ./certs:/usr/share/elasticsearch/config/certs
            - /data/elasticsearch/es-master:/usr/share/elasticsearch/data
        network_mode: host
        environment:
            - node.name=es-master3-83
            - cluster.name=new-meta
            - cluster.initial_master_nodes=10.237.7.81,10.237.7.82,10.237.7.83
            - discovery.seed_hosts=10.237.7.84,10.237.7.85,10.237.7.86
            - "ES_JAVA_OPTS=-Xms3g -Xmx3g"
            - node.roles=master
            - http.port=9200
            - transport.tcp.port=9300
            - 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-master3-83/es-master3-83.key
            - xpack.security.transport.ssl.certificate=certs/es-master3-83/es-master3-83.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
  • Một số lưu ý:
    • Sửa lại tất cả các chuỗi es-master3-83 thành tên node trên product của bạn.
    • Dùng network_mode: host, http.port=9200, transport.tcp.port=9300.
    • Sửa cluster.initial_master_nodes, discovery.seed_hosts theo danh sách master thực tế
    • ES_JAVA_OPTS hãy cấu hình theo đúng thiết kế default 3gb (ES_JAVA_OPTS=-Xms3g -Xmx3g).
docker compose -f /opt/elasticsearch/docker-compose.yml up -d

2.7. Cài đặt các data node.

Tại node es-worker1-84.

Giải nén certs đã copy từ master node sang ở bước trên.

cd /opt/elasticsearch/
tar -xf cert.tar.gz

Tạo thư mục chứa data và phân quyền cho nó.

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

Chuẩn bị file /opt/elasticsearch/docker-compose.yml nội dung ví dụ như sau:

cat > /opt/elasticsearch/docker-compose.yml << 'OEF'
services:
    es-data:
        container_name: es-worker1-84
        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-worker1-84
            - 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-worker1-84/es-worker1-84.key
            - xpack.security.transport.ssl.certificate=certs/es-worker1-84/es-worker1-84.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
  • Một số lưu ý:
    • Sửa lại tất cả các chuỗi es-worker1-84 thành tên node trên product của bạn.
    • Dùng network_mode: host, http.port=9301, transport.tcp.port=9301.
    • Sửa cluster.initial_master_nodes, discovery.seed_hosts theo danh sách master thực tế.
    • ES_JAVA_OPTS hãy cấu hình theo đúng thiết kế default 3gb (ES_JAVA_OPTS=-Xms3g -Xmx3g).

Triển khai Docker Compose.

docker compose -f /opt/elasticsearch/docker-compose.yml up -d

Tại node es-worker2-85.

Giải nén certs đã copy từ master node sang ở bước trên.

cd /opt/elasticsearch/
tar -xf cert.tar.gz

Tạo thư mục chứa data và phân quyền cho nó.

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

Chuẩn bị file /opt/elasticsearch/docker-compose.yml nội dung ví dụ như sau:

cat > /opt/elasticsearch/docker-compose.yml << 'OEF'
services:
    es-data:
        container_name: es-worker2-85
        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-worker2-85
            - 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-worker2-85/es-worker2-85.key
            - xpack.security.transport.ssl.certificate=certs/es-worker2-85/es-worker2-85.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
  • Sửa lại tất cả các chuỗi es-worker2-85 thành tên node trên product của bạn.
  • Dùng network_mode: host, http.port=9301, transport.tcp.port=9301.
  • Sửa cluster.initial_master_nodes, discovery.seed_hosts theo danh sách master thực tế.
  • ES_JAVA_OPTS hãy cấu hình theo đúng thiết kế default 3gb (ES_JAVA_OPTS=-Xms3g -Xmx3g).

Triển khai Docker Compose.

docker compose -f /opt/elasticsearch/docker-compose.yml up -d

Tại node es-worker3-86.

Giải nén certs đã copy từ master node sang ở bước trên.

cd /opt/elasticsearch/
tar -xf cert.tar.gz

Tạo thư mục chứa data và phân quyền cho nó.

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

Chuẩn bị file /opt/elasticsearch/docker-compose.yml nội dung ví dụ như sau:

cat > /opt/elasticsearch/docker-compose.yml << 'OEF'
services:
    es-data:
        container_name: es-worker3-86
        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-worker3-86
            - 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-worker3-86/es-worker3-86.key
            - xpack.security.transport.ssl.certificate=certs/es-worker3-86/es-worker3-86.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
  • Sửa lại tất cả các chuỗi es-worker3-85 thành tên node trên product của bạn.
  • Dùng network_mode: host, http.port=9301, transport.tcp.port=9301.
  • Sửa cluster.initial_master_nodes, discovery.seed_hosts theo danh sách master thực tế.
  • ES_JAVA_OPTS hãy cấu hình theo đúng thiết kế default 3gb (ES_JAVA_OPTS=-Xms3g -Xmx3g).

Triển khai Docker Compose.

docker compose -f /opt/elasticsearch/docker-compose.yml up -d

2.8. Khởi tạo user.

Tại một node master bất kỳ (ví dụ es-master1-81), chạy lệnh docker exec -it <tên master container> bash để truy cập vào container.

docker exec -it es-master1-81 bash

Chạy lệnh này để khởi tạo các mật khẩu và lưu các mật khẩu này tại một nơi an toàn.

shell> bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana_system]: 
Reenter password for [kibana_system]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]: 
Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

Sau khi tạo, kiểm tra user được tạo thành công và trạng thái cluster green.

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" : 3,
  "active_shards" : 6,
  "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
}

2.9. Cài đặt Kibana, Nginx.

2.9.1. Cài đặt và cấu hình Kibana.

Hãy tạo thư mục chứa config Kibana trên cả 3 node Master.

mkdir -p /opt/kibana
cd /opt/kibana

Tạo file docker-compose.yml trên node es-master1-81.

cat > /opt/kibana/docker-compose.yml << 'OEF'
version: "2.2"

services:
  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.17.14
    restart: always
    environment:
      - ELASTICSEARCH_HOSTS=["http://10.237.7.81:9200"]
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=Password@123
      - SERVER_PUBLICBASEURL=http://kibana.hoanghd.com/kibana-new-meta
      - SERVER_BASEPATH=/kibana-new-meta
      - SERVER_REWRITEBASEPATH=false
      - XPACK_SECURITY_ENABLED=false
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "248m"
OEF

Tạo file docker-compose.yml trên node es-master2-82.

cat > /opt/kibana/docker-compose.yml << 'OEF'
version: "2.2"

services:
  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.17.14
    restart: always
    environment:
      - ELASTICSEARCH_HOSTS=["http://10.237.7.82:9200"]
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=Password@123
      - SERVER_PUBLICBASEURL=http://kibana.hoanghd.com/kibana-new-meta
      - SERVER_BASEPATH=/kibana-new-meta
      - SERVER_REWRITEBASEPATH=false
      - XPACK_SECURITY_ENABLED=false
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "248m"
OEF

Tạo file docker-compose.yml trên node es-master3-83.

cat > /opt/kibana/docker-compose.yml << 'OEF'
version: "2.2"

services:
  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.17.14
    restart: always
    environment:
      - ELASTICSEARCH_HOSTS=["http://10.237.7.83:9200"]
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=Password@123
      - SERVER_PUBLICBASEURL=http://kibana.hoanghd.com/kibana-new-meta
      - SERVER_BASEPATH=/kibana-new-meta
      - SERVER_REWRITEBASEPATH=false
      - XPACK_SECURITY_ENABLED=false
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "248m"
OEF

Chạy Docker Compose trên cả 3 node.

docker-compose up -d

2.9.2. Cài đặt và cấu hình Nginx.

Cài đặt Nginx trên các Master Node.

apt-get install nginx -y

Backup file cấu hình nginx.conf.

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

Tạo lại file nginx.conf trên cả 3 Master Node.

cat > /etc/nginx/nginx.conf << 'OEF'
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    include /etc/nginx/conf.d/*.conf;
}
OEF

Mã hóa thông tin xác thực bằng Base64.

shell> echo -n 'elastic:Password@123' | base64
ZWxhc3RpYzpQYXNzd29yZEAxMjM=

Tạo file lb-kibana.conf tại thư mục /etc/nginx/conf.d/ sử dụng cho Kibana.

cat > /etc/nginx/conf.d/lb-kibana.conf << 'OEF'
upstream dev-kibana-new-meta {
    server 10.237.7.81:5601;
    server 10.237.7.82:5601;
    server 10.237.7.83:5601;
    keepalive 15;
}

server {
    listen 80;
    server_name kibana.hoanghd.com;

    location /kibana-new-meta/ {
        proxy_pass http://dev-kibana-new-meta/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Authorization "Basic ZWxhc3RpYzpQYXNzd29yZEAxMjM=";
        proxy_redirect off;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Connection "Keep-Alive";
        proxy_set_header Proxy-Connection "Keep-Alive";
        rewrite ^/kibana-new-meta/(.*)$ /$1 break;
    }
}
OEF

Trên cả 3 Master Node, hãy kiểm tra cú pháp Nginx nếu không có lỗi hãy reload lại cấu hình bằng lệnh nginx -s reload.

shell> nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nếu bạn muốn xác thực ElasticSearch trong trang Kibana, hãy sử dụng config dưới.

cat > /etc/nginx/conf.d/lb-kibana.conf << 'OEF'
upstream dev-kibana-new-meta {
    server 10.237.7.81:5601;
    server 10.237.7.82:5601;
    server 10.237.7.83:5601;
    keepalive 15;
}

server {
    listen 80;
    server_name kibana.hoanghd.com;

    location /kibana-new-meta/ {
        proxy_pass http://dev-kibana-new-meta/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Connection "Keep-Alive";
        proxy_set_header Proxy-Connection "Keep-Alive";
        proxy_cookie_path / "/kibana-new-meta/; HttpOnly; Secure";
        rewrite ^/kibana-new-meta/(.*)$ /$1 break;
    }
}
OEF

Trong file docker-compose.yml của Kibana, bạn hãy thêm biến môi trường XPACK_SECURITY_ENABLED=true.

version: "2.2"

services:
  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.17.14
    restart: always
    environment:
      - ELASTICSEARCH_HOSTS=["http://<ip_elasticsearch>:9200"]
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=Password@123
      - SERVER_PUBLICBASEURL=http://kibana.hoanghd.com/kibana-new-meta
      - SERVER_BASEPATH=/kibana-new-meta
      - SERVER_REWRITEBASEPATH=false
      - XPACK_SECURITY_ENABLED=true
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "248m"
OEF

Login vào bằng tài khoản của Elasticsearch ví dụ như dưới.

Kết quả nhé.

4. Kết luận.

Nhìn chung, Elasticsearch thực sự là một công cụ mạnh mẽ với nhiều tính năng vượt trội dựa vào khả năng tích hợp của các nhà phát triển. Thậm chí, Elasticsearch cũng có thể thay thế một cho Database độc lập trong hệ thống, một dịch vụ dành riêng cho tính năng tìm kiếm hoặc môt bộ công cụ mạnh mẽ trong quản lý log.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories