精华内容
下载资源
问答
  • 多数据中心容灾切换实践,ZDNS云服务率先发力.pdf
  • 摘要:SDRS的容灾切换有切换和故障切换两个功能。当生产站点进行计划性的停机维护,可以在停机维护前通过切换功能将生产站点的业务切换到容灾站点,以保持业务的连续性。当生产站点意外故障,已经不能对外提供服务时...

    摘要:SDRS的容灾切换有切换和故障切换两个功能。当生产站点进行计划性的停机维护,可以在停机维护前通过切换功能将生产站点的业务切换到容灾站点,以保持业务的连续性。当生产站点意外故障,已经不能对外提供服务时,可以通过故障切换功能将业务切换到容灾站点,通过容灾站点对外提供服务。

    切换和故障切换功能的核心区别是什么?

    切换故障切换的核心区别在于,切换是生产站点故障前对系统进行切换。业务切换到容灾站点后,切换后数据同步不中断,容灾方向更改为从容灾站点到生产站点。故障切换是生产站点故障后对系统进行切换,业务切换到容灾站点后,由于生产站点已经故障,数据同步中断。

    场景一:切换

    步骤1:进入容灾服务页面

    切换是以保护组为基本单位进行的,所以需要在保护组中进行切换。

    在待切换的保护组中,单击“切换”。

    步骤2:进行切换

    在“切换”页签,单击“切换”。

    如果保护组中的服务器未关机,请先勾选未关机的服务器,并单击“关机”。

    待服务器关机后再单击“切换”进行切换。

    切换过程中,请勿对保护组内的云服务器执行开机操作,否则可能导致保护组切换失败。


    场景二:故障切换

    步骤1:进入容灾服务页面

    故障切换是以保护组为基本单位进行的,所以需要在保护组中进行故障切换。

    在待故障切换的保护组,选择“更多 > 故障切换”。

    步骤2:进行故障切换

    在“故障切换”页签,单击“故障切换”。

    故障切换过程中,请勿对保护组内的云服务器执行开、关机操作,否则可能导致故障切换失败。

    故障切换完成后,保护组的状态变为“故障切换”,此时需进入保护实例的详情页面将当前生产站点可用区的云服务器开机。

     

    点击这里,了解更多精彩内容

    展开全文
  • 利用 Zookeeper技术 Mysql容灾切换 一 ZooKeeper 介绍 1. 简介 ZooKeeper 是一个为分布式应用所设计的分布的开源的协调服 务分布式的应用可以建立在同步配置管理分组和命名等服务的更 高级别的实现的基础之上 ...
  • 近日,分布式消息开源项目Apache RocketMQ 发布了 4.5.0版本,该版本引入了Dledger 的多副本技术,可实现多地多中心场景下的自动容灾切换,并保障切换过程中数据的...

    近日,分布式消息开源项目 Apache RocketMQ 发布了 4.5.0版本,该版本引入了 Dledger 的多副本技术,可实现多地多中心场景下的自动容灾切换,并保障切换过程中数据的完整性和一致性,同时,发布 Apache RocketMQ 开发者指南,该指南分为概念和特性、架构设计、样例、最佳实践、运维管理和 API Reference 6大内容,帮助开发者快速了解和使用 Apache RocketMQ。

    新特性:

    • [ISSUE-1046] - 引入了 Dledger 的多副本技术

    提升:

    • [RIP-9] - 发布 Apache RocketMQ 开发者指南(中英文版本)
    • [RIP-10] - 丰富单元测试用例
    • [ISSUE-608] - 优化消息 filter 的用例 
    • [ISSUE-742] - 简化 TransactionalMessageServiceImpl.
    • [ISSUE-776] - 优化使用信息

    修复了部分 Bug :

    Dledger 快速搭建指南:

    https://github.com/apache/rocketmq/blob/master/docs/cn/dledger/quick_start.md

    Apache RocketMQ 开发者指南:

    https://github.com/apache/rocketmq/tree/master/docs/cn

    展开全文
  • Fastdfs被用来作为文件存储,在实际的生产中会对其进行灾备处理,下面我们来探究Fastdfs怎么实现双机房的容灾切换。 目录 一、Fastdfs相关知识 FastDFS集群可支持的规则 二、Fastdfs双机房集群搭建 三、Fastdfs双...
    Fastdfs被用来作为文件存储,在实际的生产中会对其进行灾备处理,下面我们来探究Fastdfs怎么实现双机房的容灾切换。


    一、Fastdfs相关知识

    FastDFS集群可支持的规则

    1、选择tracker server

    当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

    1、Round robin,所有的group间轮询
    2、Specified group,指定某一个确定的group
    3、Load balance,剩余存储空间多多group优先

    2、选择storage server

    当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:

    1、Round robin,在group内的所有storage间轮询
    2、First server ordered by ip,按ip排序
    3、First server ordered by priority,按优先级排序(优先级在storage上配置)

    3、选择storage path

    当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

    1、Round robin,多个存储目录间轮询
    2、剩余存储空间最多的优先


    二、Fastdfs双机房集群搭建

    Fastdfs的具体搭建过程不做赘述,具体参考他人集群搭建

    A机房为主机房
    B机房为备机房

    在这里插入图片描述


    三、Fastdfs双机房模拟测试

    模拟场景一:AB机房容灾测试

    测试场景:

    在这里插入图片描述

    测试思路:

    1、AB机房搭建完成后,进行数据上传,查看存储状态;
    2、关闭A机房的所有服务器,继续上传数据,查看存储状态;
    3、恢复A机房的所有服务器,上传数据,查看存储状态;

    测试过程:

    1、搭建AB机房的fastdfs集群,通过/usr/bin/fdfs_monitor /etc/fdfs/storage.conf查看集群状态;
    在这里插入图片描述
    2、keepalived的虚拟ip在172.18.40.194服务器上

    在这里插入图片描述
    3、用代码进行文件上传与下载,集群状态良好;

    @PostMapping("/upload1")
        public String uploadFile() throws IOException {
            Long count = 0L;
            FSEntity fsEntity;
            int a = 0;
            int b = 0;
            ArrayList<String> strings = new ArrayList<>();
            File file = new File("D://test");
            try {
                if (file == null || !file.exists()) {
                    System.out.println("没有文件夹");
                }
                //获得文件对象的子文件对象列表
                File[] files = file.listFiles();
                //遍历文件并上传
                for (File f : files) {
                    InputStream inputStream = null;
                    FileInputStream fileInputStream = new FileInputStream(f);
                    String fileName = f.getName();
                    log.debug("文件名:{}", fileName);
    ​
    ​
                    fsEntity = new FSEntity();
                    fsEntity.setInputstream(fileInputStream);
                    fsEntity.setName(fileName);
                    fsEntity.setSize(f.length());
                    fsEntity.setContentType(FilenameUtils.getExtension(fileName));
    ​
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String dateNowStr2 = sdf.format(System.currentTimeMillis());
                    System.out.println(dateNowStr2);
                    FSEntity fsEntity1 = fsManager.putObject(bucket, fsEntity);
                    String MD5code = DigestUtils.md5Hex(new FileInputStream(new File("D:\\test\\" + fsEntity1.getName())));
                    /*保存文件*/
                    uploadService.upload1(fsEntity1, MD5code);
    ​
                    String dateNowStr = sdf.format(System.currentTimeMillis());
                    System.out.println(dateNowStr);
                    /*下载文件*/
                    FSEntity fsdown = fsManager.getObject(bucket, fsEntity.getKeyId());
                    //获取下载的路径
                    File dfile = new File("D:\\test1\\" + fileName);
                    FileOutputStream downloadFile = new FileOutputStream(dfile);
                    //将文件下载到指定文件夹
                    inputStream = fsdown.getInputstream();
                    int index;
                    byte[] bytes = new byte[1024];
                    while ((index = inputStream.read(bytes)) > 0) {
                        downloadFile.write(bytes, 0, index);
                        downloadFile.flush();
                    }
                    // 校验MD5值
                    String MD5code_download = DigestUtils.md5Hex(new FileInputStream(new File("D:\\test1\\" + fsEntity1.getName())));if (MD5code.equals(MD5code_download)) {
                        System.out.println("文件匹配");
                        a++;
                    } else {
                        System.out.println("文件不匹配");
                        b++;
                        strings.add(MD5code);
                    }
                    downloadFile.close();
                    inputStream.close();
                    fileInputStream.close();
                }
                System.out.println("文件匹配数" + a + "-------文件不匹配数" + b + "md5值为" + strings);
            } catch (Exception e) {
                log.error("Error", e);
                count++;
                System.out.println("上传失败数:" + count);
            }
            return "上传成功";
        }
    

    在这里插入图片描述

    在这里插入图片描述

    4、关闭A机房172.18.40.173服务器的tracker与storage,关闭A机房的172.18.40.174服务器的tracker与storage,关闭172.18.40.194的keepalived;

    • 关闭A机房172.18.40.173服务器的tracker与storage

    在这里插入图片描述

    • 关闭A机房的172.18.40.174服务器的tracker与storage

    在这里插入图片描述

    • 关闭172.18.40.194的keepalived

    在这里插入图片描述

    5、keepalived虚拟ip飘逸到172.18.40.195服务器上;

    在这里插入图片描述
    6、查看fastdfs集群状态,可以看出173、174的storage处于offline状态;

    在这里插入图片描述
    在这里插入图片描述

    7、进行文件上传、下载,正常;
    在这里插入图片描述

    8、重启173、174服务器的tracker与storage,重启194的keepalived;

    • 重启173服务器的tracker与storage

    在这里插入图片描述

    • 重启174服务器的tracker与storage

    在这里插入图片描述

    • 重启194服务器的keepalived,查看虚拟IP

    在这里插入图片描述

    9、恢复A机房的所有服务器,在fastdfs集群中只要是同一group,就会进行数据同步;

    • vim /app/storage/data/sync/172.18.40.175_23000.mark命令查看172.18.40.173服务器的binlog_offset的偏移量

    在这里插入图片描述

    • vim /app/storage/data/sync/172.18.40.173_23000.mark命令查看172.18.40.175服务器的binlog_offset的偏移量

    在这里插入图片描述

    • 参数解析
    binlog_index=0   //binlog索引id
    binlog_offset=528253386  //当前时间binlog 大小
    need_sync_old=0  //是否需要同步老数据
    sync_old_done=0 //是否同步完成
    until_timestamp=0 //
    scan_row_count=97 //扫描记录数
    sync_row_count=52   //同步记录数
    

    10、进行文件上传下载,状态良好;
    在这里插入图片描述

    测试结果:

    搭建的集群,AB机房切换没有问题,数据能够成功同步;


    模拟场景二:AB机房切换保证数据优先在A机房的storage存储

    测试场景:

    通常我们希望在生产中进行灾备切换时,尽量使用主机房的服务器,所以要保证数据优先存储在主机房,也就是我们模拟环境中的A机房
    在这里插入图片描述

    测试思路:

    1、设置A机房的所有storage配置中的priority为1,设置B机房的所有storage配置中的priority为10,进行数据上传,查看存储状态;

    2、关闭A机房的所有服务器,继续上传数据,查看存储状态;

    3、恢复A机房的所有服务器,上传数据,查看存储状态;

    预期结果:

    通过设置priority参数,能够实现AB机房切换时数据优先在A机房的storage存储

    测试过程:

    1、设置A机房的所有storage配置中的priority为1,设置B机房的所有storage配置中的priority为10
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2、将所有的tracker设置为根据优先级进行排序;

    • 参数解析
    # 选择哪个storage server 进行上传操作(一个文件被上传后,这个storage server就相当于这个文件的storage server源,会对同组的storage server推送这个文件达到同步效果)
    # 0: 轮询方式
    # 1: 根据ip 地址进行排序选择第一个服务器(IP地址最小者)
    # 2: 根据优先级进行排序(上传优先级由storage server来设置,参数名为upload_priority)
    store_server=0
     
    # 选择storage server 中的哪个目录进行上传。storage server可以有多个存放文件的base path(可以理解为多个磁盘)。
    # 0: 轮流方式,多个目录依次存放文件
    # 2: 选择剩余空间最大的目录存放文件(注意:剩余磁盘空间是动态的,因此存储到的目录或磁盘可能也是变化的)
    store_path=0
     
    # 选择哪个 storage server 作为下载服务器
    # 0: 轮询方式,可以下载当前文件的任一storage server
    # 1: 哪个为源storage server 就用哪一个 (前面说过了这个storage server源 是怎样产生的) 就是之前上传到哪个storage server服务器就是哪个了
    download_server=0
    

    在这里插入图片描述
    3、进行数据上传,看是否A机房的storage作为源数据、B机房的storage作为备份数据;

    • 先查看没有修改priority参数的存储状态,轮询方式进行存储,会发现下图中M00前的大写C与小写c都存在,C表示从该服务器存储的源数据,c表示从同组服务器备份的数据;通过vim /app/storage/data/sync/binlog.000命令查看172.18.40.173服务器的存储情况;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s39gZadN-1599897304429)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815152646794.png)]

    C表示源创建、c表示副本创建
    
    • 修改了priority参数,进行上传,查看172.18.40.173服务器的存储情况,接着第110条数据的小c,之后上传的文件全部是大C为源数据;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIueTZC9-1599897304430)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815153545745.png)]

    相应的同group的B机房数据为备份数据小c;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MU64zDfB-1599897304431)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815153829044.png)]

    4、关闭A机房的所有服务器,继续上传数据,查看存储状态;

    • 关闭A机房172.18.40.173服务器的tracker与storage;

    在这里插入图片描述

    • 关闭A机房172.18.40.174服务器的tracker与storage;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7G0IHOv-1599897304433)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815154328237.png)]

    • 进行文件的上传和下载,文件上传、下载成功;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSLsCgXB-1599897304434)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815154655012.png)]
    5、恢复A机房的所有服务器,上传数据,查看存储状态;

    • 重启172.18.40.173服务器的tracker与storage

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cbC2ytsw-1599897304435)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815155007961.png)]

    • 重启172.18.40.174服务器的tracker与storage

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrthX1ks-1599897304436)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815155140072.png)]

    • 查看数据同步情况,vim/app/storage/data/sync/172.18.40.175_23000.mark命令查看172.18.40.173与172.18.40.175服务器的binlog_offset的偏移量相同,且扫描的总文件数相同;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cp37pI57-1599897304437)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815155549551.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iR6Nq8aF-1599897304438)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815155609033.png)]
    6、A机房恢复后进行数据上传,查看数据是否依旧A机房的storage优先存储;

    - vim /app/storage/data/sync/binlog.000命令查看173服务器的存储情况,从第136条数据往后都是大写C,表示173服务器又作为了源数据;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p3aLgfVm-1599897304439)(C:\Users\powersi\AppData\Roaming\Typora\typora-user-images\image-20200815155956186.png)]

    测试结果:

    通过设置priority参数,能够实现AB机房切换时数据优先在A机房的storage存储。


    四、可行性方案

    1、AB机房初始状态

    1、设置A机房的storage的priority参数值<A机房的storage的priority参数值;
    2、设置所有的机房的tracker以优先级排序的方式进行存储,设置store_server=2;
    3、 保证了A机房的storage作为数据源;

    在这里插入图片描述

    2、A机房宕机,切换到B机房

    A机房宕机后,自动会切换到B机房进行存储;

    在这里插入图片描述

    3、A机房恢复,文件会自动实现同步;

    1、A机房恢复后,A机房的storage会变为sync的状态;
    2、当A机房storage同步文件完成后,A机房的storage变为源数据;

    在这里插入图片描述


    五、结束语

    值得高兴的是Fastdfs有其完备的机制,在进行双机房切换时,不需要手动或者脚本执行,只需要根据实际的需求将一些参数设置完好,即可达到灾备的自动切换!
    展开全文
  • 文章目录DLedger配置介绍新建DLedger集群机器规划BrokernameserverconsoleBroker配置broker-abroker-a-s1broker-a-s2...本文主要演示如何搭建一个多主多从的自动容灾切换的RocketMQ集群,以及如何把现有普通的Master/S


    本文主要演示如何搭建一个多主多从的自动容灾切换的RocketMQ集群,以及如何把现有普通的Master/Slave集群升级为自动容灾切换的集群。

    DLedger配置介绍

    ​ 部署自动容灾的RocketMQ集群和普通的Master/Slave集群没太多差别,只需要在Broker.conf开启DLedger相关配置即可,官方称之为自动容灾切换的RocketMQ-on-DLedger Group,DLedger是分布式一致性协议Raft的一个实现,是一个轻量级的Java类库,RocketMQ引入其来实现Leader选举等一致性操作。

    • RocketMQ-on-DLedger Group是指一组相同名称的 Broker,至少需要 3 个节点,通过 Raft 自动选举出一个 Leader,其余节点 作为 Follower,并在Leader和Follower之间复制数据以保证高可用。
    • RocketMQ-on-DLedger Group能自动容灾切换,并保证数据一致。
    • RocketMQ-on-DLedger Group是可以水平扩展的,也即可以部署任意多个RocketMQ-on-DLedger Group同时对外提供服务。

    相关配置

    name含义举例
    enableDLegerCommitLog是否启动 DLedger,即是否启用RocketMQ主从切换,默认为falsetrue
    dLegerGroupDLedger Raft Group的名字,建议和brokerName保持一致RaftNode00
    dLegerPeersDLedger Group 内各节点的端口信息,同一个Group 内的各个节点配置必须要保证一致n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
    dLegerSelfId节点 id, 必须属于 dLegerPeers 中的一个;同Group 内各个节点要唯一n0
    sendMessageThreadPoolNums发送线程个数,建议配置成 Cpu 核数16

    新建DLedger集群

    机器规划

    Broker

    节点ID机器端口dLegerPeer
    broker-a0172.24.29.21320911n0-172.24.29.213:10911
    broker-a-s11172.24.29.21420911n1-172.24.29.214:10911
    broker-a-s22172.24.29.21520911n2-172.24.29.215:10911
    broker-b0172.24.29.21420915n0-172.24.29.214:10915
    broker-b-s11172.24.29.21320915n1-172.24.29.213:10915
    broker-b-s22172.24.29.21520915n2-172.24.29.215:10915
    broker-c0172.24.29.21520919n0-172.24.29.215:10919
    broker-c-s11172.24.29.21320919n1-172.24.29.213:10919
    broker-c-s22172.24.29.21420919n2-172.24.29.214:10919

    nameserver

    节点机器端口
    nameserver172.24.29.2159976

    console

    节点机器端口
    console172.24.29.2158585

    Broker配置

    broker-a

    listenPort = 20911
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-a/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-a
    #对外提供服务地址
    brokerIP1 = 172.24.29.213
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.213
    brokerId = 0
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-a/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-a/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-a/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = ASYNC_MASTER
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-a
    dLegerSelfId = n0
    dLegerPeers = n0-172.24.29.213:10911;n1-172.24.29.214:10911;n2-172.24.29.215:10911
    

    broker-a-s1

    listenPort = 20911
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-a-s1/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-a
    #对外提供服务地址
    brokerIP1 = 172.24.29.214
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.214
    brokerId = 1
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-a-s1/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-a-s1/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-a-s1/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = SLAVE
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-a
    dLegerSelfId = n1
    dLegerPeers = n0-172.24.29.213:10911;n1-172.24.29.214:10911;n2-172.24.29.215:10911
    

    broker-a-s2

    listenPort = 20911
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-a-s2/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-a
    #对外提供服务地址
    brokerIP1 = 172.24.29.215
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.215
    brokerId = 2
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-a-s2/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-a-s2/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-a-s2/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = SLAVE
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-a
    dLegerSelfId = n2
    dLegerPeers = n0-172.24.29.213:10911;n1-172.24.29.214:10911;n2-172.24.29.215:10911
    

    broker-b

    listenPort = 20915
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-b/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-b
    #对外提供服务地址
    brokerIP1 = 172.24.29.214
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.214
    brokerId = 0
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-b/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-b/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-b/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = ASYNC_MASTER
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-b
    dLegerSelfId = n0
    dLegerPeers = n0-172.24.29.214:10915;n1-172.24.29.213:10915;n2-172.24.29.215:10915
    

    broker-b-s1

    listenPort = 20915
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-b-s1/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-b
    #对外提供服务地址
    brokerIP1 = 172.24.29.213
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.213
    brokerId = 1
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-b-s1/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-b-s1/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-b-s1/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = SLAVE
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-b
    dLegerSelfId = n1
    dLegerPeers = n0-172.24.29.214:10915;n1-172.24.29.213:10915;n2-172.24.29.215:10915
    

    broker-b-s2

    listenPort = 20915
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-b-s2/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-b
    #对外提供服务地址
    brokerIP1 = 172.24.29.215
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.215
    brokerId = 2
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-b-s2/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-b-s2/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-b-s2/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = SLAVE
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-b
    dLegerSelfId = n2
    dLegerPeers = n0-172.24.29.214:10915;n1-172.24.29.213:10915;n2-172.24.29.215:10915
    

    broker-c

    listenPort = 20919
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-c/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-c
    #对外提供服务地址
    brokerIP1 = 172.24.29.215
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.215
    brokerId = 0
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-c/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-c/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-c/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = ASYNC_MASTER
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-c
    dLegerSelfId = n0
    dLegerPeers = n0-172.24.29.215:10919;n1-172.24.29.213:10919;n2-172.24.29.214:10919
    

    broker-c-s1

    listenPort = 20919
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-c-s1/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-c
    #对外提供服务地址
    brokerIP1 = 172.24.29.213
    #Broker HAIP地址,供slave同步消息的地址
    brokerIP2= 172.24.29.213
    brokerId = 1
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-c-s1/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-c-s1/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-c-s1/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = SLAVE
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-c
    dLegerSelfId = n1
    dLegerPeers = n0-172.24.29.215:10919;n1-172.24.29.213:10919;n2-172.24.29.214:10919
    

    broker-c-s2

    listenPort = 20919
    rocketmqHome = /neworiental/rocketmq-test/rocketmq-c-s2/rocketmq471
    brokerClusterName = rocketmq-test
    namesrvAddr= 172.24.29.215:9976
    brokerName = broker-c
    #对外提供服务地址
    brokerIP1 = 172.24.29.214
    #Broker HAIP地址,供slave同步消息的地址,不配此项则不会进行主从复制
    brokerIP2= 172.24.29.214
    brokerId = 2
    storePathRootDir = /neworiental/rocketmq-test/rocketmq-c-s2/store
    storePathCommitLog = /neworiental/rocketmq-test/rocketmq-c-s2/store/commitlog
    storePathConsumerQueue = /neworiental/rocketmq-test/rocketmq-c-s2/store/consumequeue
    deleteWhen = 04
    fileReservedTime = 168
    brokerRole = SLAVE
    flushDiskType = ASYNC_FLUSH
    autoCreateTopicEnable = false
    #是否自动创建消费组
    autoCreateSubscriptionGroup = false
    #集群名称是否可用作Topic使用
    clusterTopicEnable = false
    #Broker名称是否可用作Topic使用
    brokerTopicEnable = false
    useEpollNativeSelector = true
    
    #是否开启ACL
    aclEnable=true
    
    #多副本自动主从选举Dledger相关
    enableDLegerCommitLog = true
    dLegerGroup = broker-c
    dLegerSelfId = n2
    dLegerPeers = n0-172.24.29.215:10919;n1-172.24.29.213:10919;n2-172.24.29.214:10919
    

    验证

    通过管理命令可以看到集群信息,如下图,每个组有一个Leader,两个Follower,集群搭建成功,日志也正常

    Leader日志:

    Follower日志:

    下面手动将broker-b的Leader杀掉

    操作之前:

    Leader是在215上

    操作之后:

    Leader成功选举为214了

    再次将215恢复:

    可以看到215成为了新的Follower

    旧集群升级

    如果旧集群采用 Master 方式部署,则每个 Master 都需要转换成一个 RocketMQ-on-DLedger Group。
    如果旧集群采用 Master-Slave 方式部署,则每个 Master-Slave 组都需要转换成一个 RocketMQ-on-DLedger Group。

    杀掉旧的 Broker

    可以通过 kill 命令来完成,也可以调用 bin/mqshutdown broker

    检查旧的 Commitlog

    ​ RocketMQ-on-DLedger 组中的每个节点,可以兼容旧的 Commitlog ,但其 Raft 复制过程,只能针对新增加的消息。因此,为了避免出现异常,需要保证 旧的 Commitlog 是一致的。
    ​ 如果旧的集群是采用 Master-Slave 方式部署,有可能在shutdown时,其数据并不是一致的,建议通过md5sum 的方式,检查最近的最少 2 个 Commmitlog 文件,如果发现不一致,则通过拷贝的方式进行对齐。

    ​ 虽然 RocketMQ-on-DLedger Group 也可以以 2 节点方式部署,但其会丧失容灾切换能力(2n + 1 原则,至少需要3个节点才能容忍其中 1 个宕机)。
    ​ 所以在对齐了 Master 和 Slave 的 Commitlog 之后,还需要准备第 3 台机器,并把旧的 Commitlog 从 Master 拷贝到 第 3 台机器(记得同时拷贝一下 config 文件夹)。

    ​ 在 3 台机器准备好了之后,旧 Commitlog 文件也保证一致之后,就可以开始走下一步修改配置了。

    修改配置

    参考新集群部署。

    重新启动 Broker

    参考新集群部署。

    Tips

    • dLegerPeers:每个DLedger Group内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致,多个节点用英文分号隔开,单个条目遵循 legerSlefId-IP:端口,这里的端口用作dledge内部通信,注意不要和RocketMQ本身的端口冲突
    • dLegerSelfId:节点 id, 必须属于dLegerPeers中的一个;同 Group 内各个节点要唯一,并且此ID要和dLegerPeers配置的内容中对应上
    • Broker配置文件中的dLedger少了一个d,不知道是笔误还是有意为之

    参考:

    https://github.com/apache/rocketmq/blob/master/docs/cn/dledger/deploy_guide.md

    展开全文
  • 背景:mysql主库单点...结合TDDL的mysql主库的容灾切换方案 共识:1.使用TDDL的业务通常将mysql配置信息放在diamond 2.TDDL group作用是读写分离 部署步骤:1.mysql实例和mysql-agent比例1:1 2.增加和修改d...
  • 今天我们要探讨的问题是相距两地的机房中怎么实现Redis cluster集群模式的容灾切换。 目录一、redis的集群搭建测试集群一测试集群二二、redis cluster相关知识 一、redis的集群搭建 测试集群一 Master Slave ...
  • 容灾演练时,将流量切换到备机房,验证备机房是否能正常工作。 【网络架构】 关键技术点: 1、主备机房流量切换通过公网DNS进行切换切换速度取决于DNS缓存更新的速度,三大运营商可能需要半小时。一些...
  • 最近对一个统计库做了计划内的容灾切换,即主备切换。操作的过程其实还是蛮顺利的。但是灾难切换中如果出现在问题,那就是灾难中的灾难了。 按照计划对配置信息做了同步,然后使用DG Broker做了SwitchOver操作。 ...
  • 最近对一个统计库做了计划内的容灾切换,即主备切换。操作的过程其实还是蛮顺利的。但是灾难切换中如果出现在问题,那就是灾难中的灾难了。简单咨询了下同事,还是选择热引导重启,重...
  • Oracle12c 容灾切换完全步骤

    千次阅读 2017-08-06 08:52:05
    切换前检查 1. 参数检查 ----------------------------主端----------------------------------------------------- --定义dataguard配置的有效db_unique_name SQL> show parameter log_archive_config NAME
  • 根据对阿里经济体多年的流量调度管理经验,以及在众多业务场景(容灾切换,大规模迁站,经济体上云等)中的实践,全局流量管理应运而生,能够帮助用户高效地管理业务流量。 GTM 原理 GTM 本质上是通过 DNS 实现流量...
  • ADG 容灾切换--- 2013.10.16 22:30 -- 2013.10.17 06:30留个脚印 primary 站点执行了切换命令后,standby 站点切换 primary 不成功的恢复步骤。[@more@]Roll...
  • 还有一套备用服务器数据库环境也是11.2.0.4的RAC,存储也是使用SVC,后续称为容灾RAC。医院想到做到当主RAC出现崩溃,或者存储出现问题,能及时切到容灾服务器接管业务,客户端不用改变任何配置就能在短暂时间内重新...
  • shell脚本实现redis双机房容灾切换 1、双机房切换场景模拟 2、A机房的主从切换 2.1、A机房的主从切换方案 2.2、A机房的容灾测试过程 2.3、A机房的keepalived配置文件与脚本 3、AB机房的容灾切换 3.1、AB机房的容灾...
  • 组网中SINFOR AD设备自身的冗余性: 两台深信服AD以主备的冗余方式来连接(同站点主备、或两站点主备),处于备份状态的设备采用“心跳线”检测运行的设备的状态,当检测出设备故障时,两台设备就会产生毫秒级切换,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,287
精华内容 8,114
关键字:

容灾切换