一.部署es
1.获取镜像
docker pull elasticsearch:7.14.0
2.启动并设置内存大小
docker run -d --name=es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.14.0
3.配置es
#进入es容器内容
docker exec -it es /bin/bash
#修改es配置文件
vi /usr/share/elasticsearch/config/elasticsearch.yml
#添加以下配置,允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*
4.安装ik分词器
#下载对应版本IK分词器,本次安装Elasticsearch为7.14.0,下载elasticsearch-analysis-ik-7.14.0.zip
,若下载不成功,则直接去官网下载,用xftp传到服务器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.14.0.zip
#解压到ik文件夹
unzip elasticsearch-analysis-ik/releases -d ./ik/
#将本机ik文件夹导入docker es容器中
docker cp ./ik es:/usr/share/elasticsearch/plugins/
#重启es
docker restart es
#校验es
curl localhost:9200
二.部署kibana
1.获取镜像
docker pull kibana:7.14.0
2.运行kibana
docker run -d --name kibana -p 5601:5601 kibana:7.14.0
3.配置汉化及设置连接es
docker exec -it kibana /bin/bash
#最后一行添加 i18n.locale: "zh-CN"
vi /usr/share/kibana/config/kibana.yml
#添加以下内容
i18n.locale: "zh-CN"
#将改配置设置为自己机器的ip
elasticsearch.hosts: [ "http://ip:9200" ]
#重启kibana
docker restart kibana
三.部署logstash
1.官网下载对应版本的logstash
https://www.elastic.co/fr/downloads/logstash
2.解压即可
四.配置logstash,从mysql同步数据至es
1.在logstash的config目录下创建目录userAttachment,并创建对应的文件logstash-userAttachment.conf 、 userAttachmentLog.txt、 userAttachment.sql
2.需要同步的mysql表
3..编写配置文件
(跟踪字段version_time,增量更新,使用filter对数据库中时间字段进行处理,否则会差八小时)
vim logstash-userAttachment.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
jdbc {
# 数据库连接
jdbc_connection_string => "jdbc:mysql://ip:3306/analysisdb?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false"
jdbc_user => "account"
jdbc_password => "passwd"
# 需要下载数据库连接驱动并放在logstash下
jdbc_driver_library => "/data1/logstash-7.14.0/sync/mysql-connector-java-5.1.14/mysql-connector-java-5.1.14-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 处理中文乱码问题
jdbc_default_timezone => "Asia/Shanghai"
#使用本地时区为local,否则sql_last_value如果是timestamp,时间会提前8小时
#值可以是任何的:utc,local,默认值为 "utc"
plugin_timezone => "local"
#codec => plain { charset => "UTF-8"}
# 使用其它字段追踪,而不是用时间
use_column_value => true
# 追踪的字段
tracking_column => "version_time"
# 取值范围为:numeric,timestamp,默认值为numeric。
tracking_column_type => timestamp
# 记录追踪字段上次记录
record_last_run => true
# 上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值
last_run_metadata_path => "/data1/logstash-7.14.0/config/userAttachment/userAttachmentLog.txt"
# 是否清除 last_run_metadata_path 的记录,true则每次都从头开始查询所有的数据库记录
clean_run => false
#是否开启分页
jdbc_paging_enabled => "true"
#分页条数
jdbc_page_size => "50000"
# 执行的sql 文件路径+名称
statement_filepath => "/data1/logstash-7.14.0/config/userAttachment/userAttachment.sql"
schedule => "* * * * *"
#是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false)
lowercase_column_names => false
}
}
filter {
ruby { #设置一个自定义字段'timestamp'[这个字段可自定义],将logstash自动生成的时间戳中的值加8小时,赋给这个字段
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*3600)" }
ruby { # create_time(创建时间)增加8小时
code => "event.set('create_time', event.get('create_time').time.localtime + 8*60*60)"}
ruby { # update_time(更新时间)增加8小时
code => "event.set('update_time', event.get('update_time').time.localtime + 8*60*60)"}
ruby { # expire_time(到期时间)增加8小时
code => "event.set('expire_time', event.get('expire_time').time.localtime + 8*60*60)"}
ruby { # version_time(本版更新时间)增加8小时
code => "event.set('version_time', event.get('version_time').time.localtime + 8*60*60)" }
ruby { # 将自定义时间字段中的值重新赋给@timestamp
code => "event.set('@timestamp',event.get('timestamp'))" }
ruby { #将自定义时间字段中的值重新赋给create_time
code => "event.set('create_time',event.get('create_time'))"}
ruby { #将自定义时间字段中的值重新赋给update_time
code => "event.set('update_time',event.get('update_time'))"}
ruby { #将自定义时间字段中的值重新赋给expire_time
code => "event.set('expire_time',event.get('expire_time'))"}
ruby { #将自定义时间字段中的值重新赋给version_time
code => "event.set('version_time',event.get('version_time'))"}
mutate { #删除自定义字段
remove_field => ["timestamp"]
}
# 转换成日期格式
ruby {
code => "event.set('create_time', event.get('create_time').time.localtime.strftime('%Y-%m-%d'))" }
ruby {
code => "event.set('update_time', event.get('update_time').time.localtime.strftime('%Y-%m-%d'))" }
ruby {
code => "event.set('expire_time', event.get('expire_time').time.localtime.strftime('%Y-%m-%d'))" }
ruby {
code => "event.set('version_time', event.get('version_time').time.localtime.strftime('%Y-%m-%d'))" }
}
output {
elasticsearch {
# 需要同步的es的ip:port
hosts => "localhost:9200"
#同步至es中的索引名(需要在同步前,先在es中创建好)
index => "user_attachment"
# es的id生成策略。不写es自己分配,我这里使用和mysql一致的id
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
4.编写userAttachment.sql
vim userAttachment.sql
select *, concat_WS(",",id,user_account,file_name,file_code,file_type,file_remote_path,create_by,create_time,
update_by,update_time,
file_suffix,expire_time,del_flag,version_code,version_time,is_latest_version)
as userAttachment from dc_hr_staff_attachment where version_time > :sql_last_value
5.运行logstash