centos6下ActiveMQ+Zookeeper訊息中介軟體叢集部署記錄
由於最近一個專案併發請求壓力比較大,所以考慮改進架構,引入訊息中介軟體叢集作為一個緩衝訊息佇列,具體需求:
1)將大量的WebService請求報文傳送到mq叢集之中,並保持訊息先後順序
2)保證每個訊息的可靠性
3)維護MQ伺服器的可擴充套件性
綜合考慮,決定使用Apache的activemq,activemq是Apache出品,最流行的,能力強勁的開源訊息匯流排。本專案使用的是activemq5.11,activemq5.11要求jdk6+,本次使用jdk7,並引入activemq伺服器。
準備三臺伺服器:
activemq01 172.16.51.181
activemq01 172.16.51.182
activemq01 172.16.51.183
軟體版本:activemq-5.11.1、zookeeper-3.4.11
好了,廢話不多說,下面記錄下部署過程:
由於最近一個專案併發請求壓力比較大,所以考慮改進架構,引入訊息中介軟體叢集作為一個緩衝訊息佇列,具體需求:
1)將大量的WebService請求報文傳送到mq叢集之中,並保持訊息先後順序
2)保證每個訊息的可靠性
3)維護MQ伺服器的可擴充套件性
綜合考慮,決定使用Apache的activemq,activemq是Apache出品,最流行的,能力強勁的開源訊息匯流排。本專案使用的是activemq5.11,activemq5.11要求jdk6+,本次使用jdk7,並引入activemq伺服器。
準備三臺伺服器:
G6-mq01 172.16.51.181
G6-mq02 172.16.51.182
G6-mq03 172.16.51.183
軟體版本:activemq-5.11.1、zookeeper-3.4.11
好了,廢話不多說,下面記錄下部署過程:
activemq01機器(172.16.51.181)的部署:
個人運維習慣,會專門建立一個app賬號,使用者部署應用程式。本案例應用程式都部署在/data目錄下,將/data許可權設定成app(chown -R app.app /data)
[root@G6-mq01 ~]# useradd app
[root@G6-mq01 ~]# su - app
[app@G6-mq01 ~]$ mkdir /data/software
一、部署zookeeper
[app@G6-mq01 software]$ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
[app@G6-mq01 software]$ tar -zvxf zookeeper-3.4.11.tar.gz
[app@G6-mq01 software]$ mv zookeeper-3.4.11 /data/zookeeper
[app@G6-mq01 software]$ cd /data/zookeeper/conf/
[app@G6-mq01 conf]$ cp zoo_sample.cfg.bak zoo.cfg
[app@G6-mq01 conf]$ vim zoo.cfg
[app@G6-mq01 conf]$ cat zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/data/app/zkdir/data //建立此目錄夾,存放data
dataLogDir=/data/app/zkdir/log //建立此目錄夾,存放dat
# the port at which the clients will connect
clientPort=2181 //zookeeper服務埠
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=172.16.51.181:2888:3888
server.2=172.16.51.182:2888:3888
server.3=172.16.51.183:2888:3888
[app@G6-mq01 conf]$ mkdir -p /data/app/zkdir/data
[app@G6-mq01 conf]$ mkdir -p /data/app/zkdir/log
建立myid檔案,並寫入與ip地址相稱的伺服器編號.
[app@G6-mq01 conf]$ cd /data/app/zkdir/data/
[app@G6-mq01 data]$ vim myid //注意,三臺伺服器的myid編號不能重複
1
其他兩臺伺服器配置和上面相同,不過myid檔案需要寫入不一樣的id號。兩外兩臺機器的myid可以分別寫2、3
啟動zookeeper服務:
[app@G6-mq01 data]$ /data/zookeeper/bin/zkServer.sh start
[app@G6-mq01 data]$ lsof -i:2181 //檢查zookeeper埠起來了沒
檢視三臺伺服器的zookeeper選舉情況:
[app@G6-mq01 ~]$ /data/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[app@G6-mq02 ~]$ /data/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[app@G6-mq03 ~]$ /data/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Mode: follower
二、部署activemq
[app@G6-mq01 software]$ wget http://archive.apache.org/dist/activemq/5.11.1/apache-activemq-5.11.1-bin.tar.gz
[app@G6-mq01 software]$ tar -zvxf apache-activemq-5.11.1-bin.tar.gz
[app@G6-mq01 software]$ mv apache-activemq-5.11.1 /data/activemq
[app@G6-mq01 software]$ cd /data/activemq/conf/
[app@G6-mq01 conf]$ cp activemq.xml activemq.xml.bak
[app@G6-mq01 conf]$ vim activemq.xml
........
# 需要修改brokerName為某個欄位值(注:不可使用預設的localhost),這個是mq叢集名稱。
# 一個叢集內的所有的mq的brokerName為同一個值。也就是說兩臺伺服器的這個配置也要是一樣的。
# 加上useJmx="true"的屬性,用作server的負載均衡使用。
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-cluster01" dataDirectory="${activemq.data}" useJmx="true">
........
#將kahaDB 給註釋掉,新增replicatedLevelDB,其中replicas表示為一個叢集裡面有幾個mq節點
#bind的埠號改為叢集埠,如果為0,則會隨意分配一個埠給mq節點,不方便查詢,所以最好是分配一個固定的埠。要是有第二個叢集,此埠最好別一樣。
#zkAddress為zookeeper所在伺服器的ip及客戶端埠,hostname為mq所在伺服器的地址,如果有zkpassword,則填寫,否則不要填寫。
#zkPath的路徑每個叢集不一樣,同一個叢集配成一樣的,例如第二個叢集zkPath="/activemq2/leveldb-stores"。
<!--
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
-->
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3" #表示這個activemq叢集內有三個mq節點
bind="tcp://0.0.0.0:62621" #這個最好別用tcp://0.0.0.0:0配置,如果埠為0,則會隨意分配一個埠。這裡用固定的62621埠。
zkAddress="172.16.51.181:2181,172.16.51.182:2181,172.16.51.183:2181"
zkPassword=""
hostname="172.16.51.181" #這個配置成各個mq節點的ip地址
sync="local_disk"
zkPath="/activemq/leveldb-stores"/>
</persistenceAdapter>
........
# 下面為ActiveMQ的記憶體分配資訊。這一段預設可以不改。
# memoryUsage:表示所有佇列物件佔用的記憶體大小為70mb;
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
........
#下面配置的61616埠即是activemq的服務埠
#將name為amqp、stomp、mqtt、ws幾個給註釋掉,只留下name為openwire的方式(其中ip可以改為mq所在伺服器的ip)
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<!--
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
-->
下面開始啟動activem
[app@G6-mq01 conf]$ /data/activemq/bin/activemq start
INFO: Loading '/data/activemq/bin/env'
INFO: Using java '/usr/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/data/activemq/data/activemq.pid' (pid '12229')
檢視埠啟動情況
[app@G6-mq01 conf]$ lsof -i:61616 #這個是active的服務端
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 12229 app 137u IPv6 42501 0t0 TCP *:61616 (LISTEN)
[app@G6-mq01 conf]$ lsof -i:8161 #這個是active的管理埠,在jetty.xml檔案裡配置的
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 12229 app 131u IPv6 42512 0t0 TCP *:patrol-snmp (LISTEN)
另外兩臺伺服器配置和上面類似,只需修改自己的ip地址即可。
注意:
因為使用zookeeper做負載均衡,三臺伺服器中只會有一臺是master,其他兩臺處於等待狀態,所以只有其中一臺提供服務。
所以其他兩臺伺服器雖然active程式啟動了,但是61616服務埠和8161管理埠是關閉等待狀態(即也就是說這兩臺節點的這兩個埠不會起來,只有當master節點故障時,他們中的一個節點的這兩個埠才會接著起來)
只有當這臺提供服務的伺服器當機以後,才會通過zookeeper選舉出另外的一臺頂替上來,所以其他幾個ip地址是打不開的,只有一臺能開啟!
在程式碼裡,使用failover進行配置的,如下:
mq.broker.url=failover:(tcp://172.16.51.181:61616,tcp://172.16.51.182:61616,tcp://172.16.51.183:61616)?initialReconnectDelay=1000
在瀏覽器裡輸入下面三個訪問地址(預設只有一個master狀態的地址能開啟),預設使用者名稱和密碼都是admin
http://172.16.51.181:8161/admin/queues.jsp
http://172.16.51.182:8161/admin/queues.jsp
http://172.16.51.183:8161/admin/queues.jsp
以上三個地址,預設只能有一個開啟,也就是master角色的這個能開啟,當這個機器當機或activemq關閉時,其他兩臺機器中的一個才能接管服務。
------------------------------------------補充說明--------------------------------------------
1)修改acticemq管理埠
將8161改為其他埠
[app@G6-mq01 ~]$ cd /data/activemq/conf/
[app@G6-mq01 conf]$ cat jetty.xml |grep 8161
<property name="port" value="8161"/>
kill掉activemq當前的pid,然後start即可
[app@G6-mq01 ~]$ ps -ef|grep activemq|grep -v grep|awk '{print $2}'|xargs kill -9
[app@G6-mq01 ~]$ cd /data/activemq/bin/
[app@G6-mq01 bin]$ ls
activemq activemq-admin activemq.jar diag env linux-x86-32 linux-x86-64 macosx wrapper.jar
[app@G6-mq01 bin]$ ./activemq start
2) 修改activemq管理介面登陸的使用者名稱和密碼
預設的使用者名稱和密碼為admin,內部使用還好,但如果是對外服務,安全考慮,最好還是將使用者名稱和密碼修改下。
需要在activemq.xml檔案中的</shutdownHooks>下新增下面內容,用於訊息連線身份認證的使用者名稱和密碼。
此處引用的是credentials.properties資料夾下面的activemq.username、activemq.password值。
一般寫為activemq.username=system、activemq.password=manager。
[app@G6-mq01 conf]$ cat activemq.xml
........
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
[app@G6-mq01 conf]$ cat credentials-enc.properties #這個檔案預設就行,高版本預設的就是使用者名稱就是system
activemq.username=system
activemq.password=ENC(mYRkg+4Q4hua1kvpCCI2hg==) #密碼這裡是加密的。
[app@G6-mq01 conf]$ cat jetty-realm.properties
.........
username: password [,rolename ...]
system: manager, admin
# admin: admin, admin
# user: user, user
然後重啟activemq服務即可,這樣訪問http://172.16.51.181:8161/admin/queues.jsp的時候,登陸使用者名稱和密碼就是system和manager。
3)如果是部署單機activemq。則上面就不需要部署zookeeper服務,直接安裝activemq,配置預設,然後啟動activemq。
接著訪問http://172.16.51.181:8161/admin/queues.jsp (登陸使用者名稱和密碼:admin/admin)即可。