Công nghệ ELK Stack là gì? Hướng dẫn cài đặt ELK cơ bản với Docker cho người mới.

17/01/2023 - lượt xem
Chia sẻ
 
Rate this post

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 là gì?

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…

ELK là gì?
ELK là gì?

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à gì?

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.

Elasticsearch có nhiều lợi thế trong xử lý dữ liệu lớn
Elasticsearch có nhiều lợi thế trong xử lý dữ liệu lớn

Chúng ta có thể tóm lược về Elasticsearch như sau

  • Là một Search Engine
  • Không phụ thuộc client do giao tiếp qua Restful.
  • Là open source được phát triển bằng Java.
  • Dữ liệu được tổ chức, lưu trữ dưới dạng JSON

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à gì?

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ì?.

Logstash là gì
Logstash là gì

Kibana – công cụ trực quan hóa dữ liệu

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.

Kibana hỗ trợ trực quan hóa dữ liệu
Kibana hỗ trợ trực quan hóa dữ liệu

Hướng dẫn cài đặt ELK (Elasticsearch – Logstash – Kibana)

Để 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

Cài đặt Elasticsearch với Docker

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

Để 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

Để 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.ymllogstash.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.

Cài đặt ELK với Docker compose

Cài đặt ELK bằng docker

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.ymllogstash.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)

Thêm Pipline vào trong Logstash

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

Cách Embed/Nhúng báo cáo Kibana vào website

Để 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.

Nhúng báo cáo Kibana vào website
Nhúng báo cáo Kibana vào website – Khởi tạo Role mới

Đầ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.

Nhúng báo cáo ELK vào website - tạo tài khoản user
Nhúng báo cáo ELK vào website – tạo tài khoản user

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.

Tổng kết

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é.

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Dev Ops

    Xem thêm