CentOS 8 + RocketMQ 4.9.0 双主双从配置(同步)与Broker从(Slave)节点启动失败(闪退、Exit 253 255)解决方案

文章结构:双主双从配置中顺带夹杂着Slave节点启动失败的解决方法

截止2021-07-07(中国人永远铭记七七!不忘历史!),我仍找不到较完整的Broker从节点闪退解决方法,因此撰写一篇

闪退问题所在1
闪退问题所在2
闪退问题所在3
闪退问题所在4

一、需要2个Linux服务器

原本需要4个,但本人电脑太捞了…
这2个服务器需先配好JDK8、RocketMQ4的环境
如何配置JDK8请跳转:CentOS8安装JDK1.8.0(tar.gz形式)

二、修改RockeMQ的启动内存

闪退问题所在1:

服务器性能太捞,而RocketMQ默认的启动所需内存大,服务器蚌埠住就会让RocketMQ滚,这…连NameServer都别想启动了,还说什么Broker从节点呢…

1、进入runserver.sh,修改内存

路径按自己的实际情况改(之后需要路径的地方也是如此)

vim /usr/local/soft/rocketmq-4.9.0/bin/runserver.sh

找到原来的:

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

改为:

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
2、进入runbroker.sh
vim /usr/local/soft/rocketmq-4.9.0/bin/runbroker.sh

找到原来的:

JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"

改为:

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

三、RocketMQ节点设置

1、构建思路

Broker主从交叉,目的是防止某个服务器宕了后该服务器中的消息数据全部丢失

服务器IP角色Broker节点
1192.168.1.1NameServer、BrokerMaster1、Slave2
2192.168.1.2NameServer、BrokerMaster2、Slave1
2、依据构建的节点来修改Hosts
(1) 主要目的是为节点IP起别名,方便书写

进入hosts:

vim /etc/hosts

添加上:

# nameserver
192.168.1.1 rocketmq-nameserver1
192.168.1.2 rocketmq-nameserver2
# broker
192.168.1.1 rocketmq-master1
192.168.1.1 rocketmq-slave2
192.168.1.2 rocketmq-master2
192.168.1.2 rocketmq-slave1
(2) 重启网卡(与CentOS7的systemctl不同)
nmcli connection down ens33 && nmcli connection up ens33

四、关闭防火墙

关闭防火墙:

systemctl stop firewalld.service

查看防火墙状态:

firewall-cmd --state

禁止防火墙开机启动:

systemctl disable firewalld.service

五、配置RocketMQ环境变量

进入配置文件:

vim /etc/profile

在文件最末端添加:

# Set RocketMQ
ROCKETMQ_HOME=/usr/local/soft/rocketmq-4.9.0
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME
export PATH

让配置文件生效:

source /etc/profile

六、修改Broker配置文件

不建议通过Notepad++的NppFTP插件修改,有时候在Notepad++改了但Linux仍不变(可能存在延迟吧),这样会导致Broker启动失败

(一) 服务器1

1、Master1,即broker-a.properties

进入broker-a.properties:

vim /usr/local/soft/rocketmq-4.9.0/conf/2m-2s-sync/broker-a.properties

注释掉原有内容(之后提及的3个properties配置文件都得这样,下方不再提及):

# brokerClusterName=DefaultCluster
# brokerName=broker-b
# brokerId=1
# deleteWhen=04
# fileReservedTime=48
# brokerRole=SLAVE
# flushDiskType=ASYNC_FLUSH

添加以下内容:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样; 在broker-b.properties中此处需要修改为:brokerName=broker-b
brokerName=broker-a
#0: Master; >0: Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#broker启动地址,rocketmq默认内网启动
brokerIP1=192.168.1.1
#broker的HAIP地址(供Slave同步消息的地址)
brokerIP2=192.168.1.1
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48h
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/soft/rocketmq-4.9.0/store-a1
#commitLog 存储路径
storePathCommitLog=/usr/local/soft/rocketmq-4.9.0/store-a1/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/soft/rocketmq-4.9.0/store-a1/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/soft/rocketmq-4.9.0/store-a1/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/soft/rocketmq-4.9.0/store-a1/checkpoint
#abort 文件存储路径
abortFile=/usr/local/soft/rocketmq-4.9.0/store-a1/abort
#限制的消息大小
maxMessageSize=65536
#Broker角色: ASYNC_MASTER(异步复制Master)、SYNC_MASTER(同步双写Master)、SLAVE(从节点)
brokerRole=SYNC_MASTER
#刷盘方式: ASYNC_FLUSH(异步刷盘)、SYNC_FLUSH(同步刷盘)
flushDiskType=SYNC_FLUSH
2、Slave2,即broker-b-s.properties

进入broker-b-s.properties:

vim /usr/local/soft/rocketmq-4.9.0/conf/2m-2s-sync/broker-b-s.properties

注释掉…
添加以下内容:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,在broker-b-s.properties中需修改为:brokerName=broker-b
brokerName=broker-b
#0: Master; >0: Slave
brokerId=50
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#broker启动地址,rocketmq默认内网启动
brokerIP1=192.168.1.1
#broker的HAIP地址(供Slave同步消息的地址)
brokerIP2=192.168.1.1
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48h
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/soft/rocketmq-4.9.0/store-b1
#commitLog 存储路径
storePathCommitLog=/usr/local/soft/rocketmq-4.9.0/store-b1/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/soft/rocketmq-4.9.0/store-b1/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/soft/rocketmq-4.9.0/store-b1/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/soft/rocketmq-4.9.0/store-b1/checkpoint
#abort 文件存储路径
abortFile=/usr/local/soft/rocketmq-4.9.0/store-b1/abort
#限制的消息大小
maxMessageSize=65536
#Broker角色: ASYNC_MASTER(异步复制Master)、SYNC_MASTER(同步双写Master)、SLAVE(从节点)
brokerRole=SLAVE
#刷盘方式: ASYNC_FLUSH(异步刷盘)、SYNC_FLUSH(同步刷盘)
flushDiskType=ASYNC_FLUSH
闪退问题所在2:

Master的监听端口都为10911,Slave的监听端口需与Master不同,否则会因端口占用导致Slave启动不了;Slave的端口都为:11011 (listenPort=11011)

闪退问题所在3:

(#problem3)Master与Slave的文件存储路径不能相同,若相同,则主从文件存储冲突,导致1个服务器中某个Broker启动失败
我设置的:
Master的文件存储路径都为:/store-a1
Slave的文件存储路径都为:/stroe-b1

闪退问题所在4:

Slave节点的ID问题,闪退会提示Exit 253;
一般大多人都设置为:brokerId=1,大于0就可以了,我原本也是如此,但是!这个RocketMQ有点瞎,认为这个Id小于等于0…因此我一不做二不休直接给Id个50,这就解决了闪退问题

至于我是如何发现这个RocketMQ这个Bug的(即问题4),在于启动Broker的命令中的1个细节
(1) 一开始看broker.log,没用
tail -200f ~/logs/rocketmqlogs/broker.log

看里面描述,连接都是没问题的,只有一些不明所以的内容启动失败,查来查去也查不出个所以然;那我就去找从节点的启动日志,找不到啊屑,据此开始打开另一个世界的大门,我想到Broker的启动命令

(2) 先贴出启动Broker从节点的命令
nohup ./mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties -n "rocketmq-nameserver1:9876;rocketmq-nameserver2:9876" 1>/dev/null 2>&1 &
(3) 注意其中的1个细节
1>/dev/null 2>&1 &

这个部分本身是我为了解决使用nohup时出现的:

nohup: ignoring input and appending output to 'nohup.out'
nohup: 忽略输入并把输出追加到nohup.out

添加上就不会出现了

这个细节的大致意思是:通过nohup的内容所产生的文件扔到/dev/null中,相当于扔到黑洞中,产生啥文件都给你吞掉

了解了这个细节的作用后,我就想,那我把产生的文件输出来,里面应该有启动日志,那我不是就知道问题出在哪里了吗?

(4) 修改启动命令,以输出日志
nohup ./mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties -n "rocketmq-nameserver1:9876;rocketmq-nameserver2:9876" >/root/logs/rocketmqlogs/broker-b-s.log 2>&1 &

我将该服务器启动Broker的日志内容输出到/root/logs/rocketmqlogs/broker-b-s.log之中

PS:解决问题后记得把自个输出的这些log文件删掉,以免出现其他问题

(5) 查看日志
tail -200f ~/logs/rocketmqlogs/broker-b-s.log

得出的答案是:

Slave's brokerId must be > 0

看了一脸问号…嫌我小?我得让RocketMQ康康什么叫大,给了个50

(6) RocketMQ部分源码

brokerId判断的源码,有兴趣可以看一下,没兴趣就跳过

// 根据broker角色设置brokerId值,0为master,大于0为slave
switch (messageStoreConfig.getBrokerRole()) {
    case ASYNC_MASTER:
    case SYNC_MASTER:
        brokerConfig.setBrokerId(MixAll.MASTER_ID);
        break;
    case SLAVE:
        if (brokerConfig.getBrokerId() <= 0) {
            System.out.printf("Slave's brokerId must be > 0");
            System.exit(-3);
        }

        break;
    default:
        break;
}

(二) 服务器2

1、Master2,即broker-b.properties

只说修改的配置文件内容,其他不写了:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字
brokerName=broker-b
#0: Master; >0: Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#broker启动地址,rocketmq默认内网启动
brokerIP1=192.168.1.2
#BrokerHAIP地址,供slave同步消息的地址
brokerIP2=192.168.1.2
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/soft/rocketmq-4.9.0/store-b2
#commitLog 存储路径
storePathCommitLog=/usr/local/soft/rocketmq-4.9.0/store-b2/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/soft/rocketmq-4.9.0/store-b2/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/soft/rocketmq-4.9.0/store-b2/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/soft/rocketmq-4.9.0/store-b2/checkpoint
#abort 文件存储路径
abortFile=/usr/local/soft/rocketmq-4.9.0/store-b2/abort
#限制的消息大小
maxMessageSize=65536
#Broker角色: ASYNC_MASTER(异步复制Master)、SYNC_MASTER(同步双写Master)、SLAVE(从节点)
brokerRole=SYNC_MASTER
#刷盘方式: ASYNC_FLUSH(异步刷盘)、SYNC_FLUSH(同步刷盘)
flushDiskType=SYNC_FLUSH
2、Slave1,即broker-a-s.properties

改配置:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字
brokerName=broker-a
#0: Master; >0: Slave
brokerId=70
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#broker启动地址,rocketmq默认内网启动
brokerIP1=192.168.75.131
#broker的HAIP地址(供Slave同步消息的地址)
brokerIP2=192.168.75.131
#在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/soft/rocketmq-4.9.0/store-a2
#commitLog 存储路径
storePathCommitLog=/usr/local/soft/rocketmq-4.9.0/store-a2/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/soft/rocketmq-4.9.0/store-a2/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/soft/rocketmq-4.9.0/store-a2/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/soft/rocketmq-4.9.0/store-a2/checkpoint
#abort 文件存储路径
abortFile=/usr/local/soft/rocketmq-4.9.0/store-a2/abort
#限制的消息大小
maxMessageSize=65536
#Broker角色: ASYNC_MASTER(异步复制Master)、SYNC_MASTER(同步双写Master)、SLAVE(从节点)
brokerRole=SLAVE
#刷盘方式: ASYNC_FLUSH(异步刷盘)、SYNC_FLUSH(同步刷盘)
flushDiskType=ASYNC_FLUSH

在配置RocketMQ时,感觉它总是没事抽抽风,冲突一下,我索性把服务器2的存储路径和Id改得和服务器1的不一样,服务器2的从节点Id我给了个70

至此,配置全部结束,开始启动!

七、启动RocketMQ节点(注意启动顺序)

1、进入bin目录

我使用的启动方法需要进入RocketMQ的bin目录,其实大同小异

(1) 服务器1
cd /usr/local/soft/rocketmq-4.9.0/bin/
(2) 服务器2

与1的一致

2、启动NameServer节点

IP不一致而已

(1) 服务器1
nohup ./mqnamesrv -n rocketmq-nameserver1:9876 1>/dev/null 2>&1 &
(2) 服务器2
nohup ./mqnamesrv -n rocketmq-nameserver2:9876 1>/dev/null 2>&1 &

毕竟是双主双从,因此要先把2个服务器的NmaeServer先启动好,不然2个服务器各自的Broker怎么与对方服务器的NmaeServer连接

3、启动Broker的Master与Slave
(1) 服务器1

Master1:

nohup ./mqbroker -c ../conf/2m-2s-sync/broker-a.properties -n "rocketmq-nameserver1:9876;rocketmq-nameserver2:9876" 1>/dev/null 2>&1 &

需要2个NameServer的IP+Port的原因:Broker启动,要与所有NameServer保持长连接,才能定时发送心跳包[包含:当前Broker信息(IP+Port等)、Topic信息];注册成功后,NameServer集群中就有Topic与Broker的映射信息
Slave2:

nohup ./mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties -n "rocketmq-nameserver1:9876;rocketmq-nameserver2:9876" 1>/dev/null 2>&1 &
(2) 服务器2

Master2:

nohup ./mqbroker -c ../conf/2m-2s-sync/broker-b.properties -n "rocketmq-nameserver1:9876;rocketmq-nameserver2:9876" 1>/dev/null 2>&1 &

Slave1:

nohup ./mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties -n "rocketmq-nameserver1:9876;rocketmq-nameserver1:9876" 1>/dev/null 2>&1 &
4、验证成功与否
jps

若都出现:

Jps
BrokerStartup
BrokerStartup
NamesrvStartup

则说明成功,出现的顺序不重要

八、关闭节点

要先关闭broker

./mqshutdown broker
./mqshutdown namesrv
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
CentOS双网卡主备配置Linux双网卡主备配置类似,也是需要使用Bonding模块和ifenslave工具来实现。具体步骤如下: 1. 确认系统内核支持Bonding模块,可以通过执行“modinfo bonding”命令来检查。 2. 安装ifenslave工具,该工具为Linux系统的网卡绑定工具,可以通过执行“yum install ifenslave”命令进行安装。 接下来,按照以下步骤进行双网卡主备的配置: 1. 修改网络配置文件 在/etc/sysconfig/network-scripts/目录下,创建ifcfg-bond0文件,并添加以下内容: DEVICE=bond0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Bond BONDING_MASTER=yes BONDING_OPTS="mode=active-backup miimon=100" 其中,DEVICE为绑定后的网卡名称,BOOTPROTO为IP地址获取方式,ONBOOT表示开机自启动,TYPE为Bond类型,BONDING_MASTER为主网卡,BONDING_OPTS为Bonding模块的参数,mode为active-backup表示使用主备模式进行聚合,miimon为检测网卡连接状态的时间间隔。 2. 配置网卡 在/etc/sysconfig/network-scripts/目录下,创建ifcfg-eth0和ifcfg-eth1文件,并添加以下内容: DEVICE=eth0 BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes DEVICE=eth1 BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes 其中,eth0和eth1为两张网卡的名称,BOOTPROTO为none表示不使用IP地址,ONBOOT表示开机自启动,MASTER为绑定后的网卡名称,SLAVE表示从网卡。 3. 重启网络服务 执行“systemctl restart network”重启网络服务,使配置生效。 完成以上配置后,CentOS双网卡主备即可实现。在主网卡(即eth0)故障时,备网卡(即eth1)会自动接管,从而保证网络的连通性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值