Trong thời đại dữ liệu bùng nổ, Elasticsearch là công cụ mạnh mẽ giúp tìm kiếm và phân tích dữ liệu nhanh chóng. Tuy nhiên, việc triển khai Elasticsearch có thể phức tạp. Docker, với khả năng “container hóa” dữ liệu, được tin dùng làm giải pháp đơn giản và linh hoạt. Bài viết này sẽ hướng dẫn bạn cách áp dụng Elasticsearch Docker để tối ưu hóa quá trình quản lý dữ liệu.
Đọc bài viết để hiểu thêm về:
- Elasticsearch Docker là gì;
- Lợi ích của việc chạy Elasticsearch trên Docker;
- Hướng dẫn cách chạy Elasticsearch Docker;
- Lưu ý giúp chạy Elasticsearch trên Docker hiệu quả;
- Các câu hỏi thường gặp về Elasticsearch Docker.
Elasticsearch Docker là gì?
Elasticsearch là công cụ tìm kiếm và phân tích mã nguồn mở, có khả năng mở rộng theo chiều ngang, độ tin cậy và quản lý dễ dàng. Elasticsearch tăng tốc độ tìm kiếm, cung cấp phân tích thời gian thực và xử lý nhiều loại dữ liệu khác nhau.
Docker là nền tảng tự động hóa việc triển khai, mở rộng và quản lý các ứng dụng bằng cách sử dụng container. Docker container là một đơn vị phần mềm tiêu chuẩn đóng gói mã nguồn và tất cả các dependency của nó để ứng dụng chạy nhanh và đáng tin cậy trong môi trường điện toán khác nhau.
Elasticsearch Docker hoạt động bằng cách chạy Elasticsearch bên trong một Docker container, kết hợp khả năng tìm kiếm và phân tích hiệu quả của Elasticsearch với tính linh hoạt và dễ sử dụng do Docker cung cấp. Chạy Elasticsearch trên Docker cho phép Developer tách biệt Elasticsearch khỏi các ứng dụng khác, kiểm soát việc phân bổ tài nguyên, đơn giản hóa quá trình triển khai và quản lý Elasticsearch. Điều này đặc biệt hữu ích để tạo ra các môi trường có thể dự đoán, tái tạo, dễ bảo trì và mở rộng quy mô.
Đọc thêm: Elasticsearch tutorial: Chi tiết cách sử dụng Elasticsearch cơ bản
Lợi ích của việc chạy Elasticsearch trên Docker
- Docker giúp thiết lập và chạy dịch vụ Elasticsearch đầy đủ chức năng chỉ trong vài phút mà không cần phải lo lắng về các quy trình thiết lập phức tạp hoặc các vấn đề về khả năng tương thích.
- Docker không yêu cầu hệ điều hành đầy đủ và có thể chia sẻ tài nguyên của hệ thống lưu trữ, nghĩa là bạn có thể chạy nhiều phiên bản Elasticsearch trên một máy chủ duy nhất. Điều này cho phép bạn tận dụng tối đa phần cứng và có thể giảm chi phí.
- Docker cung cấp một môi trường biệt lập cho dịch vụ Elasticsearch, có nghĩa là dịch vụ Elasticsearch của bạn sẽ không can thiệp vào các ứng dụng khác và ngược lại. Sự biệt lập này cũng làm tăng tính bảo mật vì nó hạn chế bề mặt tấn công tiềm ẩn.
- Docker giúp bạn dễ dàng mở rộng dịch vụ Elasticsearch bằng cách tạo các Docker container mới để xử lý khối lượng công việc tăng lên, đáp ứng các nhu cầu kinh doanh khi phát triển ứng dụng. Chẳng hạn như khi lưu lượng truy vấn hoặc dữ liệu tăng đột biến. Điều này rất hữu ích trong các hệ thống cần khả năng mở rộng theo nhu cầu (scalability).
Chạy Elasticsearch Docker như thế nào?
Cài đặt Elasticsearch Docker
Việc tải Elasticsearch cho Docker cũng đơn giản như việc đưa lệnh docker pull vào sổ đăng ký Elastic Docker.
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.28
Bắt đầu một single-node Elasticsearch cluster với Docker Compose
Để phát triển hoặc thử nghiệm single-node Elasticsearch cluster, hãy chỉ định khám phá một node để bỏ qua các kiểm tra khởi động:
docker run -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.28
Khởi động một multi-node cluster với Docker Compose
Để thiết lập và chạy three-node Elasticsearch cluster trong Docker, bạn có thể sử dụng Docker Compose để tạo tập tin docker-compose.yml như sau:
version: '2.2' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.28 container_name: es01 environment: - node.name=es01 - cluster.name=es-docker-cluster - discovery.seed_hosts=es02,es03 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data01:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - elastic es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.28 container_name: es02 environment: - node.name=es02 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data02:/usr/share/elasticsearch/data networks: - elastic es03: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.28 container_name: es03 environment: - node.name=es03 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data03:/usr/share/elasticsearch/data networks: - elastic volumes: data01: driver: local data02: driver: local data03: driver: local networks: elastic: driver: bridge
Sử dụng lệnh Docker để khởi động single-node Elasticsearch cluster nhằm phát triển hoặc thử nghiệm. Sau đó, bạn có thể chạy các lệnh Docker bổ sung để thêm các node thử nghiệm cluster hoặc chạy Kibana.
Lưu ý, thiết lập này không chạy multiple Elasticsearch node hoặc Kibana theo mặc định. Để tạo multi-node cluster với Kibana, hãy sử dụng Docker Compose thay thế. Xem cách khởi chạy multi-node cluster với Docker Compose.
Tăng cường bảo mật Docker images
Bạn cũng có thể sử dụng Wolfi image để tăng cường bảo mật. Việc sử dụng Wolfi image yêu cầu Docker phiên bản 20.10.10 hoặc cao hơn. Để sử dụng Wolfi image, hãy thêm -wolfi vào tag image trong lệnh Docker. Ví dụ:
docker pull docker.elastic.co/elasticsearch/elasticsearch-wolfi:8.17.2
Cấu hình và chạy Elasticsearch
Cài đặt Docker
Truy cập Get Docker để cài đặt Docker cho môi trường của bạn. Nếu sử dụng Docker Desktop, hãy đảm bảo phân bổ ít nhất 4GB bộ nhớ. Bạn có thể điều chỉnh mức sử dụng bộ nhớ trong Docker Desktop bằng cách vào Settings > Resources.
Tạo một mạng docker mới
docker network create elastic
Pull Elasticsearch Docker image
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.17.2
Tùy chọn: Sử dụng Cosign để xác minh chữ ký của Elasticsearch image.
wget https://artifacts.elastic.co/cosign.pub cosign verify --key cosign.pub docker.elastic.co/elasticsearch/elasticsearch:8.17.2
Lệnh cosign cho ra kết quả kiểm tra và nội dung chữ ký theo định dạng JSON:
Verification for docker.elastic.co/elasticsearch/elasticsearch:8.17.2 -- The following checks were performed on each of these signatures: - The cosign claims were validated - Existence of the claims in the transparency log was verified offline - The signatures were verified against the specified public key
Khởi động một Elasticsearch container
docker run --name es01 --net elastic -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.17.2
Các tính năng Machine learning như tìm kiếm ngữ nghĩa với ELSER yêu cầu một container lớn hơn với bộ nhớ hơn 1GB. Nếu bạn định sử dụng các khả năng học máy, hãy khởi động container bằng lệnh này:
docker run --name es01 --net elastic -p 9200:9200 -it -m 6GB -e "xpack.ml.use_auto_machine_memory_percent=true" docker.elastic.co/elasticsearch/elasticsearch:8.17.2
Lệnh này sẽ print ra mật khẩu người dùng elastic và mã thông báo đăng ký cho Kibana.
Sao chép mật khẩu elastic
Sao chép mật khẩu elastic đã tạo và mã thông báo đăng ký. Các thông tin xác thực này chỉ được hiển thị khi bạn khởi động Elasticsearch lần đầu tiên. Bạn có thể tạo lại thông tin xác thực bằng các lệnh sau:
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
Bạn nên lưu trữ mật khẩu elastic dưới dạng biến môi trường trong shell. Ví dụ:
export ELASTIC_PASSWORD="your_password"
Sao chép chứng chỉ SSL http_ca.crt
Sao chép chứng chỉ SSL http_ca.crt từ container vào local machine của bạn.
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
Thực hiện lệnh gọi REST API tới Elasticsearch
Để đảm bảo Elasticsearch container đang chạy:
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200
Thêm nhiều node hơn
Sử dụng một node hiện có để tạo mã thông báo đăng ký cho node mới.
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
Mã thông báo đăng ký có hiệu lực trong 30 phút.
Bắt đầu 1 container Elasticsearch mới, bao gồm mã thông báo đăng ký làm biến môi trường:
docker run -e ENROLLMENT_TOKEN="<token>" --name es02 --net elastic -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.17.2
Gọi cat nodes API để xác minh node mới đã được thêm vào cluster:
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200/_cat/nodes
Chạy Kibana
Pull Kibana Docker image
docker pull docker.elastic.co/kibana/kibana:8.17.2
Tùy chọn: Xác minh chữ ký của Kibana image
wget https://artifacts.elastic.co/cosign.pub cosign verify --key cosign.pub docker.elastic.co/kibana/kibana:8.17.2
Khởi động Kibana container
docker run --name kib01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.17.2
Kibana có thể mất vài phút để kết nối với Elasticsearch. Nếu gặp lỗi khi truy cập, đợi 1-2 phút rồi thử lại. Xem log Kibana bằng: docker logs kib01 để kiểm tra trạng thái.
Khi Kibana khởi động sẽ tạo ra một liên kết duy nhất đến terminal. Để truy cập Kibana, hãy mở liên kết này trong trình duyệt web.
Trong trình duyệt của bạn, hãy nhập mã thông báo đăng ký được tạo khi bạn khởi động Elasticsearch. Để tạo lại mã thông báo, hãy chạy:
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
Đăng nhập với tư cách người dùng elastic với mật khẩu được tạo khi bạn khởi động Elasticsearch. Để tạo lại mật khẩu, hãy chạy:
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Xóa container
Để xóa container và network của chúng, bạn chạy:
# Điều này tránh lỗi khi xóa container đang chạy docker stop es01 es02 kib01 # Loại bỏ Elastic network docker network rm elastic # Loại bỏ Elasticsearch containers docker rm es01 docker rm es02 # Loại bỏ Kibana container docker rm kib01
Lưu ý cần nhớ để chạy Elasticsearch trên Docker tốt nhất
Thiết lập bộ nhớ
Elasticsearch sử dụng rất nhiều bộ nhớ, đặc biệt là khi xử lý các tập dữ liệu lớn. Do đó, để đảm bảo hiệu suất, bạn hãy:
- Phân bổ đủ bộ nhớ cho Docker container đang chạy Elasticsearch. Nên phân bổ ít nhất 50% tổng RAM cho bộ nhớ heap của Elasticsearch, nhưng không quá 32GB vì có thể khiến Elasticsearch chậm lại do Java sử dụng các object pointers bị nén.
- Điều quan trọng là Elasticsearch sử dụng bộ nhớ cho nhiều mục đích hơn là chỉ riêng heap. Do đó, container phải có nhiều bộ nhớ hơn kích thước heap.
Elasticsearch sử dụng heap (được cấu hình qua JVM options như -Xms và -Xmx) và cả bộ nhớ ngoài heap (off-heap) cho các mục đích như caching, buffer, hoặc lưu trữ chỉ mục. Vì vậy, tổng bộ nhớ container cần lớn hơn heap size, thường gấp 1.5-2 lần, tùy vào workload.
Đảm bảo tính bền vững của dữ liệu
Các Docker container là tạm thời, nghĩa là chúng mất tất cả dữ liệu khi khởi động lại. Điều này gây ra vấn đề cho một ứng dụng sử dụng nhiều dữ liệu như Elasticsearch. Để đảm bảo tính bền vững của dữ liệu, bạn nên lưu trữ dữ liệu của mình trong các Docker volumes.
Các Docker volumes là vùng lưu trữ bền vững tồn tại độc lập với các container. Ngay cả khi bạn dừng hoặc xóa Elasticsearch container, dữ liệu của bạn vẫn an toàn trong Docker volume.
Ví dụ:
docker run --name es01 -v esdata:/usr/share/elasticsearch/data -m 4GB docker.elastic.co/elasticsearch/elasticsearch:8.17.2
Dùng docker volume create esdata để tạo volume trước, hoặc chỉ định đường dẫn tuyệt đối như
-v /path/to/data:/usr/share/elasticsearch/data
Phân cụm (clustering)
Elasticsearch được thiết kế để hoạt động trong môi trường cluster, nơi nhiều node hợp tác để phân phối dữ liệu và khối lượng công việc. Thiết kế này rất có lợi cho khả năng mở rộng và dự phòng. Tuy nhiên, vận hành Elasticsearch cluster trên Docker có thể là một thách thức.
Bạn cần đảm bảo tất cả các Elasticsearch node trong Docker network có thể communicate với nhau. Docker có khả năng kết nối mạng tích hợp cho phép các container communicate trên các máy chủ khác nhau. Ngoài ra, hãy sử dụng cơ chế discovery của Elasticsearch để cho phép các node tìm thấy nhau và tạo thành một cluster.
Giới hạn tài nguyên
Docker cho phép bạn đặt giới hạn tài nguyên trên các container. Tính năng này hữu ích để đảm bảo rằng Elasticsearch container của bạn không sử dụng hết tài nguyên hệ thống và ảnh hưởng đến các ứng dụng khác.
Bạn có thể đặt giới hạn cho CPU, bộ nhớ và đĩa I/O. Đối với Elasticsearch, điều cần thiết là cung cấp cho container đủ tài nguyên để xử lý khối lượng công việc hiệu quả. Tuy nhiên, hãy cẩn thận không phân bổ tất cả tài nguyên cho Elasticsearch vì điều này có thể làm các ứng dụng khác bị thiếu hụt.
Tránh dùng ‘Docker exec’ cho các tác vụ thường xuyên
‘Docker exec’ cho phép bạn chạy lệnh bên trong Docker container. Mặc dù hữu ích cho việc gỡ lỗi, nhưng không được khuyến khích cho các tác vụ thông thường.
Chạy các tác vụ thường lệ với ‘Docker exec’ có thể dẫn đến sự cố. Ví dụ, nếu bạn sử dụng ‘Docker exec’ để tạo dữ liệu bên trong container, dữ liệu này sẽ bị mất khi container được khởi động lại. Thay vào đó, hãy sử dụng các cơ chế tích hợp của Docker để duy trì dữ liệu, chẳng hạn như Docker volumes.
Câu hỏi thường gặp về Elasticsearch Docker
Elasticsearch Docker có miễn phí không?
Bản dùng thừ của Elasticsearch Docker cung cấp tất cả các tính năng của Elasticsearch, bao gồm RRF và ML Inference, thời gian dùng thử là 30 ngày.
Sau khi thời gian dùng thử hết hạn, bạn sẽ được cấp giấy phép cơ bản, miễn phí vô thời hạn, bao gồm các tính năng tìm kiếm, lập chỉ mục, phân cụm, và bảo mật cơ bản (SSL, xác thực). Nếu muốn giữ tính năng cao cấp sau 30 ngày, bạn cần mua giấy phép từ Elastic.
Để kiểm tra trạng thái giấy phép, dùng lệnh:
API: curl -X GET 'https://localhost:9200/_license'.
Tại sao cần có Docker?
Docker mang đến nhiều lợi ích cho phát triển và triển khai phần mềm bao gồm khả năng mở rộng, tính nhất quán, tính di động, tính cô lập và hiệu quả tài nguyên. Khả năng cô lập các dependency của Docker cho phép mỗi container chạy trong bất kể môi trường nào một cách đáng tin cậy.
Với Elasticsearch, Docker giúp triển khai nhanh single-node hoặc multi-node cluster, đảm bảo phiên bản Java và dependency nhất quán, và dễ dàng tái tạo môi trường trên các máy khác nhau. Tuy nhiên, Docker đòi hỏi hiểu biết cơ bản về mạng và quản lý container để tận dụng tối đa lợi ích.
Docker có phải Virtual Machine không?
Không. Docker không phải là Virtual Machine. Sự khác biệt chính giữa Docker và Virtual Machine nằm ở kiến trúc của chúng: Virtual Machine có host OS và guest OS bên trong mỗi Virtual Machine. Guest OS có thể là bất kỳ OS nào, như Linux hoặc Windows, bất kể host OS nào.
Ngược lại, các Docker container lưu trữ trên một physical server duy nhất với host OS được chia sẻ giữa chúng. Việc chia sẻ host OS giữa các container làm cho chúng nhẹ hơn và tăng thời gian khởi động.
Tổng kết
Elasticsearch Docker giúp đơn giản hóa triển khai và quản lý dữ liệu hiệu quả hơn. Docker mang đến môi trường linh hoạt, dễ tái tạo và mở rộng. Sự kết hợp này không chỉ tiết kiệm thời gian mà còn tối ưu hóa công việc với Elasticsearch. Thử ngay Elasticsearch Docker để nâng cao hiệu quả hệ thống dữ liệu của bạn!
Đọc thêm: Elasticsearch Query: Khám phá bí kíp tìm kiếm dữ liệu siêu tốc