RocketMQ4.4笔记 (四)RocketMQ集群

四、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的映射关系

IPhostnamemastername
192.168.179.129rocketmq-nameserver2rocketmq-master1-slave1
192.168.179.128rocketmq-nameserver1rocketmq-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、准备工作

准备四台虚拟机

IPhostnamemastername
192.168.179.128rocketmq-nameserver1rocketmq-master1
192.168.179.129rocketmq-nameserver2rocketmq-master2
192.168.179.130rocketmq-nameserver3rocketmq-master1-slave
192.168.179.131rocketmq-nameserver4rocketmq-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集群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值