mysql进阶:canal搭建主从|集群架构

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 之前我们讲解过canal的各种应用,但是对于生产环境来讲,服务高可用是必须保证的。因此canal单节点是不能满足我们的需求的。就需要搭建canal集群。

0.引言

之前我们讲解过canal的各种应用,但是对于生产环境来讲,服务高可用是必须保证的。因此canal单节点是不能满足我们的需求的。就需要搭建canal集群。

1. canal集群模式

从架构方式上出发,我们用来保证服务高可用的手段主要是主从架构、集群架构。有时我们也把主从归结到集群架构中,但严格意义上讲,集群架构是指多节点同时运行,而主从架构同一时刻只有一个节点运行,另一个节点作为备用,只有当主节点宕机时,备用节点才会启用。

canal的集群模式是哪一种呢?

我们首先要理解canal实现数据同步的依赖于binlog,也依赖于mysql dump指令,binlog本身的特性就要求数据原子性、隔离性,有序性,同时mysql dump指令是比较占用mysql服务器资源的,所以要尽可能少的避免,为此canal服务端同一时刻只能有一个节点来读取binlog进行同步。

因此在这样的基础之上,canal的集群模式实际上就是主从模式。那么我们要进行搭建的也就是主从。

我们知道canal中有服务端deployer和客户端adapter,服务端负责从mysql中读取binlog,而客户端负责从服务端读取同步过来的binlog数据,处理后将同步数据发送到目标服务端,比如redis、es或其他的关系性数据库等

在这里插入图片描述
这一点,在官方文档中也有解释,特此引用,帮助大家理解

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

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

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

主从节点之间如何协调配合?

确定了集群架构后,迎面而来的就出现了另一个问题:从节点如何知道主节点宕机了,如何知道自己何时开始工作?同时主节点同步数据的进度从节点如何知道,从节点不可能再从头开始同步数据吧?

针对第一个大家可能会想到发送心跳包来实现,第二个那么就需要一个第三方来存储同步的进度,于是乎结合这两点,我们想一想,什么样的第三方组件具备了心跳维护功能(也就是注册服务的功能),还具备了文件存储及同步的功能

这不就是zookeeper的天然属性嘛。所以我们需要zk来作为调节主从节点的第三方组件。相当于是作为注册中心和配置中心的作用

于是架构变成了这样的形式

在这里插入图片描述

2. canal集群搭建

梳理完原理后,我们来看看实际如何搭建

2.1 环境准备

为了保证演示的完整性,除了演示canal集群搭建,我们还会通过集群模式来同步mysql数据到es

所以我们前期需要准备:

  • 一个mysql数据库,并开启binlog,以及创建一个canal账号,给予权限
  • 一个es+kibana的服务
  • 一个zookeeper服务
  • 两个服务器,用于部署canal

关于mysql开启binlog,创建用户并赋权因为之前已经讲过,不再累叙,有需要的参考以下博文:

通过canal1.1.5实现mysql8.0数据增量/全量同步到elasticsearch7.x

2.2 集群搭建

2.2.1 zookeeper搭建

这里为了方便演示,采用docker搭建zk

docker run -d -e TZ="Asia/Shanghai" -p 2181:2181 --name zookeeper zookeeper

2.2.2 服务端deployer搭建

1、查询数据源mysql服务的binlog位置

# 源mysql服务器中登陆mysql执行
show binary logs;

在这里插入图片描述

记住该查询结果,我们后续配置中将使用

2、截止本文canal的最新版为1.1.6,所以文本使用该版本进行演示,canal1.1.6版本需要jdk11+,canal1.1.5及以下使用jdk1.8+即可

canal1.1.6下载地址

在这里插入图片描述

或者直接在服务器上通过wget指令下载

wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz

3、解压安装包

tar -zxvf canal.deployer-1.1.6.tar.gz

4、新建一个实例cluster用于本次演示

cd deployer
cp -R conf/example conf/cluster

5、修改配置文件canal.properties

vim conf/canal.properties

修改内容

# 设置canal服务端IP
canal.ip =192.168.244.25
# zk地址,多个地址用逗号隔开
canal.zkServers =192.168.244.1:2181
# 实例名称
canal.destinations = cluster
# 持久化模式采用zk
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

6、修改配置文件instance.properties

vim conf/cluster/instance.properties

修改内容:

# 每个canal节点的slaveId保持唯一,在1.0.26版本后已经能够自动生成了, 无需设置
# canal.instance.mysql.slaveId=1
# 设置binlog同步开始位置
canal.instance.master.address=192.168.244.17:3306
canal.instance.master.journal.name=mysql-bin.000001
canal.instance.master.position=0
canal.instance.master.timestamp=1665038153854
# 数据源账号密码
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal

mysql数据同步起点说明:

  • canal.instance.master.journal.name + canal.instance.master.position : 精确指定一个binlog位点,进行启动
  • canal.instance.master.timestamp : 指定一个时间戳,canal会自动遍历mysql binlog,找到对应时间戳的binlog位点后,进行启动
  • 不指定任何信息:默认从当前数据库的位点,进行启动。(show master status)

7、参考上述配置调整deployer节点2,注意deployer服务ip调整为当前节点的ip

8、启动两个节点,需要注意的是,启动第二个节点的时候是不会启动成功的,如我们上述所说同时只会有一个canal服务运行,当另一个canal服务宕机时该备用节点会自动启动的

./bin/startup.sh

2.2.3 客户端adapter配置

1、下载adapter安装包,可以如上述一样在github页面上下载,也可以通过指令下载

wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.adapter-1.1.6.tar.gz

2、解压压缩包

tar -zxvf canal.adapter-1.1.6.tar.gz

3、修改配置文件application.yml

vim conf/application.yml

修改内容,所需调整项已用【】标识

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp #tcp kafka rocketMQ rabbitMQ
  flatMessage: true
  # zk地址【1】
  zookeeperHosts: 192.168.244.1:2181
  syncBatchSize: 1000
  # 出现报错时的重试次数
  retries: 0
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    # deployer服务端地【2】
   # canal.tcp.server.host: 127.0.0.1:11111
   # zk地址【3】
    canal.tcp.zookeeper.hosts: 192.168.244.1:2181
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
  srcDataSources:
    # 源数据库地址,可配置多个
    canalDs: # 命名自定义【4】
      url: jdbc:mysql://192.168.244.17:3306/canal_test?useUnicode=true
      username: canal
      password: canal
  canalAdapters:
  - instance: cluster # 服务端配置的实例名称【5】
    groups:
    - groupId: g1
      outerAdapters:
      # 开启日志打印
      - name: logger
      # 配置目标数据源【5】
      - 
        key: es
        # es7 or es6
        name: es7 
        hosts: http://192.168.244.11:9200 # 127.0.0.1:9300 for transport mode
        properties:
          mode: rest # or rest or transport
          # es账号密码
          security.auth: elastic:elastic #  only used for rest mode
          # es集群名称
          cluster.name: blade-cluster

4、创建同步配置文件user.yml

vim conf/es7/user.yml

文件内容

注意事项:这里有一个坑点,就是书写的sql中不要用“``”符号括上你的表名,否则会导致无报错但数据一直无法同步

dataSourceKey: canalDs # 这里的key与上述application.yml中配置的数据源保持一致
outerAdapterKey: es # 与上述application.yml中配置的outerAdapters.key一直
destination: cluster # 默认为example,与application.yml中配置的instance保持一致
groupId:
esMapping:
  _index: user
  _type: _doc
  _id: id
  sql: "SELECT
         id,
         seq_no,
         name,
         age,
         address 
       FROM
        user"
#  etlCondition: "where t.update_time>='{0}'"
  commitBatch: 3000

这里可根据自己的数据库表创建对应的文件,我这里只同步了一张表,es中的索引mappings如下,同步前请提前创建好索引

{
  "user" : {
    "mappings" : {
      "properties" : {
        "address" : {
          "type" : "text",
          "analyzer" : "ik_smart"
        },
        "age" : {
          "type" : "integer"
        },
        "name" : {
          "type" : "keyword"
        },
        "seq_no" : {
          "type" : "keyword"
        }
      }
    }
  }
}

5、另一台adapter节点也同样配置

6、启动adapter

./bin/startup.sh

在这里插入图片描述

2.2.4 测试

1、我们在数据库中添加数据

在这里插入图片描述

2、查看adapter节点日志

tail -f logs/adapter/adapter.log

节点1:

在这里插入图片描述

节点2:

在这里插入图片描述

可以看到数据同步分发到节点1了,同步成功后日志后会有Affected indexes: xxx 的字样

3、我们到kibana中查询数据

GET user/_search

结果显示同步正常
在这里插入图片描述

4、现在我们将正在工作的那台deployer服务关闭,模拟宕机

如果不知道哪台deployer正在工作,查看日志即可,不断有日志输出的就是正在工作的

cd ../deployer
./bin/stop.sh

5、查看备用deployer节点日志

cat logs/cluster/cluster.log

在这里插入图片描述

6、再新增一条数据,看看是否能正常同步

在这里插入图片描述

7、kibana中查看数据,数据同步成功,说明deployer节点自动切换成功

在这里插入图片描述

8、下面我们接着模拟一下adapter节点宕机:我们将其中一个adapter节点关闭

9、新增一条数据

10、查看kibana,数据正常同步

在这里插入图片描述

总结

deployer节点同时只会运行一个,而adapter节点是采用服务分发的机制,多节点同时服务,由zk分发请求到具体的adapter节点上执行数据同步任务

下期,我们接着讲讲如何结合canal-admin来管理集群节点

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
174 0
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
5月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
5月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
6月前
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
424 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
|
6月前
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
141 0
|
9月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
10月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
229 3
|
5月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
311 12

热门文章

最新文章

推荐镜像

更多