Quay lại

Giới thiệu và triển khai Elasticsearch và Kibana sử dụng Docker Chuyên mục Elasticsearch    2024-03-27    55 Lượt xem    50 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Giới thiệu và triển khai Elasticsearch và Kibana sử dụng Docker

Giới thiệu

Trong thời đại số hóa ngày nay, việc quản lý và phân tích dữ liệu trở nên ngày càng quan trọng đối với các tổ chức và doanh nghiệp. Elasticsearch đã trở thành một công cụ không thể thiếu trong việc tìm kiếm, lưu trữ và phân tích lượng lớn dữ liệu một cách linh hoạt và hiệu quả.

Elasticsearch là một hệ thống tìm kiếm và phân tích dữ liệu mạnh mẽ, được xây dựng trên nền tảng Apache Lucene - một thư viện tìm kiếm văn bản mạnh mẽ và phổ biến. Với khả năng phân tán, mở rộng và xử lý dữ liệu lớn, Elasticsearch là một công cụ đa năng, được sử dụng trong nhiều ứng dụng khác nhau từ tìm kiếm trên trang web, phân tích log, giám sát hệ thống đến nền tảng tìm kiếm cho ứng dụng di động và trí tuệ nhân tạo.

Một trong những điểm mạnh của Elasticsearch là khả năng tìm kiếm nhanh chóng và hiệu quả trên dữ liệu lớn. Nhờ vào cơ chế tìm kiếm phân tán và song song, Elasticsearch có thể tìm kiếm và trả về kết quả trong thời gian gần như thời gian thực, thậm chí trên các tập dữ liệu lớn hàng tỷ bản ghi.

Bên cạnh đó, Elasticsearch cũng cung cấp các tính năng phân tích mạnh mẽ, cho phép bạn thực hiện các thao tác phân tích và tổng hợp dữ liệu, từ phân tích từ khóa đến tính tổng, trung bình, và nhiều tính toán phức tạp khác.

Trong bối cảnh không ngừng phát triển của dữ liệu và nhu cầu phân tích, Elasticsearch không chỉ là một công cụ mạnh mẽ cho việc tìm kiếm và phân tích dữ liệu mà còn là một lựa chọn thông minh cho việc xây dựng các ứng dụng và hệ thống dựa trên dữ liệu lớn, đem lại giá trị và hiệu suất tối ưu cho doanh nghiệp.

Trong bài viết này chúng ta sẽ cùng nhau đi tìm hiểu những khái niệm và cách thức hoạt động của elasticsearch và cũng như ứng dụng của nó nhé!

Elasticsearch là gì

Elasticsearch là một hệ thống tìm kiếm và phân tích dữ liệu phân tán mã nguồn mở, được xây dựng trên nền tảng Apache Lucene. Nó được thiết kế để lưu trữ, tìm kiếm và phân tích lượng lớn dữ liệu một cách nhanh chóng và hiệu quả. Elasticsearch được sử dụng rộng rãi trong nhiều ứng dụng, bao gồm tìm kiếm trên trang web, giám sát hệ thống, phân tích log, và nhiều ứng dụng khác có liên quan đến dữ liệu lớn.

Cơ chế hoạt động của Elasticsearch

Sau khi triển khai hệ thống Elasticsearch (có thể là một máy chủ đơn lẻ hoặc một cụm máy chủ phân tán), bạn có thể tương tác với nó thông qua giao thức RESTful. Điều này có nghĩa là từ các client, bạn có thể tạo ra các yêu cầu HTTP (GET, PUT, v.v.) và gửi chúng đến Elasticsearch, kèm theo dữ liệu được định dạng dưới dạng JSON để thực hiện các thao tác như tạo, xóa, cập nhật dữ liệu, hay truy vấn tìm kiếm.

Để tạo ra các yêu cầu HTTP gửi đến Elasticsearch, bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào. Trong phần này, chúng ta sẽ trình bày việc tạo các HTTP Request kèm theo dữ liệu JSON bằng cách sử dụng công cụ CURL, một công cụ dòng lệnh cho phép gửi và nhận dữ liệu từ các URL.

Nó có một vài khái niệm các bạn phải biết trước khi chúng ta đi vào thực hành nhé!

  1. Cluster:

    • Cluster là một nhóm các node Elasticsearch (máy chủ) kết hợp lại với nhau. Cluster giúp tăng tính sẵn sàng và mở rộng của hệ thống bằng cách chia sẻ tải công việc và dữ liệu giữa các node. Một cluster được xác định bằng một tên duy nhất.
  2. Node:

    • Node là một máy chủ (server) trong cluster Elasticsearch. Mỗi node có thể chạy Elasticsearch và tham gia vào một cluster để lưu trữ và xử lý dữ liệu. Một cluster có thể có một hoặc nhiều node, và mỗi node được gán một tên duy nhất để xác định nó trong cluster.
  3. Index:

    • là một tập hợp các tài liệu (document), những tài liệu này có một số tên thuộc tính tính chất chung. Thường mỗi index là một loại dữ liệu nào đó của bạn ví dụ như index chữa các sản phẩm, index chứa các đơn hàng, index chứa các bài viết ... Mỗi index được đặt một cái tên (nhớ là chữ thường), tên này dùng để thi hành các chức năng như đánh chỉ mục, tìm kiếm, cập nhật ... cho các dữ liệu (document) trong nó. Mỗi node có thể tạo nhiều index.
  4. Document:

    • Document là một bản ghi dữ liệu đơn với cấu trúc dưới dạng JSON. Các document được lưu trữ trong index và là đơn vị cơ bản của dữ liệu trong Elasticsearch. Mỗi document có một ID duy nhất và thuộc về một index cụ thể.
  5. Shard:

    • Để giải quyết các vấn đề hiệu năng khi lưu trữ dữ liệu lớn bị giới hạn bởi phần cứng ES cung cấp khả năng chia một index ra thành từng mảnh nhỏ hơn - mỗi mảnh nhỏ đó gọi là shard. Khi tạo ra index, bạn có thể chia nó ra thành bao nhiêu shard tùy bạn. Một shard đó vẫn có đầy đủ chức năng như index nhưng độc lập với index, vào có thể lưu ở các node khác nhau. Shard nó giúp giải quết vấn đề hiệu năng tốc độ, tìm kiếm song song trên nhiều node phân tán. Ngoài ra bạn cũng có khái niệm replica đó là một bản backup, copy của shard để ES có thể phục hồi nếu một shard nào đó bị chết.
    • khi bạn tạo một chỉ mục mới với số lượng shard được chỉ định, Elasticsearch sẽ tự động phân phối các tài liệu (documents) vào các shard một cách đều đặn. Quá trình này gọi là "routing".
    • Điều quan trọng cần lưu ý là một khi đã tạo chỉ mục và phân phối tài liệu vào các shard, việc thay đổi số lượng shard sau này sẽ không thực sự ảnh hưởng đến việc phân phối các tài liệu đã có trước đó.
    • Khi một tài liệu mới được thêm vào chỉ mục, Elasticsearch sẽ xác định shard nào sẽ lưu trữ tài liệu đó bằng cách sử dụng một hàm hash của giá trị của trường _id của tài liệu. Do đó, tài liệu sẽ được phân phối đều qua các shard dựa trên giá trị _id, giúp tối ưu hóa việc truy xuất dữ liệu và phân phối tải công việc trên các node Elasticsearch.

Kibana

Kibana là một công cụ trực quan hóa và tương tác với dữ liệu được lưu trữ trong Elasticsearch. Nó cung cấp một giao diện người dùng web dễ sử dụng để thực hiện các tác vụ như tạo biểu đồ, đồ thị, bảng điều khiển, và thực hiện các truy vấn tìm kiếm trên dữ liệu Elasticsearch.

Mối quan hệ giữa Kibana và Elasticsearch là rất chặt chẽ. Kibana được phát triển bởi cùng một công ty, Elastic, như Elasticsearch và được thiết kế để làm việc tốt nhất khi được tích hợp với Elasticsearch.

Cụ thể, Kibana có các tính năng sau:

  1. Trực quan hóa dữ liệu: Kibana cho phép bạn tạo biểu đồ, đồ thị, bản đồ, và các hình ảnh khác để trực quan hóa dữ liệu từ Elasticsearch.

  2. Tương tác với dữ liệu: Bạn có thể tương tác trực tiếp với dữ liệu bằng cách thực hiện các truy vấn tìm kiếm hoặc lọc dữ liệu.

  3. Tạo và quản lý bảng điều khiển: Kibana cho phép bạn tạo và quản lý các bảng điều khiển để hiển thị các chỉ số hoặc thông tin quan trọng từ dữ liệu của bạn.

  4. Quản lý người dùng và quyền: Kibana cung cấp các tính năng quản lý người dùng và quyền truy cập để đảm bảo rằng mỗi người dùng chỉ có quyền truy cập vào dữ liệu và tính năng mà họ cần.

Triển khai Elasticsearch container

Dưới đây là hướng dẫn sử dụng Docker để tạo một container Elasticsearch theo trên hướng dẫn của elasticsearch:

Bắt đầu single-node cluster

1. Tạo một mạng docker mới.

docker network create elastic​

2. Pull image Docker Elasticsearch.

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.13.0​

3. Optional: Cài đặt Cosign cho môi trường của bạn. Sau đó sử dụng Cosign để xác minh Elasticsearch image’s signature.

wget https://artifacts.elastic.co/cosign.pub
cosign verify --key cosign.pub docker.elastic.co/elasticsearch/elasticsearch:8.13.0​

Lệnh cosign in ra kết quả kiểm tra và dữ liệu chữ ký dưới dạng JSON:

Verification for docker.elastic.co/elasticsearch/elasticsearch:8.13.0 --
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

4. Bắt đầu một container Elasticsearch.

docker run --name es01 --net elastic -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.13.0​

Sử dụng flag -m để đặt một giới hạn bộ nhớ cho container. Điều này loại bỏ nhu cầu thiết lập kích thước JVM thủ công.

5. Lệnh in ra mật khẩu người dùng elastic và một token đăng ký cho Kibana.

Sao chép mật khẩu elastic và token thông báo đăng ký được tạo ra. Những thông tin đăng nhập 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 đăng nhập 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​

Mình khuyến nghị lưu trữ mật khẩu elastic dưới dạng biến môi trường trong shell của bạn. Ví dụ:

export ELASTIC_PASSWORD="mật_khẩu_của_bạn"​

Sao chép chứng chỉ SSL http_ca.crt từ container vào máy host của bạn.

docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .​

Thực hiện call API REST đến Elasticsearch để đảm bảo rằng container Elasticsearch đang chạy.

curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200

Note: Nếu các bạn chạy trên môi trường window gặp lỗi bên dưới, do virtual memory limit is too low (giới hạn bộ nhớ ảo quá thấp).

Elasticsearch did not exit normally

Chạy thêm lệnh sau:

wsl -d docker-desktop
sysctl -w vm.max_map_count=262144

Sau khi pull image và tạo container các bạn sẽ được tài khoản và password để đăng nhập vào elasticsearch với user là elastic và mk nó được grenarate ra cho bạn.

Mặc định để truy cập Elasticsearch thông qua API là HTTPS nên các bạn phải lưu ý điều này. https://localhost:9200.

Đây là một cách đơn giản để tạo một container Elasticsearch bằng Docker. Bạn có thể thay đổi các tham số trong lệnh Docker để phù hợp với nhu cầu của bạn, chẳng hạn như phiên bản Elasticsearch, cổng kết nối, và cấu hình khác.

Triển khai Kibana container

1. Pull image Docker Kibana.

docker pull docker.elastic.co/kibana/kibana:8.13.0​

2. Optional: Xác minh chữ ký của image Kibana.

wget https://artifacts.elastic.co/cosign.pub
cosign verify --key cosign.pub docker.elastic.co/kibana/kibana:8.13.0​

3. Bắt đầu một container Kibana.

docker run --name kib01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.13.0​

Khi Kibana khởi động, nó sẽ xuất ra một liên kết duy nhất được tạo ra đến bảng điều khiển. Để truy cập Kibana, mở liên kết này trong trình duyệt web.

Trong trình duyệt của bạn, nhập mã thông báo đăng ký đã được tạo ra khi bạn bắt đầu Elasticsearch.

4. Để tạo lại token thông báo, chạy:

docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana​

5. Đăng nhập vào Kibana với tài khoản elastic và mật khẩu được tạo ra khi bạn bắt đầu Elasticsearch.

Để tạo lại mật khẩu, chạy:

docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

Truy cập Kibana: Mở trình duyệt web và truy cập vào địa chỉ http://localhost:5601 hoặc http://your_server_ip:5601 (nếu bạn đang chạy Docker trên một máy chủ từ xa) để truy cập giao diện người dùng của Kibana.

Sau khi truy cập vào Kibana nó yêu cầu chúng ta cung cấp token, các bạn hãy copy token mà ở bước trước khi cài Elasticsearch nó đã genarate ra cho chúng ta và nhập vào input như hình bên dưới.

Lưu ý: Trước khi chạy container Kibana, bạn cần đảm bảo rằng Elasticsearch đã được triển khai và hoạt động trên máy chủ hoặc container khác.

Multi-node cluster Docker Compose

Sử dụng Docker Compose để bắt đầu một cụm Elasticsearch ba node với Kibana. Docker Compose cho phép bạn khởi động nhiều container với một lệnh duy nhất.

Cấu hình và bắt đầu cụm

  1. Cài đặt Docker Compose. Truy cập tài liệu Docker Compose để cài đặt Docker Compose cho môi trường của bạn.

Nếu bạn đang sử dụng Docker Desktop, Docker Compose sẽ được cài đặt tự động. Hãy đảm bảo cấp ít nhất 4GB bộ nhớ cho Docker Desktop. Bạn có thể điều chỉnh việc sử dụng bộ nhớ trong Docker Desktop bằng cách vào Cài đặt > Tài nguyên.

  1. Tạo hoặc move đến một thư mục trống cho dự án.

  2. Tải xuống và lưu các tệp sau trong thư mục dự án:

  3. Trong tệp .env, chỉ định một mật khẩu cho các biến ELASTIC_PASSWORDKIBANA_PASSWORD.

Mật khẩu phải là chữ số và chữ cái và không được chứa ký tự đặc biệt, như ! hoặc @. Tập lệnh bash được bao gồm trong tệp docker-compose.yml chỉ hoạt động với các ký tự chữ số và chữ cái. Ví dụ:

# Mật khẩu cho người dùng 'elastic' (ít nhất 6 ký tự)
ELASTIC_PASSWORD=changeme​

# Mật khẩu cho người dùng 'kibana_system' (ít nhất 6 ký tự)
KIBANA_PASSWORD=changeme
  1. Trong tệp .env, đặt STACK_VERSION thành phiên bản Elastic Stack hiện tại.
# Phiên bản của các sản phẩm Elastic
STACK_VERSION=8.13.0​

Theo mặc định, cấu hình Docker Compose mở cổng 9200 trên tất cả các giao diện mạng.

Để tránh mở cổng 9200 ra ngoài cho các máy chủ bên ngoài, đặt ES_PORT thành 127.0.0.1:9200 trong tệp .env. Điều này đảm bảo rằng Elasticsearch chỉ có thể truy cập từ máy chủ host.

# Cổng để mở API HTTP Elasticsearch ra host
#ES_PORT=9200
ES_PORT=127.0.0.1:9200​
  1. Để bắt đầu cụm, chạy lệnh sau từ thư mục dự án.
docker-compose up -d​

Sau khi cụm đã được bắt đầu, mở http://localhost:5601 trong trình duyệt web để truy cập Kibana. Đăng nhập vào Kibana với tài khoản là elastic và sử dụng mật khẩu ELASTIC_PASSWORD bạn đã đặt trước đó.

 
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday