rocketMq双Master双Slave,同步双写,异步刷盘

首先,我们准备7台linux服务器,尽可能的在每个服务器上部署一个服务。当然,在实际工作中如果服务器数量不足,那么可以同一台机器部署两个节点,比如:broker-a的主节点与broker-b的从节点部署在一台服务器,broker-a的从节点与broker-b的主节点部署在一台服务器,这样也会节省一些资源,同样也能达到相对的高可用的效果!


服务器列表
192.168.1.1 namesrv 1
192.168.1.2 namesrv 2
192.168.1.3 namesrv3
192.168.1.4 broker-a
192.168.1.5 broker-a-s
192.168.1.6 broker-b
192.168.1.7 broker-b-s


1、启动namesrv服务

       分别在192.168.1.1、192.168.1.2、192.168.1.3 机器上启动namesrv服务

      nohup sh bin/mqnamesrv &

      tailf  ~/logs/rocketmqlogs/namesrv.log


2、启动broker主节点或从节点

       在192.168.1.4服务器上启动broker主节点:

      nohup sh bin/mqbroker -c ./conf/2m-2s-sync/broker-a.properties &

     在192.168.1.5服务器上启动broker从节点:

     nohup sh bin/mqbroker -c ./conf/2m-2s-sync/broker-a-s.properties &


       tailf  ~/logs/rocketmqlogs/broker.log

      192.168.1.6、192.168.1.7 服务器节点,以同样的方式启动.


3、主从节点配置

      broker-a.properties配置如下:

    
rokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.1.1:9876;192.168.1.2:9876;192.168.1.3:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=true
listenPort=10911
deleteWhen=04
fileReservedTime=48
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=50000000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
diskMaxUsedSpaceRatio=88

storePathRootDir=/opt/rocketmq/data/store
storePathCommitLog=/opt/rocketmq/data/store/commitlog
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000

checkTransactionMessageEnable=false
sendMessageThreadPoolNums=128
pullMessageThreadPoolNums=128

brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH

      broker-a-s.properties配置如下:

    
rokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
namesrvAddr=192.168.1.1:9876;192.168.1.2:9876;192.168.1.3:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=true
listenPort=10915
deleteWhen=04
fileReservedTime=48
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=50000000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
diskMaxUsedSpaceRatio=88

storePathRootDir=/opt/rocketmq/data/store
storePathCommitLog=/opt/rocketmq/data/store/commitlog
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000

checkTransactionMessageEnable=false
sendMessageThreadPoolNums=128
pullMessageThreadPoolNums=128

brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH



RocketMQ最佳实践
一、Producer最佳实践
1、一个应用尽可能用一个 Topic,消息子类型用 tags 来标识,tags 可以由应用自由设置。只有发送消息设置了tags,消费方在订阅消息时,才可以利用 tags 在 broker 做消息过滤。
2、每个消息在业务层面的唯一标识码,要设置到 keys 字段,方便将来定位消息丢失问题。由于是哈希索引,请务必保证 key 尽可能唯一,这样可以避免潜在的哈希冲突。
3、消息发送成功或者失败,要打印消息日志,务必要打印 sendresult 和 key 字段。
4、对于消息不可丢失应用,务必要有消息重发机制。例如:消息发送失败,存储到数据库,能有定时程序尝试重发或者人工触发重发。
5、某些应用如果不关注消息是否发送成功,请直接使用 sendOneWay方法发送消息。
二、Consumer最佳实践
1、消费过程要做到幂等(即消费端去重)
2、尽量使用批量方式消费方式,可以很大程度上提高消费吞吐量。
3、优化每条消息消费过程
三、其他配置
线上应该关闭 autoCreateTopicEnable,即在配置文件中将其设置为 false
RocketMQ在发送消息时,会首先获取路由信息。如果是新的消息,由于MQServer上面还没有创建对应的 Topic,这个时候,如果上面的配置打开的话,会返回默认TOPIC的(RocketMQ会在每台 broker上面创建名为 TBW102的TOPIC)路由信息,然后 Producer会选择一台 Broker发送消息,选中的 broker在存储消息时,发现消息的 topic还没有创建,就会自动创建 topic。后果就是:以后所有该TOPIC的消息,都将发送到这台 broker上,达不到负载均衡的目的。
所以基于目前RocketMQ的设计,建议关闭自动创建TOPIC的功能,然后根据消息量的大小,手动创建TOPIC。



你可能感兴趣的:(rocketmq)