前言
随着软件技术不断的进步,和用户需求的不断增长,优化性能俨然已经是软件开发的重中之重了。对于并发量和数据量的增加,首先想到的处理方式是分库分表,分库分表解决的高并发和大数据量的问题,同时,数据量增大,遇见分页查询历史数据的情况下,查询又成了新的问题。此时,就需要一些大数据的方式来处理,其中一个方式就是使用elsticsearch处理。本篇文章,介绍的是canal检测mysql数据库变化后发送kafka消息的环境搭建过程,并不讲elasticsearch相关内容,以后专门写篇博客讲解elasticsearch及java相关代码。
一、相关配置及版本
Mysql版本:8.0.22
zookeeper版本:latest
canal版本:1.1.5
kafka版本:2.6.0
注:MySQL和canal是本地安装,其余软件都安装在docker中,自行安装,docker配置教程,zookeeper使用命令未查到版本故,用latest版本,查询docker对应image版本命令:docker image inspect zookeeper:latest|grep -i version(查询其他的替换zookeeper即可)
二、原理
canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
基于MySQL主从复制:
- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 - MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
三、安装过程
1.mysql
1)安装MySQL
安装命令:
brew install mysql
启动命令:
brew services start mysql
关闭命令:
brew services stop mysql
2)MySQL配置
//首次登陆mysql使用无密码命令
//出现输入命令行时,点确定便可进入
mysql -u root -p
//切换至mysql数据库
use mysql
//查询MySQL账号及加密方式sql,如果和修改加密方式后的图中的root账号相同则不用修改
select Host,User,authentication_string ,plugin from user;
默认加密方式
//修改root账号的host为%
update user set Host='%' where user='root';
//修改root的密码,加密方式命令
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword';
//如果不想使用root账号可使用以下命令,增账号
CREATE USER canal IDENTIFIED BY 'YourPassword';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword';
//密码自行设置 替换 YourPassword
设置账号密码加密方式为下面mysql_native_password,canal模拟登陆使用的此加密方式。修改为此方式后
修改后图片
最后检查,binlog状态与下图一致即可,MySQL8.0.22默认是一致的,5.7之前需要命令开启;
//检查命令
SHOW VARIABLES LIKE’%bin%’;
开启log_bin命令,附带连接自行查看,mysql开启binlog日志方法
2.zookeeper
brew 命令添加
//查看命令
$ brew info zookeeper
//安装命令
$ brew install zookeeper;
//启动命令
$ zkServer
$ zkServer status
$ zkServer start
docker安装方式
//安装
$ docker pull zookeeper
//首次启动命令,之后可在docker可视化工具中操作
$ docker run --name zookeeper --restart always -d zookeeper
3、canal
网站下载:阿里巴巴 MySQL binlog 增量订阅&消费组件
配置文件修改
1、conf目录下canal.properties文件修改
//修改为 kafka
# tcp, kafka, rocketMQ, rabbitMQ
canal.serverMode = kafka
#下面这一行,如果为放开等注释掉
#canal.instance.parser.parallelThreadSize = 16
kafka设置为默认等9092,如果Kafka端口修改,同步修改即可
2、conf/example目录下instance.properties文件修改
#username/password 设置数据库连接账号和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=123456
canal.instance. Defaultdatabasename=test
/*
* 全匹配: .*\\..*
* 匹配test数据库下的表:test\\..*
* 匹配test数据库下以test开头的表:test.test_.*
* 匹配test数据库下test表:test.test
*/
//下一行为匹配检测的数据库和表
canal.instance.filter.regex=.*\\..*
// 下一行为给kafka发送消息的topic
canal.mq.topic=test
//启动命令
//进入bin目录下
$ ./startup.sh
//关闭命令
$ ./stop.sh
//启动成功之后可通过下面命令,回canal根目录查看日志看是否启动成功
tail -f logs/example/example.log
3、kafka
//安装命令
docker pull wurstmeister/kafka
//首次启动命令
//创建
$ docker run --name kafka -d wurstmeister/kafka
//查看
topic /opt/kafka/bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181
//创建生产者
/opt/kafka/bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test
//创建消费者
/opt/kafka/bin/kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --topic test --from-beginning
下面为数据库修改的,kafka接收消息实例
{
"data": [
{
"Host": "4",
"Db": "5",
"User": "6",
"Table_name": "4",
"Column_name": "7",
"Timestamp": "2020-12-15 17:45:26",
"Column_priv": "1"
}
],
"database": "esport",
"es": 1608025526000,
"id": 10,
"isDdl": false,
"mysqlType": {
"Host": "char(255)",
"Db": "char(64)",
"User": "char(32)",
"Table_name": "char(64)",
"Column_name": "char(64)",
"Timestamp": "timestamp",
"Column_priv": "set('Select','Insert','Update','References')"
},
"old": [
{
"Column_name": "6",
"Timestamp": "2020-12-15 17:29:12"
}
],
"pkNames": [
"Host",
"Db",
"User",
"Table_name",
"Column_name"
],
"sql": "",
"sqlType": {
"Host": 1,
"Db": 1,
"User": 1,
"Table_name": 1,
"Column_name": 1,
"Timestamp": 93,
"Column_priv": -7
},
"table": "columns_priv",
"ts": 1608025526832,
"type": "UPDATE"
}
结束,希望对大家有些许帮助,引用链接如有侵权,请及时告知本人删除,本博客只供学习交流使用