Trong bài viết trước, chúng ta đã cùng tìm hiểu về Elasticsearch cũng như các kiến thức cần biết khác liên quan tới nó. Kỳ này, Stringee và các bạn sẽ cùng nhau cài đặt một cluster Elasticsearch với 3 node và Kibana trên nền tảng Docker nhé.
>>> Xem thêm bài viết trong chuỗi bài hướng dẫn tìm hiểu ngôn ngữ lập trình Python:
- Bài 1: Cài đặt Python và tạo dựng môi trường làm việc
- Bài 2: Biến và kiểu dữ liệu cơ bản trong Python
- Bài 3: Tạo index, tạo mapping, CRUD trong Elasticsearch
- Bài 4: Tìm kiếm dữ liệu trên Elasticsearch
- Bài 5: Sắp xếp dữ liệu với Elasticsearch
- Bài 6: Truy vấn DSL trong Elasticsearch
- Bài 7: SQL query trong Elasticsearch
- Bài 8: Thực hiện các phép toán aggregations với Elasticsearch
1. Các bước chuẩn bị
Bước 1: Cài docker-compose cho môi trường thực hiện của mình
Để có thể thực hiện theo hướng dẫn trong bài viết này, bạn cần cài đặt sẵn docker-compose. Bạn có thể tìm hiểu và cài đặt docker-compose từ trang thông tin hướng dẫn chính thức của Docker.
Nếu bạn đang sử dụng Docker Desktop thì docker-compose đã được cài đặt sẵn trên máy của bạn rồi đó. Chú ý rằng, bạn luôn cần có tối thiểu 4GB RAM cho Docker sử dụng để đảm bảo việc cài đặt được thực hiện một cách trơn tru. Bạn có thể điều chỉnh lượng bộ nhớ Docker Desktop sử dụng bằng cách vào Settings > Resources.
Bước 2: Tạo một workspace để thực hiện project.
Bước 3: Tạo các file sau trong thư mục.
- File .env
# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=
# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD=
# Version of Elastic products
STACK_VERSION={version}
# Set the cluster name
CLUSTER_NAME=docker-cluster
# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
# Port to expose Kibana to the host
KIBANA_PORT=5601
# Increase or decrease based on the available host memory (in bytes)
MEM_LIMIT=1073741824
Trong file này, chúng ta cần điền thông tin password vào ELASTIC_PASSWORD và biến KIBANA_PASSWORD. Các giá trị này phải là các ký tự chữ và không được chứa các ký tự đặc biệt như là ! hay @. Các file bash được bao gồm trong file docker-compose.yml chỉ hoạt động với các ký tự chữ.
Cũng trong file .env, điền thông tin STACK_VERSION và version Elasticsearch và Kibana muốn cài.
- File setup.yml
version: "3.8"
services:
setup:
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
volumes:
- certs:/usr/share/elasticsearch/config/certs
user: "0"
command: >
bash -c '
if [ x${ELASTIC_PASSWORD} == x ]; then
echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
exit 1;
elif [ x${KIBANA_PASSWORD} == x ]; then
echo "Set the KIBANA_PASSWORD environment variable in the .env file";
exit 1;
fi;
if [ ! -f config/certs/ca.zip ]; then
echo "Creating CA";
bin/elasticsearch-certutil ca --silent --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";
echo -ne \
"instances:\n"\
" - name: es01\n"\
" dns:\n"\
" - es01\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
" - name: es02\n"\
" dns:\n"\
" - es02\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
" - name: es03\n"\
" dns:\n"\
" - es03\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
> config/certs/instances.yml;
bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --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 \{\} \;;
echo "Waiting for Elasticsearch availability";
until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
echo "Setting kibana_system password";
until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
echo "All done!";
'
healthcheck:
test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
interval: 1s
timeout: 5s
retries: 120
volumes:
certs:
driver: local
- File docker-compose.yml
version: "3.8"
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: es01
volumes:
- ./certs:/usr/share/elasticsearch/config/certs
- ./esdata01:/usr/share/elasticsearch/data
ports:
- ${ES_PORT}:9200
environment:
- node.name=es01
- cluster.name=${CLUSTER_NAME}
- cluster.initial_master_nodes=es01,es02,es03
- discovery.seed_hosts=es02,es03
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- bootstrap.memory_lock=true
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=certs/es01/es01.key
- xpack.security.http.ssl.certificate=certs/es01/es01.crt
- xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.key=certs/es01/es01.key
- xpack.security.transport.ssl.certificate=certs/es01/es01.crt
- xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.license.self_generated.type=${LICENSE}
networks:
- elastic-network
mem_limit: ${MEM_LIMIT}
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test:
[
"CMD-SHELL",
"curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
]
interval: 10s
timeout: 10s
retries: 120
es02:
depends_on:
- es01
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: es02
volumes:
- ./certs:/usr/share/elasticsearch/config/certs
- ./esdata02:/usr/share/elasticsearch/data
environment:
- node.name=es02
- cluster.name=${CLUSTER_NAME}
- cluster.initial_master_nodes=es01,es02,es03
- discovery.seed_hosts=es01,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=certs/es02/es02.key
- xpack.security.http.ssl.certificate=certs/es02/es02.crt
- xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.key=certs/es02/es02.key
- xpack.security.transport.ssl.certificate=certs/es02/es02.crt
- xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.license.self_generated.type=${LICENSE}
networks:
- elastic-network
mem_limit: ${MEM_LIMIT}
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test:
[
"CMD-SHELL",
"curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
]
interval: 10s
timeout: 10s
retries: 120
es03:
depends_on:
- es02
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: es03
volumes:
- ./certs:/usr/share/elasticsearch/config/certs
- ./esdata03:/usr/share/elasticsearch/data
environment:
- node.name=es03
- cluster.name=${CLUSTER_NAME}
- cluster.initial_master_nodes=es01,es02,es03
- discovery.seed_hosts=es01,es02
- bootstrap.memory_lock=true
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=certs/es03/es03.key
- xpack.security.http.ssl.certificate=certs/es03/es03.crt
- xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.key=certs/es03/es03.key
- xpack.security.transport.ssl.certificate=certs/es03/es03.crt
- xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.license.self_generated.type=${LICENSE}
networks:
- elastic-network
mem_limit: ${MEM_LIMIT}
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test:
[
"CMD-SHELL",
"curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
]
interval: 10s
timeout: 10s
retries: 120
networks:
elastic-network:
external: true
- File kibana.yml
version: "3.8"
services:
kibana:
image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
container_name: kibana
volumes:
- ./certs:/usr/share/kibana/config/certs
- ./kibanadata:/usr/share/kibana/data
ports:
- ${KIBANA_PORT}:5601
environment:
- SERVERNAME=kibana
- ELASTICSEARCH_HOSTS=https://es01:9200
- ELASTICSEARCH_USERNAME=kibana_system
- ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
- ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
networks:
elastic-network:
mem_limit: ${MEM_LIMIT}
healthcheck:
test:
[
"CMD-SHELL",
"curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
]
interval: 10s
timeout: 10s
retries: 120
networks:
elastic-network:
external: true
2. Khởi chạy cluster Elasticsearch
Bước 1: Tạo network để sử dụng cho cluster
docker network create -d bridge elastic-network
Bước 2: Setup Elasticsearch và lấy certs
docker-compose -f setup.yml up -d
Bước 3: Sao chép lại folder certs mà container setup đã tạo ra máy host
docker cp setup_container:/usr/share/elasticsearch/config/certs .
Bước 4: Khởi chạy cluster Elasticsearch
docker-compose up -d
Ta có thể kiểm tra trạng thái hoạt động của cluster với các lệnh sau:
- Kiểm tra logs của một node bất kỳ
docker logs –details -f es01
- Xem trạng thái các container
>>> Xem thêm bài viết:
- DevSecOps là gì? Kiến thức cơ bản về DevSecOps
- Giới thiệu về GridFS trong MongoDB
- Hướng dẫn cài đặt K8s Kubenertes Cluster
3. Cài đặt Kibana
Bước 1: Khởi chạy Kibana
docker-compose -f kibana.yml up -d
Bước 2: Kiểm tra trạng thái Kibana
docker ps | grep kibana
Kết quả hiện ra console sẽ có dạng như sau:
8bccc41963b0 docker.elastic.co/kibana/kibana:8.10.4 "/bin/tini -- /usr/l…" About a minute ago Up About a minute (healthy) 0.0.0.0:5601->5601/tcp kibana
Truy cập Kibana:
Sau cùng, đăng nhập vào bằng tài khoản Elastic đã tạo và chúng ta đã có thể truy cập vào Kibana:
Kết bài
Trên đây là hướng dẫn của chúng tôi về cách cài đặt cluster Elasticsearch cùng với Kibana, chúc các bạn thành công. Stringee sẽ còn ra thêm nhiều bài viết trong chùm bài về Elasticsearch, quý bạn đọc hãy cùng đón chờ nhé.
Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.
Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy, Adavigo, bTaskee…
Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: