本文介绍使用confluent kafka,实现将mysql的数据同步到elasticsearch。
一、官网
https://www.confluent.io
本文,下载的非最新版本,原因本版本有bin\confluent启动脚本,可以将confluent的相关服务一并启动,而新版5.3.1下则没有bin\confluent启动脚本。
http://packages.confluent.io/archive/5.0/confluent-5.0.0-2.11.tar.gz
历史版本清单:
https://www.confluent.io/previous-versions/?_ga=2.88895196.698576389.1571619762-1253541240.1571104105
二、相关使用
本文使用案例,均为单机版本(standalone)。
1、安装
解压即可,本文安装在/data/app/confluent目录下。
配置环境
export PATH=/data/app/confluent/bin:$PATH
2、启动confluent
confluent start
启动结果:
This CLI is intended for development only, not for production
https://docs.confluent.io/current/cli/index.html
Using CONFLUENT_CURRENT: /tmp/confluent.lIw8SGxT
Starting zookeeper
zookeeper is [UP]
Starting kafka
kafka is [UP]
Starting schema-registry
schema-registry is [UP]
Starting kafka-rest
kafka-rest is [UP]
Starting connect
connect is [UP]
Starting ksql-server
ksql-server is [UP]
Starting control-center
control-center is [UP]
启动后服务端口
#find ./ -name "*.*" | xargs grep "8081"
zookeeper 2181
kafka 9092
control-center 9021
schema registry 8081
kafka-reset 8082
connector 8083
ksql-server 8088
查看confluent服务端口启动情况
netstat -tunlp | grep -E '2181|9092|9021|8081|8082|8083|8088'
3、启动es connector sink
配置 etc/kafka-connect-elasticsearch/quickstart-elasticsearch.properties
name=elasticsearch-sink
connector.class=io.confluent.connect.elasticsearch.ElasticsearchSinkConnector
tasks.max=1
topics=kafka_es_test
key.ignore=false
connection.url=http://localhost:9200
type.name=kafka-connect
transforms=InsertKey,ExtractId
transforms.InsertKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.InsertKey.fields=id
transforms.ExtractId.type=org.apache.kafka.connect.transforms.ExtractField$Key
transforms.ExtractId.field=id
检查elasticsearch-sink是否启动
#查看已启动connector列表
./bin/confluent list connectors
#卸装
./bin/confluent unload elasticsearch-sink
#加载
./bin/confluent load elasticsearch-sink
#加载非预定的connector
./bin/confluent load jdbc-member -d /data/app/confluent/etc/kafka-connect-jdbc/source-mysql-member.properties
./bin/confluent load es-ssouser-sink -d /data/app/confluent/etc/kafka-connect-elasticsearch/es-ssouser.properties
通过producer 推送数据
值得注意的事,执行完下来命令后,并不会退出或进入命令行界面。需要通过回传一行一行提交数据,通过ctrl+c退出。注意topic名称需要与quickstart-elasticsearch.properties配置文件中的topic保持一致。
./bin/kafka-avro-console-producer --broker-list localhost:9092 --topic kafka_es_test --property value.schema='{"type":"record","name":"person","fields":[{"name":"nickname","type":"string"}]}'
如果成功,能够在elasticsearch索引中查询到对应的数据。
4、启动connect-jdbc
启动 connect-jdbc,将数据库中表数据同步到kafka。
1)、首先装mysql-connector-jdbc.jar,从mysql官网下载,然后复制到%CONFLUENT_HOME%/share/java/kafka-connect-jdbc目录下。
cp mysql-connector-java-8.0.15.jar /data/app/confluent/share/java/kafka-connect-jdbc
2)、修改connect-jdbc配置
name=test-source-sqlite-jdbc-autoincrement
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=1
#数据库地址
connection.url=jdbc:mysql://127.0.0.1:3306/kafka_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false
#用户名
connection.user=
#密码
connection.password=
#白名单,目前设置白名单的表复制成功
table.whitelist=kafka_test.member
#模式自增
mode=incrementing
#自增字段名称
incrementing.column.name=id
#topic名称前缀,真实topic名称为前缀-表名
topic.prefix=test-mysql-
#数据库方言
dialect.name=MySqlDatabaseDialect
#设置是否检测数据库中自增长和时间戳字段不允许为空值,如果检查失败connector就停止启动。
validate.non.null=false
insert.mode=upsert
pk.mode = record_value
pk.fields = id
delete.enabled=true
3)、重新加载
#卸装
./bin/confluent unload jdbc-source
#加载
./bin/confluent load jdbc-source
4)、同步索引到elasticsearch
要将已经推送到kafka的mysql数据索引到elasticsearch,需要修改elasticsearch-sink的配置文件。
#1、配置文件topics项目加入test-mysql-member
topics=kafka_es_test,test-mysql-member
#2、卸装elasticsearch-sink
./bin/confluent unload elasticsearch-sink
/3、加载elasticsearch-sink
./bin/confluent load elasticsearch-sink
完成上述3项后,数据会索引到elasticsearch,索引名为test-mysql-member
5、遗留问题
1、mysql表decimal字段问题
同步到elasticsearch中,及时设定为text字段,但存储的值是乱码:
#es结果
"redpack_money": "Fw==",
2、date日期字段同步
#mysql,字段类型为date
2019-11-23
#es
"expire_date": 18223,
6、问题集锦
a、Server is not running
错误信息
ksql-server, Kafka Server or Schema Registry Server is not running. Check your deployment
通过以下命令查看日志
confluent log kafka | ksql-server |kafka-rest
有时候服务不能启动,是因为服务端口被占用