rocketmq是阿里研發,並貢獻給Apache的一款分佈式消息中間件。html
RcoketMQ 是一款低延遲、高可靠、可伸縮、易於使用的消息中間件。java
ACE環境:(Adapted communication environment)自適配通訊環境linux
ACK:命令應答(Acknowledgement)git
rocketMQ參照jms,可是並不遵循jms規範,所以也就不存在activeMQ的createQueue,createTopic進行ptp鏈接,直接負載均衡依託於groupName。github
JMS (java message server)的PTP模型:point to point modelspring
BROKER :中繼器(代理人),即RocketMQ服務,也稱provider。apache
同步刷盤-消息阻塞,能保證數據絕對完整性,異步刷盤-信息丟失,但吞吐量增大。瀏覽器
訂閱者和發佈者狀況下,會直接廣播到group下的全部customer。tomcat
RocketMQ做用:springboot
rocketMQ可作到平均分配,不一樣於其餘的mq有隨機性分配。
前提要求:
rocketMQ由java編寫,所以須要jdk環境。
jdk1.7+,tomcat7.0+,主機64位,
http://rocketmq.apache.org/dowloading/releases/
rocketMQ下載解壓到指定位置。
在兩臺主機上建立/etc/hosts地址和名稱。
192.168.68.137 rocketmq-nameserver1 192.168.68.138 rocketmq-nameserver2
建立存儲路徑:
[root@localhost program]# mkdir rocketmq/store [root@localhost program]# mkdir rocketmq/store/commitlog [root@localhost program]# mkdir rocketmq/store/consumequeue [root@localhost program]# mkdir rocketmq/store/index
修改配置文件 rocketmq/config:
drwxr-xr-x. 2 root root 4096 Sep 19 2017 2m-2s-async //異步複製 drwxr-xr-x. 2 root root 4096 Sep 19 2017 2m-2s-sync //同步雙寫 drwxr-xr-x. 2 root root 4096 Sep 19 2017 2m-noslave //雙主
若是是搭建雙主,則進入雙主對應的文件夾:
修改文件rocketmq-a.properties 和 rocketmq-b.properties
可參照一下的配置項,注意文件夾路徑,和nameserver的host名,以及broker-name.
RocketMQ 部分 配置項(https://blog.csdn.net/w_x_z_/article/details/70225303)
brokerClusterName=rocketmq-cluster #集羣名,多個mq集羣須要使用一個統一的名字,最好是按照示例自動給的名字,防止人爲輸錯,致使集羣失敗。
brokerName=broker-a #當前主機節點名稱,按照mq的慣性進行起名,好比第一個爲 brokerName=broker-a,第二個文件爲brokerName=broker-b
brokerId=0 #master節點的ID都爲0,>0的數就爲Slave。
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 #用於多個nameserver進行互相發現,注意多個用分號鏈接,名字和/etc/hosts中保持一致。
defaultTopicQueueNums=4 #默認設置1個topic對應4個隊列。
autoCreateTopicEnable=true #是否容許自動建立Topic。這種最好設置爲false,否則隨意注入會形成資源無形損耗,好比我原本消費者只消費T1,T2,
#可是若是傳過來的是T3~T100(惡意攻擊),則消費不掉,會在mq中進行積壓,所以建議設置爲false.
autoCreateSubscriptionGroup=true #是否容許自動建立訂閱組,也是同理最好關閉掉,不讓自發產生。
listenPort=10911 #broker的監聽端口號,一個broker會佔用3個端口,即10911,10912,10913,同臺機器要隔幾個端口
deleteWhen=04 #文件在服務器被刪除掉的時間,例 04點的時候被刪除。
fileReservedTime=120 #文件保留最長時間默認是48小時,也就是2天。
mapedFileSizeCommitLog=1073741824 #commit文件大小限制,超過則會新建一個文件進行保存。commitlog用於存放從producer傳遞過來的數據內容。
mapedFileSizeConsumeQueue=300000 #每一個文件默認存30W條,根據業務狀況調整,consumequeue用於存放文件內容索引和topic以及隊列的邏輯關係。
brokerRole=ASYNC_MASTER #可選擇同步雙寫,或異步複製(SYNC_MASTER ASYNC_MASTER SLAVE),若是是從節點就用SLAVE
#destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
# 檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/program/rocketmq/store
#commitLog存儲路徑
storePathCommitLog=/usr/local/program/rocketmq/store/commitlog
#消費隊列存儲路徑
storePathConsumeQueue=/usr/local/program/rocketmq/store/consumequeue
# 消息索引存儲路徑
storePathIndex=/usr/local/program/rocketmq/store/index
# checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/program/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/program/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# 刷盤方式
# - ASYNC_FLUSH 異步刷盤
# - SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageTreadPoolNums=128
#拉消息線程池數量
#pullMessageTreadPoolNums=128
isVIPChannel=false
注意: brokerRole 我從別人那copy的配置文件,當時這個名稱是brokerRote 致使一直Slave不起做用。
注意用替換的時候storepath,我噹噹時從服務和主服務交叉,store用的store2,直接用全替換將路徑名也替換掉了,致使Slave啓動不起來。
修改logs文件位置,替換文件的存放位置: 因斜槓有特殊意義,所以須要反斜槓作不轉義聲明
>mkdir rocketmq/logs >cd rocketmq/config && sed -i 's/${user.home}/\/usr\/local\/program\/rocketmq/g' logback_*.xml
修改配置文件JAVA_OPT文件:
查看rocketmq/bin/runbroker.sh rocketmq/bin/runnameserver.sh能夠看出如下的java_opt中默認設置的內存達到8G,在生產上能夠,可是用虛擬機太大帶不起來。
所以須要所有調整爲1G,過小有可能啓動不起來。
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
修改成:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
啓動:
注意:首先要啓動全部機器節點的nameServer.而後再啓動各節點的broker.
在ab機器啓動nameserver:
》nohup sh mqnamesrv &
使用java的jps查看就能夠看到nameserver的進程。
>jps
在ab機器啓動broker,注意a機器用broker-a.properties,b機器用broker-b.properties:
》nohup sh mqbroker -c /usr/local/program/rocketmq/conf/2m-noslave/broker-a.properties &
有時會遇到有這種寫法 nohup sh **** >/dev/null >2&1 & 這種是爲了在當前目錄下不產生nohup.out文件。
再用jps查看是否已經啓動進程。若是發現沒有broker的進程,則去logs下查看日誌nohup.sh或者broker文件,瞭解問題。
至此,服務端的啓動就算OK了。
關閉:》sh mqshutdown broker (先關閉全部的broker)
》sh mqshutdown namesrv (而後再關閉全部的namesrv)
清理數據:刪除掉 store中的文件夾及文件便可。
使用教程:RocketMq 監控 之rocketmq-console應用(https://yq.aliyun.com/articles/486069)
下載地址:https://github.com/apache/rocketmq-externals
目前rocketmq-console使用springboot,所以已經不須要安裝tomcat,內嵌有tomcat。
下載後,修改rocketmq-console的配置文件application.properties。
修改如下文件:
rocketmq.config.namesrvAddr=[參見broker-a.properties中namesrvAddr] isVIPChannel=false rocketmq.config.dataPath=/usr/local/program/rocketmq-console/data
不過,也能夠先不作修改,在控制檯啓動後在OPT上添加也能夠。
而後從新打包 >mvn install -DskipTests
將target中的jar包放入到linux下,啓動
>nohup java -jar /rocketmq-console.jar &
也可添加參數指定啓動的port,和nohup啓動文件日誌地址 --server.port=12581 > /Disk/temp.txt &
若是瀏覽器訪問被拒絕,有多是linux端的防火牆未關閉致使,關閉防火牆後就OK了。
http://192.168.68.137:8080/
點擊菜單Cluster就能夠看到集羣的機器,默認會提供一些Topic。
1. 從節點的brokerId=n, n>0從節點的數值必定要大於0。
2. 從節點的brokername名必定要和對應的主節點一致。
3. 從節點的brokerRote=SLAVE。
4. 因9876端口爲其默認端口,所以也就意味着一臺電腦使用一個NameServer。不能存在主節點和從節點部署在一臺機子上。
若是用2個電腦作雙主雙從,則端口號要不同且至少隔3位,否則端口占用沒法啓動,且存儲位置不能同樣。(僅測試用),生產徹底分開。
可參照文章: http://www.javashuo.com/article/p-xedzspmm-br.html
2m-2s sync 同步雙寫,
2m-2s async 異步複製。
從節點通常會作數據備份,只有在主節點宕機時,從節點未被消費內容會被消費,可是從節點不能用於直接生產者寫操做。即主從不能互換。
當主節點重啓後,主節點會去從節點查詢offset同步offset。這樣就防止從消費後主又消費。