暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术解读 | Klustron 集群同城双活(RCR) 的功能介绍和使用示例

点击上方蓝字关注我们





需求背景

Klustron分布式数据库为了支持集群同城/跨城实现高可用性,支持用户在同城/异地的备用机房建立另一个Klustron集群(备集群)与主城Klustron集群(主集群)建立RCR (remote cluster replication)关系(主集群和备集群合称为主备集群),实现Klustron集群层面的数据更新实时同步。


关键词:同城双活 异地灾备 集群间复制 高可用 高可靠


本文3500文字,大概阅读时长8分钟 


 

1

功能概况


 

当主机房整体不可用时,用户的业务系统可以自动切换到Klustron在备机房的备份集群继续对外提供服务。如果备机房在同城,则DBA可以配置主备集群同步复制,因此切换后可以确保不丢失任何数据;如果备集群在异地机房,则考虑到网络延时较大,通常用户会设置为主备集群做异步复制。这样,一旦主机房失效,则切换到Klustron备集群后,可能会丢失一些最新的数据更新。



2

部署架构


Klustron企业版cluster_mgr组件负责创建和维护RCR集群间复制关系。Klustron在cluster_mgr提供API接口,并且在XPanel 提供GUI,供用户管理和维护RCR复制关系。用户DBA需要在备用机房创建备集群,并且使用RCR配置管理功能配置好RCR集群复制关系。用户的业务系统需要探测主集群或者主机房的可用性,在探测到主集群失效时自动切换到备集群。


主备集群必须具有各自的元数据集群和cluster_mgr集群,不能共用,这主要是考虑主备集群之间的网络延时可能较大,共用的话会导致性能下降。


Klustron RCR要求主备集群具有相同数量的存储集群(storage shard, 简称shard),cluster_mgr的RCR组件为主备集群的每一对shard建立复制关系,这样备集群每个shard就可以从主集群对应的shard复制数据更新。


备集群可以使用主集群的全量物理备份数据或者全量逻辑备份数据做回档来提供初始化数据。


Klustron RCR功能可以确保在主集群或者备集群发生存储节点故障而导致部分或者全部RCR连接失效时,自动恢复连接,并且不丢失数据更新。



3

实现原理和功能用法


3.1 Klustron集群间数据同步包括以下两个部分。


  • shard之间用户数据同步


基于binlog replication主备同步来实现,其中如果是同步复制则使用Klustron特有的fullsync技术。


  • klustron集群的元数据同步


需要同步元数据是因为计算节点需要复制执行DDL以便与源集群具有相同的元数据信息。其中库表分布信息不能直接使用,需要根据目标集群的情况转换映射。


该同步采用binlog_sync工具来完成,binlog_sync通过binlog_dump方式连接主cluster所在元数据集群,捕获对目标集群的DDL log系统表的更新,捕获到binlog变化后,将binlog记录中的DDL SQL语句做必要的转换后再写入备cluster元数据表中。


目前必要的转换包括:shard id信息进行映射。需要映射转换是因为目标集群的shard id与源集群的对应的shard id未必相同。



3.2 功能实现和用法说明


3.2.1 建立RCR数据同步


cluster_mgr检查主备cluster的shard节点数,配置参数(参数为主备RCR cluster_id以及对应cluster所在元数据集群ip:port)等是否一致。如果不一致则返回失败。如果一致则主备cluster各个shard之间建立binlog同步链路。为了保证主备RCR shard数据一致性,cluster_mgr会清理掉备RCR shard中各个节点中数据,重新从对应主RCR shard节点上同步数据过来。建立RCR关系时,cluster_mgr会自动将主备RCR各个shard 一一对应起来。cluster_mgr将备cluster中各个shard中主节点与主cluster中对应shard中一个延迟较小备节点建立数据同步。cluster_mgr会根据建立好数据层同步,自动启动binlog_sync工具来实时同步Klustron主集群的元数据更新,经过转换后同步到备集群的元数据集群的DDL log表,让备集群的计算节点去执行。


为了确保数据一致性,Klustron RCR会把备集群每个shard主节点设置为只读,避免用户误写入数据导致其数据与主集群不一致。


特别说明:建立RCR时,cluster_mgr自动清理掉备RCR shard中数据。


3.2.2 删除RCR数据同步


cluster_mgr根据输入参数参数为主备RCR cluster_id以及对应cluster所在元数据集群ip:port)校验是否合法,如果输入参数与cluster_mgr中记录主备RCR cluster_id以及元数据集群信息不一致则返回任务失败。校验通过后,cluster_mgr连接备RCR cluster中各个shard主节点,断开binlog同步链路,断开klustron集群元数据同步关系。放开备cluster 各个shard主节点可读写等操作。


3.2.3 手动切换RCR关系


cluster_mgr根据输入参数(参数为主备RCR cluster_id以及对应cluster所在元数据集群ip:port)校验是否合法,如果输入参数与cluster_mgr中记录主备RCRcluster_id以及元数据集群信息不一致则返回任务失败。校验通过后cluster_mgr检查主备RCR同步延迟,如果延迟大约配置值(5s)则返回任务失败。cluster_mgr将主RCR cluster各个shard主节点设置为只读,阻止数据继续写入;连接备RCR cluster各个shard主节点,检查主备数据是否同步(检查gtid)完成,该阶段cluster_mgr超时时间为10s,如果超时则任务回滚并返回任务失败。断开Klustron集群元数据同步关系。断开主备RCR shard之间原先数据同步链路,反向建立shard之间数据同步链路,即原主变为备,原备变为主。设置原备RCR cluster 各个shard主节点可读写。原主RCR cluster各个shard主节点只读。cluster_mgr根据shard新同步关系,重新启动binlog_sync工具建立klustron集群元数据同步。


手动切换场景:

  • 业务部署发生变化,从主RCR切换到备RCR所在地区。直接发起手动RCR切换即可。由于RCR手动切换保证数据一致性的,不必担心数据丢失问题。

  • 容灾演练。


3.2.4 配置RCR同步关系


当前支持暂停RCR主备数据同步,恢复RCR主备数据同步以及设置主备RCR之间数据延迟复制。


3.2.5 集群拓扑结构变化


如果在建立RCR关系cluster中任何一个cluster添加/删除shard,cluster_mgr自动根据RCR关系到对端cluster_mgr中添加/删除shard。目前cluster_mgr自动会创建一个添加/删除shard任务发送对端cluster_mgr,并等待查询该任务执行情况。如果执行失败,则用户发起的添加/删除shard任务失败。

  • 添加shard,cluster_mgr在主备RCR都建立好shard后,发起对新增shard建立RCR关系。

  • 删除shard,cluster_mgr先断开删除shard RCR同步关系,再发起主备RCR shard删除任务。



4

配置使用



4.1 使用cluster_mgr api操作


4.1.1 建立RCR关系

    curl -d '
    {
    "version":"1.0",
    "job_id":"",
    "job_type":"create_rcr",
    "timestamp":"1435749309",
    "user_name":"kunlun_test",
    "paras":{
    "master_info":
    {
    "meta_db":"127.0.0.1:1001,
    127.0.0.2:1001, 127.0.0.3:1001",
    "cluster_id":"2"
    },
    "cluster_id":"3"
    }
    }
    ' -X POST
    http://127.0.0.1:58000/HttpService/Emit

    4.1.2 删除RCR关系

      curl -d '
      {
      "version":"1.0",
      "job_id":"",
      "job_type":"delete_rcr",
      "timestamp":"1435749309",
      "user_name":"kunlun_test",
      "paras":{
      "master_info": {
      "meta_db":"127.0.0.1:1001,
      127.0.0.2:1001, 127.0.0.3:1001",
      "cluster_id":"2"
      },
      "cluster_id":"3"
      }
      }
      ' -X POST
      http://127.0.0.1:58000/HttpService/Emit

      4.1.3 手动RCR主备切换,支持在主备RCR所在cluster_mgr发起


      在备RCR所在cluster_mgr发起

        curl -d '
        {
        "version":"1.0",
        "job_id":"",
        "job_type":"manualsw_rcr",
        "timestamp":"1435749309",
        "user_name":"kunlun_test",
        "paras":{
        "master_info": {
        "meta_db":"127.0.0.1:1001,
        127.0.0.2:1001, 127.0.0.3:1001",
        "cluster_id":"2"
        },
        "cluster_id":"3"
        }
        }
        '
        -X POST http://127.0.0.1:58000/HttpService/Emit


        在主RCR所在cluster_mgr发起

          curl
          -d '
          {
          "version":"1.0",
          "job_id":"",
          "job_type":"manualsw_rcr",
          "timestamp":"1435749309",
          "user_name":"kunlun_test",
          "paras":{
          "slave_info": {
          "meta_db":"127.0.0.1:1001,
          127.0.0.2:1001, 127.0.0.3:1001",
          "cluster_id":"2"
          },
          "cluster_id":"3"
          }
          }
          '
          -X POST http://127.0.0.1:58000/HttpService/Emit


          4.1.4 配置主备RCR同步,支持在主备RCR所在cluster_mgr发起


          在备RCR所在cluster_mgr发起

            curl -d '
            {
            "version":"1.0",
            "job_id":"",
            "job_type":"modify_rcr",
            "timestamp":"1435749309",
            "user_name":"kunlun_test",
            "paras":{
            "master_info": {
            "meta_db":"127.0.0.1:1001,
            127.0.0.2:1001, 127.0.0.3:1001",
            "cluster_id":"2"
            },
            "cluster_id":"3",
            "work_mode":"modify_sync_delay|stop_rcr|start_rcr",
            "sync_delay":"10"
            //如果是modify_sync_delay,则需要配置sync_delay
            }
            }
            ' -X POST http://127.0.0.1:58000/HttpService/Emit

            在主RCR所在cluster_mgr发起

              curl -d '
              {
              "version":"1.0",
              "job_id":"",
              "job_type":"modify_rcr",
              "timestamp":"1435749309",
              "user_name":"kunlun_test",
              "paras":{
              "slave_info": {
              "meta_db":"127.0.0.1:1001,
              127.0.0.2:1001, 127.0.0.3:1001",
              "cluster_id":"2"
              },
              "cluster_id":"3"
              "work_mode":"modify_sync_delay|stop_rcr|start_rcr",
              "sync_delay":"10"
              //如果是modify_sync_delay,则需要配置sync_delay
              }
              }
              ' -X POST http://127.0.0.1:58000/HttpService/Emit


              4.2 使用xpanel页面操作


              由于Xpanel支持管理多个Klustron集群,首先上报要建立RCR关系Klustron集群元数据信息,如下图

              设置元数据集群名称,以及集群ip,port;如果多个,点击加号添加。


              4.2.1 配置好元数据集群后,点击新增RCR

              点击确认发起建立RCR

              点击详情查看 元数据同步以及shard同步对应关系,如下图


              4.2.2 删除RCR关系

              输入验证码,点击确认发起删除命令

              4.2.3 手动切换RCR关系

              输入验证码,点击确认发起手动切换命令

              4.2.4 配置RCR关系

              • 设置延迟复制时间

              输入配置延迟时间,点击确认。

              • 暂停同步复制

              输入验证码,点击确认

              • 启动同步复制

              输入验证码,点击确认

              END


              同时欢迎大家扫码👇添加小助手(备注:加入Klustron技术交流群)欢迎大家在交流群共同探讨更多问题及主题。



               点击👆上方,关注获取源代码及技术信息~

               



              推荐阅读


              关于我司将 KunlunBase 产品名称改为 Klustron 的通知


              技术解读 | KunlunBase全局死锁检测技术


              技术解读 | MySQL分布式事务处理的问题和kunlun-storage的解决方案


              技术解读 | 深入了解词法分析:从原理到实践


              技术解读 | Klustron 数据备份及全局一致性恢复


              技术解读|Klustron Mirror表功能介绍和使用示例


              MySQL Bug 的处理及修复


              MySQL内核研发系列之二 - MySQL测试框架MTR简介


              文章转载自KunlunBase 昆仑数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论