mysql数据同步es的实现原理通常有两种:php
经过sql语句定时查询进行同步。html
使用binlog进行同步java
这里主要介绍logstash-jdbc这种方法主要是由于这种方法的是官方项目,更新维护的比较频繁,使用起来也比较放心,固然它也有必定的弊端。废话很少开始正题。node
本文是在docker环境下构建的环境,首先天然须要安装docker,笔者的版本为18.09.2。由于一直开发使用的是laradock的环境,这里依旧是使用这个环境为基础添加的es和logstash。由于mysql没有做任何变更,关于mysql的安装编排自行参考laradock文档。其实包括es和logstash的编排都很简单。mysql
es的docker文件Dockerfilegit
FROM elasticsearch:7.3.0 EXPOSE 9200 9300
docker-compose.yml文件github
elasticsearch: build: ./elasticsearch volumes: - elasticsearch:/usr/share/elasticsearch/data environment: - cluster.name=laradock-cluster - node.name=laradock-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - cluster.initial_master_nodes=laradock-node ulimits: memlock: soft: -1 hard: -1 ports: - "${ELASTICSEARCH_HOST_HTTP_PORT}:9200" - "${ELASTICSEARCH_HOST_TRANSPORT_PORT}:9300" depends_on: - php-fpm networks: - frontend - backend
docker-compose up -d elasticsearch mysql
启动镜像,能够测试一下发现es和mysql应该已经启动了。sql
既然是使用logstash-jdbc插件来实现同步,那咱们的重点就是在编排logstash上了。docker
logstash-jdbc是经过java链接mysql的,因此咱们首先须要一个jdbc的jar文件,能够从官网下载,获得一个jar文件,将它copy进docker的编排目录里,固然也能够编排时使用docker下载。数据库
笔者的logstash的编排目录
dockerfile文件
FROM logstash:7.3.0 USER root RUN rm -f /usr/share/logstash/pipeline/logstash.conf RUN curl -L -o /usr/share/logstash/lib/mysql-connector-java-5.1.47.jar https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar ADD ./pipeline/ /usr/share/logstash/pipeline/ ADD ./config /usr/share/logstash/config/ ADD mysql-connector-java-8.0.18.jar /usr/share/logstash/logstash-core/lib/jars/mysql/mysql-connector-java-8.0.18.jar RUN logstash-plugin install logstash-input-jdbc
同步任务配置文件mysql/mysql.conf
input { jdbc { # 这里是jdbc链接mysql的语句,第二个mysql是由于这个docker项目内部访问须要网络桥接缘由,你能够自行修改 jdbc_connection_string => "jdbc:mysql://mysql:3306/koudai" jdbc_user => "root" jdbc_password => "root" # 驱动; /usr/share/logstash/config/mysql/ 为logstash插件启动是查找jar文件的默认目录 jdbc_driver_library => "/usr/share/logstash/config/mysql/mysql-connector-java-8.0.18.jar" # 驱动类名 jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "50000" jdbc_default_timezone => "Asia/Shanghai" # sql文件名 statement_filepath => "/usr/share/logstash/config/mysql/task.sql" # 监听间隔[分、时、天、月、年] schedule => "* * * * *" type => "user" # 是否记录上次执行结果, 若是为真,将会把上次执行到的 tracking_column 字段的值记录下来,保存到 last_run_metadata_path 指定的文件中 record_last_run => true # 是否须要记录某个column 的值,若是record_last_run为真,能够自定义咱们须要 track 的 column 名称,此时该参数就要为 true. 不然默认 track 的是 timestamp 的值. use_column_value => true # 若是 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 通常是mysql主键 tracking_column => "lastmodifiedTime" tracking_column_type => "timestamp" last_run_metadata_path => "./last_record/logstash_article_last_time" # 是否清除 last_run_metadata_path 的记录,若是为真那么每次都至关于从头开始查询全部的数据库记录 clean_run => false # 是否将 字段(column) 名称转小写 lowercase_column_names => false } } output { elasticsearch { # 同理是由于这个docker项目内部访问须要网络桥接缘由 hosts => ["http://elasticsearch:9200"] index => "user" document_id => "%{uid}" } }
同步mysql
select * from kdgx_partner_charge_user
更多使用能够参考这里
自此mysql中的新增数据就能够同步到es了。