RocketMQ环境搭建及主从的搭建

RocketMQ环境搭建

*此教程不是docker安装,如linux系统已安装docker,在rocketmq搭建好之后,会使用docker的ip地址,而不是linux系统的ip,因此会造成错误,本人试了把docker卸载还是使用docker的ip,只好重装虚拟机在搭建,结果成功*

1.下载源码包
地址 http://rocketmq.apache.org/docs/quick-start/

unzip rocketmq-all-4.4.0-source-release.zip
cd rocketmq-all-4.4.0/
mvn -Prelease-all -DskipTests clean install -U
cd distribution/target/apache-rocketmq
使用maven打包源码包
完成后在distribution/target/apache-rocketmq目录下找到生成的文件

2.修改linux Hosts
vi /etc/hosts

添加

192.168.6.129 rocketmq-nameserver1
192.168.6.129 rocketmq-master1

nameserver和master映射关系

3.建立RocketMQ目录

mkdir /usr/local/apache-rocketmq
cp apache-rocketmq.tar.gz /usr/local/apache-rocketmq
cd /usr/local/apache-rocketmq
tar -zxvf apache-rocketmq.tar.gz
ln -s ./../apache-rocketmq rocketmq

4.创建存储路径
mkdir /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index

5.修改RocketMQ配置文件
vi /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties

内容如下

集群名称

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3或者修改hosts文件不使用IP而是域名)
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数。由于是4个broker节点,所以设置为4
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=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#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

6.修改日志文件路径
mkdir -p /usr/local/rocketmq/logs
cd /usr/local/rocketmq/conf
sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml

7.修改启动脚本参数(主要防止配置内存过大,本地机器内存不够用,生产另说)
vi /usr/local/rocketmq/bin/runbroker.sh
修改jvm内存为最大,最小,新生代为1g
vi /usr/local/rocketmq/bin/runserver.sh
修改jvm内存为最大,最小,新生代为1g

8.启动
cd /usr/local/rocketmq/bin/
先启动 NameServer
nohup sh mqnamesrv &

再启动 broker
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &

9.查看日志
broker 日志
tail -f /usr/local/rocketmq/logs/rocketmqlogs/broker.log
tail -f /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

RocketMQ生产者使用


    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer("testQuickStart");
        producer.setNamesrvAddr(Const.NAME_SERVER_ADDR);
        producer.start();

        for (int i = 0; i < 5; i++) {
            Message message = new Message("test_quick_topic", "TagA", "Keys" + i, ("Hello RocketMQ"  + i).getBytes());
            SendResult res = producer.send(message);
            System.out.println("消息发送结果" + res);
        }
        producer.shutdown();
    }
}

运行代码可以发现Topic和Queue是一对多的关系,一个Topic发送多条消息会落到不同queueId的队列中去

消费端:

public class Consumer {

    public static void main(String[] args) throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_quick_consumer_name");
        consumer.setNamesrvAddr(Const.NAME_SERVER_ADDR);
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

        consumer.subscribe("test_quick_topic", "*");

        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                MessageExt messageExt = list.get(0);

                try {
                    String topic = messageExt.getTopic();
                    String msgId = messageExt.getMsgId();
                    String body = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
                    System.out.println("topic "  + topic + " msgId "  + msgId + " body "  + body);
                    int i =  1 / 0;
                } catch (Exception e) {
                    e.printStackTrace();
                    int reconsumeTimes = messageExt.getReconsumeTimes();
                    System.out.println("reconsumeTimes " + reconsumeTimes);
                    if (reconsumeTimes == 3) {
                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                    }
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
    }

可以看到RocketMQ会有自动重试机制,在捕获异常时RocketMQ Broker可以进行消息重发。

至此,完成了单机RocketMQ的搭建和简单生产者消费者的demo运行。

RocketMQ主从搭建

        **RocketMQ-四种集群环境构建**

1.单点模式

2.主从模式
主节点消息收发,同步到从节点,主节点挂了,从节点可以保证消息不丢失

3.双主模式

4.双主双从模式,多主多从模式

主要使用2和4两种

主从模式集群构建

保障消息的即时性和可靠性并存

投递一条消息后,关闭主节点,故障演练,数据一致性能否保证

(同步刷盘和异步刷盘)

从节点可以继续提供消费者继续消费,不能接收消息

主节点重新上线后进行消费进度的offset同步

开始构建主从模式架构
1.在构建过的虚拟机中修改配置
vi /etc/hosts

192.168.6.129 rocketmq-nameserver1
192.168.6.129 rocketmq-master1
192.168.6.130 rocketmq-nameserver2
192.168.6.130 rocketmq-master1-slave1

两台机器都配置hosts如上

2.修改129服务上/usr/local/rocketmq/conf/2m-2s-async目录中的broker-a-s.properties配置文件,slave机器修改配置文件如下

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3或者修改hosts文件不使用IP而是域名)
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数。由于是4个broker节点,所以设置为4
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=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

复制上述两个文件到130服务器的对应目录下

scp broker-a.properties broker-a-s.properties 192.168.6.130:/usr/local/rocketmq/conf/2m-2s-async/

3.增加相关日志信息配置,详见Rocket单机的环境配置

第一台机器启动NameServer
nohup sh mqnamesrv &
第一台机器启动Broker
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &

第一台机器启动NameServer
nohup sh mqnamesrv &
第二台机器启动Broker
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties > /dev/null 2>&1 &

值得注意的是放火墙需要打开10912端口,HA主要使用该端口同步数据。
查看防火墙端口是否打开
firewall-cmd --query-port=10912/tcp

(1)首先启动完成master和slave
(2)用Producer发送消息到集群
(3)将主节点关闭,模拟主节点宕机
(4)Consumer启动之后还是能消费到Producer发送的数据
(5)再次启动Master节点,没有消费到新的数据
证明主从架构能够保证主节点宕机之后,能够保证数据不丢失。具备高可用特性,可避免单点故障。

      </div>
    </div>
</div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值