linux下搭建rocketmq(附服務腳本)
此文檔安裝的是rocketmq當前最新版本rocketmq v4.0.0,當時阿裏已經把rocketmq捐贈給了apache組織,為什麽要特別指明這一點,因為在下載、安裝和服務腳本中有個別不同的地方。這是本人第一篇博客,如果排版不是很清楚,請評論中指明,以糾正自己的編寫習慣。
一、安裝rocketmq
1、安裝要求
64bit OS, Linux/Unix/Mac is recommended; 64bit JDK 1.7+; Maven 3.2.x; Git
2、克隆和編譯
> git clone -b develop https://github.com/apache/incubator-rocketmq.git 會在當前目錄下生成“incubator-rocketmq”目錄,接下來的部分操作都是在這個目錄下進 > cd incubator-rocketmq > mvn -Prelease-all -DskipTests clean install -U 此步驟時間會比較長,請耐心等待,執行成功會生成多個目錄。這是編譯過程,我們後續操作只需要在編譯過程生成的distribution/target/apache-rocketmq目錄中進行,通常為了方便,我們把這個目錄拷貝出來。 > cd distribution/target/apache-rocketmq
此時需要註意的是:啟動的時候先啟動Name server 停止的時候先停止Broker
3、嘗試啟動"Name Server"
> nohup sh bin/mqnamesrv & > tail -f ~/logs/rocketmqlogs/namesrv.log 日誌文件會自動生成 The Name Server boot success…
4、嘗試啟動"Broker"
> nohup sh bin/mqbroker -n localhost:9876 & > tail -f ~/logs/rocketmqlogs/broker.log The broker[%s, 172.30.30.233:10911] boot success...
5、停止"Broker"服務
> sh bin/mqshutdown broker The mqbroker(36695) is running... Send shutdown request to mqbroker(36695) OK
6、停止"Name Server"服務
> sh bin/mqshutdown namesrv The mqnamesrv(36664) is running... Send shutdown request to mqnamesrv(36664) OK
在測試完成之後,說明安裝成功,一切都能正常運行,此安裝過程是摘自官方文檔,有何異議請移步官方文檔 https://rocketmq.incubator.apache.org/
二、配置mqbroker
1、 通常我們使用是以集群模式運行Broker
Broker集群有多種配置方式: 1,單Master 優點:除了配置簡單沒什麽優點 缺點:不可靠,該機器重啟或宕機,將導致整個服務不可用 2,多Master 優點:配置簡單,性能最高 缺點:可能會有少量消息丟失(配置相關),單臺機器重啟或宕機期間,該機器下未被消費的消息在機器恢復前不可訂閱,影響消息實時性 3,多Master多Slave,每個Master配一個Slave,有多對Master-Slave,集群采用異步復制方式,主備有短暫消息延遲,毫秒級 優點:性能同多Master幾乎一樣,實時性高,主備間切換對應用透明,不需人工幹預 缺點:Master宕機或磁盤損壞時會有少量消息丟失 4,多Master多Slave,每個Master配一個Slave,有多對Master-Slave,集群采用同步雙寫方式,主備都寫成功,向應用返回成功 優點:服務可用性與數據可用性非常高 缺點:性能比異步集群略低,當前版本主宕備不能自動切換為主
2、配置文件默認存在的是
[[email protected] conf]# ls 2m-2s-async 2m-noslave broker.conf.bak logback_filtersrv.xml logback_tools.xml 2m-2s-sync brk.conf logback_broker.xml logback_namesrv.xml
其中m表示主節點,s表示從節點,以哪種集群形式運行,去配置文件中修改即可,之後在服務腳本中調用就行了。這裏我們只是運行單節點broker,具體的集群模式請再自行琢磨,把默認的broker.conf 做備份,並復制一份配置文件出來,重命名為brk.conf 這個名字是隨意起的,建議見名知意,方便在腳本中調用。
3、# cat brk.conf
brokerClusterName = onebroker brokerName = broker-a brokerId = 0 0表示master,1表示slave deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH namesrvAddr = mycat:9876 指明mqname server storePathRootDir = /data/rocketmq/store storePathCommitLog = /data/rocketmq/store/commitlog autoCreateTopicEnable = true autoCreateSubscriptionGroup = true
4、通常
/data/rocketmq/store和/data/rocketmq/store/commitlog是需要手動創建的
為了安全起見,我們使用mq用戶啟動和關閉服務
# useradd mq # chown -R mq:mq /data/rocketmq/ # chown -R mq:mq /opt/apache-rocketmq
三、提供服務腳本
# cat /etc/init.d/mqnamesrv
#!/bin/bash # chkconfig: 2345 55 25 # description:MQ manmger . /etc/rc.d/init.d/functions start() { status if [ $? -ne 0 ] then echo ‘start rocketmq-namserv......‘ #####################################需要修改的就是下面一行######################################### su - mq -c "nohup /opt/apache-rocketmq/bin/mqnamesrv &> /data/rocketmq/logs/mq_namser.log &" if [ $? -eq 0 ];then echo "started......" fi fi } stop() { pid=`ps ax | grep -i ‘org.apache.rocketmq.namesrv.NamesrvStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` if [ -z "$pid" ] ; then echo "No mqnamesrv running." return 2; else echo "The mqnamesrv(${pid}) is running..." kill ${pid} echo "Send shutdown request to mqnamesrv(${pid}) OK" fi } restart() { stop start } status() { pid=`ps ax | grep -i ‘org.apache.rocketmq.namesrv.NamesrvStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` if [ -z "$pid" ] ; then echo "No mqnamesrv running." return 1; fi echo "The mqnamesrv(${pid}) is running..." return 0 } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|tatus}" esac
# cat /etc/init.d/mqbroker
#!/bin/bash # chkconfig: 2345 95 25 # description:MQ manmger . /etc/rc.d/init.d/functions start() { pid=`ps ax | grep -i ‘org.apache.rocketmq.broker.BrokerStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` if [ -z "$pid" ] ; then ###調用腳本啟動mq-master-1.properties echo ‘start rocketmq-broker......‘ su - mq -c "nohup /opt/apache-rocketmq/bin/mqbroker -c /opt/apache-rocketmq/conf/brk.conf &> /data/rocketmq/logs/mqbroker.log &" sleep 1 newpid=`ps ax | grep -i ‘org.apache.rocketmq.broker.BrokerStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` echo "restart mqbroker(${newpid}) is running success..." else echo "The mqbroker(${pid}) is running..." fi } stop() { pid=`ps ax | grep -i ‘org.apache.rocketmq.broker.BrokerStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` if [ -z "$pid" ] ; then echo "No mqbroker running." return 2; else echo "The mqbroker(${pid}) is running..." echo -e "Send shutdown to mqbroker(${pid})\c" kill ${pid} oldpid=$pid while [ ${oldpid} ] do oldpid=`ps ax | grep -i ‘org.apache.rocketmq.broker.BrokerStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` echo -e ‘!\c‘ sleep 1 done echo -e "\nSend shutdown request to mqbroker(${pid}) OK" fi } status() { pid=`ps ax | grep -i ‘org.apache.rocketmq.broker.BrokerStartup‘ |grep java | grep -v grep | awk ‘{print $1}‘` if [ -z "$pid" ] ; then echo "No mqbroker running." return 1; fi echo "The mqbroker(${pid}) is running..." return 0 } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|tatus}" esac
啟動服務的時候,要先啟動mqnamesrv後啟動mqbroker,到此為止,安裝和配置過程結束,至於rocketmq還有更多的玩法,待後續研究,希望對大家有所幫助。
本文出自 “tianxi” 博客,請務必保留此出處http://tianxi.blog.51cto.com/12735181/1922653
linux下搭建rocketmq(附服務腳本)