系列

概述

这篇文章的目的是为了讲清楚canal的HA机制,至于什么是HA机制直接套用canal官网原话,因为我自认为没法描述的更好。而我直接从代码的角度去分析如何实现HA的,其实也就是zookeeper的分布式锁的使用方法。

摘录自官网的一段原话:

canal的HA分为两部分,canal server和canal client分别有对应的ha实现:

canal server: 为了减少对mysql dump的请求,不同server上的instance要求同一时间只能有一个处于running,其他的处于standby状态。

canal client: 为了保证有序性,一份instance同一时间只能由一个canal client进行get/ack/rollback操作,否则客户端接收无法保证有序。

canal HA 架构图

0f580647905c

canal-ha说明图

说明

图片来自官网的剪切,讲述的很清楚,就不再多说什么了,后面会基于这个图从代码角度展开讲解。

canal server HA

canal server的HA是其实我觉得从我自己的理解应该分为两个角度去讲解,一个是在启动的时候抢占并负责启动提供服务,另外一个是在发生fail-over后抢占并负责启动提供服务。

能把这两个过程讲解清楚我觉得就够了,就能理解server的HA机制了,也基本了解了如何通过zookeeper去实现互斥锁。

最后我们需要问自己的一个问题,就是发生HA切换的时候状态数据同步在两个切换的server之间进行同步呢,很简单,因为我们的数据都是记录在zookeeper上的。

server 启动HA

server在启动过程中,通过以下几步来实现抢占服务启动,入口类在CanalController。

1、对临时节点(/otter/canal/destinations/xxxx/running)进行监听。

2、通过创建临时节点来抢占锁,成功就提供服务。

3、抢占锁成功后启动embededCanalServer开始提供服务。

4、创建的临时节点内部将自己的ip+port暴露出去给client使用。

0f580647905c

start-ha-1

说明

启动服务的入口函数,别看是runningMonitor,其实是内部负责启动canal instance实例的。

0f580647905c

start-ha-2

说明

这里最重要的一个点就是对canal的临时节点监控用于在fail-over的时候能够感知到并及时启动stand-by的canal server提供服务。

0f580647905c

start-ha-3

说明

负责创建临时节点来确认自己是否能够提供服务,这其实通过zookeeper的特性来实现的。

0f580647905c

start-ha-4

说明

真正启动canal instance的过程,负责同步mysql的数据到canal instance。

server fail-over ha

server 在fail-over过程能够及时发现并完成切换的原因是通过zookeeper的watch机制来实现,如果watch的节点消失了那么其他监听的canal server都能感知到并发起新一轮的抢占并提供服务。

需要区分两个zookeeper事件,分别是节点内容变更事件、节点删除事件,下面有具体说明。

关键字:zookeeper的watch机制,通知,重新抢占。

0f580647905c

fail-over-1

说明

这里区分了两种情况,节点内容变更事件、节点本身消失事件。对于这两种情况区分简单区分一下进行说明。我估计很多人跟我的疑惑一样,为啥要区分这两个事件呢,其实我的猜测是如果节点删除了说明这个服务停止了跟mysql的同步也就结束了,但是如果节点内容变更了,可能因为其他一些原因,譬如我们手动修改zk节点内容之类的,这个时候我们需要处理连接释放的过程。

节点本身消失处理是handleDataDeleted函数内部的操作,可以看出来其实就做一件事情,重新开始新一轮的抢占,initRunning就是我们刚刚讲的抢占逻辑,可以翻看start-ha-3这个图片。唯一的区别是节点消失事件前提供服务的如果是自身就具有优先抢占的权利,否则就随机进行个delay操作避免同时大面积并发抢占。

我们重点关注下节点内容变更的事件吧,之所以需要额外关注这个事件是因为中间涉及到如果是如果变更前是自身就需要释放连接资源。

资源释放过程

0f580647905c

canal server release - 1

说明

在收到节点内容变更事件后就开始进入资源释放过程

0f580647905c

canal server release - 2

说明

停止canal的embededCanalserver的服务,结束从mysql的数据同步。

canal client HA

整体来说,canal client的HA和canal server的HA机制是一模一样的,它的实现逻辑其实在创建cluster client的时候用的封装zookeeper的客户端,然后zookeeper的客户端去检测canal server节点内容的变化并重新初始化连接而已。

0f580647905c

client cluster -1

说明

这个地方很明显看出来,我们首先连接的zookeeper,原因应该很清楚,因为我们需要从zookeeper获取提供服务的canal server的地址,在/otter/canal/destinations/destination/running节点去获取。

0f580647905c

client cluster-2

0f580647905c

client cluster-3

说明

这部分其实就是client和zookeeper交互的部分,负责实时感知节点变化并重新初始化连接,保证client端的HA。

canal与mysql高可用_canal 高可用介绍(4)相关推荐

  1. canal+zookeeper+mysql高可用配置

    一.部署环境 1.基础环境: 软件 版本 作用 Linux Centos7.1,8g Jdk 1.8.0_151 canal 1.1.1 canal server端,与mysql和zookeeper交 ...

  2. MySQL高可靠_MySQL高可用与高可靠架构

    前言 数据库高可用是生产环境使用数据库必要条件,MySQL数据库通常使用复制技术实现.然MySQL复制本身存在很多的"坑"容易被忽视,导致一些开发或运维人员对于MySQL复制的可靠 ...

  3. keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践

    MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段.本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求.各高可用技术特点对比.实施.测试等过程进行整理,完善Mysql ...

  4. GaussDB(for MySQL)如何在存储架构设计上做到高可靠、高可用

    摘要: GaussDB(for MySQL)通过ND算子下推解决存储节点和计算节点之间的传输速度,减少网络开销这个难题. 数据库作为高效稳定处理海量数据交易/分析的坚强数据底座,底层架构设计的重要性不 ...

  5. mysql应用层透明扩展_MySQL高扩展和高可用

    # MySQL高扩展和高可用 * [真题](https://www.kancloud.cn/ranjun940726/php_interview/596349#_2) * [分区表的原理](https ...

  6. 基于heartbeat v1配置mysql和httpd的高可用双主模型

    一.配置高可用集群的前提:(以两节点的heartbeat为例) ⑴时间必须保持同步 ⑵节点之间必须用名称互相通信 建议使用/etc/hosts,而不要用DNS 集群中使用的主机名为`uname -n` ...

  7. mysql 升级高可用_MySQL高可用方案升级规划

    这是学习笔记的第2035篇文章 这两天在梳理MySQL高可用方案的升级计划,发现要做的事情还真不少. 我们目前有新系统和老系统,老系统因为历史原因使用的是MySQL 5.5版本,新系统有了整体的规划, ...

  8. 《MySQL性能优化和高可用架构实践》阅读总结

    文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...

  9. mysql性能调优 高可用_MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案...

    第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库 ...

  10. mysql高可用cmha_mysql高可用方案

    A.普通的主从复制――――客户端通过master对数据库进行读/写操作,Slave端作为备机,可用来进行一些查询,备份等操作. 优点:部署简单,易于扩展,能提供一定的数据保护. 缺点:如果master ...

最新文章

  1. 三维地形可视化开源项目TerraVision
  2. sql2012包含数据库,快速生成用户tsql脚本
  3. 程序实现php文件上传,PHP实例:实现文件上传的程序源码_php
  4. A1032. 画三角形2
  5. 这操作厉害:怎么样发布你的 Python模块给别人 “pip install”
  6. yii2.0下,JqPaginator与load实现无刷新翻页
  7. Spark学习之Spark Streaming(9)
  8. docker load tar.gz包失败解决方法
  9. 自费访学|计算机专业老师赴加拿大卡尔加里大学
  10. Excel-查找与引用函数
  11. java 带t日期格式转换_自我整理:java 日期转换
  12. ElasticSearch cardinality基数 算法优化内存开销及HLL算法
  13. 【龙印】把龙芯1c的pwm用作定时器并产生中断
  14. 解决QQ识图后复制文字然后将其粘贴到文件重命名中,总是显示重命名不成功
  15. python测试框架untest_python自动化测试框架unittest
  16. Kyligence + 亚马逊云科技丨实现云上的精细化运营和数字化指挥
  17. spotlight on oracle
  18. 禁用 MyBatis 一级缓存
  19. Ubuntu18.04+Docker+Hadoop+Spark分布式集群搭建
  20. 什么是换热器,换热器的种类有哪些QY-RG33

热门文章

  1. LIO-SAM探秘之文章索引
  2. 如何使用文件的fseek函数对文件指针进行操作
  3. 综述|重邮高新波等最新《少样本目标检测算法》
  4. Dropout和BN层的模式切换
  5. TCP连接的建立和断开
  6. 作业 3 应用分支与循环结构解决问题
  7. 三种找回丢失iPhone的方法,来自苹果手机找回网
  8. android 图片设置圆角
  9. 智能优化算法(源码)-生物地理学算法(Biogeography-Based Optimization,BBO)
  10. 【Prison Break】第八天(4.4)