RocketMQ 集群搭建

  简单研究下其集群策略以及集群搭建方式。

  参考: https://github.com/apache/rocketmq/blob/master/docs/cn/operation.md

1. 集群架构图

2. 数据复制与刷盘策略

复制策略: 指的是broker的主从节点之间的数据同步方式,分为同步复制与异步复制

同步复制:消息写入master后,master会等待slave同步数据成功之后才向producer返回成功ACK

异步复制:消息写入master后,master会立即向producer返回成功ack,无需等待slave 同步完成。异步复制策略会降低系统的写入延迟,RT 响应时间变小,增加了系统吞吐量

刷盘策略:指的是broker 中的数据落盘的方式,即消息发送到broker内存后消息持久化到磁盘的方式。分为同步刷盘与异步刷盘。

同步刷盘: 当消息持久化到磁盘才算消息写入成功

异步刷盘: 消息到达内存即算成功。异步刷盘会降低系统的写入延迟,RT变小,提高了吞吐量;消息写入到broker 的内存,一般是写入到了pageCache, 对于异步刷盘,pageCache 达到一定量时会自动落盘。

3. broker 集群模式

根据节点间关系不同,可以分为:

单master(单机版)

多master: broker集群由多个master 构成,不存在slave。 同一Topic 的各个Queue 会平均分配到多个master 节点上。

多master 多slave模式 - 异步复制:broker集群由多个master 构成,每个master 又配置了多个slave。master 与 slave 的关系是主备关系,master 负责读写请求、slave 负责消息的备份与master节点宕机后的角色切换。 由于是异步复制,所以会有可能有消息丢失的情况。

多master 多slave模式 - 同步双写: 与上面的区别是,master与slave 数据是同步复制的,即同步双写。

补充:关于RAID10 磁盘阵列

RAID: redundant Array of Independent Disks 独立磁盘冗余阵列, 是一种硬件技术。 RAID主要利用镜像、数据条带、数据校验三种技术来获取高性能、可靠性、容错能力和扩展性。

镜像技术: 在磁盘阵列中有多个相同的数据副本,并且分布在多个不同的磁盘上。当一个数据副本失效时,可以访问另一个副本,这样达到数据备份的目的。坏处是写性能会降低。

数据条带技术: 自动将IO操作负载均衡到多个物理磁盘上。具体说就是将一块连续的数据分成很多小部分并存储到不同的磁盘上。这就能使多个进程并发访问数据的对个不同部分,从而提高IO并行能力。

数据校验:利用冗余数据进行数据错误检测和修复,冗余数据通常采用海明码、异或操作等算法来计算获得。利用校验功能,可以很大程度上提高磁盘阵列的可靠性、鲁棒性和容错能力。不过,数据校验需要从多处读取数据并进行计算和对比,会影响系统性能。

  RAID 有等级,原始是0-6 等级,后来又推出7、10、01、53 等等级。目前使用最多的是0、1、3、5、6、10。 每个等级代表一种实现方法和技术,等级之间没有高低,只是技术点不同。RAID10 就是RAID1和RAID0的合体,先做条带,再做镜像。也就是先将数据分散到不同的磁盘,然后再将磁盘中的数据做镜像。

 4. 集群环境搭建

  本次搭建集群模式为两个master, 两个slave集群, 且复制模式为异步复制。

集群节点之间关系:

rocketmq1 192.168.13.101 Master1+Slave2 
rocketmq2
192.168.13.102 Master2+Slave1

1. 环境信息修改

  两个主机分别对应如上信息,下面修改其中一个,另一个类似修改即可。

1. 修改两个主机的hostname

查看可以用:hostname\ hostnamectl

修改: 直接编辑/etc/hostname 即可, 或者用如下命令,实际上也是修改的/etc/hostname 文件

hostnamectl set-hostname rocketmq1 

2.  修改两个主机的网络信息,改为上述的IP,这里采用静态ip 修改 /etc/sysconfig/network-scripts/ifcfg-ens33 , 内容如下

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=4843987d-3495-4240-adec-17e877868f97
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.13.101
GATEWAY=192.168.13.2
NETMASK=255.255.255.0

设置DNS 服务器 vim /etc/resolv.conf (如果设置了静态ip, 必须设置这个,否则访问不到一些域名网站)

cat >> /etc/resolv.conf << EOF
nameserver 114.114.114.114
EOF

然后ping baidu.com 进行测试

 2. 修改配置文件

rocketMQ 提供了几个模板配置类,在%rocketmq%/conf 目录下。如下:

[root@rocketmq1 conf]# pwd
/opt/rocketmq/rocketmq-4.9.2/conf
[root@rocketmq1 conf]# ll | grep '^d'
drwxr-xr-x. 2 root root   118 Jan  4 05:56 2m-2s-async
drwxr-xr-x. 2 root root   118 Oct 22 13:41 2m-2s-sync
drwxr-xr-x. 2 root root    91 Oct 22 13:41 2m-noslave
drwxr-xr-x. 2 root root    72 Oct 22 13:41 dledger

2m-2s-async 是2主2从,异步复制的模板; 2m-2s-sync 是2主2从同步复制的模板; 2m-noslave 是2主没有从的配置。

下main修改 2m-2s-async 里面的配置,修改前将目录复制备份下。

1. 查看 2m-2s-async 目录下面的文件

broker-a.properties  broker-a-s.properties  broker-b.properties  broker-b-s.properties

四个配置文件构成一个集群,四个配置的brokerClusterName 是一致的,代表一个相同的集群;brokerName 代表大集群中的小集群,也就是主从节点关系。

broker-a.properties、broker-a-s.properties 是成对出现的,一个主一个从, 两者内部的brokerName 一致; 同理,broker-b.properties、broker-b-s.properties 也是如此。

下面修改四个配置文件, 然后后面启动集群的时候选择不同的配置文件启动,然后构成不同的集群。

13.101 机器修改两个配置:

(1) broker-a.properties 文件

# 集群名称,整个集群名称
brokerClusterName=DefaultCluster
# 指定master-slave 集群的名称,一个RocketMQ 可以包含多个master-slave 集群
brokerName=broker-a
# brokerId,为0 代表master
brokerId=0
# 指定删除消息存储过期文件的时间为凌晨4点
deleteWhen=04
# 指定未发生更新的消息存储文件的保留时长为48小时,48小时后过期,将会被删除 
fileReservedTime=48
# 指定当前broker为异步复制master 
brokerRole=ASYNC_MASTER
# 指定刷盘策略为异步刷盘
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876

  增加了个namesrvAddr 地址配置

(2) broker-b-s.properties 文件

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876
# 指定Broker对外提供服务的端口,即Broker与producer与consumer通信的端口。默认 10911。由于当前主机同时充当着master1与slave2,而前面的master1使用的是默认 里需要将这两个端口加以区分,以区分出master1与slave2 
listenPort=11911
# 指定消息存储相关的路径。默认路径为~/store目录。由于当前主机同时充当着master1与 slave2,master1使用的是默认路径,这里就需要再指定一个不同路径
storePathRootDir=~/store-s
storePathCommitLog=~/store-s/commitlog
storePathConsumeQueue=~/store-s/consumequeue
storePathIndex=~/store-s/index
storeCheckpoint=~/store-s/checkpoint
abortFile=~/store-s/abort

13.102 机器修改两个配置:

(1) broker-b.properties 文件

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876

(2) broker-a-s.properties 文件

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876
# 指定Broker对外提供服务的端口,即Broker与producer与consumer通信的端口。默认 10911。由于当前主机同时充当着master1与slave2,而前面的master1使用的是默认 里需要将这两个端口加以区分,以区分出master1与slave2 
listenPort=11911
# 指定消息存储相关的路径。默认路径为~/store目录。由于当前主机同时充当着master1与 slave2,master1使用的是默认路径,这里就需要再指定一个不同路径 
storePathRootDir=~/store-s
storePathCommitLog=~/store-s/commitlog
storePathConsumeQueue=~/store-s/consumequeue
storePathIndex=~/store-s/index
storeCheckpoint=~/store-s/checkpoint
abortFile=~/store-s/abort

3. 启动集群

启动: 两个机子启动nameserver

nohup sh bin/mqnamesrv &

启动Broker 集群

(1)rocketmq1 启动 master 节点:

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &

(2)rocketmq2 启动 master 节点:

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &

(3)rocket1 启动 slave 节点:

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &

(4)rocket2 启动 slave 节点:

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &

4. 两个机子查看java 进程

rocketmq1:

[root@rocketmq1 rocketmq-4.9.2]# jps -l | grep -v 'jps'
29170 org.apache.rocketmq.broker.BrokerStartup
29097 org.apache.rocketmq.broker.BrokerStartup
15210 org.apache.rocketmq.namesrv.NamesrvStartup

rocketmq2:

[root@rocketmq2 rocketmq-4.9.2]# jps -l | grep -v 'jps'
15697 org.apache.rocketmq.namesrv.NamesrvStartup
25251 org.apache.rocketmq.broker.BrokerStartup
25335 org.apache.rocketmq.broker.BrokerStartup

5. 查看集群

(1) mqadmin管理工具可以查看,mqadmin 是自带的一个管理工具。 关于mqadmin 具体用法可以参考上面连接。

[root@rocketmq1 rocketmq-4.9.2]# ./bin/mqadmin clusterList -n 192.168.13.101:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap).
RocketMQLog:WARN Please initialize the logger system properly.
#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
DefaultCluster    broker-a                0     192.168.13.101:10911   V4_9_2                   0.00(0,0ms)         0.00(0,0ms)          0 455960.76 0.6200
DefaultCluster    broker-a                1     192.168.13.102:11911   V4_9_2                   0.00(0,0ms)         0.00(0,0ms)          0 455960.76 0.6100
DefaultCluster    broker-b                0     192.168.13.102:10911   V4_9_2                   0.00(0,0ms)         0.00(0,0ms)          0 455960.76 0.6100
DefaultCluster    broker-b                1     192.168.13.101:11911   V4_9_2                   0.00(0,0ms)         0.00(0,0ms)          0 455960.76 0.6200

(2) mqadmin 查看相关topic

[root@rocketmq1 rocketmq-4.9.2]# ./bin/mqadmin topicList -n 192.168.13.101:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap).
RocketMQLog:WARN Please initialize the logger system properly.
RMQ_SYS_TRANS_HALF_TOPIC
%RETRY%please_rename_unique_group_name_4
BenchmarkTest
OFFSET_MOVED_EVENT
TBW102
SELF_TEST_TOPIC
DefaultCluster
SCHEDULE_TOPIC_XXXX
DefaultCluster_REPLY_TOPIC
broker-b
TopicTest
broker-a
%RETRY%__MONITOR_CONSUMER
%RETRY%TOOLS_CONSUMER
localhost.localdomain

(3) 查看Topic的路由信息

[root@rocketmq2 rocketmq-4.9.2]# ./bin/mqadmin topicRoute -t TopicTest -n 192.168.13.101:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap).
RocketMQLog:WARN Please initialize the logger system properly.
{
        "brokerDatas":[
                {
                        "brokerAddrs":{0:"192.168.13.102:10911",1:"192.168.13.101:11911"
                        },
                        "brokerName":"broker-b",
                        "cluster":"DefaultCluster"
                },
                {
                        "brokerAddrs":{0:"192.168.13.101:10911",1:"192.168.13.102:11911"
                        },
                        "brokerName":"broker-a",
                        "cluster":"DefaultCluster"
                }
        ],
        "filterServerTable":{},
        "queueDatas":[
                {
                        "brokerName":"broker-a",
                        "perm":6,
                        "readQueueNums":4,
                        "topicSysFlag":0,
                        "writeQueueNums":4
                },
                {
                        "brokerName":"broker-b",
                        "perm":6,
                        "readQueueNums":4,
                        "topicSysFlag":0,
                        "writeQueueNums":4
                }
        ]
}

6. 可视化界面查看集群

也可以从之前的可视化界面查看集群信息

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】
原文地址:https://www.cnblogs.com/qlqwjy/p/15763458.html