一、docker搭建Elasticsearch
-
拉取es镜像:
docker pull elasticsearch:7.6.1
-
查看镜像:
docker images
-
运行es容器 ,然后查看容器是否启动
docker run -d --name elasticsearch -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.6.1
OK,我们发现现在es启动成功了,现在我们测试一下
-
首先我们打开谷歌浏览器,访问:
http://ip:9200
证明es启动成功。 -
下载es head插件,用于可视化数据管理
输入ip端口信息,查看健康状态,如下图:
二、搭建logstash
首先我们需要说明一下,logstash的作用是什么?第一,我们要知道es的数据是从哪里来的,当然是从数据库来的,这说明他的数据要与db保持一致性,这时候就需要一个工具帮助我们同步数据信息,此时我们就需要安装logstash,同步方式有两种,第一种,设置时间,比如一秒同步一次(全量);另一种方式就是监听mysql的binlog日志,当发现有改动的时候就发起数据更新的请求,更新es中的数据信息。本文从简单的方式来讲解。
-
通过Dockerfile构建镜像,我这里的路径是
/usr/local/docker/es
(用户可自定义),首先创建Dockerfile文件:vim DockerFile
FROM logstash #安装input插件, 此处有坑,需要配置国内ruby源,否则下载基本失败:https://blog.csdn.net/weixin_40397083/article/details/80605182 # RUN logstash-plugin install logstash-input-jdbc #安装output插件 # RUN logstash-plugin install logstash-output-elasticsearch #容器启动时执行的命令.(CMD 能够被 docker run 后面跟的命令行参数替换) CMD ["-f", "/usr/local/docker/es/jdbc.conf"]
-
创建
jdbc.conf
文件
此时需要我们自己导入mysql的驱动jar包input{ stdin{ } jdbc { jdbc_connection_string => "jdbc:mysql://localhost:3306/driven-design?useSSL=false&serverTimezone=GMT" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_user => "root" jdbc_password => "123456" jdbc_paging_enabled => "true" jdbc_page_size => "50000" # mysql驱动所在位置 jdbc_driver_library => "/usr/local/docker/es/mysql-connector-java-8.0.15.jar" #sql执行语句 statement => "SELECT top.id, top.title, top.content, top.type,top.uid, top.browse_num,top.care_num, top.comment_num, top.support_num, top.gmt_create, top.gmt_modify,top.`status`,USER.user_name AS author_name,USER.nick AS author_nick,USER.picture AS author_avatar,USER.remark AS remark FROM topic AS top LEFT JOIN sys_user AS USER ON USER.id = top.uid" # 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新 schedule => "* * * * *" # 是否将 sql 中 column 名称转小写 lowercase_column_names => false } } output { elasticsearch { hosts => ["101.23.142.22:9200"] index => "topic" # 文档_id,%{goods_id}意思是取查询出来的goods_id的值,并将其映射到shop的_id字段中 # 文档_id,%{goodsId}如果是别名,意思是取查询出来的goodsId的值,并将其映射到shop的_id字段中 document_id => "%{id}" } stdout { codec => json_lines } }
-
构建镜像 (最后的点不可省略,他代表当前路径下,当然也可以使用绝对路径)
docker build -t logstash .
-
运行容器
docker run -d --name logstash -v /usr/local/docker/es:/usr/lcoal/docker/es logstash
-
数据同步结果: