从入门到入土(九)手摸手教你搭建RocketMQ双主双从同步集群,不信学不会!(下)

简介: 从入门到入土(九)手摸手教你搭建RocketMQ双主双从同步集群,不信学不会!(下)

2.6、总结


其实就是如下几个关键配置需要注意:


  • brokerClusterName:集群名称,所有broker配置的必须一致
  • brokerName:broker名称,M-S之间必须一致,比如broker-a/broker-a(M/S),broker-b/broker-b
  • brokerId:0 表示 Master,>0 表示 Slave,比如1M2S,那么M是0,Slave1是1,Slave2配置为2
  • namesrvAddr:namesrv地址
  • store*:持久化数据存储目录
  • brokerRole:Broker的角色
  • flushDiskType:刷盘方式,2m2s-sync中,master默认为SYNC_FLUSH,slave默认为ASYNC_FLUSH


2.7、启动


2.7.1、启动namesrv


cd /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/bin
nohup sh mqnamesrv &


两台机器都要启动。


2.7.2、启动broker


172.17.160.28


cd /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/bin
# 启动Master1
nohup sh mqbroker -c /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/conf/2m-2s-sync/broker-a.properties &
# 启动Slave2
nohup sh mqbroker -c /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/conf/2m-2s-sync/broker-b-s.properties &


172.17.160.29


cd /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/bin
# 启动Master2
nohup sh mqbroker -c /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/conf/2m-2s-sync/broker-b.properties &
# 启动Slave1
nohup sh mqbroker -c /home/chentongwei/rocketmq/rocketmq-all-4.7.0-bin-release/conf/2m-2s-sync/broker-a-s.properties &


2.8、验证


直接打开我们的管控台进行查看集群(Cluster)


image.png


2.9、问题


他致命的问题就是不能自动主备切换,比如我杀死broker-a-master的进程,然后看管控台broker-a-slave是否会自动升级为master,发现并不会。所以我们的Dledger诞生了。


# 找到broker-a-master的进程号是8983
kill -9 8983



image.png


3、Dledger搭建


3.1、说明


是基于raft的一种做法,redis的哨兵也是基于raft的,和这个是一样的道理。上面【古老的集群搭建】方式并不作废,Dledger就是基于上面的继续增加额外配置,上面的配置依然保留,继续追加新的配置即可。Dledger要求机器数必须是3台或3台以上才行。这也是raft的基础要求。不懂的可以自行Google下raft。


3.2、搭建


3.2.1、官方搭建手册


https://github.com/apache/rocketmq/blob/master/docs/cn/dledger/deploy_guide.md


3.2.2、准备


我们多开一台虚拟机:172.17.160.30,采取Dledger搭建一组1M2S的集群,机器规划如下:


机器 用途
172.17.160.28 namesrv、broker-a-master
172.17.160.29 namesrv、broker-a-slave1
172.17.160.30 namesrv、broker-a-slave2


3.2.3、配置


上面的【古老的集群搭建】配置不变,在每个properties里新增如下配置:


172.17.160.28


enableDLegerCommitLog=true
dLegerGroup=broker-a
dLegerPeers=n0-172.17.160.28:40911;n1-172.17.160.29:40911;n2-172.17.160.30:40911
dLegerSelfId=n0
sendMessageThreadPoolNums=4


172.17.160.29


enableDLegerCommitLog=true
dLegerGroup=broker-a
dLegerPeers=n0-172.17.160.28:40911;n1-172.17.160.29:40911;n2-172.17.160.30:40911
dLegerSelfId=n1
sendMessageThreadPoolNums=4


172.17.160.30


enableDLegerCommitLog=true
dLegerGroup=broker-a
dLegerPeers=n0-172.17.160.28:40911;n1-172.17.160.29:40911;n2-172.17.160.30:40911
dLegerSelfId=n2
sendMessageThreadPoolNums=4


3.2.4、配置说明


name 含义 举例
enableDLegerCommitLog 是否启动 DLedger true
dLegerGroup DLedger Raft Group的名字,建议和 brokerName 保持一致 broker-a
dLegerPeers DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致 n0-172.17.160.28:40911;n1-172.17.160.29:40911;n2-172.17.160.30:40911
dLegerSelfId 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一 n0
sendMessageThreadPoolNums=4 发送消息的线程数,建议与CPU核数设置成一样的 4


3.2.5、启动


启动三台的namesrv和三个broker,跟上面姿势一样,不重复贴代码了。


3.2.6、验证


管控台去看的话应该是1个master,两个slave,都叫broker-a,这时候停掉master,会发现其中一个slave自动升级为Master了,这才叫真正的高可用,自动主备切换。


3.3、补充


虽然要求至少三台机器,但是没条件的可以用一台机器去模拟,弄三个不同的端口号就行了。


三、常见问题


1、Lock failed,MQ already started


1.1、错误


[root@iZ2ze84zygpzjw5bfcmh2hZ 2m-2s-sync]#  sh ../../bin/mqbroker -c broker-b-s.properties
java.lang.RuntimeException: Lock failed,MQ already started
        at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:223)
        at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:853)
        at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
        at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)


1.2、解决


这个是由于没配置store*导致的,比如如下:


#存储路径
storePathRootDir=/home/chentongwei/data/rocketmq/broker-a/store
#commitLog 存储路径
storePathCommitLog=/home/chentongwei/data/rocketmq/broker-a/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/chentongwei/data/rocketmq/broker-a/store/consumequeue
#消息索引存储路径
storePathIndex=/home/chentongwei/data/rocketmq/broker-a/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/chentongwei/data/rocketmq/broker-a/store/checkpoint
#abort 文件存储路径
abortFile=/home/chentongwei/data/rocketmq/broker-a/store/abort


没配置这个,我一台机器上部署两个broker,一个broker-a-master,一个broker-b-slave,都采取默认的store*配置,冲突了,所以报错。所以手动配上不同目录即可,我这里目录区分是broker-a/broker-b。


2、AllocateMappedFileService started:false lastThread:null


这个是由于store*配置的都一样导致的,比如如下:


#存储路径
storePathRootDir=/home/chentongwei/data/rocketmq/broker-a/store
#commitLog 存储路径
storePathCommitLog=/home/chentongwei/data/rocketmq/broker-a/store
#消费队列存储路径存储路径
storePathConsumeQueue=/home/chentongwei/data/rocketmq/broker-a/store
#消息索引存储路径
storePathIndex=/home/chentongwei/data/rocketmq/broker-a/store
#checkpoint 文件存储路径
storeCheckpoint=/home/chentongwei/data/rocketmq/broker-a/store
#abort 文件存储路径
abortFile=/home/chentongwei/data/rocketmq/broker-a/store


发现了没?我都用的/home/chentongwei/data/rocketmq/broker-a/store,这肯定不行的,所以我们需要采用不同目录,比如store/commitlogstore/consumequeue等。


3、Address already in use


这个更神奇了,见名知意,地址被占用了。也就是端口被占用了。我为什么说他更神奇,不是因为我没配置listenPort,而是我在单台机器上配置了broker-a-master的端口为默认端口10911,broker-b-slave的端口为10912,就是+1操作了。他为啥说我被占用?


经过查源码发现,他大爷的,他给我默认启动了一个进程,端口号就是配置的端口+1,所以启动一个broker后他其实是给我们启动了两个端口,一个原端口,一个原端口+1。所以我配置的时候一个是10911,一个是11911,而不能 是10912!!!


#Broker 对外服务的监听端口
listenPort=11911


源码如下:


// {@link org.apache.rocketmq.broker.BrokerStartup#createBrokerController(String[])}
messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1);


4、管控台配置namesrv


如果namesrv和broker都启动正常后,管控台上还是没有集群的话,可以检查下管控台是否配置了namesrv




image.png


这个namesrv配置需要手动敲完后+回车+点击UPDATE才能生效。


END

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 监控 Java
RocketMQ 同步发送、异步发送和单向发送,如何选择?
本文详细分析了 RocketMQ 中同步发送、异步发送和单向发送三种消息发送方式的原理、优缺点及适用场景。同步发送可靠性高但延迟较大,适合订单系统等场景;异步发送非阻塞且延迟低,适用于实时数据处理等场景;单向发送高效但可靠性低,适用于日志收集等场景。文章还提供了示例代码和核心源码分析,帮助读者更好地理解每种发送方式的特点。
221 4
|
1月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
3月前
|
消息中间件 存储 负载均衡
|
3月前
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
46 2
|
3月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
84 0
|
4月前
|
消息中间件 Prometheus 监控
消息队列 MQ使用问题之如何将旧集群的store目录迁移到新集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 传感器 负载均衡
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
|
4月前
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
|
3月前
|
消息中间件 API 数据安全/隐私保护
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
|
4月前
|
消息中间件 运维 RocketMQ
MetaQ/RocketMQ 原理问题之slave broker是从master同步信息的问题如何解决
MetaQ/RocketMQ 原理问题之slave broker是从master同步信息的问题如何解决