多master模式部署RocketMQ

前言:目前项目打算把一些操作都通过RocketMq改成异步的,现在系统是只有一台单点RocketMq,担心万一挂了就太影响使用了,所以打算部署成集群的,网上看到RocketMq有四种不同的部署模式,针对我这种只有两台电脑的,我打算部署成多master模式。供本人复习之用,不一定完全正确。

参考:

https://blog.csdn.net/qq_36147908/article/details/107844959

https://blog.csdn.net/leexide/article/details/80035468

目录

第一章 环境

第二章 部署

2.1 服务器端口

2.2 RocketMq的安装

2.2.1 安装jdk并下载rocket

2.2.2 修改启动内存

 2.2.3 修改broker启动配置

2.3 操作指令

2.4 效果

第三章 代码测试

3.1 生产者

3.2 消费者

3.3 配置

3.4 发送消息

3.5 效果


第一章 环境

172.31.44.112现在是已经单点部署了RocketMq,172.31.44.113需要再新安装RocketMq。

序号IP地址主机名用户角色模式
1172.31.44.112rocketmq01rootnameServer1,brokerServer1Master1
2172.31.44.113rocketmq02rootnameServer2,brokerServer2Master2

我为了图方便把防火墙都关了

第二章 部署

2.1 服务器端口

rocketMq所在服务器 一般来说要开启四个端口 9876,10909,10911,10912

9876 nameserver的端口  10911 broker对外的接口

特意查了与10909与10912端口的作用

开放10912,否则master的消息将无法复制到slave节点

10909是VIP通道对应的端口,在JAVA中的消费者对象或者是生产者对象中关闭VIP通道即可无需开放10909端口

centos7 防火墙操作api:

查看防火墙状态:systemctl status firewalld.service

关闭防火墙:systemctl stop firewalld.service

停止防火墙服务(避免开机重启):systemctl disable firewalld.service

2.2 RocketMq的安装

2.2.1 安装jdk并下载rocket

下载地址:http://rocketmq.apache.org/docs/quick-start/

首先安装jdk,这个就不用说了。

下载后并解压,这里我解压的位置为:

/home/zchen/app/rocketmq

2.2.2 修改启动内存

cd /home/zchen/app/rocketmq/bin
vim runbroker.sh
#将JAVA_OPT修改为
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn64m"

vim runserver.sh
#将JAVA_OPT修改为
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn64m"

2.2.3 修改broker启动配置

这个根据mq的不同,每个把名字改一下就行了

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-1
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=172.31.44.112:9876;172.31.44.113:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/zchen/app/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/home/zchen/app/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/zchen/app/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/home/zchen/app/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/zchen/app/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/home/zchen/app/rocketmq/store/abort
#限制的消息大小
maxMessageSize=125536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

 

2.3 操作指令

上面配置完就可以启动RocketMQ了

启动nameserver:nohup sh mqnamesrv &
启动broker:nohup sh mqbroker -c /home/zchen/app/rocketmq/conf/2m-noslave/broker-a.properties > /dev/null 2>&1 & netstat -ntlp
停止nameserver:sh mqshutdown namesrv
停止broker:sh mqshutdown broker


下面是我自己装的rocketmq可视化界面的启动命令,没装的可以不用管
cd /home/zchen/app/rocketmq-externals/rocketmq-externals-master/rocketmq-console/target
可视化:nohup java -jar rocketmq-console-ng-2.0.0.jar  > /dev/null 2>&1 &

创建队列(下面的命令大体是对的,但是可能哪里标点空格标点有问题,复制不行可以手敲一遍)

sh mqadmin updateTopic -n 172.31.44.112:9876 -b 172.31.44.112:10911 -t faceTopic

sh mqadmin updateTopic -n 172.31.44.112:9876 -c rocketmq-cluster  -t faceRecognitionTopic

sh mqadmin updateTopic -n 172.31.44.112:9876;172.31.44.113:9876 -c rocketmq-cluster  -t faceTopic(这个总是报命令错误,不用管,我在这里记录一下,以后处理)

 

参考:

 

2.4 效果

 

 

第三章 代码测试

3.1 生产者

@Configuration
public class ProducerConfiguration {
    @Value("${test.rocketmq.producerGroup}")
    private String producerGroup;
    /**
     * NameServer 地址
     */
    @Value("${rocketmq.namesrvaddr}")
    private String namesrvAddr;

    @Bean
    public DefaultMQProducer defaultMQProducer(){
        DefaultMQProducer producer =null;
        try {
            producer = new DefaultMQProducer(producerGroup);
            producer.setNamesrvAddr(namesrvAddr);
            producer.start();

        } catch (MQClientException e) {
            e.printStackTrace();
        }
        return producer;
    }

}

3.2 消费者

@Component
public class ConsumerTest {
    /**
     * 消费者的组名
     */
    @Value("${test.rocketmq.conumerGroup}")
    private String consumerGroup;

    /**
     * NameServer 地址
     */
    @Value("${rocketmq.namesrvaddr}")
    private String namesrvAddr;

    @PostConstruct
    public void consumer() {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
        consumer.setNamesrvAddr(namesrvAddr);
        try {
            consumer.subscribe("user-topic", "user-tag");
            consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
                try {
                    for (MessageExt messageExt : list) {
                        Thread.sleep(10000);
                        System.err.println("消费消息: " + new String(messageExt.getBody()));//输出消息内容
//                        Integer currentInt = Integer.valueOf(new String(messageExt.getBody()));
//                        if(currentInt%2==0){
                            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
                        /*}else{
                            return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                        }*/
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
            });
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

3.3 配置

#RocketMQ
# 生产者的组名
test.rocketmq.producerGroup=test-group
# 消费者的组名
test.rocketmq.conumerGroup=test-group
# NameServer地址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

3.4 发送消息

@RestController
public class MessageTest {
    @Autowired
    DefaultMQProducer defaultMQProducer;

    @RequestMapping("/pushMessage")
    public String pushMessage(String message){
        if(message==null){
            message="zhangchen";
        }
        try {
            Message mqMessage = new Message("user-topic", "user-tag", message.getBytes());
            SendResult result = defaultMQProducer.send(mqMessage);
            System.out.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return message;
    }

}

3.5 效果

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值