RocketMQ集群 双主双从同步模式(2m-2s-sync)搭建

集群架构概念 

在部署的时候首先要将nameserver启动起来,之后就是将broker启动起来,broker启动起来会将自己的信息注册到nameserver上面。之后再去创建topic,因为发消息的逻辑和收消息的逻辑都是要基于topic来实现的。

有了topic才能将消息发到某个topic上面,也就是某个主题上面,这个topic是自己可以去建立的。这个topic就是用来区分消息的。

现在建立了topic1,那么生产者就可以把消息往t1上面发。topic是建立在nameserver上面,它其实是逻辑上面的概念。topic和broker在nameserver上面会形成映射的关系。具体物理的保存是保存在broker上面。也就是具体的topic和broker映射关系是保存在nameserver上面的,具体topic对应的消息保存在broker上面。(创建某个topic那么就在broker上面创建出来了)

生产者启动了就要随机选择一个nameserver然后建立长连接。长连接的目的就是定期的获取topic信息。生产者就可以往topic对应的broker上发送消息。

生产者发送完消息了(或者先启动消费者也行),消费者这边也是随机选择nameserver建立长连接,或得topic的信息,它要去连接到broker上面,从broker上面不断的去拉取数据消息。

RocketMQ集群模式 

2m-2s表示两个master两个slave,async是异步的刷盘方式,sync是同步的刷盘方式。

为了追求更好的性能,RocketMQ的最佳实践⽅式都是在集群模式下完成。 RocketMQ官⽅提供了三种集群搭建⽅式。

broker master和slave之间需要做数据的复制,主从模式下也是为了提高broker的性能。
broker会有消费者c1 c2, 都会消费broker里面的某个topic,前提条件c1 c2不在同一个消费组里面。
这两个消费者在消费一个topic,怎么提高这两个消费者的并发性能?可以让一个消费者去消费master,另外一个消费者去消费salve。这样master和salve都在应对消费的动作,这个时候性能就提高了两倍。
c1 c2分别消费主节点,生产者去发送消息的时候,消息发送到master这边。master需要做的事情就是同步。 master要将消息数据复制给从节点。复制的方式有两种,一种是同步的复制,一种是异步的复制。
  1. 同步复制:生产者消息发过去之后,要等到slave数据复制完成了,生产者才能发送下一条消息,这样对生产者来说可能会发生阻塞。
     
  2. 异步复制:生产者发过去之后,通过异步刷盘同步数据,对于生产者来说无需等待slave复制master完成,还可以继续发送下一条。
  • 22从异步通信⽅式
使⽤异步⽅式进⾏主从之间的数据复制,吞吐量⼤,但可能会丢消息。 使⽤ conf/2m-2s-async ⽂件夹内的配置⽂件做集群配置。
消息过去之后,它不知道有没有复制成功,producer马上就发下一条消息,同步就知道消息没有复制成功,生产者就可以知道重新再发送这条消息。
在异步的方式里面不知道有没有发送成功,但是下一条消息已经发送过去了,这样就可以造成丢失消息。
  • 22从同步通信⽅式
使⽤同步⽅式进⾏主从之间的数据复制,保证消息安全投递,不会丢失,但影响吞吐量(发送消息的速度就下来了)使⽤ conf/2m-2s-sync ⽂件夹内的配置⽂件做集群配置。
producer会知道消息已经安全的到达主和从消息里面了。你才会做下一件事情。所以在这个过程当中对于生产者来说是阻塞的。阻塞的时候跳出阻塞状态就应该得到这个结果是成功的还是失败的。
如果是失败的就可以再发。
  • 2主⽆从⽅式
会存在单点故障,且读的性能没有前两种⽅式好。 使⽤ conf/2m-noslave ⽂件夹内的配置⽂件做集群配置。
  • Dledger⾼可⽤集群
上述三种官⽅提供的集群没办法实现⾼可⽤,即在 master 节点挂掉后, slave 节点没办法⾃动被选举为新的master ,⽽需要⼈⼯实现。 RocketMQ在 4.5 版本之后引⼊了第三⽅的 Dleger ⾼可⽤集群。
[root@localhost 2m-2s-sync]# ls -l
total 16
-rw-r--r--. 1 root root 928 Feb 22  2024 broker-a.properties
-rw-r--r--. 1 root root 922 Feb 22  2024 broker-a-s.properties
-rw-r--r--. 1 root root 928 Feb 22  2024 broker-b.properties
-rw-r--r--. 1 root root 922 Feb 22  2024 broker-b-s.properties

broker-a.properties  broker-b.properties  描述的是两个master
broker-a-s.properties  broker-b-s.properties  描述的是两个master对应的从节点

防火墙配置(两台机器都要执行)


可以开放端口,此处本地实现,简单粗暴点儿,直接关闭防火墙;
#检查状态
systemctl status firewalld
#关闭防火墙
systemctl stop firewalld
#禁止防火墙开机启动
systemctl disable firewalld
 

启动两台nameserver

服务器1:192.168.136.66    broker-a master ,broker-b-s slave)  nameserver 
                                                 Master1,Slave2

注意在一台机器上的broker关系不是一主一从,主从关系分别在不同的服务器上面。如果挂掉其中一台,那么还有另外一台,其中的broker-a和broker-b还是存在的。 如果全部都挂了,那就惨了。

服务器2:192.168.136.67    broker-bmaster,broker-a-sslave)  nameserver                                                                        Master2,Slave1

启动 RocketMQ 服务需要先启动 NameServer 。 在bin ⽬录内使⽤静默⽅式启动。
nameserver 是⼀个轻量级的注册中⼼, broker 把⾃⼰的信息注册到 nameserver 上。 ⽽且,nameserver 是⽆状态的,直接启动即可。三台 nameserver 之间不需要通信,而是被请求⽅来关联三台nameserver 的地址。
修改启动脚本

修改配置文件runserver.sh,主要是修改JVM参数:因为rocketmq默认配置的JVM参数太大,本地资源有限,所以就改小点儿;

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -
XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

在每台服务器的bin⽬录下执⾏如下命令:

cd /usr/local/rocketmq/bin
nohup sh mqnamesrv 2>&1 &

查看bin/nohup.out显示如下内容表示启动成功: 

[root@localhost bin]# cat nohup.out 
OpenJDK 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
OpenJDK 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
The Name Server boot success. serializeType=JSON

创建消息存储路径

两个broker存储的路径要不一样。

因为同一台机器主从节点共用存储路径会冲突报错,这里我们分别创建两个目录避坑,我们在下一步中配置文件就用对应的路径就可以了;

#第一个节点使用目录
mkdir -p /usr/local/rocketmq/broker-a-master/store
mkdir -p /usr/local/rocketmq/broker-b-slave/store
 
#第二个节点节点使用目录
mkidr -p /usr/local/rocketmq/broker-a-slave/store
mkdir -p /usr/local/rocketmq/broker-b-master/store

broker配置文件,配置文件修改如下:
配置文件位置在conf文件目录下。我们使用2m-2s-sync文件夹里面的配置,这个就是对应双主-双从-同步集群

下面配置文件可直接使用:
各配置文件主要区别有主要有以下几个点:brokerName、brokerId、listenPort、brokerRole、flushDiskType、存储路径;
 

服务器1:192.168.136.66  操作配置

conf/2m-2s-sync 下面有四个配置文件,但是这四个配置文件并不是我们都需要。节点一上面需要配置broker-a.properties  broker-b-s.properties,节点二上面需要broker-a-s.properties  broker-b.properties


首先对192.168.136.66机器上要部署的master1和slave2配置文件进行修改:

编辑broker-a.properties:

  • brokerClusterName=rocketmq-cluster      根据实际业务来调整集群名称
  • brokerName=broker-a          主从角色的broker名称都保持一致
  • brokerId=1    只有brokerId=1才会参与到负载均衡的读当中
  • defaultTopicQueueNums=4  创建topic的时候默认会跟着message quenue,也就是队列。当topic创建出来会带四个队列,将topic分为了四个区域。消息进入四个队列里面的其中一个队列。
[root@localhost 2m-2s-sync]# cat broker-a.properties 
#所属集群名称
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样;主从节点一样,也就是这个值区分broker组的;
brokerName=broker-a
#主从标识:0 表示Master, >0 表示Slave;同一个组中区分主从的标识,只能有一个主;
brokerId=0
#nameServer地址,分号分割
namesrvAddr=192.168.136.66:9876;192.168.136.67:9876
#在发消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除长期无用文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间(h),默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/broker-a-master/store
#commitLog存储路径
storePathCommitLog=/usr/local/rocketmq/broker-a-master/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketmq/broker-a-master/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/broker-a-master/store/index
#checkpoint 文件存储路径
storeCheckPoint=/usr/local/rocketmq/broker-a-master/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/broker-a-master/store/abort
#限制的消息大小
maxMessageSize=65536
#broker角色
#- ASYNC_MASTER    异步复制Master
#- SYNC_MASTER     同步双写Master
#- SLAVE    从节点
brokerRole=ASYNC_MASTER
#刷盘策略
#- ASYNC_FLUSH    异步刷盘
#- SYNC_FLUSH     同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

这个先可以先只启动一台broker, 可以先让生产者去发送消息的。生产者发送消息是要发送到topic上面的。但是现在没有做创建topic这个动作。

autoCreateTopicEnable = true   这个功能打开是在发送消息的时候自动创建topic,让你将消息发送到这个topic上面,当这个topic不存在的时候会创建出来
namesrvAddr=192.168.136.66:9876;192.168.136.67:9876  这个broker要注册到哪个nameserver上面

The broker[broker-a, 192.168.136.66:10911] boot success. serializeType=JSON and name server is 192.168.136.66:9876;192.168.136.67:9876
The broker[broker-b, 192.168.136.66:11011] boot success. serializeType=JSON and name server is 192.168.136.66:9876;192.168.136.67:9876

The broker[broker-a, 192.168.136.67:11011] boot success. serializeType=JSON and name server is 192.168.136.66:9876;192.168.136.67:9876
The broker[broker-b, 192.168.136.67:10911] boot success. serializeType=JSON and name server is 192.168.136.66:9876;192.168.136.67:9876

可以看到broker启动成功了,端口为10911,它会将信息放在192.168.136.66:9876;

192.168.136.67:9876这两台nameserver上面。这个生产者程序就需要有这个环境变量才能够找到要连接的nameserver。

编辑broker-b-s.properties:

[root@localhost 2m-2s-sync]# cat broker-b-s.properties 
#所属集群名称
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#主从标识:0 表示Master, >0 表示Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=192.168.136.66:9876;192.168.136.67:9876
#在发消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除长期无用文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间(h),默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/broker-b-slave/store
#commitLog存储路径
storePathCommitLog=/usr/local/rocketmq/broker-b-slave/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketmq/broker-b-slave/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/broker-b-slave/store/index
#checkpoint 文件存储路径
storeCheckPoint=/usr/local/rocketmq/broker-b-slave/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/broker-b-slave/store/abort
#限制的消息大小
maxMessageSize=65536
#broker角色
#- ASYNC_MASTER    异步复制Master
#- SYNC_MASTER     同步双写Master
#- SLAVE    从节点
brokerRole=SLAVE
#刷盘策略
#- ASYNC_FLUSH    异步刷盘
#- SYNC_FLUSH     同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

 

 

 服务启动

2)启动broker集群

-c   参数指定的是以哪个配置文件来启动

192.168.136.66 启动master1和slave2
master1:

cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a.properties &

slave2:

cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b-s.properties &
  • 192.168.136.67上启动master2和slave1
    master2:
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b.properties &

slave1:

cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a-s.properties &

The broker[broker-a, 192.168.136.67:11011] boot success. serializeType=JSON and name server is 192.168.136.66:9876;192.168.136.67:9876

The broker[broker-b, 192.168.136.67:10911] boot success. serializeType=JSON and name server is 192.168.136.66:9876;192.168.136.67:9876 

可以看到broker启动成功和连接到的集群 ,将自己的信息注册到nameserver集群上面,nameserver又是无状态的,所以在broker里面会去配置全部的nameserver的地址。nameserver之间无状态没关系,每台nameserver之间可以收到broker a b的数据。nameserver之间都会有各自的全量的数据。

查看进程状态

# 查看nameServer日志
tail -500f ~/logs/rocketmqlogs/namesrv.log
# 查看broker日志
tail -500f ~/logs/rocketmqlogs/broker.log

可以看到在当前服务器上面有哪些Java程序,一个是nameserver,两个broker。还可以看到pid。 

[root@localhost 2m-2s-sync]# jps 
66851 NamesrvStartup
69639 BrokerStartup
71544 jar
73436 Jps
69534 BrokerStartup

 服务停止(依次执行以下两条命令即可)

sh bin/mqshutdown broker

The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK

sh bin/mqshutdown namesrv

The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK

 

 

Tags · apache/rocketmq-dashboard · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值