以下关于Canal的介绍来自Github官方介绍。
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费。
- canal模拟MySQL slave的交互协议,将自己伪装为MySQL slave,向MySQL master发送dump协议。
- MySQL master收到dump请求,开始推送binary log给slave(即canal )。
- canal解析binary log对象(原始为byte流)。
因此可以使用Canal来提供MySQL数据库增量数据的订阅和消费,当MySQL数据库中的数据发生变化时,Canal可以高效地将这些数据同步到下游服务,比如更新Redis中的数据、提供数据给ElasticSearch以及更新索引异构表等。
架构
说明:
- server代表一个canal运行实例,对应于一个jvm。
- instance对应于一个数据队列 (1个server对应1-n个instance)。
instance模块:
- eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)。
- eventSink (Parser和Store的链接器,进行数据过滤、加工以及分发的工作)。
- eventStore (数据存储)。
- metaManager (增量订阅和消费信息管理器)。
本篇博客将介绍如何部署Canal以及Canal Admin,而它们的依赖环境必须要提取准备好。
- 安装Mysql:需要先安装Mysql,博主这里安装Mysql 8(Mysql 8 - CentOS yum & Docker安装Mysql 8),使用CentOS yum方式安装即可,其他 *** 作系统的安装步骤可自行百度。
设置开机自启动并且立即启动Mysql:systemctl enable mysqld & systemctl start mysqld,查询Mysql状态:systemctl status mysqld,状态为active (running)即可。
- 配置JDK环境(JDK8下载地址),下载好压缩包后,使用Xftp将该压缩包上传到虚拟机中。
解压文件(tar -zxvf jdk-8u202-linux-x64.tar.gz)以及修改/etc/profile配置文件(vim /etc/profile,没有vim可以执行yum install -y vim进行安装)。这些常用工具的配置还是要自己去理解以及多练习,敲熟了,比搜索加Copy快多了(export JAVA_HOME=/usr/local/jdk1.8.0_202、export CLASSPATH=.:$JAVA_HOME/lib、export PATH=$JAVA_HOME/bin:$PATH)。
使对/etc/profile配置文件的修改生效(source /etc/profile)。
进入Mysql创建Canal和Canal Admin需要使用的用户,并且授予该用户权限。
create user kaven identified by 'kaven';
- Mysql 8 - CentOS yum & Docker安装Mysql 8,这篇博客有介绍如何进入Mysql 8(需要获取初始密码进入)、修改root用户的密码以及修改合法密码的校验规则,不然给用户设置这种弱密码(kaven)Mysql 8会报错。
授予用户权限(为了方便,博主这里直接授予用户所有权限,可以根据目前的业务需求来设置):
grant all privileges on *.* to 'kaven'@'%'; flush privileges;
还需要配置Mysql,要先开启binlog写入功能,配置binlog-format为ROW模式,my.cnf需要增加的配置如下所示:
[mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
重启Mysql:
systemctl restart mysqld部署Canal
- 下载地址
博主这里选择1.1.5版本(Canal Admin要求Canal版本>=1.1.4,需要依赖canal-server提供面向admin的动态运维管理接口),下载下图所示的两个压缩包。
下载好后再将它们上传到虚拟机中。Canal对应于canal.deployer项目,Canal Admin对应于canal.admin项目。先解压canal.deployer压缩包,再修改配置,如果Canal和Canal Admin不在同一台主机上部署(博主这里是部署在同一台主机上),需要修改Canal的配置(conf/canal_local.properties)。
[root@localhost local]# mkdir ./canal-server [root@localhost local]# tar -zxvf canal.deployer-1.1.5.tar.gz -C ./canal-server [root@localhost local]# cd canal-server/ [root@localhost canal-server]# vim conf/canal_local.properties
配置修改如下图所示:
等启动Canal Admin之后再启动Canal。
Canal Admin设计上是为Canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI *** 作界面,方便更多用户快速和安全的 *** 作。
解压文件和修改配置:
[root@localhost canal-server]# cd /usr/local/ [root@localhost local]# mkdir ./canal-admin [root@localhost local]# tar -zxvf canal.admin-1.1.5.tar.gz -C ./canal-admin/ [root@localhost local]# cd canal-admin/ [root@localhost canal-admin]# vim conf/application.yml
修改数据库相关配置,需要适配Mysql 8。
Mysql 8的驱动类名是com.mysql.cj.jdbc.Driver,并且Mysql 8需要配置serverTimezone(以下serverTimezone配置都可以)。
serverTimezone=GMT%2B8 serverTimezone=GMT serverTimezone=Asia/Shanghai
还要将Canal Admin项目中的sql文件导入Mysql中(会生成用于管理Canal的相关表)。
[root@localhost canal-admin]# mysql -uroot -p Enter password: mysql> source conf/canal_manager.sql Query OK, 1 row affected, 2 warnings (0.06 sec) Database changed ... Query OK, 0 rows affected (0.00 sec) mysql> exit Bye
还需要更换Mysql连接jar包,可以在本地maven仓库里面找,博主选择平时用的最新的8.0.22版本。
使用下面这条命令来查看Mysql版本:
select version();
博主这里的Mysql版本是8.0.27。
默认的Mysql连接jar包是5.1.48版本,连接Mysql 8会出问题。
[root@localhost canal-admin]# cd lib [root@localhost lib]# ll
删除该jar包。
[root@localhost lib]# rm -f mysql-connector-java-5.1.48.jar
使用Xftp上传Mysql 8的连接jar包到Canal Admin项目的lib路径下。
[root@localhost lib]# find ./ -name mysql* ./mysql-connector-java-8.0.22.jar
启动Canal Admin。
[root@localhost lib]# cd .. [root@localhost canal-admin]# sh bin/startup.sh
查看日志,发现日志文件不存在,说明启动失败了。
[root@localhost canal-admin]# tail logs/admin.log tail: 无法打开"logs/admin.log" 读取数据: 没有那个文件或目录
在bin目录下可以找到类似hs_err_pid20182.log的日志文件。
[root@localhost canal-admin]# cd bin [root@localhost bin]# ll 总用量 40 -rw-r--r--. 1 root root 6 12月 13 23:45 admin.pid -rw-r--r--. 1 root root 18584 12月 13 23:45 hs_err_pid20182.log -rwxr-xr-x. 1 root root 205 4月 19 2021 restart.sh -rwxr-xr-x. 1 root root 747 4月 19 2021 startup.bat -rwxr-xr-x. 1 root root 2047 4月 19 2021 startup.sh -rwxr-xr-x. 1 root root 1362 4月 19 2021 stop.sh
由下图可知,Canal Admin启动失败是由于分配2G内存不成功导致的(因为虚拟机本身内存就只分配了2G)。
因此需要修改项目的JVM堆内存配置,这个配置在启动脚本中设置。
[root@localhost bin]# vim startup.sh
初始堆内存和最大堆内存都设置成1G。
再启动Canal Admin。
[root@localhost bin]# ./startup.sh
再查看日志,如下图所示,说明启动成功了。
启动成功后,再关闭防火墙,让本地可以访问Canal Admin。
[root@localhost bin]# systemctl stop firewalld
本地访问192.168.1.199:8089。
现在可以启动Canal了。
[root@localhost bin]# cd /usr/local/canal-server [root@localhost canal-server]# sh bin/startup.sh local
查看日志,检查Canal是否启动成功。
[root@localhost canal-server]# vim logs/canal/canal.log
如下图所示,说明启动成功了。
刚刚启动的server(Canal)已经在Canal Admin上显示出来了,并且状态是启动。
可以对server进行 *** 作。
比如查看server的日志。
新建instance。
如下图所示进行 *** 作即可。
example instance也是启动状态。
可以查看example instance的日志。
再新建一个other instance,配置和example instance一样,other Instance的状态也是启动。
也可以查看other instance的日志。
实现逻辑就是在Canal项目的日志路径和配置路径下创建了对应instance的相关文件。
[root@localhost canal-server]# ll logs 总用量 0 drwxr-xr-x. 2 root root 47 12月 14 15:27 canal drwxr-xr-x. 2 root root 25 12月 14 15:20 example drwxr-xr-x. 2 root root 23 12月 14 15:34 other [root@localhost canal-server]# ll conf 总用量 16 -rwxrwxrwx. 1 root root 319 4月 19 2021 canal_local.properties -rwxrwxrwx. 1 root root 6277 4月 19 2021 canal.properties drwxrwxrwx. 2 root root 65 12月 14 15:17 example -rwxrwxrwx. 1 root root 3437 4月 19 2021 logback.xml drwxrwxrwx. 2 root root 39 12月 13 23:02 metrics drwxr-xr-x. 2 root root 38 12月 14 15:36 other drwxrwxrwx. 3 root root 149 12月 13 23:02 spring [root@localhost canal-server]# ll conf/other/ 总用量 156 -rw-r--r--. 1 root root 155648 12月 14 15:36 h2.mv.db -rw-r--r--. 1 root root 40 12月 14 15:36 meta.dat
example instance的相关文件在Canal项目中默认存在,而配置信息以在Canal Admin中的配置为准(其他instance也一样),比如修改example instance的数据库用户配置。
example instance的日志中就会出现数据库拒绝访问的错误日志。
因此instance的配置以Canal Admin中的配置为准。
搭建ZooKeeper可以参考下面这几篇博客:
- ZooKeeper :Shell脚本搭建单机版ZooKeeper
- ZooKeeper :搭建ZooKeeper集群
- ZooKeeper :Nginx基于TCP协议代理ZooKeeper集群
启动ZooKeeper并且关闭防火墙。
[root@localhost ~]# cd /usr/local/apache-zookeeper-3.6.3-bin/ [root@localhost apache-zookeeper-3.6.3-bin]# sh bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@localhost apache-zookeeper-3.6.3-bin]# sh bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Client port found: 9000. Client address: localhost. Client SSL: false. Mode: standalone [root@localhost apache-zookeeper-3.6.3-bin]# systemctl stop firewalld
在Canal Admin上添加集群,集群名称为zookeeper。
修改zookeeper集群的主配置。
主要是添加ZooKeeper服务地址。
在zookeeper集群下创建server(博主把之前创建的instance和server都删除了,因为server不能修改所属集群配置,只能删除再重新创建)。
创建kaven server成功,状态为启动。
在zookeeper集群下创建instance。
由下图所示,itkaven instance由zookeeper集群下的kaven server运行,状态也是启动。
查看itkaven instance的日志,很显然启动成功了。
因为zookeeper集群下只有一个server,即kaven server,因此itkaven instance肯定是在kaven server上运行的。查看Canal项目(zookeeper集群下唯一的server)的日志文件和配置文件即可发现itkaven instance的相关文件:
[root@localhost canal-server]# ll logs 总用量 0 drwxr-xr-x. 2 root root 47 12月 14 15:27 canal drwxr-xr-x. 2 root root 25 12月 14 15:20 example drwxr-xr-x. 2 root root 25 12月 14 16:26 itkaven drwxr-xr-x. 2 root root 23 12月 14 15:34 other [root@localhost canal-server]# ll conf 总用量 16 -rwxrwxrwx. 1 root root 319 4月 19 2021 canal_local.properties -rwxrwxrwx. 1 root root 6277 4月 19 2021 canal.properties drwxrwxrwx. 2 root root 65 12月 14 16:05 example drwxr-xr-x. 2 root root 38 12月 14 16:27 itkaven -rwxrwxrwx. 1 root root 3437 4月 19 2021 logback.xml drwxrwxrwx. 2 root root 39 12月 13 23:02 metrics drwxr-xr-x. 2 root root 38 12月 14 15:36 other drwxrwxrwx. 3 root root 149 12月 13 23:02 spring
ZooKeeper中也会保存一些数据(比如集群下的所有server和instance信息,以及instance在哪个server上运行)。
[root@localhost apache-zookeeper-3.6.3-bin]# sh bin/zkCli.sh -timeout 5000 -server 127.0.0.1:9000 [zk: 127.0.0.1:9000(CONNECTED) 0] ls -R /otter /otter /otter/canal /otter/canal/cluster /otter/canal/destinations /otter/canal/cluster/192.168.1.199:11111 /otter/canal/destinations/itkaven /otter/canal/destinations/itkaven/cluster /otter/canal/destinations/itkaven/running /otter/canal/destinations/itkaven/cluster/192.168.1.199:11111 [zk: 127.0.0.1:9000(CONNECTED) 1] get /otter/canal/destinations/itkaven/running {"active":true,"address":"192.168.1.199:11111"}HA机制设计
canal的HA分为两部分,canal server和canal client分别有对应的HA实现:
- canal server: 为了减少对mysql dump的请求,不同server上的instance要求同一时间只能有一个处于running,其他的处于standby状态。
- canal client: 为了保证有序性,一个instance同一时间只能由一个canal client进行get/ack/rollback *** 作,否则客户端接收无法保证有序。
整个HA机制的控制主要是依赖了ZooKeeper的几个特性,watcher和EPHEMERAL节点(和session生命周期绑定)。
- ZooKeeper :重要概念 & 客户端命令介绍
大致步骤:
- canal server要启动某个canal instance时,都先向ZooKeeper进行一次尝试启动判断 (创建EPHEMERAL节点,谁创建成功就允许谁启动)。
- 创建ZooKeeper节点成功后,该canal server就启动对应的canal instance,没有创建成功的canal instance就会处于standby状态。
- 一旦ZooKeeper发现canal server 创建的节点消失后,立即通知其他的canal server再次进行步骤1的 *** 作,重新选出一个canal server启动canal instance。
- canal client每次进行connect时,会首先向ZooKeeper询问当前是谁启动了canal instance,然后和其建立连接,一旦连接不可用,会重新尝试connect。
canal client的方式和canal server的方式类似,也是利用ZooKeeper抢占EPHEMERAL节点的方式进行控制。
部署Canal、Canal Admin以及使用ZooKeeper进行集群管理就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)