目录
- 背景
- 环境
- 本地安装
- 一、安装mysql
- 二、安装canal server
- 三、安装canal admin和zookeeper
- 1. 安装canal admin(UI)
- 2.安装zookeeper
- 3. 配置canal admin 页面
背景
研发伙伴的需求,需要监控mysql增量数据,想通过canal-client发送到java flink上。
-
canal是什么
canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 -
canal 工作原理
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议 MySQL master 收到 dump 请求,开始推送 binary log 给slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流)
参考文档:https://github.com/alibaba/canal/
环境
均为Centos7.2,配置:内存4G,磁盘40G,2CPU。
服务名 | IP/域名 | 端口(均默认) |
---|---|---|
mysql | 10.10.11.141 | 3306 |
canal admin | 172.16.16.108 | 8090 |
zookeeper | 172.16.16.108 | 2181 |
canal01 | 172.16.16.108 | 11110 |
canal02 | 10.10.11.142 | 11110 |
NOTE:
- IP地址是自己瞎写的,为了方便看。
- 个人觉得zookeeper和canal admin都是可选的,不影响canal server的运行,只是配置了canal admin可以从网页上登录,zookeeper有canal server HA 状态日志,看起来方便。
- 在这里是把canal admin、canal、zookeeper安装在一台机器上了,其实这几个服务可以分别安装在任何联网机器上的哈。
本地安装
一、安装mysql
参考文档:安装mysql
对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下
(阿里云RDS默认都配置好了,可以直接跳过这一步)
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
NOTE:这里可能会报错提示密码强度太低,可以降低mysql密码强度(全局的,不建议)或者改为复杂密码。
二、安装canal server
- 访问 release 页面,下载canal server
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
- 解压
mkdir /opt/canal.deployer
tar zxvf canal.deployer-1.1.4.tar.gz -C /opt/canal.deployer
cd /opt/canal.deployer;ll
- 修改配置文件
这里的canal.properties可以理解为canal server配置,example即instance配置,可以理解为配置多个(无关联的)mysql
cp -ra conf/example/ conf/iris-mysql-141
vi conf/iris-mysql-141/instance.properties
修改如下:
## mysql serverId
canal.instance.mysql.slaveId = 1234
#position info,需要改成自己的数据库信息
canal.instance.master.address = xxxx.com:3306
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = <远程登录mysql的账号>
canal.instance.dbPassword = <密码>
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
#table regex
canal.instance.filter.regex = .\*\\\\..\*
canal.instance.filter.black.regex=mysql..*
canal.instance.mysql.slaveId,如果想配置canal server HA(即主从两台,高可用模式)取值要不同
canal.instance.connectionCharset 代表数据库的编码方式对应到 java 中的编码类型,比如 UTF-8,GBK , ISO-8859-1
- 启动
cd bin
./startup.sh
启动成功后会自动生成“canal.pid”文件,记录canal server进程日志
- 验证
1)查看配置
cd conf/iris-mysql-141/;ll
自动生成了“h2.mv.db”
2)查看日志
cd logs #canal里会记录canal server 启动是否成功,iris-mysql-141记录我配置的instance日志
tail -f iris-mysql-141/iris-mysql-141.log
- 关闭
sh bin/stop.sh
踩坑记录:
当同样安装第二个canal server时,发现启动后没有生成“h2.mv.db”和日志文件,找了好半天,最后看日志发现它不认识主机名,即需要在/etc/hosts中配置本机IP和主机名
vi /etc/hosts
172.16.16.108 GEOTSTCANAL01
三、安装canal admin和zookeeper
1. 安装canal admin(UI)
参考官方文档即可:https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
2.安装zookeeper
目前单机模式,后面会做集群
- Install java
yum -y install java
- Download zookeeper
这里有个坑,官网给了两个,其中“apache-zookeeper-3.5.8.tar.gz ”是源码,我们要下载“apache-zookeeper-3.5.8-bin.tar.gz”这个
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.8/
tar zxvf apache-zookeeper-3.5.8-bin.tar.gz -C /opt/
mv zookeeper-3.5.8 zookeeper
ln -s /opt/zookeeper /usr/local/zookeeper
- 创建数据目录
mkdir -p /opt/zookeeper/data
- 修改配置文件
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181
- 添加环境变量,vi /etc/profile
## zookeeper env
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
使环境变量生效
source /etc/profile
- 启动zookeeper
zkServer.sh start
jps ## 查看进程
zkServer.sh status ## 查看状态
zkServer.sh stop
- 设置开机启动,vi /etc/rc.d/rc.local
su - root -c zkServer.sh start
3. 配置canal admin 页面
登录:http://ip:8089/
默认账号/密码:admin/123456
PS:如果登录失败,有可能是canal admin中“”中配置的登录mysql的账号权限不够
吐槽一下:这个页面上的配置很鸡肋,有些必须填写,但又不生效(即使页面改了,也不会同步到服务器上)。
- 新建一个集群
ZK地址:即zookeeper地址
- 新建server
端口默认:11110
- 新建instance
️这里instance名字要和canal server上的一致才行
成功界面
测试:如果停掉当前server,instance会先停止几秒,再跑到另外机器上。