目录
四、RocketMQ集群
1、RocketMQ集群模式
1、单个Master
这是一种风险比较大的集群模式,因为一旦Broker重启或宕机期间,将会导致这个服务不可用因此是不建议线上环境去使用的。
2、多个Master
一个集群全部都是Master,没有Slave,它的优缺点如下:
优点:配置简单,单个Master宕机或者是重启维护对应用没有什么影响的,在磁盘配置为RAID10时,即时机器宕机不可恢复的情况下,消息也不会丢失(异步刷盘丢失少量消息,同步刷盘则是一条都不会丢失),性能最高。
缺点:当单个Broker宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息的实时性会受到影响。
3、多Master多Slave模式-异步复制
每个Master配置一个Slave,有多对Master-Slave,HA采用的是异步复制的方式,主备有短暂的消息延迟,毫秒级别(Master收到消息之后立刻向应用返回成功标识,同时向Slave写入消息)。优缺点如下:
优点:即时是磁盘损坏了,消息丢失的非常斯奥,且消息实时性不会受到影响,因为Master宕机之后,消费者仍然可以从Slave消费,此过程对应用透明,不需要人工干预,性能同多个Master模式机会一样。
缺点:Master宕机,磁盘损坏的情况下,会丢失少量的消息。
4、多Master多Slave模式-同步双写
每个Master配置一个Slave,有多对的Master-Slave,HA采用的是同步双鞋模式,主备都写成功,才会向应用返回成功。
优点:数据与服务都无单点,Master宕机的情况下,消息无延迟,服务可用性与数据可用性都非常高
缺点:性能比异步复制模式略低,大约低10%左右,发送单个Master的RT会略高,目前主机宕机后,Slave不能自动切换为主机,后续会支持自动切换功能
2、RocketMQ主从搭建
1、环境准备
我们先准备2台Centos虚拟机,ip:192.168.179.128、192.168.179.129,在hosts文件中配置地址与IP的映射关系
IP | hostname | mastername |
---|---|---|
192.168.179.129 | rocketmq-nameserver2 | rocketmq-master1-slave1 |
192.168.179.128 | rocketmq-nameserver1 | rocketmq-master1 |
修改2台机器的/etc/hosts文件,加入如下映射关系
192.168.179.128 rocketmq-nameserver1
192.168.179.128 rocketmq-master1
192.168.179.129 rocketmq-nameserver2
192.168.179.129 rocketmq-master1-slave1
2、安装配置(slave)
由于之前已经安装了一台RocketMQ,所以我们只需要安装从节点(192.168.179.129)即可
# 1、从192.168.179.128目录拷贝到129上
scp rocketmq-all-4.4.0-bin-release.zip 192.168.179.129:/usr/local/server/software/
# 2、解压文件存放到/usr/local/server/mq目录下
unzip rocketmq-all-4.4.0-bin-release.zip -d /usr/local/server/mq
# 3、解压后重命名
mv rocketmq-all-4.4.0-bin-release rocketmq
# 4、创建RocketMQ存储文件的目录创建以下文件夹
mkdir logs
mkdir store
cd store/
mkdir commitlog
mkdir consumequeue
mkdir index
# 5、进入conf目录,替换所有xml种的${user.home},保证日志路径正确
sed -i 's#${user.home}#/usr/local/server/mq/rocketmq#g' *.xml
# 注意:sed -i 在这里起到一个批量替换的作用
# sed -i 's#原字符串#新字符串#g' 替换的文件
RocketMQ对内存的要求比较高,最少1G,如果内存太少,会影响RocketMQ的允许效率和执行性能,我们需要修改bin目录下的runbroker.sh和runserver.sh文件
runbroker.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"
runserver.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MasMetaspaceSize=320m"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MasMetaspaceSize=320m"
3、修改从节点配置
brokerId=1
brokerRole=SLAVE
将配置文件拷贝到192.168.179.129上,如下代码:
scp broker-a.properties broker-a-s.properties 192.168.179.129:
/usr/local/server/mq/rocketmq/conf/2m-2s-async/
# 1、停止192.168.179.128服务
sh mqshutdown broker
sh mqshutdown namesrv
# 2、启动192.168.179.128的namesrv
nohup sh mqnamesrv &
# 3、启动192.168.179.129的namesrv
nohup sh mqnamesrv &
# 4、启动192.168.179.128的broker
nohup sh mqbroker -c /usr/local/server/mq/rocketmq/conf/2m-2s-async/broker-a.properties &
# 5、启动192.168.179.129的broker
nohup sh mqbroker -c /usr/local/server/mq/rocketmq/conf/2m-2s-async/broker-a-s.properties &
4、控制台配置
修改rocketmq-console-ng控制台项目的application.properties配置文件,添加上主从地址
rocketmq.config.namesrvAddr=192.168.179.128:9876,192.168.179.129:9876
运行控制台项目,并打开控制台集群,可以看到如下节点信息:
5、主从模式故障演练
主从模式,即时Master宕机之后,消费者仍然可以从Slave消费,但不能接收新的消息,我们通过程序来掩饰一次该流程。
创建MasterSlaveProdcer,实现消息发送,代码如下:
public class MasterSlaveProducer{
//指定namesrv地址,多个地址用分号分割
private static String NAMESRV_ADDRESS="192.168.179.128:9876;192.168.179.129:9876";
public static void main(String[] args) throws Exception{
//创建一个DefaultMQProducer,需要指定消息发送组
DefauleMQProducer producer = new DefauleMQProdicer("Test_Quick_Producer_Name");
//指定NameSrv地址
producer.setNamesrvAddr(NAMESRV_ADDRESS);
//启动Producer
producet.start();
//创建消息
Message message = new Message(
"Test_Quick_Topic", //主题
"TagA", //标签,可以用来做过滤
"KeyA", //唯一标识,可以用来查找消息
"hello rocketmq master-slave".getBytes(); //要发送的消息字节数组
);
SendResult result = producer.send(message);
System.out.println(result);
//关闭producer
producer.shutdown();
}
}
3、RocketMQ集群搭建-双主双从
我们这里搭建一个双主双从的集群,采用同步赋值异步刷盘方式进行集群,在工作中,我们也推荐这么做,
1、准备工作
准备四台虚拟机
IP | hostname | mastername |
---|---|---|
192.168.179.128 | rocketmq-nameserver1 | rocketmq-master1 |
192.168.179.129 | rocketmq-nameserver2 | rocketmq-master2 |
192.168.179.130 | rocketmq-nameserver3 | rocketmq-master1-slave |
192.168.179.131 | rocketmq-nameserver4 | rocketmq-master2-slave |
2、RocketMQ安装
在每台机器上安装RocketMQ,如上操作
3、修改映射路径
修改每台机器的/etc/hosts文件
192.168.179.128 rocketmq-nameserver1
192.168.179.129 rocketmq-nameserver2
192.168.179.130 rocketmq-nameserver3
192.168.179.131 rocketmq-nameserver4
192.168.179.128 rocketmq-master1
192.168.179.129 rocketmq-master2
192.168.179.130 rocketmq-master1-slave
192.168.179.131 rocketmq-master2-slave
4、RocketMQ节点配置
4台机器分别执行以下操作
mkdir logs
mkdir store
cd store/
mkdir commitlog
mkdir consumequeue
mkdir index
进入141集群rocketmq/conf/2m-2s-sync目录下配置对应的配置文件,修改broker-a.properties配置文件
terName=rocketmq-cluster
# broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
# 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
主要改了brokerId=1和brokerRole=SLAVE
# 将配置文件拷贝到192.168.179.129服务器上,如下
scp broker-a.properties broker-a-s.properties 192.168.179.128:/usr/local/server/mq/rocket/conf/2m-2s-async/
# 停止192.168.179.130服务
sh mqshutdown broker
sh mqshutdown namesrv
# 启动192.168.179.130的namesrv
nohup sh mqnamesrv &
# 启动192.168.179.129的namesrv
nohup sh mqnamesrv &
# 启动192.168.179.130的broker
nohup sh mqbroker -c /usr/local/server/mq/rocket/conf/2m-2s-async/broker-a.properties &
# 启动192.168.179.129的broker
nohup sh mqbroker -c /usr/local/server/mq/rocket/conf/2m-2s-async/broker-a-s.properties &
# 将节点信息拷贝到每台机器,在141机器执行如下命令
scp broker-*.properties 192.168.179.129:/usr/local/server/mq/rocket/conf/2m-2s-sync
scp broker-*.properties 192.168.179.130:/usr/local/server/mq/rocket/conf/2m-2s-sync
scp broker-*.properties 192.168.179.131:/usr/local/server/mq/rocket/conf/2m-2s-sync
进入每台机器的conf目录,替换日志文件路径,执行如下命令
sed -i 's#${user.home}#/usr/local/server/mq/rockermq#g' *.xml
进入每台机器的bin目录下,需改runbroker.sh和runserver.sh文件
runbroker.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"
runserver.sh
改前:
JAVA_OPT"${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
改后:
JAVA_OPT"${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
5、RocketMQ集群启动测试
先在每台服务器启动namesrv
nohup sh mqnamesrv &
在启动broker
# 1、141服务器执行如下命令
nohup sh mqbroker -c /usr/local/server/mq/rocketmq/conf/2m-2s-sync/broker-a.properties &
# 2、142服务器执行如下命令
nohup sh mqbroker -c /usr/local/server/mq/rocketmq/conf/2m-2s-sync/broker-b.properties &
# 3、143服务器执行如下命令
nohup sh mqbroker -c /usr/local/server/mq/rocketmq/conf/2m-2s-sync/broker-a-s.properties &
# 4、144服务器执行如下命令
nohup sh mqbroker -c /usr/local/server/mq/rocketmq/conf/2m-2s-sync/broker-b-s.properties &
执行jps查看java进程是否启动成功
[root@localhost bin]# jps
43761 NamesrvStartup
43803 BrokerStartup
44093 Jps
RocketMQ4.4笔记 (一)入门以及安装
RocketMQ4.4笔记 (二)java操作rocketmq入门
RocketMQ4.4笔记 (三)springboot操作rocketmq
RocketMQ4.4笔记 (四)RocketMQ集群