• 云原生中间件RocketMQ(三)RocketMQ集群(多Master和多Master-Slave方式)部署实操


    RocketMQ为我们提供了丰富的集群架构模型,包括单点模式、主从模式、双主模式以及生产上使用最多的双主双从模式(或者说多主多从模式)。更多细节可以查看我之前的文章:云原生中间件RocketMQ(二)源码包结构和集群架构模型。本文主要讲双主模式和多主多从模式的部署。

    双主模式(双Master)

    服务器准备

    需要准备两台服务器,172.xxx.xxx.1、172.xxx.xxx.2。

    IP

    角色

    模式

    172.xxx.xxx.1

    nameServer1,brokerServer1

    Master1

    172.xxx.xxx.2

    nameServer2,brokerServer2

    Master2

    hosts配置

    vi /etc/hosts
    
    • 1

    IP

    NAME

    172.xxx.xxx.1

    rocketmq-nameserver1

    172.xxx.xxx.1

    rocketmq-master1

    172.xxx.xxx.2

    rocketmq-nameserver2

    172.xxx.xxx.2

    rocketmq-master2

    上传解压【多服务器】

    # 上传apache-rocketmq.tar.gz文件至/usr/local
    tar -zxvf apache-rocketmq.tar.gz -C /usr/local
    
    ln -s apache-rocketmq rocketmq
    ll /usr/local
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建存储路径【多服务器】

    # 存储路径
    mkdir /usr/local/rocketmq/store
    # commitLog 存储路径
    mkdir /usr/local/rocketmq/store/commitlog
    # 消费队列存储路径存储路径
    mkdir /usr/local/rocketmq/store/consumequeue
    # 消息索引存储路径
    mkdir /usr/local/rocketmq/store/index
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    RocketMQ broker配置文件【多服务器】

    vim /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties
    
    vim /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties
    
    • 1
    • 2
    • 3

    文件内容如下:

    # 所属集群名字
    brokerClusterName=rocketmq-cluster
    #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a|broker-b
    #0 表示 Master,>0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=4
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    #Broker 对外服务的监听端口
    listenPort=10911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    fileReservedTime=120 #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #检测物理文件磁盘空间
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/usr/local/rocketmq/store
    #commitLog 存储路径
    storePathCommitLog=/usr/local/rocketmq/store/commitlog
    #消费队列存储路径存储路径
    storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
    #消息索引存储路径
    storePathIndex=/usr/local/rocketmq/store/index
    #checkpoint 文件存储路径
    storeCheckpoint=/usr/local/rocketmq/store/checkpoint
    #abort 文件存储路径
    abortFile=/usr/local/rocketmq/store/abort
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    #刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    #checkTransactionMessageEnable=false
    #发消息线程池数量
    #sendMessageThreadPoolNums=128
    #拉消息线程池数量
    #pullMessageThreadPoolNums=128
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    修改日志配置文件【多服务器】

    mkdir -p /usr/local/rocketmq/logs
    #
    cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
    
    • 1
    • 2
    • 3

    修改启动脚本参数【多服务器】

    因为broker默认的JVM参数为8g(JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"),可以依据实际情况调整,最少要分配1g。

    vim /usr/local/rocketmq/bin/runbroker.sh
    
    
    #==============================================================================
    # 开发环境JVM Configuration
    #==============================================================================
    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    nameserver参数调整:

    vim /usr/local/rocketmq/bin/runserver.sh
    
    
    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
    
    • 1
    • 2
    • 3
    • 4

    启动NameServer【多服务器】

    cd /usr/local/rocketmq/bin
    # 启动nameserver
    nohup sh mqnamesrv &
    
    • 1
    • 2
    • 3

    启动BrokerServer A【172.xxx.xxx.1】

    cd /usr/local/rocketmq/bin
    # 启动broker
    nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
    # 查看端口占用情况
    netstat -ntlp
    # 查看Java进程
    jps
    # 查看broker启动日志日志
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    # 查看namesrv启动日志
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    启动BrokerServer B【172.xxx.xxx.2】

    cd /usr/local/rocketmq/bin
    # 启动broker
    nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &
    # 查看端口占用情况
    netstat -ntlp
    # 查看Java进程
    jps
    # 查看broker启动日志日志
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    # 查看namesrv启动日志
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    数据清理

    cd /usr/local/rocketmq/bin
    
    sh mqshutdown broker
    
    sh mqshutdown namesrv
    
    ### 等待停止
    rm -rf /usr/local/rocketmq/store
    
    mkdir /usr/local/rocketmq/store
    
    mkdir /usr/local/rocketmq/store/commitlog
    
    mkdir /usr/local/rocketmq/store/consumequeue
    
    mkdir /usr/local/rocketmq/store/index
    
    ####      按照上面步骤重启NameServer与BrokerServer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    多主多从模式(多Master-Slave方式)

    多主多从模式分为俩种方式,第一种为异步复制,第二种为同步双写,我们暂且考虑其中的一种情况,注意:(RocketMQ每一种集群环境配置会对应一个不同的目录)
    双主模式,文件夹配置为: conf/2m-noslave/
    多主多从模式(异步复制),文件夹配置为: conf/2m-2s-async/
    多主多从模式(同步双写),文件夹配置为: conf/2m-2s-sync/

    服务器准备

    需要准备四台服务器,172.xxx.xxx.1、172.xxx.xxx.2、172.xxx.xxx.3、172.xxx.xxx.4。

    IP

    角色

    模式

    172.xxx.xxx.1

    nameServer1,brokerServer1

    Master1

    172.xxx.xxx.2

    nameServer2,brokerServer2

    Master2

    172.xxx.xxx.3

    nameServer3,brokerServer1-Slave

    Master1-Slave

    172.xxx.xxx.4

    nameServer2,brokerServer2-Slave

    Master2-Slave

    hosts配置

    vi /etc/hosts
    
    • 1

    IP

    NAME

    172.xxx.xxx.1

    rocketmq-nameserver1

    172.xxx.xxx.1

    rocketmq-master1

    172.xxx.xxx.2

    rocketmq-nameserver2

    172.xxx.xxx.2

    rocketmq-master2

    172.xxx.xxx.3

    rocketmq-nameserver3

    172.xxx.xxx.3

    rocketmq-master1-slave

    172.xxx.xxx.4

    rocketmq-nameserver4

    172.xxx.xxx.4

    rocketmq-master2-slave

    上传解压【多服务器】

    # 上传apache-rocketmq.tar.gz文件至/usr/local
    tar -zxvf apache-rocketmq.tar.gz -C /usr/local
    
    ln -s apache-rocketmq rocketmq
    ll /usr/local
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建存储路径【多服务器】

    mkdir /usr/local/rocketmq/store
    
    mkdir /usr/local/rocketmq/store/commitlog
    
    mkdir /usr/local/rocketmq/store/consumequeue
    
    mkdir /usr/local/rocketmq/store/index
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    RocketMQ配置文件【多服务器】

    vim /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties
    #
    vim /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties
    #
    vim /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties
    #
    vim /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    broker-a.properties、broker-b.properties配置如下:

    #所属集群名字
    brokerClusterName=rocketmq-cluster
    #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a|broker-b
    #0 表示 Master,>0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=4
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    #Broker 对外服务的监听端口
    listenPort=10911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    fileReservedTime=120 #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #检测物理文件磁盘空间
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/usr/local/rocketmq/store
    #commitLog 存储路径
    storePathCommitLog=/usr/local/rocketmq/store/commitlog
    #消费队列存储路径存储路径
    storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
    #消息索引存储路径
    storePathIndex=/usr/local/rocketmq/store/index
    #checkpoint 文件存储路径
    storeCheckpoint=/usr/local/rocketmq/store/checkpoint
    #abort 文件存储路径
    abortFile=/usr/local/rocketmq/store/abort
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    #刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    #checkTransactionMessageEnable=false
    #发消息线程池数量
    #sendMessageThreadPoolNums=128
    #拉消息线程池数量
    #pullMessageThreadPoolNums=128
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    broker-a-s.properties、broker-b-s.properties配置如下:

    #所属集群名字
    brokerClusterName=rocketmq-cluster #broker名字,注意此处不同的配置文件填写的不一样,与Master通过brokerName来配对 brokerName=broker-a|broker-b
    #0 表示 Master,>0 表示 Slave
    brokerId=1
    #nameServer地址,分号分割
    namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=4
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    #Broker 对外服务的监听端口
    listenPort=10911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    fileReservedTime=120 #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #检测物理文件磁盘空间
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/usr/local/rocketmq/store
    #commitLog 存储路径
    storePathCommitLog=/usr/local/rocketmq/store/commitlog
    #消费队列存储路径存储路径
    storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
    #消息索引存储路径
    storePathIndex=/usr/local/rocketmq/store/index
    #checkpoint 文件存储路径
    storeCheckpoint=/usr/local/rocketmq/store/checkpoint
    #abort 文件存储路径
    abortFile=/usr/local/rocketmq/store/abort
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=SLAVE
    #刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    #checkTransactionMessageEnable=false
    #发消息线程池数量
    #sendMessageThreadPoolNums=128
    #拉消息线程池数量
    #pullMessageThreadPoolNums=128
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    修改日志配置文件【多服务器】

    mkdir -p /usr/local/rocketmq/logs
    #
    cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
    
    • 1
    • 2
    • 3

    修改启动脚本参数【多服务器】

    vim /usr/local/rocketmq/bin/runbroker.sh
    
    
    #==============================================================================
    # 开发环境JVM Configuration
    #==============================================================================
    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
    
    
    vim /usr/local/rocketmq/bin/runserver.sh
    
    
    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    启动NameServer

    cd /usr/local/rocketmq/bin
    #
    nohup sh mqnamesrv &
    
    • 1
    • 2
    • 3

    启动Master1:BrokerServerA

    cd /usr/local/rocketmq/bin
    #
    nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 &
    #
    netstat -ntlp
    #
    jps
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    启动Master2:BrokerServerB

    #
    cd /usr/local/rocketmq/bin
    #
    nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties >/dev/null 2>&1 &
    #
    netstat -ntlp
    #
    jps
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    启动Master1-Slave:BrokerServerC

    #
    cd /usr/local/rocketmq/bin
    #
    nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties >/dev/null 2>&1 &
    #
    netstat -ntlp
    #
    jps
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    启动Master2-Slave:BrokerServerD

    #
    cd /usr/local/rocketmq/bin
    #
    nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties >/dev/null 2>&1 &
    #
    netstat -ntlp
    #
    jps
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    #
    tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    服务停止(首先关闭4个BrokerServer,再关闭4个NameServer)

    #
    cd /usr/local/rocketmq/bin
    #
    sh mqshutdown broker
    #
    sh mqshutdown namesrv
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用注意事项

    消费重试机制

    第几次重试

    每次重试间隔时间

    1

    10 秒

    2

    30 秒

    3

    1 分钟

    4

    2 分钟

    5

    3 分钟

    6

    4 分钟

    7

    5 分钟

    8

    6 分钟

    9

    7 分钟

    10

    8 分钟

    11

    9 分钟

    12

    10 分钟

    13

    20 分钟

    14

    30 分钟

    15

    1 小时

    16

    2 小时

    消费端做幂等处理

    RocketMQ 无法避免消息重复,如果业务对消费重复非常敏感,务必要在业务局面去重。
    有以下几种去重方式:

    1. 将消息的唯一键,可以是 msgId,也可以是消息内容中的唯一标识字段,例如订单 Id 等。 建议最好使用消息内容中的唯一标识字段去重。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    JavaWeb简单实例——DBCP数据库连接池
    叮当健康(9886.HK)赴港上市,“快+全”组合下继续保持行业领先
    达梦DEM监控配置
    如何开发移动应用:iOS和Android的比较
    BLDC 四大方案
    Angular 中的路由
    this.$set用法
    bash中执行比较的几种方法
    如何训练ChatGPT以提高其文学创作和创造性写作技能?
    【JAVA】异常
  • 原文地址:https://blog.csdn.net/m0_67402970/article/details/126080884