天天看點

rocketmq3.5.8 原理和叢集安裝

阿裡的rocketmq

RocketMQ是一款分布式、隊列模型的消息中間件,具有以下特點:

1、支援嚴格的消息順序;

2、支援Topic與Queue兩種模式;

3、億級消息堆積能力;

4、比較友好的分布式特性;

5、同時支援Push與Pull方式消費消息;

https://github.com/alibaba/RocketMQ/releases 最新版本

在生産環境部署Broker,請參考以下軟硬體要求

https://github.com/alibaba/RocketMQ/wiki/system_requirements

rabbit不知道,但是rocket的性能是(萬條每秒),并且能夠橫向無限擴充,單機topic數量在256時,性能損失較小。

rocket可以說是kafka的變種,是阿裡在充分reviewkafka代碼後,開發的metaQ。在不斷更新,修補以後,阿裡把metaQ3.0更名為rocket,并且rocket是java寫的易于維護。

另外就是rocket和kafka有類似無限堆積的能力。想想,斷電不丢消息,積壓兩億條消息毫無壓力,niubility

kafka和rocket性能根本不是你需要考慮的問題

導入本地包

mvn install:install-file -DgroupId=net.java.dev.jna -DartifactId=jna -Dversion=4.2.2 -Dpackaging=jar -Dfile=/root/jna-4.2.2.jar

以下文章非常有用

http://blog.csdn.net/zknxx/article/details/52974189

http://blog.csdn.net/crazyxq/article/details/52870502 

rocketmq3.5.8 編譯好的包,自己編譯太坑了

http://download.csdn.net/download/zknxx/9668351

生産一般都主主吧

RocketMQ-3.5.8雙主雙從配置及部署說明  

http://download.csdn.net/download/coffeelifelau/9667849

mkdir -p /var/log/rocketmqlogs

mkdir -p /data/rocketmq/store/commitlog  /data/logs

nohup sh mqnamesrv > /var/log/rocketmqlogs/namesrv.log 2>&1 &

a伺服器

nohup sh mqbroker -c ../conf/2m-noslave/broker-a.properties  >/dev/null 2>&1 &

b伺服器

nohup sh mqbroker -c ../conf/2m-noslave/broker-b.properties  >/dev/null 2>&1 &

配置檔案參考

http://sofar.blog.51cto.com/353572/1540874

配置權限

chown -Rnobody.nobody Application

a.啟動NameServer[master-a,master-b]

cd /data/Application/rocketmq/bin

sudo -u nobody nohup sh/data/Application/rocketmq/bin/mqnamesrv &

b.啟動BrokerA[master-a]

sudo -u nobody nohup sh/data/Application/rocketmq/bin/mqbroker -c/data/Application/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null2>&1 &

c.啟動BrokerB[master-b]

sudo -u nobody nohup sh/data/Application/rocketmq/bin/mqbroker -c/data/Application/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null2>&1 &

關閉nameserver或broker

sh ./mqshutdown

Useage: mqshutdown broker | namesrv

注意:

運作sh os.sh,會發現swap會占用一半,而記憶體會占用很少。

如果需要恢複成開始的樣子,修改os.sh

sudo sysctl -w vm.extra_free_kbytes=0

sudo sysctl -w vm.min_free_kbytes=67584

sudo sysctl -w vm.overcommit_memory=0

sudo sysctl -w vm.drop_caches=0

sudo sysctl -w vm.zone_reclaim_mode=0

sudo sysctl -w vm.max_map_count=65530

sudo sysctl -w vm.dirty_background_ratio=10

sudo sysctl -w vm.dirty_ratio=20

sudo sysctl -w vm.dirty_writeback_centisecs=500

sudo sysctl -w vm.page-cluster=3

sudo sysctl -w vm.swappiness=60

然後重新開機後者用網上的swap.sh腳本找到占用swap的程序,重新開機之。

具體os.sh參數的作用

1.控制記憶體回收 grep low /proc/zoneinfo

這個參數值用來強制linux虛拟記憶體保留最小值的空閑

vm.extra_free_kbytes

vm.min_free_kbytes  

2.vm.max_map_count 虛拟記憶體使用

3.vm.swappiness

執行這個腳本出現記憶體占用的少的原因,估計就是調了控制記憶體回收

應該是控制broker同步的頻率,這樣做之後,隻有很多的資料,才會同步。

測試

export NAMESRV_ADDR=ip1:9876\;ip2:9876

bash tools.sh com.alibaba.rocketmq.example.quickstart.Producer

bash tools.sh com.alibaba.rocketmq.example.quickstart.Consumer

要解決的問題

1.主主還是多主多從

http://blog.csdn.net/a19881029/article/details/34446629

2.如何順序消費

RocketMQ消費并行度分兩種情況

順序消費方式并行度同Kafka完全一緻

亂序方式并行度取決于Consumer的線程數,如Topic配置10個隊列,10台機器消費,每台機器100個線程,那麼并行度為1000

rocketmq 順序消費了解

http://blog.csdn.net/u011686226/article/details/53465357

https://github.com/alibaba/RocketMQ/search?utf8=%E2%9C%93&q=sequence

3.

你是叢集消費還是廣播消費,叢集消費的話每個消費者都會收到對應的消息,廣播則不會,另外即使是叢集環境下,也有可能重複消費消息,消費者自己要做到幂等

ps:說反了,不好意思,叢集消費,隻有一次,廣播則多次,

目前rocketmq消費是有叢集消費和廣播消費,上面的樓主說錯了,應該是叢集消費隻能有一個消費者消費一次,而廣播消費則是所有的消費者都會消費一次,至于出現重複消費的問題,一種可能的原因是消費者消費完有沒有做确認機制.

即使消費者做出了确認消費的辨別,消費者還是可能出現重複消費的情況,那是一般在高并發下的出現的,rocketmq有說明,幾乎主流的mq都有這種情況,一般的就是消費幂等

4.推薦Filter Server生産環境部署,為Consumer提供任意的伺服器消息過濾能力

5.支援Topic與Queue兩種模式  不是預設都同時支援的

6.rocketmq使用大記憶體是靠mmap堆外記憶體啊,而不是設定大的jvm堆記憶體的,java的堆最好不要超過10G,要不然性能不行

7.Producer/Consumer指定Name Server位址

通過代碼中指定

producer.setNamesrvAddr("192.168.0.1:9876;192.168.0.2:9876");

consumer.setNamesrvAddr("192.168.0.1:9876;192.168.0.2:9876");

通過Java啟動參數中指定

-Drocketmq.namesrv.addr=192.168.0.1:9876;192.168.0.2:9876

通過環境變量指定

exportNAMESRV_ADDR=192.168.0.1:9876;192.168.0.2:9876

8.監控

web平台監控

安裝tomcat

這裡就省略了。

将war放入webapps下,修改vimWEB-INF/classes/config.properties

rocketmq.namesrv.addr=RocketMQ01:9876   #這裡隻能寫一個

throwDone=true

監控需要自己git後,編譯,網上csdn有現成的。

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1882756,如需轉載請自行聯系原作者