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
和 Docker Compose
注:对于 Win/MacOS系统安装 Docker 桌面版后自带 Docker Compsoe,不需要再次安装。
Docker安装好后,建议先配置相关权限,官方文档:
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 文档
中的说明,在地址后添加认证信息: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 部署完成。