ActiveMQ集羣搭建以及zookeeper的安裝


使用ZooKeeper+ActiveMQ實現主從和集羣.

1 Master-Slave

主從模式是一種高可用解決方案。 在 ZooKeeper中註冊若干 ActiveMQ Broker, 其中只有一個 Broker提供對外服務(Master), 其他 Broker 處於待機狀態(Slave)。 當Master出現故障導致宕機時, 通過ZooKeeper 內部的選舉機制, 選舉出一臺 Slave 替代Master繼續對外提供服務。官方文檔:http://activemq.apache.org/replicated-leveldb-store.html

1.1 安裝 ZooKeeper

zookeeper一般建議爲奇數個,方便快速投票和選舉,半數以上的纔可以選出主機
搭建僞集羣, 在同一個Linux中安裝三個 ZooKeeper實例。 使用不同的端口實現同時啓動。 端口分配如下:

主機 服務端口 投票端口 選舉端口
192.168.159.130 2181 2881 3881
192.168.159.130 2182 2882 3882
192.168.159.130 2182 2882 3882

1.1.1 解壓縮

tar -zxvf zookeeper

1.1.2 複製配置文件

zookeeper解壓後的conf目錄中,把zoo_sample.cfg給複製一份並且名字爲zoo.cfg,這是因爲zoo_sample.cfg只是配置模板,需要我們以這個模板爲基礎創建zoo.cfg,並且zookeeper真正讀取的是zoo.cfg文件
cp zoo_sample.cfg zoo.cfg

1.1.3 創建 data 數據目錄

因爲在 zookeeper 中需要臨時的數據目錄,因爲在解壓後的文件夾中創建文件夾 data目錄
mkdir data
另外,需要在每個Zookeeper 應用內的 data目錄中增加文件myid,內部定義每個服務的編號. 編號要求爲數字,是正整數可以使用回聲命名快速定義 myid 文件,這個文件的名字必須是myid,其他的話回啓動失敗
echo 1 > myid

1.1.4 編寫Zookeeper配置文件

vi /usr/local/solrcloude/zookeeper1/conf/zoo.cfg

  • 修改data數據目錄的路徑
  • clientPort=2181 客戶端訪問端口,因此三個 zookeeper 實例不能端口相同.
    還需要如下配置:server.服務的編號=IP:投票端口:選舉端口
    投票端口:用於決定正在運行的主機是否宕機
    選舉端口: 用於決定哪一個 Zookeeper服務作爲主機
    三個Zookeeper 應用配置一致.
server.1=192.168.120.132:2881:3881
server.2=192.168.120.132:2882:3882
server.3=192.168.120.132:2883:3883

1.1.5 複製兩份同樣的Zookeeper

cp zookeeper1 zookeeper2 -r
cp zookeeper1 zookeeper3 -r

複製後,要修改zoo.cfg

1.1.6 啓動 Zookeeper 測試

要至少啓動兩個 Zookeeper 啓動. 啓動單一 Zookeeper,無法正常提供服務.

# 啓動
zookeeper1/bin/zkServer.sh start
# 查看狀態
zookeeper1/bin/zkServer.sh status

2.2安裝 ActiveMQ

在同一個Linux中安裝三個 ActiveMQ 實例, 使用不同端口實現同時啓動。 端口分配如下:

主機 M-S 通訊端口 服務端口 jetty 端口
192.168.159.130 62626 61616 8161
192.168.159.130 62627 61617 8162
192.168.159.130 62628 61618 8163

2.2.1 解壓ActiveMQ

tar -zxvf apache-activemq-5.9.0-bin.tar.gz
解壓後,直接複製3份,cp -r apache-activemq

2.2.2 修改配置信息

2.2.2.1 修改 jetty 端口

修改conf/jetty.xml 中的端口配置。 分別是8161、 8162、 8163

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="port" value="8161"/>
</bean>

2.2.2.2 統一所有主從節點 Broker 命名

修改conf/activemq.xml 文件。 修改broker標籤屬性信息, 統一所有節點的broker 命名。

<broker xmlns="http://activemq.apache.org/schema/core" 
    brokerName="mq-cluster" dataDirectory="${activemq.data}">

2.2.2.3 修改持久化配置

修改 conf/activemq.xml 文件
修改 broker標籤中子標籤 persistenceAdapter相關內容:

  • replicas屬性代表當前主從模型中的節點數量。 按需配置。
  • bind 屬性中的端口爲主從實例之間的通訊端口。 代表當前實例對外開放端口是什麼, 三個實例分別使用 62626、 62627、 62628端口。
  • zkAddress 屬性代表ZooKeeper安裝位置, 安裝具體情況設置。
  • zkPathActiveMQ 主從信息保存到 ZooKeeper中的什麼目錄內。
  • hostnameActiveMQ實例安裝 Linux的主機名, 可以在/etc/hosts 配置文件中設置。 設置格式爲: IP 主機名。 如:127.0.0.1 mq-server
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<replicatedLevelDB
directory="${activemq.data}/levelDB"
replicas="3"
bind="tcp://0.0.0.0:62626"
zkAddress="192.168.159.130:2181,192.168.159.130:2182,192.168.159.130:2183"
zkPath="/activemq/leveldb-stores"
hostname="mq-server"
/>
</persistenceAdapter>

2.2.2.4 修改服務端口

修改 ActiveMQ對外提供的服務端口。 原默認端口爲 61616
當前環境使用的端口爲:61616、 61617、 61618
修改conf/activemq.xml配置文件。 修改broker 標籤中子標籤transportConnectors的相關配置

<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp"
uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp"
uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt"
uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws"
uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

2.2.3啓動主從

將三個 ActiveMQ 實例分別啓動。${activemq-home}/bin/active start
啓動後, 可以查看日誌文件, 檢查啓動狀態, 日誌文件爲${activemq-home}/data/activemq.log

2.2.4查看主從狀態

2.2.4.1 使用客戶端連接 ZooKeeper

${zkHome}/bin/zkCli.sh

2.2.4.2查看狀態信息

連接成功後, 可以使用命令ls查看ZooKeeper中的目錄結構如:

ls /
ls /activemq/leveldb-stores

找到對應的內容後, 可以使用命令get 查看 ZooKeeper 中的數據內容
在這裏插入圖片描述
get /activemq/leveldb-stores/00000000005其中主節點的 electedaddress 屬性一定有數據。 從節點則數據爲null

2.2.5 java中的代碼

//普通模式連接工廠
ConnectionFactory factory = new ActiveMQConnectionFactory("guest","guest","tcp://192.168.126.133:61616");
//集羣模式連接工廠
// failover -失敗轉移,當任意節點宕機,自動轉移
ConnectionFactory factory = new ActiveMQConnectionFactory("guest","guest",
"failover:(tcp://192.168.126.133:61616,tcp://192.168.126.133:61617,tcp://192.168.126.133:61618)?Randomize=false");

2.2.6 activeMq主從集羣

準備多份主從模型。 在所有的 ActiveMQ節點中的 conf/activemq.xml中增加下述配置:
(每個主從模型中的 networkConnector都指向另外一個主從模型)

<networkConnectors>
<networkConnector uri="static://(tcp://ip:port,tcp://ip:port)" duplex="false">
</networkConnector>
</networkConnectors>

duplex="false"的意思是不做複製,假入有兩個模型,設置爲fasle的話,其中得到消息的模型就不會複製到沒有得到消息的模型裏,如果設置爲true,那麼得到消息的模型會把消息複製到沒有得到消息的模型中去
注意配置順序Networks相關配置必須在持久化相關配置之前。 如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.apache.org/schema/core">
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-cluster"
dataDirectory="${activemq.data}" >
<networkConnectors>
<networkConnector uri=" static://(tcp://ip:port,tcp://ip:port)"/>
</networkConnectors>
<persistenceAdapter>
<replicatedLevelDB directory = "xxx"/>
</persistenceAdapter>
</broker>
</beans>

如: 主從模型1 -192.168.159.129主從模型 2 - 192.168.159.130
在主從模型 1 的所有節點activemq.xml 配置文件中增加標籤:

<networkConnectors>
<networkConnector uri="static://(tcp://192.168.159.130:61616,tcp://192.168.159.130:61617)"/>
</networkConnectors>

在模型 2 中所有節點增加配置:

<networkConnectors>
<networkConnector uri="static://(tcp://192.168.159.129:61616,tcp://192.168.159.129:61617)"/>
</networkConnectors>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章