消息中間件RocketMQ的安裝與部署
官方簡介:
RocketMQ是一款分佈式、隊列模型的消息中間件,具有以下特點:
能夠保證嚴格的消息順序
提供豐富的消息拉取模式
高效的訂閱者水平擴展能力
實時的消息訂閱機制
億級消息堆積能力
1.安裝RocketMQ
1.1 安裝環境git,Java,Maven
安裝git
yum install git
安裝jdk環境
下載jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
安裝並設置環境變量
rpm -ivh jdk-7u51-linux-x64.rpm echo "exportJAVA_HOME=/usr/java/default" >> /etc/profile source /etc/profile
安裝maven
mkdir /usr/local/maven tar zxvf apache-maven-3.2.1-bin.tar.gz -C/usr/local/maven/ echo 'exportM2_HOME=/usr/local/maven/apache-maven-3.2.1' >> /etc/profile echo 'export M2=$M2_HOME/bin' >>/etc/profile echo 'export MAVEN_OPTS="-Xms256m-Xmx512m"' >> /etc/profile echo 'export PATH=$M2:$PATH' >>/etc/profile source /etc/profile mvn -v
1.2 安裝RocketMQ
wget https://github.com/alibaba/RocketMQ/archive/v3.0.8-beta1.tar.gz tar zxvf v3.0.8-beta1.tar.gz cd rocketmq sh install.sh cd devenv
2.RocketMQ部署
Producer、Consumer、Broker都可以分佈式部署。Producer、Consumer通過Name Server來尋找Broker,Broker啓動後,會定時將要發佈的Topic註冊到NameServer。
2.1 啓動nameserver
nohup mqnamesrv &
在生產環境部署nameserver,請參考以下軟硬件要求
https://github.com/alibaba/RocketMQ/wiki/system_requirements
2.2 啓動broker
nohup mqbroker -n "192.168.0.1:9876;192.168.0.2:9876" &
Broker指定Name Server地址的方式(優先級按照高低順序排序)
啓動Broker時,命令行方式指定
mqbroker -n "192.168.0.1:9876;192.168.0.2:9876"
通過環境變量指定
exportNAMESRV_ADDR=192.168.0.1:9876;192.168.0.2:9876
2.3 關閉nameserver或broker
sh ./mqshutdown Useage: mqshutdown broker | namesrv
2.4 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
在生產環境部署Broker,請參考以下軟硬件要求
https://github.com/alibaba/RocketMQ/wiki/system_requirements
2.5 Broker集羣部署
推薦的幾種 Broker 集羣部署方式,這裏的Slave 不可寫,但可讀,類似與 Mysql 主備方式。
1.單個 Master
這種方式風險較大,一旦Broker 重啓或者宕機時,會導致整個服務不可用,不建議線上環境使用。
2.多 Master 模式
一個集羣無 Slave,全是 Master,例如 2 個 Master 或者 3 個 Master
優點:配置簡單,單個Master 宕機或重啓維護對應用無影響,在磁盤配置爲 RAID10 時,即使機器宕機不可恢復情況下,由與 RAID10 磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)。性能最高。
缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到受到影響。
### 先啓動 NameServer,例如機器 IP 爲:192.168.1.1:9876
nohup sh mqnamesrv &
### 在機器 A,啓動第一個 Master
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties &
### 在機器 B,啓動第二個 Master
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties &
3.多 Master 多 Slave 模式,異步複製
每個 Master 配置一個 Slave,有多對Master-Slave,HA 採用異步複製方式,主備有短暫消息延遲,毫秒級。
優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,因爲 Master 宕機後,消費者仍然可以從 Slave 消費,此過程對應用透明。不需要人工干預。性能同多 Master 模式幾乎一樣。
缺點:Master 宕機,磁盤損壞情況,會丟失少量消息。
### 先啓動 NameServer,例如機器 IP 爲:192.168.1.1:9876
nohup sh mqnamesrv &
### 在機器 A,啓動第一個 Master
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
### 在機器 B,啓動第二個 Master
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &
### 在機器 C,啓動第一個 Slave
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
### 在機器 D,啓動第二個 Slave
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &
4. 多 Master 多 Slave 模式,同步雙寫
每個 Master 配置一個 Slave,有多對Master-Slave,HA 採用同步雙寫方式,主備都寫成功,嚮應用返回成功。
優點:數據與服務都無單點,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高
缺點:性能比異步複製模式略低,大約低 10%左右,發送單個消息的 RT 會略高。目前主宕機後,備機不能自動切換爲主機,後續會支持自動切換功能。
### 先啓動 NameServer,例如機器 IP 爲:192.168.1.1:9876
nohup sh mqnamesrv &
### 在機器 A,啓動第一個 Master
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &
### 在機器 B,啓動第二個 Master
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &
### 在機器 C,啓動第一個 Slave
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &
### 在機器 D,啓動第二個 Slave
nohup sh mqbroker -n 192.168.1.1:9876 -c$ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &
以上 Broker 與 Slave 配對是通過指定相同的brokerName 參數來配對,Master 的 BrokerId 必須是 0,Slave 的BrokerId 必須是大與 0 的數。另外一個 Master 下面可以掛載多個 Slave,同一 Master 下的多個 Slave 通過指定不同的 BrokerId 來區分。
$ROCKETMQ_HOST 指的 RocketMQ 安裝目錄,需要用戶自己設置此環境變量