0%

Docker部署Logstash记

Docker部署Logstash记

背景

之前学习Docker,练习时已经在Docker安装了es和kibana容器(此处很简单,只需注意docker镜像的版本对照)。最近公司在上马ES作为数据查询出口的主力,所以想在本地试验下Logstash数据收集同步。

步骤

安装logstash

之前安装的ES和Kibana版本都是7.6.0, 版本不用纠结。
docker pull logstash:7.6.0

获取配置文件

logstash的配置文件,如果手上没有,可以启动logstash后获取默认配置文件。
docker run -d -p 5044:5044 --name logstash logstash:7.6.0

查看日志信息 是否启动成功

docker logs -f logstash

本地环境创建所需挂载文件夹

mkdir -p ~/docker/logstash

1
2
3
docker cp logstash:/usr/share/logstash/config ~/docker/logstash/
docker cp logstash:/usr/share/logstash/data ~/docker/logstash/
docker cp logstash:/usr/share/logstash/pipeline ~/docker/logstash/

修改配置文件 logstash.ymls 的内容

1
2
3
4
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://127.0.0.1:9200" ]
#path.config: /usr/share/logstash/config/conf.d/*.conf
path.logs: /usr/share/logstash/logs

文件夹赋权

chmod -R 777 ~/docker/logstash/

删除之前的容器,重新创建新的容器,重新启动

1
2
3
4
5
6
7
8
9
10
docker run \
--name logstash \
--restart=always \
-p 5044:5044 \
-p 9600:9600 \
-e ES_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \
-v /Users/xbcui/docker/logstash/config:/usr/share/logstash/config \
-v /Users/xbcui/docker/logstash/data:/usr/share/logstash/data -v /Users/xbcui/docker/logstash/pipeline:/usr/share/logstash/pipeline \
-v /Users/xbcui/docker/logstash/pipeline/mysql-connector-java-8.0.22.jar://usr/share/logstash/config/jars/mysql-connector-java-8.0.22.jar \
-d logstash:7.6.0

参数说明:

docker run
–name logstash\ 将容器命名为 logstash
–restart=always \ 容器自动重启
-p 5044:5044 \ 将容器的5044端口映射到宿主机5044端口 logstash的启动端口
-p 9600:9600 \ 将容器的9600端口映射到宿主机9600 端口,api端口
-e ES_JAVA_OPTS=”-Duser.timezone=Asia/Shanghai” \ 设置时区
-v /Users/xbcui/docker/logstash/data:/usr/share/logstash/data -v /Users/xbcui/docker/logstash/pipeline:/usr/share/logstash/pipeline
-v /Users/xbcui/docker/logstash/pipeline/mysql-connector-java-8.0.22.jar://usr/share/logstash/config/jars/mysql-connector-java-8.0.22.jar \ 挂载
-d logstash:7.6.0 后台运行容器,并返回容器ID

查看logstash新的容器是否启动成功

docker ps
docker logs -f --tail 200 logstash

mysql同步配置

先进入容器

docker exec -it logstash bash

查看是否装有 logstash-input-jdbc 插件

./bin/logstash-plugin list --verbose

没有的话就安装,其实插件茫茫多

./bin/logstash-plugin install logstash-input-jdbc

退出容器

exit

在文件目录 ~/docker/logstash/config/conf.d下创建 jdbc.conf 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
input{
jdbc{
# 连接数据库
jdbc_connection_string => "jdbc:mysql://192.168.99.205:3306/database"
jdbc_user => "user"
jdbc_password => "pass"
# 连接数据库的驱动包 需要手动导入到docker服务中
jdbc_driver_library => "/usr/share/logstash/pipeline/mysql-connector-java-8.0.22.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
codec => plain { charset => "UTF-8" }

# 数据追踪
# 追踪的字段
tracking_column => "update_time"
# 上次追踪的元数据存放位置
last_run_metadata_path => "/usr/share/logstash/config/lastrun/logstash_jdbc_last_run"
# 设置时区
jdbc_default_timezone => "Asia/Shanghai"
# sql 文件地址
# statement_filepath => ""
# sql
statement => "select * from order_info"
# 是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
clean_run =>false
# 这是控制定时的,重复执行导入任务的时间间隔,第一位是分钟 不设置就是1分钟执行一次
schedule => "* */1 * * *"
}
}
filter {
date {
match => ["order_time", "yyyy-MM-dd HH:mm:ss"]
}
}

output{
elasticsearch{
# 要导入到的Elasticsearch所在的主机
hosts => "192.168.98.169:9200"
# 要导入到的Elasticsearch的索引的名称
index => "jinwei_order_2360s_index"
# 类型名称(类似数据库表名)
document_type => "_doc"
# 主键名称(类似数据库表名)
document_id => "%{id}"
}

stdout{
# JSON 格式输出
codec => json_lines
}
}

将logstash.yml 中 path.config: /usr/share/logstash/config/conf.d/*.conf这一行的注释放开

附:向Docker服务下载/上传文件

下载文件
docker cp logstash:/usr/share/logstash/data ~/docker/logstash/
上传文件
docker cp 本地文件路径 ID全称:容器路径
docker cp /Users/xbcui//elasticsearch-phone-.zip 609e6107f1210f20e8689e985bb7265d7ac0a453bb23eee36aed0c9c852801ea:usr/share/elasticsearch/plugins/elasticsearch-phone.zip