MacOS基于canal和kafka的mysql近实时同步,环境部署

前言

随着软件技术不断的进步,和用户需求的不断增长,优化性能俨然已经是软件开发的重中之重了。对于并发量和数据量的增加,首先想到的处理方式是分库分表,分库分表解决的高并发和大数据量的问题,同时,数据量增大,遇见分页查询历史数据的情况下,查询又成了新的问题。此时,就需要一些大数据的方式来处理,其中一个方式就是使用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"
}

结束,希望对大家有些许帮助,引用链接如有侵权,请及时告知本人删除,本博客只供学习交流使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值