两主两从高可用RocketMq搭建与使用

项目背景

由于产品端有大量的用户行为需要记录日志,考虑到数据存储压力,与前端接口返回速度问题所以将用户数据行为通过消息队列进行解耦。也就是前端应用作为生产者,用户行为处理,比如增加阅读次数,增加行为统计等都通过消费者进行解耦,降低系统所面临的接口压力,保护DB,并有效降低接口超时的风险。
RocketMq搭建与部署

部署结构图如下


image.png

简单说明:两台主机计划搭建集群环境为:两主两从两注册中心的高可用框架

nameserver部署 两台机器拼团与布兜应用服务器构成高可用的注册中心。

broker的部署:两台机器分开部署两个不同的broker主节点,与两个broker的从节点,这样避免某一台机器挂了后死掉两个主,或者两个从节点,组成相对高可用的集群

部署步骤

先修改nameserver启动的jvm参数,因为家境贫寒内存用默认的会造成内存分配失败我暂时就调整jvm参数

打开runserver.sh

vim runserver.sh

找到jvm内存相关配置参数

因为nameserver压力比较小所以无限压榨nameserver内存

JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn64m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m"

另外通过配置文件看到 server端开启的是CMS 垃圾回收器

同理还要修改broker的启动jvm参数,runbroker.sh

打开runbroker.sh

因为broker负责数据读取并且客户端会直连broker压力较大因此将broker的内存配置的稍微大一些

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

从启动配置文件来看broker使用的是G1垃圾收集器

基础配置就配置完成了,下面是要配置config/2m-2s-sync目录下的配置,贴一下官方文档的参数配置

这个配置是用来配置broker启动文件的配置参数清单

Property Name Default value Details
listenPort 10911 监听客户端请求的端口,这个可以不配置随机分配,交给nameserver告诉客户端listen port for client
namesrvAddr null 当前broker实例要连接的nameserver地址name server address
brokerIP1 InetAddress for network interface 当前实例的ip,如果是多外网ip可能会上报给nameserver错误,保险起见配置一下Should be configured if having multiple addresses
brokerName null 当前broker的名字broker name
brokerClusterName DefaultCluster 当前broker集群的名字this broker belongs to which cluster
brokerId 0 当前broker的id,0表示只主节点,broker id, 0 means master, positive integers mean slave
storePathCommitLog $HOME/store/commitlog/ broker保存commitlog的路径,也就是我们的消息存放路径file path for commit log
storePathConsumerQueue $HOME/store/consumequeue/ 保存消费者队列的路径,其实是存的消费者组与消息的关联索引file path for consume queue
mapedFileSizeCommitLog 1024 * 1024 * 1024(1G) commitlogmapped file size for commit log
deleteWhen 04 每天几点删除过期的消息When to delete the commitlog which is out of the reserve time
fileReserverdTime 72 消息默认保存的时间The number of hours to keep a commitlog before deleting it
brokerRole ASYNC_MASTER 当前broker角色SYNC_MASTER/ASYNC_MASTER/SLAVE
flushDiskType ASYNC_FLUSH 消息刷盘机制,如果是同步刷盘会降低消息队列吞吐量{SYNC_FLUSH/ASYNC_FLUSH}. Broker of SYNC_FLUSH mode flushes each message onto disk before acknowledging producer. Broker of ASYNC_FLUSH mode, on the other hand, takes advantage of group-committing, achieving better performance.

因为我们计划使用两主两从主同步模式启动集群,那么我们需要开始着手修改rocket安装目录下面的配置顺便我们将集中模式梳理在这里

单 master 模式

  • 也就是只有一个 master 节点,称不上是集群,一旦这个 master 节点宕机,那么整个服务就不可用,适合个人学习使用。

多 master 模式

  • 多个 master 节点组成集群,单个 master 节点宕机或者重启对应用没有影响。
  • 优点:所有模式中性能最高
  • 缺点:单个 master 节点宕机期间,未被消费的消息在节点恢复之前不可用,消息的实时性就受到影响。
  • 注意:使用同步刷盘可以保证消息不丢失,同时 Topic 相对应的 queue 应该分布在集群中各个节点,而不是只在某各节点上,否则,该节点宕机会对订阅该 topic 的应用造成影响。
  • conf 目录中的2m模式配置文件

多 master 多 slave 异步复制模式

  • 在多 master 模式的基础上,每个 master 节点都有至少一个对应的 slave。
  • master 节点可读可写,但是 slave 只能读不能写,类似于 mysql 的主从模式。
  • 优点: 在 master 宕机时,消费者可以从 slave 读取消息,消息的实时性不会受影响,性能几乎和多 master 一样。
  • 缺点:使用异步复制的同步方式有可能会有消息丢失的问题。
  • conf目录中的2m-2s-async目录下的配置文件

多 master 多 slave 同步双写模式

  • 同多 master 多 slave 异步复制模式类似,区别在于 master 和 slave 之间的数据同步方式。
  • 优点:同步双写的同步模式能保证数据不丢失。
  • 缺点:发送单个消息 RT 会略长,性能相比异步复制低10%左右。
  • 刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)
  • 同步方式:同步双写和异步复制(指的一组 master 和 slave 之间数据的同步)
  • 注意:要保证数据可靠,需采用同步刷盘和同步双写的方式,但性能会较其他方式低。
  • conf目录中 2m-2s-sync目录下配置文件,布兜项目使用的方式

broker-a-m配置

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH

##namesrvAddr 地址
namesrvAddr=172.17.140.1:9876;172.17.139.253:9876
listenPort=10911
##消息存储与commitlog存储目录
storePathRootDir=/usr/local/rocketmq/data/store
storePathCommitLog=/usr/local/rocketmq/data/store/commitlog

#生产环境关闭自动创建topic与group
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false

broker-a-s

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

##namesrvAddr 地址
namesrvAddr=172.17.140.1:9876;172.17.139.253:9876
listenPort=11011
##消息存储与commitlog存储目录
storePathRootDir=/usr/local/rocketmq/data/store_s
storePathCommitLog=/usr/local/rocketmq/data/store_s/commitlog

#生产环境关闭自动创建topic与group
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false

broker-b-m

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH

##namesrvAddr 地址
namesrvAddr=172.17.140.1:9876;172.17.139.253:9876
listenPort=10911
##消息存储与commitlog存储目录
storePathRootDir=/usr/local/rocketmq/data/store
storePathCommitLog=/usr/local/rocketmq/data/store/commitlog

#生产环境关闭自动创建topic与group
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false

broker-b-s

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

##namesrvAddr 地址
namesrvAddr=172.17.140.1:9876;172.17.139.253:9876
listenPort=11011
##消息存储与commitlog存储目录
storePathRootDir=/usr/local/rocketmq/data/store_s
storePathCommitLog=/usr/local/rocketmq/data/store_s/commitlog

#生产环境关闭自动创建topic与group
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false

修改rocket默认消息保存位置,修改日志保存位置

在rocket安装目录新建 data/store_s 目录用于存放消息与commitlog

image.png

通过sed修改配置文件

进入conf目录,执行 sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml

这里要注意storePath的不相同行,也就是每台机器的master 与 slave使用的 storePathRootDir storePathCommitLog 要不同,为了方便我一个叫store,另外一个叫store_s

还有就是一定要给主节点与从节点配置监听端口,我一开始没配置,发现一台机器起来主节点后,起不来从节点,我感觉并不是端口占用,应该是在往nameserver注册的时候唯一性的问题,反正正确的道路就是配置好监听端口,这也符合运维习惯因为对外开放端口是要做配置的,不能总是随机监听。

这些准备工作都做好后开始启动服务,我们第一台主机部署有 nameserver1、broker-a-m、broker-b-s.第二台机器部署 nameserver2、broker-b-m、broker-a-s组成高可用集群

启动集群

进入两台机器的rocketmq安装目录的bin目录执行

nohup sh mqnamesrv &

进入第一台机器

启动 brokera 主节点,与broker-b从节点

nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a.properties&
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b-s.properties&

进入第二台机器

nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b.properties&
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a-s.properties&

出现注册成功就可以认为集群搭建完成了

2020-12-14 18:08:03 INFO main - The broker[broker-a, 172.17.139.253:11011] boot success. serializeType=JSON and name server is 172.17.140.1:9876;172.17.139.253:9876
2020-12-14 18:08:06 INFO ReadSocketService - makestop thread ReadSocketService
2020-12-14 18:08:06 INFO ReadSocketService - makestop thread WriteSocketService
2020-12-14 18:08:07 INFO WriteSocketService - makestop thread WriteSocketService
2020-12-14 18:08:07 INFO WriteSocketService - makestop thread ReadSocketService
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - Update slave topic config from master, 172.17.140.1:10911
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - Update slave consumer offset from master, 172.17.140.1:10911
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - Update slave delay offset from master, 172.17.140.1:10911
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - Update slave Subscription Group from master, 172.17.140.1:10911
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - register broker to name server 172.17.139.253:9876 OK
2020-12-14 18:08:13 INFO BrokerControllerScheduledThread1 - register broker to name server 172.17.140.1:9876 OK
2020-12-14 18:08:15 INFO BrokerControllerScheduledThread1 - register broker to name server 172.17.140.1:9876 OK
2020-12-14 18:08:15 INFO BrokerControllerScheduledThread1 - register broker to name server 172.17.139.253:9876 OK

另外备忘几个rocketmq的命令

一、查看消费者情况

sh bin/mqadmin consumerProgress -n localhost:9876

测试环境显示结果

#Group                            #Count  #Version                 #Type  #Model          #TPS     #Diff Total
guozc-consumer1                   0       OFFLINE                                         0        818
guozc                             0       OFFLINE                                         0        818
behaviorGroup                     1       V4_4_0                   PUSH   CLUSTERING      0        0
guozc2                            0       OFFLINE                                         0        0

在服务端创建topic

sh mqadmin updateTopic -n172.17.140.1:9876 -cDefaultCluster -tbehavior

更多命令查看

sh mqadmin
The most commonly used mqadmin commands are:
   updateTopic          Update or create topic
   deleteTopic          Delete topic from broker and NameServer.
   updateSubGroup       Update or create subscription group
   deleteSubGroup       Delete subscription group from broker.
   updateBrokerConfig   Update broker's config
   updateTopicPerm      Update topic perm
   topicRoute           Examine topic route info
   topicStatus          Examine topic Status info
   topicClusterList     get cluster info for topic
   brokerStatus         Fetch broker runtime status data
   queryMsgById         Query Message by Id
   queryMsgByKey        Query Message by Key
   queryMsgByUniqueKey  Query Message by Unique key
   queryMsgByOffset     Query Message by offset
   queryMsgByUniqueKey  Query Message by Unique key
   printMsg             Print Message Detail
   printMsgByQueue      Print Message Detail
   sendMsgStatus        send msg to broker.
   brokerConsumeStats   Fetch broker consume stats data
   producerConnection   Query producer's socket connection and client version
   consumerConnection   Query consumer's socket connection, client version and subscription
   consumerProgress     Query consumers's progress, speed
   consumerStatus       Query consumer's internal data structure
   cloneGroupOffset     clone offset from other group.
   clusterList          List all of clusters
   topicList            Fetch all topic list from name server
   updateKvConfig       Create or update KV config.
   deleteKvConfig       Delete KV config.
   wipeWritePerm        Wipe write perm of broker in all name server
   resetOffsetByTime    Reset consumer offset by timestamp(without client restart).
   updateOrderConf      Create or update or delete order conf
   cleanExpiredCQ       Clean expired ConsumeQueue on broker.
   cleanUnusedTopic     Clean unused topic on broker.
   startMonitoring      Start Monitoring
   statsAll             Topic and Consumer tps stats
   allocateMQ           Allocate MQ
   checkMsgSendRT       check message send response time
   clusterRT            List All clusters Message Send RT
   getNamesrvConfig     Get configs of name server.
   updateNamesrvConfig  Update configs of name server.
   getBrokerConfig      Get broker config by cluster or special broker!
   queryCq              Query cq command.

创建topic是通过updataTopic命令

sh mqadmin help updateTopic    通过help查看详情

通过topic查询命令查看是否创建成功

sh  mqadmin topiclist -n 172.17.140.1:9876

broker-b
BenchmarkTest
OFFSET_MOVED_EVENT
broker-a
behavior
SELF_TEST_TOPIC
DefaultCluster

好的打烊收工,后面再整理一些使用中的坑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容