Nếu bạn đang tìm kiếm một nền tảng để phân tích dữ liệu log một cách đơn giản nhanh chóng. Thì chính xác ELK Stack chính là công nghệ bạn đang tìm kiếm. Trong bài viết này chúng ta cùng tìm hiểu ELK Stack là gì cũng như cách cấu hình cài đặt ELK Stack với Docker.
Tuy vậy, các bạn có thể hiểu rằng ELK Stack hiện nay đang nổi lên như một nền tảng mạnh mẽ trong việc phân tích, visuallize dữ liệu.
Ngoài ELK Stack chúng ta có thể có các công cụ thay thế như Hadoop, Spark, Zeppelin, Tableau… Tuy vậy trong khuôn khổ seri bài viết này, CodeTuTam sẽ hướng dẫn bạn làm quen với ELK Stack và ứng dụng nó trong việc biểu diễn data.
ELK Stack được viết tắt từ 3 dự án phổ biến bao gồm: Elasticsearch, Logstash và Kibana. Mục tiêu chính của ELK Stack là hỗ trợ khả năng tổng hợp nhất ký log từ các hệ thống, ứng dụng, phân tích dữ liệu này và đồ thị hóa dữ liệu. Dựa trên các kết quả này chúng ta có thể giám sát, theo dõi hoạt động của ứng dụng, cơ sở hạ tầng. Điều này đồng nghĩa với việc ELK Stack cũng có thể giúp chúng ta phát hiện lỗi, khắc phục sự cố nhanh hơn, sớm hơn…
Việc ghi nhận Log đối với ELK Stack có thể đến từ nhiều nguồn như tệp log của Hệ điều hành, của các thiết bị IOT… Ngoài ra ELK cũng được sử dụng để tạo các báo cáo cho các ứng dụng phân tích số liệu như Ecommerce, hành trình chuyến bay…
Elasticsearch là công cụ tìm kiếm (Search Engine) được kế thừa và phát triển từ Apache Lucene. Về bản chất, Elasticsearch hoạt động như một webserver, cõ hỗ trợ khả năng tìm kiếm thông qua Resful. Chình vì điều này, ElasticSearch không bị phụ thuộc vào client là nền tảng gì hay xây dựng bằng ngôn ngữ lập trình gì. Elasticsearch là một hệ thống phân tán, có khả năng mở rộng không giới hạn.
Chúng ta có thể tóm lược về Elasticsearch như sau
Bạn có thể tham khảo thêm thông tin về Elasticsearch tại Elasticsearch là gì hoặc trên trang chủ của Elastic https://www.elastic.co
Logstash là một công cụ thu nạp dữ liệu nguồn mở cho phép bạn thu thập dữ liệu từ các nguồn khác nhau. Logstash sau đó hỗ trợ chuyển đổi dữ liệu và gửi dữ liệu tới điểm đích bạn muốn. Với các bộ lọc được tạo sẵn và hỗ trợ hơn 200 phần bổ trợ, Logstash cho phép người dùng dễ dàng thu nạp bất kỳ dữ liệu đến từ nguồn hay thuộc loại dữ liệu nào. Tìm hiểu thêm về Logstash là gì?.
Cũng giống như Zeppelin, Tableau, Power BI… thì Kibana là một công cụ hỗ trợ trực quan hóa dữ liệu, khám phá dữ liệu dựa trên các dữ liệu nhật ký, log. Kibana cung cấp các biểu đồ tương tác dễ sử dụng, những bộ lọc và tập hợp được tạo sẵn cũng như hỗ trợ không gian địa lý, khiến cho công cụ này trở thành lựa chọn ưa thích cho hoạt động hiển thị trực quan dữ liệu được lưu trữ trong Elasticsearch.
Để cài đặt ELK Stack chúng ta có nhiều cách khác nhau. Tuy vậy để thuận theo xu thế, cũng như thuận tiện trong quá trình sử dụng. Code Tu Tam sẽ hướng dẫn các bạn cài đặt thông qua Docker.
Download source ở đây: https://bit.ly/codetutam_elk_851
Chúng ta tạo file docker-compose.yml với nội dung như sau
version: "3" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.5.1 container_name: sem_elasticsearch restart: always environment: - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - 9200:9200 logging: driver: "json-file" options: max-size: "10k" max-file: "10" volumes: - ./share/elasticsearch:/home/elk - ./common/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
Với thông tin như trên, chúng ta sẽ khởi tạo 1 container elastichsearch từ image elasticsearch phiên bản 8.5.1 (Phiên bản mới nhất tại thời điểm bài viết này).
Container Name là sem_elasticsearch
Restart: Always – thông tin này sẽ giúp container được khởi động lại khi xảy ra lỗi
Chúng ta cài đặt các thông tin môi trường thông qua Enviorment. Ví dụ như trên chúng ta chạy Elasticsearch với single node.
Ánh xạ cổng 9200 của container với cổng 9200 của máy host thông qua cấu hình ports.
Cuối cùng phần Volume, chúng ta chia sẻ nội dung thư mục /home/elk trong container với thư mục máy host tại /share/elasticsearch của chúng ta.
File elasticsearch.yml là file cấu hình của Elasticsearch, nội dung file như sau:
cluster.name: "docker-cluster" network.host: 0.0.0.0 node.name: node-1 #----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------------- # # The following settings, TLS certificates, and keys have been automatically # generated to configure Elasticsearch security features on 21-11-2022 18:57:26 # # -------------------------------------------------------------------------------- # Enable security features xpack.security.enabled: true #xpack.security.enrollment.enabled: true # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents #xpack.security.http.ssl: # enabled: true # keystore.path: certs/http.p12 # Enable encryption and mutual authentication between cluster nodes #xpack.security.transport.ssl: # enabled: true # verification_mode: certificate # client_authentication: required # keystore.path: certs/transport.p12 # truststore.path: certs/transport.p12 # Create a new cluster with the current node only # Additional nodes can still join the cluster later #cluster.initial_master_nodes: ["dc43bcd825f3"] #----------------------- END SECURITY AUTO CONFIGURATION -------------------------
Trong file cấu hình này, CodeTuTam đã tắt cấu hình SSL (mặc định trong phiên bản 8.5.1 là bật)
Để cài đặt Kibana, chúng ta bổ sung thêm nội dung cấu hình Kibana vào trong file docker-compose như sau
kibana: image: docker.elastic.co/kibana/kibana:8.5.1 container_name: sem_kibana restart: always environment: - "ELASTICSEARCH_URL=http://elasticsearch:9200" - "SERVER_NAME=127.0.0.1" ports: - 5601:5601 depends_on: - elasticsearch volumes: - ./share/kibana:/home/elk - ./common/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
Cũng tương tự như cấu hình của Elasticsearch. Trong Kibana chúng ta khai báo đường dẫn của Elastichsearch, Ánh xạ cổng 5601 của máy host vào cổng 5601 của container Kibana
Nội dung file cấu hình Kibana như sau
# # ** THIS IS AN AUTO-GENERATED FILE ** # # Default Kibana configuration for docker target server.host: "0.0.0.0" server.shutdownTimeout: "5s" elasticsearch.hosts: ["http://elasticsearch:9200"] monitoring.ui.container.elasticsearch.enabled: true elasticsearch.username: "kibana_system" elasticsearch.password: "UdX8VsW9EXto7li6x2EH" xpack.encryptedSavedObjects.encryptionKey: bb8d1e9a57fcb695fb022c11c729b65c xpack.reporting.encryptionKey: cd823f0848463db55923f4dd8776a1c3 xpack.security.encryptionKey: 1b1423ed299c626b1d2c2197a6e8b15c xpack.reporting.capture.browser.chromium.disableSandbox: true # xpack.security.sameSiteCookies: "None" xpack.security.authc.providers: basic.basic1: order: 0 description: "Log in as an Employee" anonymous.anonymous1: order: 1 description: "Continue as guest" icon: "globe" session: idleTimeout: 1Y credentials: username: "ano" password: "123456"
Trong đó phần cấu hình username, xpack sẽ được điền sau. Phần này liên quant ới bảo mật cũng như việc cho phép embed đường dẫn của dashboard kibana vào website.
Sau bước này, nếu khởi động kibana có thể bạn sẽ gặp lỗi chưa chạy được. Lỗi này là do trước đó trong file cấu hình CodeTuTam đã cài đặt sẵn các thông tin liên quan tới security.
Để cài đặt Logstash chúng ta bổ sung thêm service trong docker-compose.yml. Sau khi bổ sung nội dung file docker-compose.yml có nội dung như sau:
version: "3" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.5.1 container_name: sem_elasticsearch restart: always environment: - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - 9200:9200 logging: driver: "json-file" options: max-size: "10k" max-file: "10" volumes: - ./share/elasticsearch:/home/elk - ./common/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml kibana: image: docker.elastic.co/kibana/kibana:8.5.1 container_name: sem_kibana restart: always environment: - "ELASTICSEARCH_URL=http://elasticsearch:9200" - "SERVER_NAME=127.0.0.1" ports: - 5601:5601 depends_on: - elasticsearch volumes: - ./share/kibana:/home/elk - ./common/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml logstash: build: context: . dockerfile: Dockerfile-logstash container_name: sem_logstash restart: always depends_on: - elasticsearch volumes: - ./share/logstash:/home/elk - ./common/logstash/config/pipelines.yml:/usr/share/logstash/config/pipelines.yml - ./common/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml - ./common/logstash/pipeline:/usr/share/logstash/pipeline
Nội dung file Dockerfile-logstash
FROM docker.elastic.co/logstash/logstash:8.5.1 RUN curl -L --output "mysql-connector-java-8.0.22.tar.gz" "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.22.tar.gz" \ && tar -xf "mysql-connector-java-8.0.22.tar.gz" "mysql-connector-java-8.0.22/mysql-connector-java-8.0.22.jar" \ && mv "mysql-connector-java-8.0.22/mysql-connector-java-8.0.22.jar" "mysql-connector-java-8.0.22.jar" \ && rm -r "mysql-connector-java-8.0.22" "mysql-connector-java-8.0.22.tar.gz" ENTRYPOINT ["/usr/local/bin/docker-entrypoint"]
Trong ví dụ này, khi cài logstash chúng ta cài đặt thêm mysql-connector để đồng bộ dữ liệu từ mysql sang ElasticSearch.
Chú ý rằng, với cài đặt Logstash chúng ta có sử dụng các file cấu hình bao gồm: piplines.yml và logstash.yml. Trong đó logstash.yml chứa các cấu hình cài đặt của Logstash tương tự như file kibana.yml hay elasticsearch.yml. Với file piplines.yml định nghĩa các luồng xử lý dữ liệu của Logstash.
Nội dung file logstash.yml như sau:
http.host: "0.0.0.0" xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"] xpack.monitoring.elasticsearch.username: elastic xpack.monitoring.elasticsearch.password: cpbegH2G15lyW0nK8zrs
Trong đó các cấu hình xpack là cấu hình liên quan tới bảo mật kết nối từ logstash sang elasticsearch.
File piplines.yml như sau
# This file is where you define your pipelines. You can define multiple. # For more information on multiple pipelines, see the documentation: # https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html - pipeline.id: main path.config: "/usr/share/logstash/pipeline"
Như cấu hình trong file piplines.yml thì sẽ lấy toàn bố các file cấu hình trong thư mục pipline.
Với các bước trên, chúng ta đã có đủ nguyên liệu cho việc cài đặt ELK với docker. Việc cài đặt này đối với dân ngoại đạo hay người mới bắt đầu sẽ gặp nhiều khó khăn. Nếu gặp bất kì vấn đề nào các bạn có thể comment dưỡi bài viết để cùng thảo luận và trao đổi nhé.
Chúng ta mở terminal tại thư mục gốc (thư mục chưa file docker-compose.yml) và chạy lệnh
docker compose up
Lệnh docker compose up sẽ tiến hành đọc file docker-compose.yml và pull image, khởi tạo container. Việc cài đặt này có thể mất 1 vài phút.
Sau khi hoàn thành bạn sẽ nhìn thấy log khởi tạo của Elasticsearch, Kibana và cả Logstash hiện ra. Tuy nhiên khi này như CodeTuTam đã trình bày trước đó, Logstash và Kibana có thể bị stop do các cấu hình liên quan tới bảo mật.
Chúng ta cần khởi chạy lệnh bash trong Elasticsearch bằng lệnh sau
docker exec -it sem_elasticsearch bash
Sau khi truy cập vào Container Elasticsearch, chúng ta tiến hành khởi tạo mật khẩu cho Elasticsearch bằng lệnh sau
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
Bạn có thể thấy màn hình nôi dung tương tự như sau
Changed password for user apm_system PASSWORD apm_system = t5ET3htxK7XrhqqfhcY0 Changed password for user kibana_system PASSWORD kibana_system = UdX8VsW9EXto7li6x2EH Changed password for user kibana PASSWORD kibana = UdX8VsW9EXto7li6x2EH Changed password for user logstash_system PASSWORD logstash_system = RYvrflKgF3LoYfYQLqr9 Changed password for user beats_system PASSWORD beats_system = m8y5bacqpPZbweBIJyBZ Changed password for user remote_monitoring_user PASSWORD remote_monitoring_user = VSmWHZNuRCXeB97a4bCm Changed password for user elastic PASSWORD elastic = cpbegH2G15lyW0nK8zrs
Đây chính là các tài khoản được tạo ra để truy cập hệ thống.
Việc tiếp theo chúng ta cần cập nhật tài khoản vào từng file kibana.yml và logstash.yml. Như trong cấu hình mẫu trên, kibana sẽ sử dụng tài khoản kibana_system, còn logstash sử dụng tài khoản elastic.
Bạn có thể thoát khỏi màn hình terminal của Elasticsearch. Sau đó chúng ta truy cập màn hình terminal của Kibana với lệnh như sau
docker exec -it sem_kibana bash
Tạo Encryption key cho Kibana với lệnh
/usr/share/kibana/bin/kibana-encryption-keys generate
Kết quả được thông báo ra có dạng như sau
xpack.encryptedSavedObjects.encryptionKey: bb8d1e9a57fcb695fb022c11c729b65c xpack.reporting.encryptionKey: cd823f0848463db55923f4dd8776a1c3 xpack.security.encryptionKey: 1b1423ed299c626b1d2c2197a6e8b15c
Chúng ta copy các cấu hình này vào file kibana.yml (xem lại file cấu hình mẫu bên trên)
Về cơ bản, việc cài đặt ELK đã hoàn thành và bạn có thể sử dụng phục vụ phân tích, sơ đồ hóa dữ liệu. Tuy nhiên trong phần này của bài viết, CodeTuTam sẽ hướng dẫn bạn thêm Pipline vào trong logstash với nhiệm vụ đồng bộ dữ liệu từ Mysql sang Elasticsearch thông qua Logstash.
Để thêm 1 pipline mới, chúng ta cần cập nhật file piplines.yml, tham khảo nội dung sau
- pipeline.id: ten-pipeline
path.config: "/usr/share/logstash/pipeline/ten-pipeline.conf"
Bạn cần tạo file ten-pipeline.conf trong thư mục pipeline, tham khảo file mẫu dưỡi đây, chú ý cập nhật mật khẩu tạo ở elastic bước trên vào trong file để có thể đồng bộ dữ liệu.
input { jdbc { jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.22.jar" # jdbc_driver_class => "com.mysql.cj.jdbc.Driver" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://IP_SERVER_MYSQL:3306" jdbc_user => "MYSQL_USERNAME" jdbc_password => "MYSQL_PASSWORD" schedule => "* * * * *" statement => "SELECT * FROM MYSQL_DATABSE.TABLE_NAME where id > :sql_last_value" # where id > :sql_last_value use_column_value => true tracking_column => "id" last_run_metadata_path => "/home/elk/logstash/.logstash_jdbc_last_query" } }filter { mutate { remove_field => ["@version", "@timestamp"] } }output { stdout { codec => rubydebug { metadata => true } } elasticsearch { hosts => ["http://elasticsearch:9200"] index => "racs" user => 'ELASTIC_USERNAME' password => 'ELASTIC_PASSWORD' } }
Các bạn cần chú ý tới các từ khóa ELASTIC_USERNAME, ELASTIC_PASSWORD, MYSQL_DATABSE, TABLE_NAME, IP_SERVER_MYSQL, MYSQL_USERNAME, MYSQL_PASSWORD để cài đặt chuẩn cho file cấu hình đồng bộ dữ liệu.
Để tìm hiểu thêm về jdbc-streaming các bạn có thể tham khảo thêm link bài viết sau: https://www.elastic.co/guide/en/logstash/current/plugins-filters-jdbc_streaming.html
Để thuận tiện cho việc nhúng báo cáo (Canvas, Dashboard) được tạo ra bởi Kibana bạn có thể tham khảo nội dung sau.
Bạn cần login vào hệ thống quản lý của Kibana tại địa chỉ http://localhost:8501. và đăng nhập với tài khoản elastic đã tạo bên trên.
Đầu tiên, bạn cần tạo 1 role mới với đầy đủ quyền truy cập vào các indeces mà bạn muốn truy vấn, hay tạo báo cáo từ nó. Ngoài ra bạn cũng cần setup quyền cho phần Kibana.
Tiếp đến, chúng ta tạo 1 tài khoản trong mục user với role chính là role chúng ta vừa tạo.
Nếu bạn để ý kĩ, thông tin tài khoản này chính là cài đặt trong file kibana.yml bên trên. Các bạn có thể lăn lên xem lại để thấy rõ điều này nhé. Các báo cáo để dạng public sẽ được view dưới quyền của tài khoản này.
Trong bài viết này, CodeTuTam đã hướng dẫn các bạn cài đặt ELK một các cơ bản nhất, đồng thời CodeTuTam cũng hướng dẫn đồng bộ dữ liệu từ Mysql về ElasticSearch. ELK là một bộ công cụ mạnh trong việc phân tích và xử lý dữ liệu. Và đương nhiên, bộ công cụ này cũng không hề đơn giản đối với người mới bắt đầu. Tuy nhiên hi vọng bài viết này giúp bạn hiểu được ELK là gì? Cũng như hiểu được cài đặt cấu hình cơ bản cho hệ thống ELK.
Bài viết được viết dựa trên kinh nghiệm cá nhân trong quá trình tìm hiểu. Hi vọng với bài viết này có thể giúp các bạn xử lý được công việc của mình. Nếu thấy bài viết hay và hữu ích hãy giúp CodeTuTam chia sẻ tới nhiều người hơn bạn nhé.
Bình luận: