RocketMQ 配置双主模式 和 双主双从模式

发布时间:2021-04-26作者:laosun阅读(2888)

RocketMQ

    今天讲解的是RocketMQ如何配置双主和双主双从模式。

    环境:Parallels CentOS虚拟机两台:

    第一台: 10.211.55.11 ;第二台:10.211.55.12 。首先确保两台机器都已经安装了RocketMQ,如何安装请查看之前发布的文章: RocketMQ 下载安装,修改运行内存,配置单主


    其实官方已经给出了配置双主或者双主双从模式的案例,只需要我们修改调整一下即可。

    1.png


    接下来的操作两台机器我们都是处在 /usr/local/rocketmq-4.8.0 根目录下。


    双主模式配置方式:

    我们打开两个窗口,分别编辑两台机器上的文件。如果没有这个条件的,就按照步骤一步步的来吧。

    10.211.55.11机器 和 10.211.55.12机器,下边我们将简称为 11机器和12机器。


    我们分别在两台机器上的rocketmq根目录创建一个文件夹,方便之后的双主双从模式的搭建。

    11机器上创建store-a文件夹,12机器上创建store-b文件夹。(至于文件夹有什么用,以后的文章会介绍)


    11机器:

    # 创建文件夹,11机器上我们创建名字为store-a的文件夹
    > mkdir store-a

    image.png


    12机器:

    # 创建文件夹,12机器上我们创建名字为store-b的文件夹
    > mkdir store-b

    image.png


    使用命令先停止掉两台机器上的rocketmq服务。

    # 停止两台机器上的服务,如果没有启动则无需停止。
    # 先停止broker
    > sh bin/mqshutdown broker
    # 停止namesrv
    > sh bin/mqshutdown namesrv

    image.png

    停止完成后,我们现在需要修改配置文件进行双主搭建了。


    11机器:

    # 编辑10.211.55.11机器上的broker-a.properties配置文件
    > vim conf/2m-noslave/broker-a.properties


    11机器上的conf/2m-noslave/broker-a.properties文件内容如下:

    我们其中需要修改的地方有namesrvAddr、listenPort、storePathRootDir 三项。如果你们是按照我的操作步骤来一步步搭建的,那么只需要修改namesrvAddr即可。

    以下文件可以和原文件做个对比,其实没有修改啥,只是新增了不少选项,另外每个都加上了备注说明。

    # 所属集群名称
    brokerClusterName=DefaultCluster
    # 名称可重复 为了便于管理,master和所属的slave采用同一个名称
    # Broker 的名称, Master和Slave 通过使用相同的 Broker 名称来表明相互关系,以说明某个 Slave 是哪个 Master的Slave
    brokerName=broker-a
    # 0 - master | >0 - slave
    # 一个 Master Barker 可以有多个 Slave, 表示 Master ,大于 表示不同的Slave ID
    brokerId=0
    # 删除文件时间点,默认凌晨 4点
    # 与fi leReservedTim 参数呼应,表明在几点做消息删除动作,默认值 04 表示凌晨四点
    deleteWhen=04
    # 文件保留时间,默认 48 小时
    # 在磁盘上保存消息的时长,单位是小时,自动删除超时的消息
    fileReservedTime=48
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    # broker Role 有3种: SYNC MASTER ASYNC MASTER SLAVE 
    # 关键词 SYNC ASYNC 表示 Master Slave 之间同步消息的机制, 
    # SYNC 的意思是当 Slave Master 消息同步完成后,再返回发送成功的状态
    brokerRole=SYNC_MASTER
    # 刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    # flushDiskType 表示 盘策略,分为 SYNC_FLUSH ASYNC_FLUSH 两种
    # 分别代表同步刷盘和异步刷盘 同步刷盘情况下,消息 正写人磁盘后再
    # 返回成功状态;异步刷盘情况下,消息写人 page_cache 后就返回成功状态
    flushDiskType=ASYNC_FLUSH
    
    # =================增加如下几行=================
    # 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    # defaultTopicQueueNums=4
    # 是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    # 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    # nameServer 服务地址列表,配置多台
    namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    # Broker 对外服务的监听端口
    # Broker 监听的端口 号,如果一台机器上启动了多个 Broker 要设置不同的端口号,避免冲突
    listenPort=11111
    # commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    # ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    # 存储消息以及一些配置信息的根目录
    storePathRootDir=/usr/local/rocketmq-4.8.0/store-a
    
    # 以下几个目录不需要填写,会自动创建
    # commitLog 存储路径
    #storePathCommitLog=/usr/local/rocketmq-4.8.0/store-a/commitlog
    # 消费队列存储路径存储路径
    #storePathConsumeQueue=/usr/local/rocketmq-4.8.0/store-a/consumequeue
    # 消息索引存储路径
    #storePathIndex=/usr/local/rocketmq-4.8.0/store-a/index
    # checkpoint 文件存储路径
    #storeCheckpoint=/usr/local/rocketmq-4.8.0/store-a/checkpoint
    # abort 文件存储路径
    #abortFile=/usr/local/rocketmq-4.8.0/store-a/abort
    
    # 限制的消息大小
    maxMessageSize=65536
    # 发消息线程池数量(注意:如果机器性能不怎么样,但是消息量又很大的情况下,此值要调小,或者消费者修改成单线程顺序接收,orderly)
    sendMessageThreadPoolNums=128
    # 拉消息线程池数量(注意:如果机器性能不怎么样,但是消息量又很大的情况下,此值要调小,或者消费者修改成单线程顺序接收,orderly)
    pullMessageThreadPoolNums=128


    12机器:

    # 编辑10.211.55.12机器上的broker-b.properties配置文件
    > vim conf/2m-noslave/broker-b.properties


    12机器上的conf/2m-noslave/broker-b.properties文件内容如下:

    我们其中需要修改的地方有namesrvAddr、listenPort、storePathRootDir 三项。如果你们是按照我的操作步骤来一步步搭建的,那么只需要修改namesrvAddr即可。

    以下文件可以和原文件做个对比,其实没有修改啥,只是新增了不少选项,另外每个都加上了备注说明。

    # 所属集群名称
    brokerClusterName=DefaultCluster
    # 名称可重复 为了便于管理,master和所属的slave采用同一个名称
    brokerName=broker-b
    # 0 - master | >0 - slave
    brokerId=0
    # 删除文件时间点,默认凌晨 4点
    deleteWhen=04
    # 文件保留时间,默认 48 小时
    fileReservedTime=48
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    # 刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    
    # =================增加如下几行=================
    # 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    # defaultTopicQueueNums=4
    # 是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    # 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    # nameServer 服务地址列表
    namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    
    #brokerIP1=10.211.55.12
    # Broker 对外服务的监听端口
    listenPort=22222
    # commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    # ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    # 存储消息以及一些配置信息的根目录
    storePathRootDir=/usr/local/rocketmq-4.8.0/store-b
    
    # 以下几个目录不需要填写,会自动创建
    # commitLog 存储路径
    #storePathCommitLog=/usr/local/rocketmq-4.8.0/store-b/commitlog
    # 消费队列存储路径存储路径
    #storePathConsumeQueue=/usr/local/rocketmq-4.8.0/store-b/consumequeue
    # 消息索引存储路径
    #storePathIndex=/usr/local/rocketmq-4.8.0/store-b/index
    # checkpoint 文件存储路径
    #storeCheckpoint=/usr/local/rocketmq-4.8.0/store-b/checkpoint
    # abort 文件存储路径
    #abortFile=/usr/local/rocketmq-4.8.0/store-b/abort
    
    # 限制的消息大小
    maxMessageSize=65536
    # 发消息线程池数量(注意:如果机器性能不怎么样,但是消息量又很大的情况下,此值要调小,或者消费者修改成单线程顺序接收,orderly)
    sendMessageThreadPoolNums=128
    # 拉消息线程池数量(注意:如果机器性能不怎么样,但是消息量又很大的情况下,此值要调小,或者消费者修改成单线程顺序接收,orderly)
    pullMessageThreadPoolNums=128


    都修改完成后,我们现在启动服务

    # 分别启动两台机器上的namesrv服务
    > nohup sh bin/mqnamesrv &
    # 启动namesrv后,启动11机器上的broker服务
    > nohup sh bin/mqbroker -c conf/2m-noslave/broker-a.properties &
    # 启动namesrv后,启动12机器上的broker服务
    > nohup sh bin/mqbroker -c conf/2m-noslave/broker-b.properties &

    确保都启动完成后,查看下进程是否正常。

    我们来看下配置双主模式是否成功。

    # 在两台机器上的任何一台执行以下命令(Ip也可以是两台中任何一台的ip)
    > sh bin/mqadmin clusterList -n 10.211.55.11:9876


    展示如下图所示,则表示配置双主模式成功。

    image.png


    现在我们使用rocketmq-console控制台来查看一下。

    上一篇文章已经介绍过如何搭建rocketmq-console控制台了。请查看文章:RocketMQ配置console控制台,配置登录账户密码

    image.png

    发现双主模式已经配置成功了

    现在就有个疑问了,我的rocketmq-console只配置了一个namesrv为什么两台都能展示呢?

    博主认为应该是namesrv通过broker互相通信的原因。不过还是建议都配置上


    之前是一台rocketmq,现在我们部署了双主模式,我们需要修改下rocketmq-console控制台的配置文件。

    现在我们先停止掉rocketmq-console控制台

    # 如何停止?kill -9 杀掉即可
    > kill -9 pid

    进入下载好的rocketmq-console模块目录

    > cd /usr/local/src/rocketmq-externals-master/rocketmq-console
    # 编辑application.properties文件
    > vim src/main/resources/application.properties

    修改内容如下:

    server.address=0.0.0.0
    server.port=19876
     
    ### SSL setting
    #server.ssl.key-store=classpath:rmqcngkeystore.jks
    #server.ssl.key-store-password=rocketmq
    #server.ssl.keyStoreType=PKCS12
    #server.ssl.keyAlias=rmqcngkey
     
    #spring.application.index=true
    spring.application.name=rocketmq-console
    spring.http.encoding.charset=UTF-8
    spring.http.encoding.enabled=true
    spring.http.encoding.force=true
    logging.level.root=INFO
    logging.config=classpath:logback.xml
    #if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
    # =============增加两台机器上的namesrv地址,分号;分隔=============
    rocketmq.config.namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    #if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
    rocketmq.config.isVIPChannel=
    #rocketmq-console's data path:dashboard/monitor
    rocketmq.config.dataPath=/tmp/rocketmq-console/data
    #set it false if you don't want use dashboard.default true
    rocketmq.config.enableDashBoardCollect=true
    #set the message track trace topic if you don't want use the default one
    rocketmq.config.msgTrackTopicName=
    rocketmq.config.ticketKey=ticket
     
    #Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
    rocketmq.config.loginRequired=false
     
    #set the accessKey and secretKey if you used acl
    #rocketmq.config.accessKey=
    #rocketmq.config.secretKey=


    然后重新编译打包:

    # 重新编译打包,目录:/usr/local/src/rocketmq-externals-master/rocketmq-console
    > mvn clean package -Dmaven.test.skip=true
    
    
    # 打包完成后,我们重启该rocketmq-console控制台
    > nohup java -jar target/rocketmq-console-ng-2.0.0.jar &


    然后再从浏览器观察一下是否显示正确


    image.png

    双主双从模式配置方式:

    双主双从和双主配置模式差不多,官方也给出了案例,我们只需要修改其中的配置文件即可实现。

    我们分别在两台机器上的rocketmq根目录再创建一个文件夹。

    11机器上创建store-b文件夹,12机器上创建store-a文件夹。(至于文件夹有什么用,以后的文章会介绍)

    现在的目录结构是11机器上有store-a和store-b文件夹(store-a 已占用)。12机器上有store-b和store-a文件夹(store-b 已占用)

    文件同步如下:

    11机器上的主是store-a,从是12机器上的store-a。

    12机器上的主是store-b,从是11机器上的store-b。

    现在我们使用rocketmq官方给的2m-2s-async(双主双从异步复制master)。


    先看下目录结构:

    image.png

    我们现在要做的就是修改11机器上的broker-a.properties 和 broker-b-s.properties,反过来修改12机器上的broker-b.properties和broker-a-s.properties


    11 机器上的 broker-a.properties

    brokerClusterName=DefaultCluster
    brokerName=broker-a
    brokerId=0
    deleteWhen=04
    fileReservedTime=48
    brokerRole=ASYNC_MASTER
    flushDiskType=ASYNC_FLUSH
    
    # nameServer 服务地址列表
    namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    # Broker 对外服务的监听端口
    listenPort=11111
    # 存储路径
    storePathRootDir=/usr/local/rocketmq-4.8.0/store-a
    
    brokerIP1=10.211.55.11
    # 是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    # 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true


    11 机器上的broker-b-s.properties

    brokerClusterName=DefaultCluster
    brokerName=broker-b
    brokerId=1
    deleteWhen=04
    fileReservedTime=48
    brokerRole=SLAVE
    flushDiskType=ASYNC_FLUSH
    
    # nameServer 服务地址列表
    namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    # Broker 对外服务的监听端口
    listenPort=22222
    # 存储路径
    storePathRootDir=/usr/local/rocketmq-4.8.0/store-b

    12 机器上的broker-b.properties

    brokerClusterName=DefaultCluster
    brokerName=broker-b
    brokerId=0
    deleteWhen=04
    fileReservedTime=48
    brokerRole=ASYNC_MASTER
    flushDiskType=ASYNC_FLUSH
    
    # nameServer 服务地址列表
    namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    # Broker 对外服务的监听端口
    listenPort=22222
    # 存储路径
    storePathRootDir=/usr/local/rocketmq-4.8.0/store-b
    
    brokerIP1=10.211.55.12
    # 是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    # 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true


    12 机器上的broker-a-s.properties

    brokerClusterName=DefaultCluster
    brokerName=broker-a
    brokerId=1
    deleteWhen=04
    fileReservedTime=48
    brokerRole=SLAVE
    flushDiskType=ASYNC_FLUSH
    
    # nameServer 服务地址列表
    namesrvAddr=10.211.55.11:9876;10.211.55.12:9876
    # Broker 对外服务的监听端口
    listenPort=11111
    # 存储路径
    storePathRootDir=/usr/local/rocketmq-4.8.0/store-a


    注意观察两台机器4个文件的区别:

    主要在于brokerName、brokerId、brokerRole、listenPort、storePathRootDir 几个配置项。

    都配置完成后,现在我们挨个重新启动。

    # 按顺序启动
    # 分别启动两台机器上的namesrv服务
    > nohup sh bin/mqnamesrv &
    
    # 启动11机器上的broker master服务(Master)
    > nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
    # 启动12机器上的broker master服务
    > nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &
    
    # 启动11机器上的broker slave服务(Slave)
    > nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &
    # 启动12机器上的broker slave服务
    > nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &

    都启动完成后,我们看下是否成功。

    # 在两台机器上的任何一台执行以下命令(Ip也可以是两台中任何一台的ip)
    sh bin/mqadmin clusterList -n 10.211.55.11:9876


    输出如下图所示,则表示成功。

    image.png


    我们也可以使用rocketmq-console控制台查看一下:

    image.png

    这里的双主双从模式也配置完成。


    下一篇将会演示: JavaDemo案例演示双主 或者 双主双从 模式下的broker智能切换。


0 +1

版权声明

 Java  开源  rocketmq

 请文明留言

0 条评论