一、LightDB介绍
LightDB是恒生电子股份有限公司研发并将长期支持的一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品,具备SQL兼容性高、容量弹性伸缩、金融级高可用、现代硬件融合、纯内存计算等核心特性,主要适用于对可用性、一致性要求较高的系统。
LightDB是一款基于PostgreSQL的关系型数据库,99%兼容PostgreSQL,主要针对金融业务场景优化。LightDB采用完全拥抱开源的模式,在开源PostgreSQL基础上进行增强如:支持开源PostgreSQL不支持的分区定义语法、运行时被剪除的分区不显示、实现了pg_stat_monitor&pg_profile等监控没有包含的等待事件(这是DBA优化数据库最重要的分析信息)、类似Oracle的自动参数优化、默认主机免密登录&远程md5认证等等。针对Linux平台优化(不支持也无计划支持Windows),并持续以patch模式回馈社区,采用和Percona Server、EnterpriseDB一样的运作模式。
不同于国内要么仅提供github开源、要么必须先走销售后提供使用包的模式,LightDB选择不开源,但是无功能、容量限制180天下载试用的机制,所以开发人员无需担心被双标。
二、Debezium介绍
Debezium是用于捕获变更数据的开源工具,可以响应数据库的所有插入,更新和删除操作。
它是一种CDC(Change Data Capture)工具,工作原理与大家熟知的Canal,Maxwell一样,均是通过抽取数据库日志来获取变更的。
Debezium构建在Apache Kafka之上,并提供Kafka连接器来监视特定的数据库管理系统。
在今天(2022-12-22),Debezium最新文档版本是2.0:debezium官方站点
2.1 特点
- 使用简单,快速上手
- 快速稳定,构建于Kafka之上,可扩展,经官方验证可处理大容量的数据
- 能监控多种数据库,MySQL,Oracle,MongoDB,PostgreSQL等
2.2 架构
2.2.1 Kafka连接器架构
在大多数情况下,会采用如下架构,即Kafka连接器的架构:
Kafka连接器包含2种:
- Source connector:负责把数据库中的记录发送到Kafka(Debezium)
- Sink connector:负责把kafka topic中的数据推送到其他系统,如ES等
2.2.2 Debezium服务架构
Debezium服务器是一个可配置的、随时可用的应用程序,它将变化数据从源数据库流式传输到其他系统。
2.2.3 嵌入式架构
Debezium作为嵌入式引擎,内置到其他应用中,然后就可以实时读取数据库的变化数据了。目前比较火的Flink CDC,就是内置了Debezium。
三、准备工作
首先准备MySQL,Zookeeper和Kafka的环境。
3.1 MySQL
安装过程略(推荐使用see 默认的数据库)
MySQL需要开启binlog
sudo vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=row
-- 改完配置文件以后,需要重启mysql
sudo systemctl restart mysqld
-- 然后通过查看变量,查看更改是否生效
show variables like '%log_bin%'
显示如下,说明MySQL准备就绪:
3.2 Zookeeper
下载地址: zookeeper-3.8.0
3.3 Kafka
下载地址: kafka_2.12-3.3.1
3.4 Debezium
下载地址: debezium-connector-mysql-1.9.7
四、修改配置文件
4.1 Zookeeper
-- 解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
-- 新建目录文件,存放zk数据文件,示例如下
mkdir zk-data
-- 复制配置文件
cd conf/
cp zoo_sample.cfg zoo.cfg
-- 编辑配置文件,指定zk数据目录,使用上面创建的目录“zk-data”
vim zoo.cfg
-- 这里是举例,请根据实际修改
dataDir=/data/lightdb/zm/apache-zookeeper-3.8.0-bin/zk-data
4.2 Kafka
-- 解压kafka
tar -zxvf kafka_2.12-3.3.1.tgz
-- 解压debezium插件
unzip debezium-debezium-connector-mysql-1.9.7.zip
-- 新建目录文件,用于存放kafka数据文件,示例如下
mkdir kafka-data
-- 再新建目录文件,用于存放kafka插件目录,示例如下
mkdir kafka-plugin
-- 然后把解压后的debezium文件夹,移动到新建的目录“kafka-plugin”中
mv debezium-debezium-connector-mysql-1.9.7 kafka-plugin/
-- 上面的操作完成之后,目录结构应该是这样
--kafka_2.12-3.3.1
--config
--bin
--kafka-data
--kafka-plugin
--debezium-debezium-connector-mysql-1.9.7
-- 编辑kafka启动文件,指定kafka数据目录,使用上面创建的目录“kafka-data”
vim server.properties
-- 这里是举例,请根据实际修改
log.dirs=/data/lightdb/zm/kafka_2.12-3.3.1/kafka-data
-- 这里是举例,请根据实际修改成kafka部署所在IP和端口
listeners=PLAINTEXT://你的IP:9092
-- 编辑kafka连接器配置文件
vim connect-distributed.properties
-- 这里是举例,请根据实际修改成kafka部署所在IP和端口
bootstrap.servers=你的IP:9092
listeners=HTTP://你的IP:8083
-- 配置插件路径
plugin.path=/data/lightdb/zm/kafka_2.12-3.3.1/kafka-plugin
五、启动插件
5.1 Zookeeper
cd apache-zookeeper-3.8.0-bin/bin
./zkServer.sh start
5.2 Kafka
cd kafka_2.12-3.3.1/bin
./kafka-server-start.sh -daemon ../config/server.properties
5.3 Kafka连接器
cd kafka_2.12-3.3.1/bin
./connect-distributed.sh -daemon ../config/connect-distributed.properties
上面的步骤都执行好了之后,会存在3个进程,分别是ZK,Kafka和connectDistributed
六、Debezium请求配置
注意,下面http请求中的IP都是Kafka连接器所在的机子IP,也可以理解成Kafka所在机子的IP。
6.1 查看状态
可以直接在浏览器直接输入如下地址,查看debezium状态
http://IP:8083/
-- 正常则会返回如下类似信息
{"version":"3.3.1","commit":"e23c59d00e687ff5","kafka_cluster_id":"DL28VFkTSw-_RgbMtutGXA"}
-- 也可以采用curl的方式查看
-- curl -H "Accept:application/json" IP:8083/
6.2 查看配置了哪些连接器
可以直接在浏览器直接输入如下地址,查看配置了哪些连接器
http://IP:8083/connectors
-- 没有配置则会返回空
-- 也可以采用curl的方式查看
curl -H "Accept:application/json" IP:8083/connectors/
6.3 注册MySQL连接器
可以使用postman,方便一些,带上下面的json参数来注册MySQL的连接器,需要设置请求头
POST请求
Accept=application/json
Content-Type=application/json
-- 消息体如下
{
"name": "mariadb-connector",//名字可以自定义
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"database.hostname": "改成你的Mariadb数据库IP,示例10.20.30.40",
"database.port": "3306",//改成实际数据库端口
"database.user": "root",//改成实际数据库用户
"database.password": "xx",//改成实际数据库密码
"database.server.id": "184077",//数字可以自定义
"database.server.name": "acm",//改成实际数据库服务名
"database.include.list": "acm",//改成实际数据库服务名
"database.history.kafka.bootstrap.servers": "改成你的kafka信息,示例10.20.30.40:9092",
"database.history.kafka.topic": "schema-changes.acm",//后面的.acm改成实际数据库服务名
"include.schema.changes": "true",
"decimal.handling.mode": "string",
"include.schema.comments": "false"
}
}
-- 如果没有postman,则可以使用curl来发送post请求,示例如下:
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" 你的IP:8083/connectors/ -d '{
"name": "mariadb-connector",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"database.hostname": "127.0.0.1",
"database.port": "3306",
"database.user": "root",
"database.password": "xxx",
"database.server.id": "184077",
"database.server.name": "acm",
"database.include.list": "acm",
"database.history.kafka.bootstrap.servers": "127.0.0.1:9092",
"database.history.kafka.topic": "schema-changes.acm",
"include.schema.changes": "true",
"decimal.handling.mode": "string",
"include.schema.comments": "false"
}
}'
6.4 连接器状态检查
比如上面注册的连接器名字为mariadb-connector,直接在浏览器输入地址,就可以查看连接器信息
http://IP:8083/connectors/mariadb-connector/status
-- 如果要在服务器上操作
curl -i IP:8083/connectors/mariadb-connector/status
6.5 查看连接器配置
还是以上面注册的mariadb-connector举例,在浏览器输入如下地址,查看注册的配置信息
http://IP:8083/connectors/mariadb-connector/config
-- 如果要在服务器上操作
curl -i IP:8083/connectors/mariadb-connector/config
6.6 删除连接器
可以使用postman发起delete请求,后面跟上注册器的名字,如下图所示
-- 如果要在服务器上操作
curl -v -X DELETE IP:8083/connectors/mariadb-connector
七、启动数据同步服务
注意:需要JDK11下运行
启动示例如下:
nohup java -jar demo.jar --server.port=8888 --zk=127.0.0.1:2181 --kafka=127.0.0.1:9092 --db=database --lh=127.0.0.1:5432/lt_test --lu=lightdb --lp=lightdb123 --bl=table1 > log.file 2>&1 &
命令解释如下:
命令 | 解释 | 默认值 |
---|---|---|
–server.port | 同步服务端口,比如8080 | 8080 |
–zk | zookeeper连接信息,IP和端口,比如127.0.0.1:2181 | |
–kafka | kafka连接信息,IP和端口,比如127.0.0.1:9092 | |
–db | 同步的数据库,默认是see的数据库 | |
–lh | LightDB数据库信息,比如127.0.0.1:5432/lt_test | |
–lu | LightDB用户 | |
–lp | LightDB密码 | |
–bl | 黑名单,多个以英文逗号分隔,比如table1,table2 |