canal实现两个windows服务器之间的mysql实时同步(主从复制)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>canal是什么?<ul class="second_class_ul"><li>MySQL主备复制原理</li><li>canal 工作原理</li></ul></li><li>开启mysql的binlog<ul class="second_class_ul"><li>检查binlog功能是否有开启</li><li>binlog格式</li><li>如何开启binlog功能</li><li>重启mysql</li><li>查看二进制文件</li><li>在mysql里面添加以下的相关用户和权限</li></ul></li><li>下载安装Canal服务<ul class="second_class_ul"></ul></li><li>canal.deployer<ul class="second_class_ul"></ul></li><li>canal.adapter<ul class="second_class_ul"></ul></li><li>启动canal server和canal adapter<ul class="second_class_ul"></ul></li><li>总结<ul class="second_class_ul"></ul></li></ul></div><p class="maodian"></p><h2>canal是什么?</h2><p>canal是阿里基于java写的一个组件,他的作用是canal.deployer读取mysql数据的binlog日志,然后canal.adapter将其转换为对应的数据(数据的变化或者变化后的数据,跟配置有关),并且同步到相关中间件。本文实现两个windows服务器使用canal实现mysql主从复制实时同步。</p>
<p class="maodian"></p><h3>MySQL主备复制原理</h3>
<p>MySQL master将数据变更写入二进制日志(binarylog,其中记录叫做二进制日志事件binary log events,可以通过show binlog events进行查看)<br />MySQL slave 将master的 binary log events拷贝到它的中继日志(relay log)<br />MySQL slave 重放relay log中事件,将数据变更反映它自己的数据</p>
<p class="maodian"></p><h3>canal 工作原理</h3>
<p>canal 模拟 MySQL slave的交互协议,伪装自己为MySQL slave,向MySQL master发送dump协议<br />MySQL master 收到dump请求,开始推送binary log给slave (即canal )<br />canal 解析 binary log 对象(原始为 byte 流)</p>
<p class="maodian"></p><h2>开启mysql的binlog</h2>
<p>canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能。</p>
<p class="maodian"></p><h3>检查binlog功能是否有开启</h3>
<div class="jb51code"><pre>-- OFF 表示功能未开启
show variables like 'log_bin';</pre></div>
<p class="maodian"></p><h3>binlog格式</h3>
<p>binlog记录格式有两种,statement/row,其中statment记录SQL格式,row格式记录每行的变更内容,控制格式的参数有三种,statement/mix/row,其中mix表示两者的混合</p>
<div class="jb51code"><pre>show variables like '%binlog_format%';</pre></div>
<p class="maodian"></p><h3>如何开启binlog功能</h3>
<p>配置my.ini,在 下添加:</p>
<div class="jb51code"><pre>log-bin=mysql-bin
binlog_format=ROW
server-id=1</pre></div>
<p>注意:mysql实例id,不能和canal的slaveId重复</p>
<p>binlog命令行参数详解:</p>
<ul><li>log-bin [=file_name] 此参数表示启用binlog日志功能,并可以定制文件名称,默认为mysql-bin。存放目录是mysql安装目录的data文件夹下。</li><li>binlog_format 此参数配置binlog的日志格式,默认为mixed。</li><li>max_binlog_size此参数配置binlog的日志最大值,最大和默认值是1GB。</li><li>max_binlog_cache_size此参数表示binlog使用最大内存的数。</li><li>binlog-do-db=db_name 此参数表示只记录指定数据库的二进制日志。</li><li>binlog-ignore-db=db_name此参数表示不记录指定的数据库的二进制日志。</li><li>expire_logs_days 此参数表示binlog日志保留的时间,默认单位是天。</li></ul>
<p class="maodian"></p><h3>重启mysql</h3>
<div class="jb51code"><pre>-- 关闭服务
net stop mysql
-- 开启服务
net start mysql </pre></div>
<p>重启后在D:\softinstall\mysql\mysql-5.7.38-winx64\data\目录下会产生mysql-bin.000001 和 mysql-bin.index 两个文件。</p>
<p class="maodian"></p><h3>查看二进制文件</h3>
<p>在dos命令行中,进入到mysql的安装目录下,即D:\softinstall\mysql\mysql-5.7.38-winx64,再进到bin/目录下,执行mysqlbinlog命令查看日志:</p>
<div class="jb51code"><pre>mysqlbinlog ../data/mysql-bin.000001</pre></div>
<p>为了方便查看日志内容 可以导出到.sql文件</p>
<div class="jb51code"><pre>mysqlbinlog ../data/mysql-bin.000001 ->a.sql</pre></div>
<p>可以通过show master status来查看当前写入的binlog的位点,其中:</p>
<ul><li>File表示下一个binlog的bytes内容即将写入的文件名</li><li>position表示下一个binlog的bytes内容写入到file中的位点的起点(byte字节数)</li><li>Binlog_Do_DB表示需要记录binlog的库名列表,也就是白名单</li><li>Binlog_Ignore_DB表示需要忽略的binlog的库名列表,也就是黑名单</li><li>Executed_Gtid_Set表示本库中已经执行完的全局事务的id集合</li></ul>
<p>可以通过show binary logs来查看binlog列表,表示本地保存的binlog及其大小(byte字节数)</p>
<p class="maodian"></p><h3>在mysql里面添加以下的相关用户和权限</h3>
<div class="jb51code"><pre>CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';
-- 注意权限问题,否则在后续的一些操作中会提示没有权限
GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;</pre></div>
<p class="maodian"></p><h2>下载安装Canal服务</h2>
<blockquote><p>推荐canal1.1.5,只需要使用jdk1.8。canal1.1.6,该版本需要使用jdk11+</p></blockquote>
<p>1)canal角色</p>
<ul><li>canal-admin:canal控制台,可以统一管理canal服务</li><li>canal-deployer:也是canal-server:canal的一个节点服务</li><li>canal-instance:canal-server中的一个处理实例,可以处理不同的业务逻辑</li><li>canal-adaper:canal适配器,canal 1.1.1之后,提供了适配器功能,可将canal server的数据直接输出到目的地,不需要用户编写客户端(个性化需求还需要用户编写客户端实现)</li></ul>
<p>2)下载地址</p>
<p>https://github.com/alibaba/canal/releases</p>
<p style="text-align:center"><img alt="" height="326" src="https://zhuji.jb51.net/uploads/allimg/20250311/1-2503111A553341.png" width="1126" /></p>
<p> 从canal官网下载canal.deployer和canal.deployer,在两台服务器上准备两个MySQL数据库,其中一个作为源库,另一个为目标库,我准备的MySQL源库服务器IP为:172.17.0.2,MySQL服务端口为3306,目标库的服务器IP为172.17.0.4,MySQL服务端口为3307。</p>
<p class="maodian"></p><h2>canal.deployer</h2>
<p>修改conf/example/instance.properties文件,如下部分:</p>
<p style="text-align:center"><img alt="" height="253" src="https://zhuji.jb51.net/uploads/allimg/20250311/1-2503111A554Y8.png" width="667" /></p>
<p>即将canal.instance.master.address参数值改为172.17.0.2:3306</p>
<p class="maodian"></p><h2>canal.adapter</h2>
<p>修改conf/application.yml文件,如下部分:</p>
<p style="text-align:center"><img alt="" height="281" src="https://zhuji.jb51.net/uploads/allimg/20250311/1-2503111A5541J.png" width="709" /></p>
<p>即注释掉srcDataSources部分,修改driverClassName为com.mysql.cj.jdbc.Driver,然后修改对应url,用户名和密码。</p>
<p>修改conf/rdb/mytest_user.yml文件,如下部分:</p>
<p style="text-align:center"><img alt="" height="560" src="https://zhuji.jb51.net/uploads/allimg/20250311/1-2503111A554331.png" width="640" /></p>
<p class="maodian"></p><h2>启动canal server和canal adapter</h2>
<p>启动canal server,如下:bin/startup.bat</p>
<p>启动canal adapter,如下:bin/startup.bat</p>
<p>在172.17.0.2的数据库上执行插入语句,在172.17.0.4进行查询数据是否成功同步。</p>
<p class="maodian"></p><h2>总结</h2>
<p>到此这篇关于两个windows服务器使用canal实现mysql实时同步的文章就介绍到这了,更多相关canal实现mysql主从复制内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁:
[1]