RocketMQ集群搭建簡明教程

一、RocketMQ集群搭建

  1. 集群規(guī)劃
名稱 broker角色 IP&port
nameSer-1 注冊服務(wù)中心 UAT容器集群-02:9876
nameSer-2 注冊服務(wù)中心 UAT容器集群-04:9876
broker-a-0 master UAT容器集群-01:10911 broker-a.properties
broker-a-1 slave UAT容器集群-04:10911 broker-a-s.properties
broker-b-0 master UAT容器集群-03:10911 broker-b.properties
broker-b-1 slave UAT容器集群-02:10911 broker-b-s.properties
  1. 下載軟件包,并解壓到相應(yīng)目錄。
    下載地址:https://github.com/apache/rocketmq/archive/rocketmq-all-4.6.0.tar.gz

  2. 修改啟動腳本配置
    默認(rèn)broker的JVM內(nèi)存為8G,nameSer的JVM內(nèi)存為4G。對于測試環(huán)境有點奢侈。所以,將nameSer改為1G,broker改為2G。

[admin@iZbp150aqw850jwlm06qhcZ bin]$ cat runbroker.sh | grep Xms
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"
[admin@iZbp150aqw850jwlm06qhcZ bin]$ cat runserver.sh | grep Xms
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
  1. 修改broker配置
    將conf目錄下 broker-a.properties、broker-a-s.properties、broker-b.properties、broker-b-s.properties 四個文件分別添加如下配置。
[admin@iZbp150aqw850jwlm06qhcZ 2m-2s-async]$ cat broker-a.properties  | grep namesrvAddr
namesrvAddr=UAT容器集群-02:9876;UAT容器集群-04:9876
  1. 將配置復(fù)制到其他3臺機器

  2. 啟動nameSrv和broker服務(wù)
    啟動nameSrv

# UAT容器集群-02
[admin@iZbp15v1c0o8malwswsdm5Z bin]$ nohup sh mqnamesrv 2>&1 &
# UAT容器集群-04
[admin@iZbp13d7te8727w5phtiskZ bin]$ nohup sh mqnamesrv 2>&1 &

啟動broker

# UAT容器集群-01
[admin@iZbp150aqw850jwlm06qhcZ bin]nohup sh mqbroker -c /mnt/rocketmq-all-4.6.0-bin-release/conf/2m-2s-async/broker-a.properties 2>&1 &
# UAT容器集群-03
[admin@iZbp13d7te8727w5phtisjZ bin]$ nohup sh mqbroker -c /mnt/rocketmq-all-4.6.0-bin-release/conf/2m-2s-async/broker-b.properties 2>&1 &
# UAT容器集群-02
[admin@iZbp13d7te8727w5phtiskZ bin]$ nohup sh mqbroker -c /mnt/rocketmq-all-4.6.0-bin-release/conf/2m-2s-async/broker-a-s.properties 2>&1 &
# UAT容器集群-04
[admin@iZbp13d7te8727w5phtiskZ bin]$ nohup sh mqbroker -c /mnt/rocketmq-all-4.6.0-bin-release/conf/2m-2s-async/broker-b-s.properties 2>&1 &
  1. 可以查看日志檢查集群是否運行成功。
tail -f ~/logs/rocketmqlogs/namesrv.log
tail -f ~/logs/rocketmqlogs/broker.log
  1. 至此,rocketmq集群搭建完成。

二、如何保證消息不丟失

  1. 保證Producer成功投遞。
    1.1. 默認(rèn)情況下,可以通過同步的方式阻塞式的發(fā)送,check SendStatus,狀態(tài)是OK,表示消息一定成功的投遞到了Broker,狀態(tài)超時或者失敗,則會觸發(fā)默認(rèn)的2次重試。此方法的發(fā)送結(jié)果,可能Broker存儲成功了,也可能沒成功。
    1.2. 采取事務(wù)消息的投遞方式,并不能保證消息100%投遞成功到了Broker,但是如果消息發(fā)送Ack失敗的話,此消息會存儲在CommitLog當(dāng)中,但是對ConsumerQueue是不可見的??梢栽谌罩局胁榭吹竭@條異常的消息,嚴(yán)格意義上來講,也并沒有完全丟失(事務(wù)消息成本非常高)
    1.3. RocketMQ通過queryMessage,來查詢消息是否在Broker存儲成功

  2. 保證Broker數(shù)據(jù)不丟失。
    2.1. 消息支持持久化到Commitlog里面,即使宕機后重啟,未消費的消息也是可以加載出來的
    2.2. Broker自身支持同步刷盤、異步刷盤的策略,可以保證接收到的消息一定存儲在本地的內(nèi)存中(同步刷盤的成本非常高)
    2.3. Broker集群支持 1主N從的策略,支持同步復(fù)制和異步復(fù)制的方式,同步復(fù)制可以保證即使Master 磁盤崩潰,消息仍然不會丟失(如果是用同步策略,無法自動主從切換)

  3. 保證Consumer消息不丟失。
    3.1. Consumer自身維護一個持久化的offset(對應(yīng)MessageQueue里面的min offset),標(biāo)記已經(jīng)成功消費或者已經(jīng)成功發(fā)回到broker的消息下標(biāo)
    3.2. 如果Consumer消費失敗,通過ConsumeConcurrentlyStatus.RECONSUME_LATER進行重試
    3.3. 如果Consumer消費失敗,發(fā)回給broker時,broker掛掉了,那么Consumer會定時重試這個操作
    3.4. 如果Consumer和Broker一起掛了,消息也不會丟失,因為Consumer 里面的offset是定時持久化的,重啟之后,繼續(xù)拉取offset之前的消息到本地

Mark一下別人的經(jīng)驗:
RocketMQ-架構(gòu)原理
RocketMQ 教程
RocketMQ性能優(yōu)化【實戰(zhàn)筆記】
為什么選擇RocketMQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容