写在前面
mysql数据同步es的实现原理一般有两种:
-
通过sql语句定时查询进行同步。
- elasticsearch-jdbc
- [logstash-jdbc]logstash官方(https://www.elastic.co/blog/l...
-
使用binlog进行同步
- 大神的开源项目go-mysql-elasticsearch
这里主要介绍logstash-jdbc这种方法主要是因为这种方法的是官方项目,更新维护的比较频繁,使用起来也比较放心,当然它也有一定的弊端。废话不多开始正题。
编排docker环境
本文是在docker环境下构建的环境,首先自然需要安装docker,笔者的版本为18.09.2。因为一直开发使用的是laradock的环境,这里依旧是使用这个环境为基础添加的es和logstash。因为mysql没有作任何变动,关于mysql的安装编排自行参考laradock文档。其实包括es和logstash的编排都很简单。
编排Elasticsearch
es的docker文件Dockerfile
FROM elasticsearch:7.3.0
EXPOSE 9200 9300
docker-compose.yml文件
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应该已经启动了。
编排logstash
既然是使用logstash-jdbc插件来实现同步,那我们的重点就是在编排logstash上了。
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了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。