本文主要介紹 RocketMQ 的安裝部署,文中所使用到的軟體版本:RocketMQ 5.1.3、CentOS 7.9.2009。 1、RocketMQ 部署模型 1.1、部署模型說明 Apache RocketMQ 部署架構上主要分為四部分: A、生產者 Producer 發佈消息的角色。Prod ...
本文主要介紹 RocketMQ 的安裝部署,文中所使用到的軟體版本:RocketMQ 5.1.3、CentOS 7.9.2009。
1、RocketMQ 部署模型
1.1、部署模型說明
Apache RocketMQ 部署架構上主要分為四部分:
A、生產者 Producer
發佈消息的角色。Producer 通過 MQ 的負載均衡模塊選擇相應的 Broker 集群隊列進行消息投遞,投遞的過程支持快速失敗和重試。
B、消費者 Consumer
消息消費的角色。
C、名字伺服器 NameServer
NameServer是一個簡單的 Topic 路由註冊中心,支持 Topic、Broker 的動態註冊與發現。
主要包括兩個功能:
1、Broker 管理:NameServer 接受 Broker 集群的註冊信息並且保存下來作為路由信息的基本數據。然後提供心跳檢測機制,檢查 Broker 是否還存活;
2、路由信息管理:每個 NameServer 將保存關於 Broker 集群的整個路由信息和用於客戶端查詢的隊列信息。Producer 和 Consumer 通過 NameServer 就可以知道整個 Broker 集群的路由信息,從而進行消息的投遞和消費。
NameServer 通常會有多個實例部署,各實例間相互不進行信息通訊。Broker 是向每一臺 NameServer 註冊自己的路由信息,所以每一個- NameServer 實例上面都保存一份完整的路由信息。當某個NameServer 因某種原因下線了,客戶端仍然可以向其它 NameServer 獲取路由信息。
D、代理伺服器 Broker
Broker 主要負責消息的存儲、投遞和查詢以及服務高可用保證。NameServer 幾乎無狀態節點,因此可集群部署,節點之間無任何信息同步。Broker 部署相對複雜。
在 Master-Slave 架構中,Broker 分為 Master 與 Slave。一個 Master 可以對應多個 Slave,但是一個 Slave 只能對應一個 Master。Master 與 Slave 的對應關係通過指定相同的 BrokerName,不同的BrokerId 來定義,BrokerId 為 0 表示 Master,非 0 表示 Slave。Master 也可以部署多個。
1.2、部署模型小結
A、每個 Broker 與 NameServer 集群中的所有節點建立長連接,定時註冊 Topic 信息到所有 NameServer。
B、Producer 與 NameServer 集群中的其中一個節點建立長連接,定期從 NameServer 獲取 Topic 路由信息,並向提供 Topic 服務的 Master 建立長連接,且定時向 Master 發送心跳。Producer 完全無狀態。
C、Consumer 與 NameServer 集群中的其中一個節點建立長連接,定期從 NameServer 獲取 Topic 路由信息,並向提供 Topic 服務的 Master、Slave 建立長連接,且定時向 Master、Slave 發送心跳。Consumer 既可以從 Master 訂閱消息,也可以從 Slave 訂閱消息。
1.3、proxy 組件
5.0 版本新增了 proxy 組件,部署時根據實際訴求可以分為 Local 模式和 Cluster 模式,一般情況下如果沒有特殊需求,或者遵循從早期版本平滑升級的思路,可以選用
在 Local 模式下,Broker 和 Proxy 是同進程部署,只是在原有 Broker 的配置基礎上新增 Proxy 的簡易配置就可以運行。
在 Cluster 模式下,Broker 和 Proxy 分別部署,即在原有的集群基礎上,額外再部署 Proxy 即可。
2、RocketMQ 部署
2.1、下載部署包
從官網(https://rocketmq.apache.org/zh/download)下載部署包並解壓:
unzip rocketmq-all-5.1.3-bin-release.zip
2.2、集群規劃
假設在 10.49.196.30、10.49.196.31、10.49.196.32、10.49.196.33 四台機器上按各種模式安裝 RocketMQ。
2.3、Local 模式部署
由於 Local 模式下 Proxy 和 Broker 是同進程部署,Proxy 本身無狀態,因此主要的集群配置仍然以 Broker 為基礎進行即可。
2.3.1、單組節點單副本模式
A、啟動 NameServer
nohup bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log #查看日誌
B、啟動 Broker + Proxy
nohup bin/mqbroker -n localhost:9876 --enable-proxy & tail -f ~/logs/rocketmqlogs/broker_default.log #查看日誌
註意:這種方式風險較大,因為 Broker 只有一個節點,一旦 Broker 重啟或者宕機時,會導致整個服務不可用。不建議線上環境使用, 可以用於本地測試。
2.3.2、多組節點(集群)單副本模式
一個集群內全部部署 Master 角色,不部署 Slave 副本,例如 2 個 Master 或者 3 個 Master,這種模式的優缺點如下:
優點:配置簡單,單個 Master 宕機或重啟維護對應用無影響,在磁碟配置為 RAID10 時,即使機器宕機不可恢復情況下,由於 RAID10 磁碟非常可靠,消息也不會丟(非同步刷盤丟失少量消息,同步刷盤一條不丟),性能最高;
缺點:單台機器宕機期間,這台機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。
A、啟動 NameServer
在 10.49.196.30、10.49.196.31、10.49.196.32 三台機器上分別啟動 NameServer。
nohup bin/mqnamesrv &
B、啟動 Broker + Proxy 集群
在 10.49.196.30 上啟動第一個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties --enable-proxy &
在 10.49.196.31 上啟動第二個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties --enable-proxy &
2.3.3、多節點(集群)多副本模式-非同步複製
每個 Master 配置一個 Slave,有多組 Master-Slave,HA 採用非同步複製方式,主備有短暫消息延遲(毫秒級),這種模式的優缺點如下:
優點:即使磁碟損壞,消息丟失的非常少,且消息實時性不會受影響,同時 Master 宕機後,消費者仍然可以從 Slave 消費,而且此過程對應用透明,不需要人工干預,性能同多 Master 模式幾乎一樣;
缺點:Master 宕機,磁碟損壞情況下會丟失少量消息。
A、啟動 NameServer
在 10.49.196.30、10.49.196.31、10.49.196.32 三台機器上分別啟動 NameServer。
nohup bin/mqnamesrv &
B、啟動 Broker + Proxy 集群
在 10.49.196.30 上啟動第一個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties --enable-proxy &
在 10.49.196.31 上啟動第二個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties --enable-proxy &
在 10.49.196.32 上啟動第一個 Slave:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties --enable-proxy &
在 10.49.196.33 上啟動第二個 Slave:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties --enable-proxy &
2.3.4、多節點(集群)多副本模式-同步雙寫
每個 Master 配置一個 Slave,有多對 Master-Slave,HA 採用同步雙寫方式,即只有主備都寫成功,才嚮應用返回成功,這種模式的優缺點如下:
優點:數據與服務都無單點故障,Master 宕機情況下,消息無延遲,服務可用性與數據可用性都非常高;
缺點:性能比非同步複製模式略低(大約低10%左右),發送單個消息的 RT 會略高,且目前版本在主節點宕機後,備機不能自動切換為主機。
A、啟動 NameServer
在 10.49.196.30、10.49.196.31、10.49.196.32 三台機器上分別啟動 NameServer。
nohup bin/mqnamesrv &
B、啟動 Broker + Proxy 集群
在 10.49.196.30 上啟動第一個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties --enable-proxy &
在 10.49.196.31 上啟動第二個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties --enable-proxy &
在 10.49.196.32 上啟動第一個 Slave:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties --enable-proxy &
在 10.49.196.33 上啟動第二個 Slave:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties --enable-proxy &
註:以上 Broker 與 Slave 配對是通過指定相同的 BrokerName 參數來配對,Master 的 BrokerId 必須是 0,Slave 的 BrokerId 必須是大於 0 的數。另外一個 Master 下麵可以掛載多個 Slave,同一 Master 下的多個 Slave 通過指定不同的 BrokerId 來區分。
2.4、Cluster 模式部署
在 Cluster 模式下,Broker 與 Proxy 分別部署(Broker 啟動時不要添加 --enable-proxy 參數),可以在 NameServer和 Broker 都啟動完成之後再部署 Proxy。
在 Cluster 模式下,一個 Proxy 集群和 Broker 集群為一一對應的關係,可以在 Proxy 的配置文件 rmq-proxy.json 中使用 rocketMQClusterName 進行配置。
這裡以 Broker 的“多節點(集群)多副本模式-同步雙寫” 模式為例來部署 RocketMQ。
2.4.1、啟動 NameServer
在 10.49.196.30、10.49.196.31、10.49.196.32 三台機器上分別啟動 NameServer。
nohup bin/mqnamesrv &
2.4.2、啟動 Broker
在 10.49.196.30 上啟動第一個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &
在 10.49.196.31 上啟動第二個 Master:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &
在 10.49.196.32 上啟動第一個 Slave:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &
在 10.49.196.33 上啟動第二個 Slave:
nohup bin/mqbroker -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &
2.4.3、啟動 Proxy
在 10.49.196.30、10.49.196.31、10.49.196.32 三台機器上分別啟動 Proxy。
nohup bin/mqproxy -n '10.49.196.30:9876;10.49.196.31:9876;10.49.196.32:9876' &
3、Broker 參數說明
參數名 | 預設值 | 說明 |
---|---|---|
listenPort | 10911 | 接受客戶端連接的監聽埠 |
namesrvAddr | null | nameServer 地址 |
brokerIP1 | 網卡的 InetAddress | 當前 broker 監聽的 IP |
brokerIP2 | 跟 brokerIP1 一樣 | 存在主從 broker 時,如果在 broker 主節點上配置了 brokerIP2 屬性,broker 從節點會連接主節點配置的 brokerIP2 進行同步 |
brokerName | null | broker 的名稱 |
brokerClusterName | DefaultCluster | 本 broker 所屬的 Cluser 名稱 |
brokerId | 0 | broker id, 0 表示 master, 其他的正整數表示 slave |
storePathCommitLog | $HOME/store/commitlog/ | 存儲 commit log 的路徑 |
storePathConsumerQueue | $HOME/store/consumequeue/ | 存儲 consume queue 的路徑 |
mapedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | commit log 的映射文件大小 |
deleteWhen | 04 | 在每天的什麼時間刪除已經超過文件保留時間的 commit log |
fileReservedTime | 72 | 以小時計算的文件保留時間 |
brokerRole | ASYNC_MASTER | SYNC_MASTER/ASYNC_MASTER/SLAVE |
flushDiskType | ASYNC_FLUSH | SYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保證在收到確認生產者之前將消息刷盤。ASYNC_FLUSH 模式下的 broker 則利用刷盤一組消息的模式,可以取得更好的性能。 |
4、RocketMQ Dashboard 部署
RocketMQ Dashboard 是 RocketMQ 的管控利器,為用戶提供客戶端和應用程式的各種事件、性能的統計信息,支持以可視化工具代替 Topic 配置、Broker 管理等命令行操作。
4.1、下載源碼並編譯
源碼地址:apache/rocketmq-dashboard,下載並解壓,切換至源碼目錄 rocketmq-dashboard-master:
mvn clean package -Dmaven.test.skip=true
4.2、運行
RocketMQ Dashboard 預設的埠為 8080,與 Proxy 埠衝突,可以修改其運行埠:
java -Dserver.port=18080 -jar target/rocketmq-dashboard-1.0.1-SNAPSHOT.jar
效果如下:
參考:https://rocketmq.apache.org/zh/docs/deploymentOperations/01deploy