首先我们要安装docker, 接着我们要对docker 镜像进行加速处理(可百度查询安装操作)
备注:建议这里es,kibana,logstash版本号最好保持一致
docker搭建elasticsearch
- 拉取镜像:
docker pull elasticsearch:版本号
- 启动:
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch 镜像名
或者:(我是采用这个)
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 镜像id
- 浏览器访问http://localhost:9200 查看是否成功
docker搭建kibana
- 构建镜像
docker pull kibana:版本号
- 启动:
docker run --name kibana -e ELASTICSEARCH_URL=http://127.0.0.1:9200 -p 5601:5601 -d 镜像名
或者:
docker run --name kibana -e ELASTICSEARCH_URL=http://127.0.0.1:9200 -p 5601:5601 -d 镜像id
- 浏览器访问http://localhost:5601/查看是否成功
docker搭建logstash:
- 构建镜像
docker pull logstash:版本号
- 启动:
docker run -itd 镜像id /bin/bash
问题:
kibana 报错 server is not ready yet
解决方案-配置操作:
- 查看es容器内部ip地址:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器id
获取ip地址为:
172.17.0.2
- 进入kibana容器中
docker exec -it 容器id /bin/bash
find / -name kibana.yml
将kibana.yml中的http://后面的地址替换为刚才获取es的内部ip地址(ip:172.17.0.2),然后保存退出,重启kibana容器,问题解决。
mysql数据导入es:
进入logstash容器中:
docker exec -it 容器id /bin/bash
mysql数据导入es:
新建mysql.conf,地址在/usr/share/logstash/mysql/ 下(mysql是我新建的文件夹)
input {
jdbc {
jdbc_driver_library => "/usr/share/logstash/mysql/mysql-connector-java-8.0.28.jar"
# 数据库连接驱动,新版的有cj
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://ip:3306/库名?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"
jdbc_user => "数据库用户名"
jdbc_password => "数据库密码"
schedule => "*/5 * * * * *"
# 时区设置为上海
jdbc_default_timezone => "Asia/Shanghai"
jdbc_page_size => "50000"
record_last_run => "true"
jdbc_paging_enabled => true
# 增量更新索引的标识字段
tracking_column => "ctime"
use_column_value => "true"
last_run_metadata_path => "/usr/share/logstash/bin/last_id"
lowercase_column_names => "false"
tracking_column_type => "numeric"
# 为true表示重启logstash重新读取数据库所有内容,false会从上次读取的内容开始往后读取
clean_run => "true"
# 数据库文档的查询sql
statement => "SELECT id AS docId, `index`, fromAccount, `to`, msgTimestamp, msgidClient, body, eventType, fromClientType, msgidServer, msgType, ext, attach, `status`, ctime, date FROM m_im_log WHERE ctime > :sql_last_value AND ctime < NOW() ORDER BY ctime desc"
}
}
filter {
date {
match => ["message","UNIX_MS"]
target => "@timestamp"
}
#因为时区问题需要修正时间
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
mutate {
remove_field => ["timestamp"]
}
#因为时区问题需要修正时间
ruby {
code => "event.set('ctime', event.get('ctime').time.localtime + 8*60*60)"
}
}
output {
elasticsearch {
# 索引名称
index => "m_im_log"
# es文档的id为数据库表的id
document_id => "%{docId}"
hosts => ["http://172.17.0.2:9200"]
}
}
同时在容器内:
find / -name logstash.yml
将logstash.yml中的ip地址修改为:172.17.0.2(es容器内部获取的ip地址)
避免出现问题:logstash将mysql数据导入es的时候,连接不上es服务器。
问题完美解决,有问题可私信。