博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】本文记录一下使用 elasticsearch 官方插件 logstash 实现将 mysql 数据同步到 es 中的具体步骤。
首先说明一下使用 logstash 进行数据同步的优缺点:
优点:
(1)无需开发,只需要安装和配置 logstash 即可;
(2)只要是通过 SQL 查询的数据 logstash 均可以实现数据同步;
(3)每次同步的时候,支持全量同步,也支持按照特定字段(例如递增ID,修改时间)实现增量同步;
(4)自动同步的频率可控,最快同步频率每分钟一次;
(5)作为 ES 官网的固有插件,版本更新迭代快,相对稳定,使用简单。
缺点:
(1)不能实现同步删除操作,即 MySQL 数据物理删除后,ES 中数据仍存在。
本文以 Elasticsearch 6.5.1 版本为例,记录一下使用 MySQL 数据同步的实例。
官方文档:
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html操作系统:windows 10
elasticsearch 版本:elasticsearch-6.5.1
logstash 版本:logstash-6.5.1(必须与 es 版本一致)
java 版本:Logstash requires Java 8 or Java 11(安装后添加 JAVA_HOME 环境变量)
logstash 连接 mysql 的 jar 包:mysql-connector-java-5.1.7-bin.jar
软件下载地址:
elasticsearch:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
logstash:https://www.elastic.co/cn/downloads/past-releases#logstash
java:https://www.java.com/zh_CN/download/win10.jsp
mysql-connector-java 驱动包:http://www.java2s.com/Code/Jar/c/Downloadcloudmysqlconnectorjava517binjar.htm
CREATE TABLE `class` (
`class_id` int(11) NOT NULL AUTO_INCREMENT,
`class_name` varchar(32) NOT NULL COMMENT '用户名称',
PRIMARY KEY (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
INSERT INTO `class` VALUES ('1', '数据结构与算法');
INSERT INTO `class` VALUES ('2', 'Java');
INSERT INTO `class` VALUES ('3', 'elasticsearch');
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`class_id` char(1) DEFAULT NULL COMMENT '性别',
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', '2', '王五', '2018-08-28', '上海');
INSERT INTO `student` VALUES ('10', '1', '张三', '2014-07-10', '北京市');
INSERT INTO `student` VALUES ('16', '1', '张小明', '2018-08-16', '河南郑州');
INSERT INTO `student` VALUES ('22', '1', '陈小明', '2018-08-17', '河南郑州');
INSERT INTO `student` VALUES ('24', '1', '张三丰', '2018-08-26', '河南郑州');
INSERT INTO `student` VALUES ('25', '1', '陈小明', '2018-08-14', '河南郑州');
INSERT INTO `student` VALUES ('26', '1', '王五', '2018-08-28', '北京');
INSERT INTO `student` VALUES ('30', '1', '马小跳', '2018-08-28', '西安');
INSERT INTO `student` VALUES ('33', '1', '马富天', '2020-02-11', '福建龙岩');
这里只需要配置 logstash 即可
(1)解压后,进入 bin 目录,并在其中新建目录 bin,将 mysql-connector-java-5.1.7-bin.jar 放进去;
(2)在 logstash-6.5.1/bin 目录下,创建配置文件 logstash.conf 和 sql 执行文件:jdbc.sql
jdbc.sql 文件中写入需要同步的 sql 语句:
select id,username,class_name,birthday,address from student left join class using(class_id)
logstash.conf 文件内容:
input {
stdin {
}
jdbc {
# mysql 相关的 jdbc 配置,jy 是连接数据库名称
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/jy?useUnicode=true&characterEncoding=utf-8&useSSL=false"
jdbc_user => "root"
jdbc_password => "root"
# mysql 连接包位置,注意路劲中不能包含中文
# 可以是绝对路径,也可以是相对路径
jdbc_driver_library => "bin/mysql-connector-java-5.1.7-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_default_timezone =>"Asia/Shanghai"
# 执行的 sql 文件
statement_filepath => "jdbc.sql"
# mysql文件, 也可以直接写SQL语句在此处,如下:
# statement => "select * from student;"
# 设置监听间隔,各字段含义(由左至右)分、时、天、月、年,
# 全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 是否将字段名称转小写
lowercase_column_names => false
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["localhost:9200"]
# 索引名称 可自定义
index => "test"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{id}"
document_type => "test"
}
# 这里输出调试,正式运行时可以注释掉
stdout {
# JSON格式输出
codec => json_lines
}
}
(3)执行 logstash,在命令行中进入 bin ,执行命令:logstash -f logstash.conf
执行成功如下图所示:
执行后,每一分钟同步一次。
(4)执行命令可能会有错误提示:Unrecognized VM option 'UseParNewGC'
解决措施:注释掉 logstash-6.5.1/config/jvm.options 配置文件中:
# -XX:+UseParNewGC
以上就是完整的针对 logstash 同步 mysql 数据到 es 中的流程,最核心的部分就是 logstash.conf 配置文件的设置,上述例子中只是对单条 sql 进行同步,同时也就是只能同步单张表,下篇文章对多张表的同步进行相关简介。
另外是时区问题,会发现写入的时区不一样,这个问题之后再讨论。
最后小提示:logstash 的配置文件编码必须是 UTF-8 格式,不然会报错。
版权归 马富天个人博客 所有
本文标题:《使用 Logstash 将 MySQL 数据同步到 Elasticsearch(版本6.5.1)》
本文链接地址:http://www.mafutian.com/438.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |