1. 程式人生 > >Linux下RocketMQ環境的配置

Linux下RocketMQ環境的配置

log 能夠 集群模式 新建 技術 logback tin 堆內存 前臺

  RocketMQ是一款分布式消息系統,最初是由阿裏巴巴消息中間件團隊研發並大規模應用於生產系統,滿足線上海量堆積的需求,在去年捐贈給Apache開源基金會,並列為孵化項目,今年成功的正式成為了apache頂級項目;早期阿裏曾經基於ActiveMQ研發的消息系統,隨著業務消息的規模增大,瓶頸逐漸明顯,後來也考慮過Kafka,但是因為在低延遲和高可靠性方面沒有選擇,最後才自主研發了RocketMQ,各方面的性能都比目前已有的消息隊列要好,RocketMQ和kafka在原理和概念上都非常相似,所以也經常被拿來對比;RocketMQ默認采用長輪詢的拉模式,單機支持千萬級別的消息堆積,可以非常好的應用在海量消息系統中,下面主要敘述一下RocketMQ的安裝配置過程和一些相關的概念,因為rocketmq能夠很方便的擴展到分布式集群,所以單機情況下也可以很好的說明,所以下面操作都在一臺服務器上執行

  RocketMQ官網地址為:http://rocketmq.apache.org/ ,個人感覺RocketMQ的官方文檔寫的非常清晰,簡單易懂,通過文檔左側下方可以找到下載鏈接,下載編譯好的二進制版本,最新版本是4.1.0孵化版,下載安裝包為:rocketmq-all-4.1.0-incubating-bin-release.zip,下載之後準備安裝

  首先解壓安裝包然後放到自己要安裝的位置:

unzip rocketmq-all-4.1.0-incubating-bin-release.zip
mv rocketmq-all-4.1.0-incubating /monchickey/
cd /monchickey/rocketmq-all-4.1
.0-incubating/

  我這裏安裝到了/monchickey目錄下面,首先可以按照官網上面的Quick Start走一遍,看看大致流程,rocketmq集群包括nameserver和broker,nameserver負責管理集群的列表信息,broker是真正作為消息承載和提供數據吞吐服務的,首先執行下面命令啟動nameserver:

nohup ./bin/mqnamesrv &

  執行之後再敲一次確認鍵回到命令行,然後查看日誌,默認位置在:~/logs/rocketmqlogs/namesrv.log中,如果看到下面內容則表示啟動成功:

  技術分享

  然後執行 jps 可以看到NamesrvStartup,就是nameserver進程了

  技術分享

  然後需要啟動broker,命令如下:

nohup ./bin/mqbroker -n monchickey:9876 &

  這裏-n指定nameserver地址,nameserver服務端口為9876,,這裏如果在配置比較低的計算機或者虛擬機上很容易瞬間啟動失敗,這時候如果前臺啟動可能會看到下面這樣的內容:

  技術分享

  那麽這種情況很明顯就是內存不足導致的申請失敗,RocketMQ默認配置是比較好的,這樣可以直接應用於生產環境,所以如果機器內存較小,可以手動調整JVM的配置,可以先編輯bin/mqbroker會看到最後還是調用了bin/runbroker.sh,這裏打開bin/runbroker.sh,找到jvm啟動配置如下:

  技術分享

  這裏broker堆內存最大值和初始值都為8G,年輕代大小為4G,因為是測試環境所以xms和xmx都配置為4g,xmn配置為512m即可,配置完成後再次執行上面的命令啟動即可,啟動成功後日誌位置同樣是在家目錄下,同樣使用jps查看會看到BrokerStartup就是broker的進程

  技術分享

  對於nameserver和broker日誌位置都可以手動配置,具體配置文件就是conf下的logback_broker.xml和logback_namesrv.xml

  技術分享

  現在可以跑一個簡單的示例看一下了,現在可以打開兩個窗口,一個查看生產者,一個查看消費者,首先兩個shell窗口都需要執行命令: export NAMESRV_ADDR=monchickey:9876 導入一下nameserver變量,然後第一個窗口執行下面命令啟動生產者實例發送消息:

bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

  可以看到發送成功的消息返回:

  技術分享

  然後另一個窗口可以啟動消費者實例消費:

bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

  可以看到消費消息如下:

  技術分享

  到這裏其實最簡單的RocketMQ環境就配置好了,可以看到基本上沒有什麽配置需要修改的,停止nameserver和broker可以分別執行下面命令:

bin/mqshutdown namesrv
bin/mqshutdown namesrv

  這樣進程就可以結束了,下面來詳細說一下生產環境應該怎麽部署

  對於kafka集群,其中有一個節點為master,並且我們不用幹預,master是kafka自動選擇出來的,但是rocketMQ的master和slave都需要手動指定,所以kafka是broker中出來master和slave,而rocketmq中是多個master和slave,一塊構建成為broker,兩個過程基本上是相反的;另外在生產環境中nameserver建議至少設置2個,這樣一個掛了集群不受影響

  對於rocketmq集群,一個broker-name一般設置一個master以及一個或多個slave,一個集群可以設置多個broker-name,在rocketmq的conf目錄下可以看到如下幾個常用的配置:

  技術分享

  其中2m表示2個master,2s表示2個slave,sync表示同步刷盤,asyna表示異步刷盤和replication,默認情況下rocketmq是async模式的,這樣性能會非常好,但是如果需要保證消息的可靠性,建議使用sync的方式,

  另外多說一下,kafka的topic裏面有分區和副本的概念,使用之前都是根據數據量手動創建,對於rocketmq也一樣,需要手動創建topic,rocketmq的topic中有隊列(queue)的概念,也就是說一個節點上面可以有多個隊列,這樣能非常大的提高並發性,而kafka最多只能是一個分區一個進程消費,這樣並發性限制非常大,並且單機分區數量不能過多,超過64個分區就出現明顯的不穩定,但是rocketmq單機支持上萬隊列,所以並發性能非常好;類比一下,rocketmq中一個broker-name其實就相當於kafka broker中的一個partition,而rocketmq每一個slave就相當於kafka中的一個replication,這種情況,所以rocketmq的特點相當於單個partition支持多隊列,大致的原理圖如下:

  技術分享

  默認情況下,一個topic的隊列數是8,當然在實際應用中可以設置的更大,知道了前面這些概念,那麽在集群中以2m-2s-sync的方式啟動一個集群就簡單了,假設2臺nameserver主機分別為rocket1和rocket2,則步驟如下:

  1). 分別啟動兩個nameserver

rocket1 > nohup ./bin/mqnamesrv &
rocket2 > nohup ./bin/mqnamesrv &

  2). 然後分別在剩下主機中分別啟動2個master和2個slave:

bin/mqbroker -c ./conf/2m-2s-sync/broker-a.properties -n rocket1:9876,rocket2:9876
bin/mqbroker -c ./conf/2m-2s-sync/broker-a-s.properties -n rocket1:9876,rocket2:9876
bin/mqbroker -c ./conf/2m-2s-sync/broker-b.properties -n rocket1:9876,rocket2:9876
bin/mqbroker -c ./conf/2m-2s-sync/broker-b-s.properties -n rocket1:9876,rocket2:9876

  這樣就集群就啟動完畢了,實際生產中最好是一個服務器只運行一個broker實例

  然後在單機上也可以啟動多個broker master,為了加深對配置的理解下面是具體的步驟:

  首先啟動nameserver這個和之前一樣,但是啟動broker不能按照之前那樣啟動了,因為單機偽集群模式也必須對應集群名稱,同樣按照集群中的概念來啟動,先進入conf目錄,可以看到有一個broker.conf,這個是相當於配置的簡單模板,另外其他的配置也可以到上面說的2m-2s那些目錄中去參考一下,這個broker.conf是不能直接使用的,因為broker啟動的時候用-c參數傳入配置文件,這裏只認識*.properties的配置文件,所以這裏應該分別執行:

cp broker.conf broker1.properties
cp broker1.properties broker2.properties

  將配置文件復制為2份,先執行 vim broker1.properties 查看第一個配置文件,內容如下:

  技術分享

  這裏第一個是集群名稱,一個集群必須配置一個,默認就是DefaultCluster,然後brokerName是broker的名稱,master的話brokerId為0,其余的slave依次是1,2,3往後排,然後brokerRole配置表示異步的往slave拷貝,如果是slave節點直接寫SLAVE即可,最後一個是刷盤的類型,這樣這個配置文件不用動,然後啟動第一個broker即可:

nohup bin/mqbroker -c ./conf/broker1.properties -n monchickey:9876 &

  然後打開broker2.properties,修改如下:

  技術分享

  首先是集群名要一致,然後brokerName設置為一個新的broker-b,這個也是master,相當於第二個分區,然後只配置這些啟動直接就報端口沖突的失敗,因為這是單機環境,而broker默認端口是10911,所以為了避免沖突啟動多個broker需要設置個新的端口,當然分布式環境都默認即可,這裏添加了一個端口配置為11911,然後啟動第二個broker:

nohup bin/mqbroker -c ./conf/broker2.properties -n monchickey:9876 &

  這樣就啟動了第二個進程,此時jps應該可以看到兩個broker進程,這就是一個最簡單的集群了,另外還有更多配置項這個可以參考官方文檔講的很詳細,下面可以使用mqadmin工具執行一些CLI操作,比如直接執行: ./bin/mqadmin 可以看到所有的操作選項,常用的比如:updateTopic - 創建或更新topic,deleteTopic 刪除topic,clusterList 列出集群,topicList 列出topic,另外還可以按照時間戳以及id查看消息等,

  比如執行: bin/mqadmin clusterList -n monchickey:9876 查看集群如下:

  技術分享

  可以看到只有一個集群2個broker

  查看集群狀態可以執行: bin/mqadmin brokerStatus -c DefaultCluster -n monchickey:9876

  新建一個默認配置的topic可以執行: bin/mqadmin updateTopic -b monchickey:10911 -n monchickey:9876 -t test

  或者執行: bin/mqadmin updateTopic -c DefaultCluster -n monchickey:9876 -t test 這兩個命令都可以,也就是說-b broker主機或者-c集群名必須指定一個,

  技術分享

  這樣一個topic就創建成功了,默認讀和寫的隊列數都是8個,

  然後可以執行命令: bin/mqadmin topicList -n monchickey:9876 查看topic列表:

  技術分享

  以及查看test這個topic隊列分布的詳細信息: bin/mqadmin topicStatus -n monchickey:9876 -t test

  技術分享

  可以看到默認情況下隊列都被分到broker-a上面了,比如我們要創建更多的隊列,那麽rocketmq會自動的均衡分布到集群所有的broker中

  基本的命令就是上面這些,對於每個命令可以用的時候現查,比如topicStatus這個具體怎麽用,可以執行: bin/mqadmin help topicStatus 或者 bin/mqadmin topicStatus -h 查看詳細的參數,然後根據需要使用就可以了

  好了,關於rocketmq的基本配置使用就先敘述這些,這確實是一個非常好用的消息中間件,值得深入的學習.. 最後感謝花時間閱讀,如果有其他內容或問題也歡迎補充,一起交流...

Linux下RocketMQ環境的配置