Rocket MQ 集群搭建

集群搭建(三台机器56 57 58)

  1. 环境配置(三台机器)
vim /etc/hosts
#添加如下
10.22.101.56 worker1
10.22.101.57 worker2
10.22.101.58 worker3
  1. 免密登录(56机器)
#切换到oper用户,生成公私钥
ssh-keygen

#执行
ssh-copy-id worker1
ssh-copy-id worker2
ssh-copy-id worker3
  1. 搭建(2主2从)
#检查防火墙
#检查java环境
cd /app/rocketmq/rocketmq-4.8.0/conf
ll
2m-2s-async # 2主2从异步刷盘(吞吐量较大,但是消息可能丢失)
2m-2s-sync  #2主2从同步刷盘(吞吐量会下降,但是消息更安全),
2m-noslave  #2主无从(单点故障),还可以直接配置broker.conf,进行单点环境配置
dleger #实现主从切换,正式环境都会采用这种方式来搭建集群
  1. 配置第一组broker-a
#1.worker2配置borker-a的master节点
[oper@worker2 root]$ vim /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a.properties

#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker-a
#brokerid,0就表示是Master,>0的都是表示Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=worker1:9876;worker2:9876;worker3: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
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/app/rocketmq/store
#commitLog存储路径
storePathCommitLog=/app/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/app/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/app/rocketmq/store/index
#checkpoint文件存储路径
storeCheckpoint=/app/rocketmq/store/checkpoint
#abort文件存储路径
abortFile=/app/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#Broker的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

#2.worker3配置borker-a的从节点,2m-2s-async/broker-a-s.properties
[oper@worker3 root]$ vim /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a-s.properties

#同上,需要修改
brokerId=1
listenPort=11011
storePathRootDir=/app/rocketmq/storeSlave
storePathCommitLog=/app/rocketmq/storeSlave/commitlog
storePathConsumeQueue=/app/rocketmq/storeSlave/consumequeue
storePathIndex=/app/rocketmq/storeSlave/index
storeCheckpoint=/app/rocketmq/storeSlave/checkpoint
abortFile=/app/rocketmq/storeSlave/abort
brokerRole=SLAVE
  1. 配置第二组broker-b
#worker3配置borker-b的主节点
[oper@worker3 root]$ vim /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-b.properties


#同上,只要修改
brokerName=broker-b


#同上,需要修改
brokerName=broker-b
brokerId=1
listenPort=11011
storePathRootDir=/app/rocketmq/storeSlave
storePathCommitLog=/app/rocketmq/storeSlave/commitlog
storePathConsumeQueue=/app/rocketmq/storeSlave/consumequeue
storePathIndex=/app/rocketmq/storeSlave/index
storeCheckpoint=/app/rocketmq/storeSlave/checkpoint
abortFile=/app/rocketmq/storeSlave/abort
brokerRole=SLAVE

需要注意的配置项:
1、同一机器上两个实例的store目录不能相同,否则会报错 Lock failed,MQ already started
2、同一机器上两个实例的listenPort也不能相同。否则会报端口占用的错。nameserver不需要进行配置,直接启动就行。这也看出nameserver是无状态的

  1. 启动集群

① 修改三个节点上的bin/runserver.sh,调整里面的jvm内存配置

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m

② 直接在三个节点上启动nameServer

nohup /app/rocketmq/rocketmq-4.8.0/bin/mqnamesrv &
# 检查日志
#JPS查看进程

③ 启动broker

#worker2机器,启动broker-a的master节点和broker-b的slave节点
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a.properties &
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-b-s.properties &

#jps检查,1个NameSrvStartup进程和两个BrokerStartup进程
jps
#worker3机器,启动broker-b的master节点和broker-a的slave节点
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-b.properties &
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a-s.properties &

#jps检查,1个NameSrvStartup进程和两个BrokerStartup进程
jps

④ 验证

#worker3发消息
/app/rocketmq/rocketmq-4.8.0/bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

#worker2接收消息
/app/rocketmq/rocketmq-4.8.0/bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
  1. 搭建管理控制台
    ① 下载地址:https://github.com/apache/rocketmq-externals
    ② 进入rocket-console目录,使用maven进行编译
mvn clean package -Dmaven.test.skip=true

③ 上传jar包/app/rocketmq/rocketmq-console,并在当前目录新增application.properties,覆盖jar包默认的属性

rocketmq.config.namesrvAddr=worker1:9876;worker2:9876;worker3:9876

④ 执行

java -jar rocketmq-console-ng-1.0.1.jar
  1. 集群工作流程:
    ① 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
    ② Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
    ③ 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
    ④ Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
    ⑤ Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ是一个分布式消息传递平台,它可以在高吞吐量、低延迟和高可靠性的条件下传递大量的消息。下面是搭建RocketMQ的步骤: 1. 安装JDK RocketMQ需要使用JDK 1.8或更高版本。如果未安装,请先下载并安装JDK。 2. 下载RocketMQ 从官方网站下载RocketMQ的源代码(https://rocketmq.apache.org/release_notes/release-notes-4.9.1/)或者预编译版本。 3. 安装NameServer NameServer是RocketMQ的核心组件之一,它用于管理所有的Broker,包括Broker的路由信息、Topic、Consumer等。 解压下载的RocketMQ文件,进入bin目录,执行以下命令: ``` sh mqnamesrv ``` 4. 安装Broker Broker是RocketMQ的另一个核心组件,它用于存储和分发消息。一个Broker可以管理多个Topic,每个Topic可以有多个Queue。 解压下载的RocketMQ文件,进入bin目录,执行以下命令: ``` sh mqbroker -n localhost:9876 ``` 其中,localhost:9876是NameServer的地址,默认端口为9876。 5. 发送和接收消息 使用RocketMQ的API可以发送和接收消息。以下是一个简单的例子: ``` public class Producer { public static void main(String[] args) throws Exception { DefaultMQProducer producer = new DefaultMQProducer("example_group"); producer.setNamesrvAddr("localhost:9876"); producer.start(); Message message = new Message("example_topic", "Hello RocketMQ".getBytes()); SendResult result = producer.send(message); System.out.println(result); producer.shutdown(); } } public class Consumer { public static void main(String[] args) throws Exception { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("example_group"); consumer.setNamesrvAddr("localhost:9876"); consumer.subscribe("example_topic", "*"); consumer.registerMessageListener((MessageListenerConcurrently) (messages, context) -> { System.out.println(messages); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }); consumer.start(); } } ``` 这个例子中,Producer向example_topic发送一条消息,Consumer从example_topic接收并打印出来。在运行Producer和Consumer之前,确保NameServer和Broker已经启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值