Docker ELK 部署


目录

  • Docker ELK 部署
  • 1. 环境准备
  • 1.1 Docker & Docker Compose
  • 1.2 docker-elk 项目
  • 2 Elastics Stack 的配置
  • 2.1 Elasticsearch
  • 2.1.1 跨域
  • 2.2 Logstash
  • 2.2.1 同步数据


1. 环境准备

1.1 Docker & Docker Compose

官网下载安装 Docker

https://docs.docker.com/get-docker

和 Docker Compose

https://docs.docker.com/compose/install

注:对于 Win/MacOS系统安装 Docker 桌面版后自带 Docker Compsoe,不需要再次安装。

Docker安装好后,建议先配置相关权限,官方文档:

https://docs.docker.com/engine/install/linux-postinstall

1.2 docker-elk 项目

git clone https://github.com/deviantony/docker-elk.git /app/docker-elk

克隆到指定目录,这里指定到 /app/docker-elk

该项目初始结构(elk version 7.13)如下:
├── docker-compose.yml
├── docker-stack.yml
├── elasticsearch
│ ├── config
│ │ └── elasticsearch.yml
│ └── Dockerfile
├── extensions
│ ├── apm-server
│ ├── app-search
│ ├── curator
│ ├── logspout
├── kibana
│ ├── config
│ │ └── kibana.yml
│ └── Dockerfile
├── LICENSE
├── logstash
│ ├── config
│ │ └── logstash.yml
│ ├── Dockerfile
│ └── pipeline
│ └── logstash.conf
└── README.md
└── .env

2 Elastics Stack 的配置

首先进行下述配置:

修改 /etc/sysctl.conf:vm.max_map_count = 262144,修改完运行 sysctl -p使之生效或者退出当前终端重进使之生效。

elasticsearch.yml 配置文件中的xpack.license.self_generated.type 修改为 basic 来禁用 X-Pack 相关收费功能:

xpack.license.self_generated.type: basic

由于机器内存太小,导致实际运行中容器各种退出,我选择将 Elastic Stack 三者的 xpack.monitoring.enabled 统统关闭。打开三者的.yml,修改相应配置项为:

xpack.monitoring.collection.enabled: false
xpack.monitoring.enabled: false

2.1 Elasticsearch

2.1.1 跨域

首先进行跨域开启设置。为了能用 elasticsearch-head 插件访问 elasticsearch,elasticsearch 需要开启跨域。

找到 elasticsearch service 的 environment 属性,在其下添加:

http.cors.enabled: "true"
  http.cors.allow-origin: "*"

因为 docker-elk 项目初始的 Elastic Stack 都有认证机制,故还需要添加:

http.cors.allow-headers: "Content-Type,Content-Length,Authorization"
  http.cors.allow-credentials: "true"

此时,启动 elasticsearch 容器:docker-compose up elasticsearch,浏览器用 elasticsearh-head 访问 http://yourhost:9200/ 会发现 ERROR CODE 401。这时参考 elasticsearch-head 文档

https://github.com/mobz/elasticsearch-head

中的说明,在地址后添加认证信息:http://yourhost:9100/?auth_user=elastic&auth_password=changeme

2.2 Logstash

关于从 sql server 导入数据到 es,本文采用方案:


2.2.1 同步数据

首先,下载 jdbc jar 包,地址:
https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017 下载后解压到相应路径。然后编辑 docker-compose.yml 的 Logstash 部分以绑定 jar 包到容器内:

- type: bind
   	source: ./sqljdbc_9.2/chs/mssql-jdbc-9.2.1.jre11.jar
    target: /usr/share/logstash/lib/sqljdbc_9.2/chs/mssql-jdbc-9.2.1.jre11.jar
    read_only: true

然后,准备好一份 .conf 文件,下面给出模板。

input {
  jdbc {
    jdbc_driver_library => "/usr/local/logstash-7.2.0/lib/mssql-jdbc-7.2.2/mssql-jdbc-7.2.2.jre8.jar" # 这里请灵活应变,能找到我们上一步下载的jdbc jar包即可
    jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" # 这个名字是固定的
    jdbc_connection_string => "jdbc:sqlserver: //数据库ServerIP:1433;databaseName=数据库名;"
    jdbc_user => "数据库账号"
    jdbc_password => "数据库密码"
    schedule => "* * * * *" # Corn 表达式,请自行百度写法
    jdbc_default_timezone => "Asia/Shanghai"
    jdbc_page_size => "500" # 每一批传输的数量
    record_last_run => "true" #是否保存状态 
    use_column_value => "true" #设置为时true,使用定义的 tracking_column值作为:sql_last_value。设置为时false,:sql_last_value反映上次执行查询的时间。
    tracking_column => "LastModificationTime" #配合use_column_value使用
    last_run_metadata_path => "/usr/opt/logstash/config/last_value" #记录:sql_last_value的文件
    lowercase_column_names => "false" #将DB中的列名自动转换为小写
    tracking_column_type => "timestamp" #tracking_column的数据类型,只能是numberic和timestamp
    clean_run => "false" #是否应保留先前的运行状态,具体参考文档~~
    #statement => "SELECT * FROM 表 WITH(NOLOCK) WHERE LastModificationTime > :sql_last_value" #从DB中抓数据的SQL脚本
    statement_filepath => "/file/path/some.sql" #文件形式的SQL脚本,路径注意双引号括起来
 }
}
output {
 elasticsearch {
    index => "your_index"
    document_id => "%{Id}"
    hosts => ["elasticsearch:9200"]
    user => "elastic"
    password => "changeme"
    ecs_compatibility => disabled
 }
}

上面的 input jdbc plugin 中 SQL 语句配置了 statement_filepath。因此对应的 foo.sql 文件也需要通过 bind-mount 绑定到容器中,在docker-compose.yaml的Logstash添加:

- type: bind
    source: ./logstash/config/foo.sql
    target: /usr/share/elasticsearch/config/foo.sql
    read_only: true

关于 input 的 jdbc plugin,参考文档:

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html

这里再给出一份正式版本的 .conf 文件:

input {
 jdbc {
    jdbc_driver_library => "/usr/share/logstash/lib/sqljdbc_9.2/chs/mssql-jdbc-9.2.1.jre11.jar"
    jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    jdbc_connection_string => "jdbc:sqlserver://yourip:1433;databaseName=yourDB;"
    jdbc_user => "user_name"
    jdbc_password => "your_passwd"
    schedule => "*/15 * * * *"
    jdbc_default_timezone => "Asia/Shanghai"
    jdbc_page_size => "500"
    record_last_run => "true"
    #use_column_value => "true"
    #tracking_column => "LastModificationTime"
    last_run_metadata_path => "/usr/share/logstash/config/last_value"
    lowercase_column_names => "false"
    tracking_column_type => "timestamp"
    clean_run => "false"
    statement_filepath => "/usr/share/logstash/item_warehouse.sql"
    #statement => "SELECT * FROM Table1 WITH(NOLOCK) WHERE (LastModificationTime >= :sql_last_value OR CreationTime >= :sql_last_value) AND IsDeleted=0"
 }
}
filter {
    mutate {
            rename => {"Field1" => "字段1" "Field2" => "字段2" }
    }
}
output {
elasticsearch {
    index => "your_index"
    document_id => "%{Id}"
    hosts => ["elasticsearch:9200"]
    user => "elastic"
    password => "changeme"
    ecs_compatibility => disabled
 }
}

同样,该配置文件需要绑定到容器内,打开 docker-compose.yml 对 Logstash 添加:

- type: bind
    source: ./logstash/config/foobar.conf
    target: /usr/share/elasticsearch/config/foobar.conf
    read_only: true

这里定时查询以跟踪表 Table1 的变化,依据是上一次查询时间。logstash设定的第一次查询的初始时间是’1970-01-01 08:00’,具体请查看上述 jdbc 文档。这里的 filter 用来完成重命名字段名称的工作。

此时,运行 docker-compose up elasticsearch logstash 启动Elasticsearch 和 Logstash,在 head 插件上打开可以看到相应的 index 及其 document。

到此,Docker上的 EL 部署完成。