- vừa được xem lúc

Elasticsearch, Kibana, Logstash - Tổng quan, cài đặt và sử dụng

0 0 42

Người đăng: Nguyen Ngoc Man

Theo Viblo Asia

Trong bài viết này mình sẽ không đi sâu về định nghĩa Elastic search cũng như Kibana, Logstash là gì mà sẽ hướng dẫn cách cài đặt cũng như cách import dữ liệu từ database vào Elasticsearch bằng Logstash để sử dụng.

Tổng quát

Theo wikipedia thì Elasticsearch là một công cụ tìm kiếm dựa trên phần mềm Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công cụ với một giao diện web HTTP có hỗ trợ dữ liệu JSON. Elasticsearch được phát triển bằng Java và được phát hành dạng nguồn mở theo giấy phép Apache. Elasticsearch là một công cụ tìm kiếm phổ biến nhất, theo sau là Apache Solr, cũng dựa trên Lucene.

Kibana là ứng dụng nền web để tìm kiếm và trực quan dựa trên việc tương tác với Elasticsearch đã cài đặt ở trên. Các bạn có thể hiểu nôm na thì Kibana như là màn hình để hiển thị dữ liệu từ Elastich search vậy.

Logstash: Theo định nghĩa thì logstash là một công cụ mã nguồn mở thu thập dữ liệu có khả năng liên hợp theo thời gian thực. Logstash có thể hợp nhất dữ liệu từ các nguồn khác nhau và chuẩn hóa dữ liệu ở phần xử lý tiếp theo. Ở đây mình sẽ dùng logstash để migrate dữ liệu từ database vào Elasticsearch

Cài đặt

Elasticsearch và Kibana

Có nhiều cách để cài đặt elasticsearch và kibana. Tuy nhiên cách mình thấy đơn giản và hiệu quả nhất là sử dụng docker-compose. Để thực hiện kết nối 2 service trong docker trước tiên cần thiết lập một network chung cho 2 service đó theo mô hình image.png

Chi tiết file docker-compose.yml như sau:

version: "3.0"
services: elasticsearch: container_name: es-container image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0 environment: - xpack.security.enabled=false - "discovery.type=single-node" networks: - es-net ports: - 9200:9200 kibana: container_name: kb-container image: docker.elastic.co/kibana/kibana:7.17.0 environment: - ELASTICSEARCH_HOSTS=http://es-container:9200 networks: - es-net depends_on: - elasticsearch ports: - 5601:5601
networks: es-net: driver: bridge

Ở đây mình đang sử dụng phiên bản Elasticsearch 7.17.0. Các bạn có thể sửa lại phiên bản nào mà mình muốn sử dụng. Khởi chạy docker-compose bằng lệnh

docker-compose up -d

Trong đó, -d sẽ thực khởi chạy docker bằng chế độ detact.

docker ps

image.png Kiểm tra xem Elasticsearch và Kibana đã được khởi chạy thành công chưa. Mặc định Elasticsearch sẽ được khởi chạy ở http://localhost:9200/ và Kibana ở http://localhost:5601/ image.png image.png Nếu muốn stop cả 2 service trên ta sử dụng lệnh

docker-compose down 

Logstash

Có nhiều cách để migrate data từ cơ sở dữ liệu của bạn sang elasticsearch. Ở đây mình sẽ cài đặt và sử dụng logstash để làm việc đó. Mình sẽ cài đặt logstash theo cách thông thường thay vì tích hợp luôn vào docker-compose như 2 service trên. Tải về và cài đặt Public Signing Key:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Cài đặt apt-transport-https

sudo apt-get install apt-transport-https

Kho lưu trữ được lưu ở /etc/apt/sources.list.d/elastic-7.x.list:

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

Cài đặt

sudo apt-get update && sudo apt-get install logstash

Kiểm tra xem logstash đã được cài đặt thành công và sẵn sàng để sử dụng chưa? Cd vào thư mục logstash và chạy bằng quyền user root.

cd /usr/share/logstash && sudo su

Chạy câu lệnh sau:

bin/logstash -e 'input { stdin { } } output { stdout {} }'

Chờ đến khi pipeline started thì gõ ký tự bất kỳ => Màn hình xuất ra kết quả tương ứng thì Logstash đã được cài đặt thành công và sẵn sàng sử dụng. image.png

Migrate data

Okay. Tới đây thì mình đã cài đặt thành công cả 3 service là Elasticsearch, Kibana và Logstash rồi. Tuy nhiên hiện Elasticsearch của chúng ta không có data nào cả. Mình sẽ sử dụng JDBC Input kết hợp Logstash để migrate data có sẵn từ MySql sang Elasticsearch. Đầu tiên ta cần download MySql JDBC Driver. Cd vào thư mục logstash và chạy bằng quyền user root.

cd /usr/share/logstash && sudo su

Tạo file pipeline.conf. File này sẽ chứa những config liên quan đến DB. Các bạn có thể đọc thêm tại https://www.elastic.co/guide/en/cloud/current/ec-getting-started-search-use-cases-db-logstash.html

gedit example-pipeline.conf

Nội dung:

input { jdbc { jdbc_driver_library => "/usr/share/logstash/lib/mysql-connector-java-8.0.27.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_validate_connection => true jdbc_connection_string => "jdbc:mysql://localhost:3306/g2-aio-db" jdbc_paging_enabled => true jdbc_user => "root" jdbc_password => "ngocman11" last_run_metadata_path => "/tmp/.logstash_jdbc_last_run" use_column_value => true tracking_column => "updated_at" tracking_column_type => "timestamp" clean_run => true statement => "SELECT * FROM `g2-aio-db`.users WHERE deleted_at is null AND updated_at > :sql_last_value AND updated_at < now() ORDER BY updated_at ASC;" }
} filter { mutate { copy => { "id" => "[@metadata][_id]"} remove_field => ["id", "@version", "unix_ts_in_secs"] }
}
output { stdout { codec => "rubydebug"} elasticsearch { index => "users_index" document_id => "%{[@metadata][_id]}" }
} 

Khởi chạy file my-pipeline.conf.

bin/logstash -f example-pipeline.conf --config.reload.automatic

Quan sát trên terminal: image.png Quan sát trên Kibana. Truy cập vào http://localhost:5601/app/management/data/index_management/indices sẽ thấy users_index vừa được tạo. image.png Create index pattern để dễ nhìn image.png Vào main menu mục Analytics → Discover để xem.

Truy vấn

Okay. Vậy là chúng ta đã có data ở Elasticsearch để truy vấn. Khởi chạy postman và truy vấn thử. Đường dẫn mặc định cho lệnh tìm kiếm là:

localhost:9200/users_index/_search

Mình thử search theo column birthday và có năm sinh 1993 và xem kết quả trả về:

localhost:9200/users_index/_search?q=birthday:1993
{ "took": 24, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.6931471, "hits": [ { "_index": "users_index", "_type": "_doc", "_id": "1", "_score": 0.6931471, "_source": { "closest_parent_id": null, "status": 1, "bio": null, "chatwork_id": "123", "github_id": "mannn-2274", "team_id": null, "name": "Nguyen Ngoc Man", "phone_number": "0345526444", "birthday": "10-11-1993", "created_at": null, "deleted_at": null, "employee_code": "B44554456", "@timestamp": "2022-03-13T06:40:20.720Z", "role": 0, "email": "_@.com", "parent_path": null, "updated_at": "2021-05-23T04:51:24.000Z", "gender": 1, "position": 1 } } ] }
}

Tạm kết

Bài viết tới đây cũng khá dài. Trên đây là những mình muốn note lại nhỡ sau này cần áp dụng vào dự án. Vẫn còn nhiều vấn đề cần tìm hiểu thêm như là cluster elastic search. Hiểu nôm na như các instance của elastic search để khi 1 instance bị quá tải hay lỗi gì đó thì còn có instance khác thay thể tránh xảy ra trường hợp die cả hệ thống tìm kiếm. Cron job để migrate data theo giờ. Hoặc migrate data sử dụng trigger thay vì logstash,....

Okay. Cám ơn mọi người đã kiên nhẫn đọc tới đây. Xin cám ơn và hẹn gặp lại ở các bài viết khác.

Tài liệu tham khảo

https://www.elastic.co/

https://viblo.asia/p/tich-hop-elasticsearch-va-kibana-vao-docker-compose-Az45bymqlxY

https://dbschema.com/jdbc-driver/MySql.html

Note: Cám ơn em Nguyễn Thanh Huyền đã chia sẻ phần config và cài đặt Logstash.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Elasticsearch là gì ?

. Lời nói đầu. Elasticsearch là gì .

0 0 35

- vừa được xem lúc

Backup và Restore Elasticsearch snapshot với AWS S3 trong Kubernetes

Ở công ty mình vừa có mấy task devops liên quan đến scaling, clustering Elasticsearch nên viết lại đề phòng sau này cần dùng. Có một task là chuyển dữ liệu từ single-node Elasticsearch cũ lên cluster mới.

0 0 50

- vừa được xem lúc

Reindex Elasticsearch data with zero downtime

Elasticsearch là một search engine tuyệt vời cho mọi dự án muốn áp dụng chức năng search cho sản phẩm của mình, với những tính năng như là near-realtime search, auto-complete, suggestion,.... Cùng với đó là lợi thế kiến trúc distributed search system, có thể dễ dàng scaling, failing handle. Khi muốn

0 0 40

- vừa được xem lúc

Fork you ElasticSearch! How Open Source Works

ElasticSearch recently dropped its open-source licensing strategy, prompting AWS to fork it. Learn how "Open Source" actually works and how companies profit from it.

0 0 48

- vừa được xem lúc

Tìm hiểu Text và Keyword trong Elasticsearch

Giới thiệu. Khi mình mới bắt đầu tìm hiểu về Elasticsearch mình không nghĩ rằng giữa kiểu dữ liệu Text và Keyword có sự khác nhau nhưng khi vào dự án thực tế mình mới nhận ra được sự khác biệt giữa 2

0 0 140

- vừa được xem lúc

Tìm hiểu và cài đặt Elasticsearch

Elasticsearch là gì. 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ý.

0 0 113