@zhangyy
2021-03-12T15:39:08.000000Z
字数 7090
阅读 279
Cannel系列
https://github.com/alibaba/canal
canal 译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
数据库镜像
数据库实时备份
索引构建和实时维护(拆分异构索引、倒排索引等)
业务 cache 刷新
带业务逻辑的增量数据处理
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
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 流)
rpm -ivh mysql57-community-release-el7-10.noarch.rpm
yum install mysql-server
service mysqld start
mysql的 密码:
sudo grep 'temporary password' /var/log/mysqld.log
修改MySQL 密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'flyfish123.com';
SHOW VARIABLES LIKE 'validate_password%';
set global validate_password_policy=0;
set global validate_password_length=4;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'flyfish123.com';
exit
再生产上Canal-Admin自己用的MySQL和你要增量采集binlog的MySQL大概率不是同一个,甚至在不
同的机器上。为了简单,我们这里采用同一个MySQL,生产上自己要注意。
1、为Canal-Server采集数据创建用户
set global validate_password_policy=0;
set global validate_password_length=1;
GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%'IDENTIFIED BY 'canal123.com' WITH GRANT OPTION;
flush privileges;
exit
2.为Canal-Admin创建用户
GRANT ALL PRIVILEGES ON *.* TO 'canaladmin'@'%'IDENTIFIED BY 'canaladmin123.com' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit
3. 配置源MySQL的Binlog格式
打开mysql的 bin_log 日志功能
vim /etc/my.cnf
增加:
----
server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
----
log-bin用于指定binlog日志文件名前缀,默认存储在/var/lib/mysql 目录下。
server-id用于标识唯一的数据库,不能和别的服务器重复,建议使用ip的最后一段,默认值也不可以。
binlog-ignore-db:表示同步的时候忽略的数据库。
binlog-do-db:指定需要同步的数据库(如果没有此项,表示同步所有的库)。
配置完保存退出,然后重启MySQL,登录MySQL:
service mysqld restart
mysql -uroot -pflyfish123.com
show master status ;
禁用explicit_defaults_for_timestamp
set SHOW VARIABLES LIKE '%explicit_defaults_for_timestamp%';
SHOW VARIABLES LIKE '%explicit_defaults_for_timestamp%';
service mysqld restart
chkconfig mysqld on
安装MySQL的Java驱动
tar -zxvf mysql-connector-java-5.1.48.tar.gz
cd mysql-connector-java-5.1.48/
mv mysql-connector-java-5.1.48.jar /usr/share/java/
cd /usr/share/java/
chmod 777 mv mysql-connector-java-5.1.48.jar
下载安装包:
https://github.com/alibaba/canal/releases
canal admin:
https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart
---
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.admin-1.1.4.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
mkdir -p /usr/local/canal-admin
tar -zxvf canal.admin-1.1.4.tar.gz -C /usr/local/canal-admin
cd /usr/local/canal-admin
### 配置canal-admin 的 环境变量
vim /etc/profile
----
#canal-admin
export CANAL_ADMIN_HOME=/usr/local/canal-admin
export PATH=${CANAL_ADMIN_HOME}/bin:$PATH
---
source /etc/profile
修改配置
cd /usr/local/canal-admin/conf
vim application.yml
---
server:
port: 8089
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
spring.datasource:
address: node01.flyfish.cn:3306
database: canal_manager
username: canal
password: canal123.com
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
hikari:
maximum-pool-size: 30
minimum-idle: 1
canal:
adminUser: admin
adminPasswd: admin
----
mysql -ucanal -pcanal123.com
create database canal_manager
use canal_manager;
source canal_manager.sql
启动 canal admin
cd /usr/local/canal-admin/
bin/startup.sh
http 登录:
http://192.168.100.11:8089
默认用户名密码:
admin/123456
tar -zxvf zookeeper-3.4.14.tar.gz
mv zookeeper-3.4.14 /usr/local/zookeeper
mkdir -p /usr/local/zookeeper/data
mkdir -p /usr/local/zookeeper/log
cd /usr/local/zookeeper/data/
echo 1 > myid
----
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
----
# 心跳时间
tickTime=2000
# follow连接leader的初始化连接时间,表示tickTime的倍数
initLimit=10
# syncLimit配置表示leader与follower之间发送消息,请求和应答时间长度。如果followe在设置的时间内不能与leader进行通信,那么此follower将被丢弃,tickTime的倍数
syncLimit=5
# 客户端连接端口
clientPort=2181
# 节点数据存储目录,需要提前创建,注意myid添加,用于标识服务器节点
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
server.1=192.168.100.11:2888:3888
server.2=192.168.100.12:2888:3888
server.3=192.168.100.13:2888:3888
---
-----
scp -r zookeeper root@192.168.100.12:/usr/local/
scp -r zookeeper root@192.168.100.13:/usr/local/
修改192.168.100.12 节点 myid
cd /usr/local/zookeeper/data/
echo 2 > myid
修改192.168.100.13 节点 myid
cd /usr/local/zookeeper/data/
echo 3 > myid
启动zookeeper
cd /usr/local/zookeeper/bin/
./zkServer.sh start
1. 单机版部署:
下载:
https://github.com/alibaba/canal/wiki/Canal-Admin-ServerGuide
引入了canal-admin之后,canal-server之前面向命令行的运维方式需要有一些变化,主要的变化在于
配置体系上,每个server节点上不应该再去维护复杂而且冗长的
canal.properties/instance.properties,应该选择以最小化、无状态的方式去启动,因此在canal 1.1.4
上,对于配置做了一些重构来支持canal-admin,同时也兼容了原先的命令行运维模式。
mkdir -p /usr/local/canal-server/
tar -zxvf canal.deployer-1.1.4.tar.gz -C /usr/local/canal-server/
配置环境变量
vim /etc/profile
----
#canal-server
export CANAL_SERVER_HOME=/usr/local/canal-server
export PATH=${CANAL_SERVER_HOME}/bin:$PATH
---
source /etc/profile
-----
cd /usr/local/canal-server/conf
mv canal_local.properties canal_local.properties.bak
mv canal.properties canal.properties.bak
vim canal.properties
----
# register ip
canal.register.ip =
# canal admin config
canal.admin.manager = node01.flyfish.cn:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
-----
启动canal:
cd /usr/local/canal-server/bin
./start.sh
备注 jdk :
需要9.0 以上的jdk 下载
# https://repo.huaweicloud.com/java/jdk/13+33/
useradd elastic && echo elastic |passwd elastic --stdin
------
https://www.elastic.co/guide/en/elastic-stack-get-started/7.4/get-started-elastic-stack.html
tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz
mv elasticsearch-7.4.0 /usr/local/elastic
vim /etc/profile
----
#elasticsearch
export ES_HOME=/usr/local/elastic
export PATH=${ES_HOME}/bin:$PATH
----
vim /etc/sysctl.conf
---
vm.max_map_count=262144
---
sysctl -p
配置es
cd /usr/local/elastic
cd config
vim elasticsearch.yml
------
network.host: 0.0.0.0
discovery.seed_hosts: ["192.168.3.65"]
cluster.initial_master_nodes: ["node-1"]
cluster.name: my-application
node.name: node-1
xpack.license.self_generated.type: basic
-----
cd ../
用elastic 用户启动es
bin/elasticsearch -d
curl http://192.168.3.65:9200
部署kibana
useradd kibana && echo kibana |passwd kibana --stdin
tar -xzvf kibana-7.4.0-linux-x86_64.tar.gz
mv kibana-7.4.0-linux-x64_64 /usr/local/kibana
chown kibana:kibana -R /usr/local/kibana/
----
vim /etc/profile
#kibana
export KIBANA_HOME=/usr/local/kibana
export PATH=${KIBANA_HOME}/bin:$PATH
----
cd /usr/local/kibana/config/
vim kibana.yml
----
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.3.65:9200"]
----
用kibana用户:启动kibana
bin/kibana > kibana.out &
-------------
netstat -nultp |grep 5601
浏览器登录:
http://192.168.3.65:5601
同步流程是MySQL-->Canal-Server(Instance)--->ClientAdapter--->ES,所涉及组件的关系如下
相关组件的作用: