前言
本案例使用的是真叢集方式,準備三臺主機,IP分別為192.168.100.142、192.168.100.143、192.168.100.144
偽叢集部署請看:ActiveMQ+ZooKeeper 偽叢集整合
如果需要了解ActiveMQ叢集部署的整體概念,可以參考我這篇文章:ActiveMQ叢集整體認識
原理簡介:
一般在部署ActiveMQ叢集的時候,更傾向於使用基於ZooKeeper的Replicated LevelDB Store方式
,該方式是Master Slave部署方案
的其中一種策略,也是在多臺主機實現ActiveMQ叢集的主流部署方式。 此教程只保證了高可用性
。要想保證負載均衡得再結合Broker Clusters 部署方案,配置網路聯結器。
工作流程:
在ZooKeeper中管理多個Broker節點,根據 Master選舉策略讓其中一個 Broker選舉為Master(只有Master才具備對外提供服務的能力),剩下Broker為slave。
編碼時,client端(消費者)通過failover協議來連線ActiveMQ叢集。
一、伺服器配置
1. ZooKeeper叢集
ZooKeeper叢集保證ZooKeeper本身的高可用性。
1.1 修改ZK配置檔案conf/zoo.cfg
主機IP | 服務埠(預設) | 叢集通訊埠 | 節點目錄/opt/下 | |
---|---|---|---|---|
192.168.100.142 | 2181 | 2888:3888 | zookeeper | |
192.168.100.143 | 2181 | 2888:3888 | zookeeper | |
192.168.100.144 | 2181 | 2888:3888 | zookeeper |
叢集通訊埠:第一個埠是master和slave之間的通訊埠,預設是2888;第二個埠是leader選舉的埠,叢集剛啟動的時候選舉或者leader掛掉之後進行新的選舉的埠預設是3888。
在3臺主機上都安裝zookeeper服務,/opt/zookeeper,並分別配置它們的檔案conf/zoo.cfg:
-
主機1(192.168.100.142):
/opt/zookeeper/conf/zoo.cfg:
# zookeeper的資料儲存和日誌儲存目錄(如果目錄不存在就新建) dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/log # zk叢集之間的通訊地址 server.1=192.168.100.142:2888:3888 server.2=192.168.100.143:2888:3888 server.3=192.168.100.144:2888:3888
建立
/opt/zookeeper/data/myid
檔案,填入數字1:# 由於該主機1(192.168.100.142)是server.1,所以在myid中設定數字1 $ vim /opt/zookeeper/data/myid
-
主機2(192.168.100.143):
/opt/zookeeper/conf/zoo.cfg:
dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/log server.1=192.168.100.142:2888:3888 server.2=192.168.100.143:2888:3888 server.3=192.168.100.144:2888:3888
建立
/opt/zookeeper/data/myid
檔案,填入數字2:# 由於該主機2(192.168.100.143)是server.2,所以在myid中設定數字2 $ vim /opt/zookeeper/data/myid
-
主機3(192.168.100.143):
/opt/zookeeper/conf/zoo.cfg:
dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/log server.1=192.168.100.142:2888:3888 server.2=192.168.100.143:2888:3888 server.3=192.168.100.144:2888:3888
建立
/opt/zookeeper/data/myid
檔案,填入數字3:# 由於該主機3(192.168.100.144)是server.3,所以在myid中設定數字3 $ vim /opt/zookeeper/data/myid
1.2 分別啟動zookeeper服務
$ /opt/zookeeper/bin/zkServer.sh start # 啟動zk服務
$ /opt/zookeeper/bin/zkServer.sh status # 檢視zk服務狀態
2. ActiveMQ叢集
2.1 修改ActiveMQ配置檔案conf/activemq.xml
和conf/jetty.xml
主機IP | 服務埠(預設) | 複製協議埠(動態) | jetty控制檯埠(預設) | 節點目錄/opt/下 | |
---|---|---|---|---|---|
192.168.100.142 | 61616 | tcp://0.0.0.0:0 | 8161 | activemq/node1 | |
192.168.100.143 | 61616 | tcp://0.0.0.0:0 | 8161 | activemq/node2 | |
192.168.100.144 | 61616 | tcp://0.0.0.0:0 | 8161 | activemq/node3 |
在3臺主機上都安裝activemq 服務,/opt/activemq,並分別配置它們的檔案conf/activemq.xml和conf/jetty.xml:
-
主機1(192.168.100.142):
/opt/activemq/conf/activemq.xml:
<!-- 持久化的部分為ZooKeeper叢集連線地址--> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="192.168.100.142:2181,192.168.100.143:2181,192.168.100.144:2181" zkPath="/opt/activemq/leveldb-stores" hostname="192.168.100.142" /> </persistenceAdapter> <!-- # directory: 儲存資料的路徑 # replicas:叢集中的節點數【(replicas/2)+1公式表示叢集中至少要正常執行的服務數量】,3臺叢集那麼允許1臺當機, 另外兩臺要正常執行 # bind:當該節點成為master後,它將繫結已配置的地址和埠來為複製協議提供服務。還支援使用動態埠。只需使用tcp://0.0.0.0:0進行配置即可,預設埠為61616。 # zkAddress:ZK的ip和port, 如果是叢集,則用逗號隔開(這裡作為簡單示例ZooKeeper配置為單點, 這樣已經適用於大多數環境了, 叢集也就多幾個配置) # zkPassword:當連線到ZooKeeper伺服器時用的密碼,沒有密碼則不配置。 # zkPah:ZK選舉資訊交換的存貯路徑,啟動服務後actimvemq會到zookeeper上註冊生成此路徑 # hostname: ActiveMQ所在主機的IP # 更多參考:http://activemq.apache.org/replicated-leveldb-store.html -->
/opt/activemq/conf/jetty.xml:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> <!-- 在這裡修改埠為8161,預設就是8161 --> </bean>
-
主機2(192.168.100.143):
/opt/activemq/conf/activemq.xml:
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="192.168.100.142:2181,192.168.100.143:2181,192.168.100.144:2181" zkPath="/opt/activemq/leveldb-stores" hostname="192.168.100.143" /> </persistenceAdapter>
/opt/activemq/conf/jetty.xml:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> <!-- 在這裡修改埠為8161,預設就是8161 --> </bean>
-
主機3(192.168.100.144):
/opt/activemq/conf/activemq.xml:
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="192.168.100.142:2181,192.168.100.143:2181,192.168.100.144:2181" zkPath="/opt/activemq/leveldb-stores" hostname="192.168.100.144" /> </persistenceAdapter>
/opt/activemq/conf/jetty.xml:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> <!-- 在這裡修改埠為8161,預設就是8161 --> </bean>
2.2 依次啟動activemq服務
$ /opt/activemq/bin/activemq start # 啟動activemq服務
$ ps -ef|grep activemq # 檢查程式是否執行,即activemq是否啟動成功
$ netstat -anp|grep 61616 # 檢視服務埠61616,監聽情況
三、Client使用
該zookeeper+activemq的叢集Master Slave部署方案,能夠提供(3-1)/2的容錯率,即3臺伺服器允許當機一臺,而不影響整個叢集的對外提供服務。
編寫程式碼連線時使用failover策略:
String url = failover:(tcp://192.168.100.142:61616,tcp://192.168.100.143:61616,tcp://192.168.100.144:61616)?initialReconnectDelay=1000