zoukankan      html  css  js  c++  java
  • Canal基本原理

    Canal基本原理

    Canal是什么?

    canal是模拟mysql的slave节点,向master节点发送dump请求,获取binlog数据。解析binlog数据实现自己的业务操作

    canal能干什么?

    canal最开始设计出来是用来解决跨机房数据同步问题。我们可以用它来做缓存刷新,数据同步等等。

    canal工作原理

    • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议

    • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

    • canal 解析 binary log 对象(原始为 byte 流)

    canal中比较重要的几个模块

    parse

    该模块主要是向master节点发送dump请求,然后获取binlog数据,将数据交给sink模块处理

    sink

    该模块主要是接收parse模块下传的数据,将数据进行一些过滤,然后将数据交给store模块处理

    store

    该模块将sink模块下传的数据进行存储,并记录get以及ack位置,供client端使用。

    meta

    该模块记录一些client端的消费信息,第一当client提交ack或者rollback时,可以根据这些信息做相应的处理。第二当服务端重启或者切换实例时,可以根据这些信息确定哪些数据client端还没消费,以便重新从master拉取数据。

    client

    提供一个客户端连接工具,比如单机(SimpleCanalConnector)或集群模式(ClusterCanalConnector)。也提供集成了一些mq组件的CanalConnector,如:KafkaCanalConnector,RabbitMQCanalConnector,RocketMQCanalConnector

    admin

    canal运维平台,可以查看/修改canal的一些运行时信息

    server

    canal的server端,主要是注册一些server信息以及接收client的请求然后处理

    protocol

    定义了一些数据传输对象

    canal server获取binlog重要流程

    server监听client消息处理流程

    节点含义

    • /otter/canal/destinations/{destination}/cluster

      子节点表示canal server的集群(临时节点)

    • /otter/canal/destinations/{destination}/running

      节点数据表示表示当前激活的 canal server实例(临时节点)

    • /otter/canal/destinations/{destination}/1001/running

      节点数据表示表示当前激活的 canal client实例(临时节点)

    client激活原理(ClientRunningMonitor)

    当客户端连接时,创建/otter/canal/destinations/{destination}/1001/running节点,如果节点已存在,不做任何操作。如果不存在,则创建该节点,并且监听该节点。如果监听到删除事件,则抢占该节点。server与client类似。

    server运行实例切换,client响应

    client会监听/otter/canal/destinations/{destination}/running/otter/canal/destinations/{destination}/cluster节点,当节点的数据发生变更的时候,client会更新本地的runningAddress,当runningAddress`不存在时,则会取集群中的第一个地址。当client向server发送请求失败时,client会重新connect。

    client订阅server

    当client向server发起subscribe时,server会做以下几件事

    • 判断server的元数据管理器是否启动,如果未启动,则启动

    • 元数据管理器存储client的一些基本信息

    • 获取该client最后一次的消费position,如果position为空,判断该canalInstance的store是否有数据,如果有数据,则取出第一条数据的position,将该position更新为该client最后一次的消费position。

    Server监听Binlog事件

    com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher#fetch()

    该方法是一个阻塞方法,当数据库binlog变更时,就会触发,然后下发事件到sink。

    • QueryLogEvent

      一些查询日志

    • TableMapLogEvent

      表信息

    • UpdateRowsLogEvent

      具体变更的数据

    • XidLogEvent

      事务id

    client端ack以及rollback

    当客户端发起ack或rollback时,必须按照batchId的从小到大的顺序依次提交。

    • server端的ack逻辑是当接收到ack请求时,首先获取到该batchId的positionRange,positionRange中有endSeq信息,然后将全局的ackSequence更新到endSeq,如果batchId是乱序的,则会导致更新了一些没有提交数据的ack位置。

    • server端的rollback逻辑是当接收到rollback请求时,直接将getSequence重置为ackSequence,相当于是全部rollback,不支持回滚到指定batchId位置。

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/jhbbd/p/13220017.html
Copyright © 2011-2022 走看看