ActiveMQ的安全機制和叢集模式
- 20 ActiveMQ安全機制
-
- 20.1 Web 控制台安全
- 20.2 消息伺服器Broker安全
- 21 ActiveMQ主從叢集
-
- 21.1 使用叢集的重要性
- 20.2 主從叢集的方式
-
- 20.2.1 shared filesystem Master-Slave方式主從叢集
- 20.2.2 shared database Master-Slave方式主從叢集
- 20.2.3 Replicated LevelDB Store方式叢集
- 21 Zookeeper叢集
-
- 21.1 Zookeeper叢集特點
- 21.2 Zookeeper叢集配置
20 ActiveMQ安全機制
20.1 Web 控制台安全
1、Web 控制台安全
管理背景不要對外公開,不能讓外網通路
設定背景通路的密碼,密碼要複雜一點,不要公開
2、如何設定密碼
(1)、/conf/jetty.xml 将配置項authenticate值改為 true,現在ActiveMQ新版本預設activemq是設定的true,是以也不用改;
(2)、/conf/jetty-realm.properties 設定使用者名和密碼, 格式為--> 使用者名:密碼,角色名
<bean id="adminSecurityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<!-- set authenticate=false to disable login -->
<property name="authenticate" value="true" />
</bean>
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin
user: user, user
20.2 消息伺服器Broker安全
主要是添加通路的使用者名和密碼:實作方式有兩種:
方式1:添加通路密碼,在conf/activemq.xml檔案中的内加上:
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="system" password="123456" groups="users,admins"/>
<authenticationUser username="user" password="123456" groups="users"/>
<authenticationUser username="guest" password="123456" groups="guests"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
在發送消息和接收消息時建立AcitveMQConnectFactory時就需要指定使用者名和密碼
在Springboot中應該指定
#activemq的連接配接位址
spring.activemq.broker-url=tcp://192.168.64.128:61616
spring.activemq.user=system
spring.activemq.password=123456
#消息的目的地
spring.jms.template.default-destination=springbootQueue
#退出main方法的主程式
spring.jms.cache.enabled=false
方式二:Java Authentication Authorization Service(JAAS,Java驗證和授權服務),它可以通過插件的方式內建到你的應用程式中,提供驗證和授權服務。
ActiveMQ加入JAAS身份驗證,共4個檔案配置:
1、activemq.xml
2、login.config,
3、groups.properties,
4、users.properties
1、在conf/activemq.xml檔案中加上:
<plugins>
<!--use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
<jaasAuthenticationPlugin configuration="activemq" />
<!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<!-->表示通配符,例如USERS.>表示以USERS.開頭的主題,>表示所有主題,read表示讀的權限,write表示寫的權限,admin表示角色組-->
<authorizationEntry queue=">" read="admins" write="admins" admin="admins" />
<authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
<authorizationEntry queue="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins" />
<authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins" />
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
2、login.config配置:(預設也是正确的,是以我們不需要修改)
activemq {
org.apache.activemq.jaas.PropertiesLoginModule required
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties";
};
3、groups.properties配置:
#group=userName
admins=system
4、users.properties配置:
#userName=password
system=123456
21 ActiveMQ主從叢集
21.1 使用叢集的重要性
叢集就是将相同的程式、功能,部署在兩台或多台伺服器上,這些伺服器對外提供的功能是完全一樣的。叢集是通過不斷橫向擴充增加伺服器的方式,以提高服務的能力。

1、叢集可以解決單點故障問題;
2、叢集可以提高系統的可用性;
3、叢集可以提高系統的服務能力;
20.2 主從叢集的方式
20.2.1 shared filesystem Master-Slave方式主從叢集
通過共享存儲目錄(kahaDB)來實作master和slave的主從資訊同步;
所有ActiveMQ的broker都在不斷地擷取共享目錄的控制權,哪個broker搶到了控制權,它就成為master,它将鎖定該目錄,其他broker就隻能成為slave;
當master主出現故障後,剩下的slave從将再進行争奪共享目錄的控制權,誰搶到共享目錄的控制權,誰就成為主,其他沒有搶到控制權的稱為從;
由于他們是基于共享目錄,是以當主出現故障後,其上沒有被消費的消息在接下來産生的新的master主中可以繼續進行消費;
1、安裝多個activeMQ;
2、配置每個activeMQ的conf目錄下的activemq.xml檔案的共享目錄及端口
(如果叢集搭建在一台機器上需要改端口,如果搭建在多台上就不需要了);
3、更改activemq.xml配置檔案
<persistenceAdapter>
<kahaDB directory="/opt/kahadb"/>
</persistenceAdapter>
4、一台機器需要更改網絡端口
<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"/>
其中:
maximumConnections 最大連接配接數;
wireFormat.maxFrameSize 表示一個完整消息的最大資料量,機關byte;
4、修改jetty.xml檔案的jetty伺服器端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8162"/>
</bean>
5、啟動三台ActiveMQ,可以測試驗證了
6、判斷主從伺服器依據:看web控制台,web控制台能通路的是 master,不能通路的是 slave
7、程式收發消息連接配接時使用
failover:的意思時故障轉移,消費者和生産者啟動時,日志會列印目前連的是哪個mq,故障轉移:停止一個mq服務,會自動連接配接另一個mq
這種方式需要三台伺服器上的ActiveMQ使用同一個目錄,需要通過磁盤挂載。
20.2.2 shared database Master-Slave方式主從叢集
該方式與shared filesystem方式類似,隻是共享的存儲媒體由檔案系統改成了資料庫。
1、安裝多個activeMQ;
2、配置每個activeMQ的conf目錄下的activemq.xml檔案的持久化擴充卡是jdbc資料庫方式,同時修改相關端口
(如果叢集搭建在一台機器上需要改端口,如果搭建在多台上就不需要了);
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
<bean id="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activemq?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
注意1:上面的配置需要配置在<broker>的外面;
注意2:需要加入mysql的驅動包和資料庫連接配接池Druid包,放入activeMQ的lib目錄下;
注意3:啟動好資料庫,并建立好資料庫名稱
3、一台機器需要更改網絡端口
<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"/>
其中:
maximumConnections 最大連接配接數;
wireFormat.maxFrameSize 表示一個完整消息的最大資料量,機關byte;
4、修改jetty.xml檔案的jetty伺服器端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8162"/>
</bean>
5、啟動三台ActiveMQ,可以測試驗證了
6、判斷主從伺服器依據:看web控制台,web控制台能通路的是 master,不能通路的是 slave
7、程式收發消息連接配接時使用
failover:的意思時故障轉移,消費者和生産者啟動時,日志會列印目前連的是哪個mq,故障轉移:停止一個mq服務,會自動連接配接另一個mq
20.2.3 Replicated LevelDB Store方式叢集
基于可複制的LevelDB存儲方式的叢集
這種叢集方式是ActiveMQ5.9版本以後新增的特性,它使用ZooKeeper從一組broker中協調選擇一個broker作為master主,其他broker作為slave從的模式;
所有slave從節點通過複制master主節點的消息來實作消息同步,當主出現故障後,沒有被消費的消息在從伺服器上也同步了一份,是以不會有消息的丢失;
LevelDB 是 Google開發的一套用于持久化資料的高性能kv資料庫,ActiveMQ利用該資料庫進行資料的存儲;
隻有master 接受用戶端連接配接,slave不接受用戶端連接配接;
Master的所有存儲操作都将被複制到slaves;
在這個模式中,需要有半數以上的broker是正常的,叢集才是可用的,超過半數broker故障,zookeeper的選舉算法将不能選擇master,進而導緻叢集不可用;
1、配置
<persistenceAdapter>
<replicatedLevelDB
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="localhost:2181"/>
</persistenceAdapter>
參數說明:
replicas :叢集中存在的節點的數目;
bind :當該節點成為master後,将使用該bind配置的ip和端口進行資料複制;0.0.0.0表示任何位址
zkAddress :zookeeper的位址;
驗證叢集:
1、依次啟動一個ZooKeeper;
2、依次啟動三個ActiveMQ;
3、程式使用:failover:(tcp://localhost:61617,tcp://localhost:61618,tcp://localhost:61619) 收發資訊;
4、把其中的一台master關閉,留下兩台運作,觀察效果;
5、繼續關閉下一台master,留下一台運作,觀察效果;
6、啟動其中一台,讓兩個運作,再觀察效果;
這種方式,不适合叢集太大,也就是activemq不能太多,因為多個activemq之間需要複制消息,
這個也會耗資源,占用網絡,建議3、5台;
21 Zookeeper叢集
Zookeeper作為一個服務,它本身也可能發生故障,是以我們也需要将Zookeeper進行叢集,避免單點故障問題,以保證zookeeper本身的高可用性,那麼我們需要搭建奇數台Zookeeper構成一個Zookeeper的叢集;
21.1 Zookeeper叢集特點
1、叢集中隻要有超過半數的機器是正常工作的,那麼整個叢集對外就是可用的;
2、也就是說如果有2個zookeeper,那麼隻要有1個故障了,zookeeper就不能用了,因為1沒有過半,是以2個zookeeper不是高可用的,因為不能容忍任何1台發生故障;
3、同理,要是有3個zookeeper,一個故障了,還剩下2個正常的,過半數了,是以3個zookeeper才是高可用的,因為能容忍1台發生故障;
4、如果是4台呢?5台呢?6台呢? 那麼分别能容忍1,2,2 台發生故障 (奇數台)
21.2 Zookeeper叢集配置
1、下載下傳安裝3個Zookeeper
2、3個zookeeper中conf目錄下的zoo_sample.cfg複制一份,改為zoo.cfg并配置:
dataDir=/usr/local/zookeeper-3.4.10_1/data (1)
clientPort=2181 (2)
server.1=localhost:2888:3888 (3)
server.2=localhost:2889:3889
server.3=localhost:2890:3890
格式:
server.A=B:C:D:
A是一個數字,表示這個是第幾号伺服器,
B是這個伺服器的ip位址
C第一個端口用來叢集成員的資訊交換,表示的是這個伺服器與叢集中的Leader伺服器交換資訊的端口
D是在leader挂掉時專門用來進行選舉leader所用
3、建立三個dataDir目錄 (4)
/usr/local/zookeeper-3.4.10_1/data
/usr/local/zookeeper-3.4.10_2/data
/usr/local/zookeeper-3.4.10_3/data
4、每個data目錄中都建立一個名為myid的檔案
3個檔案的内容分别寫1、2、3;
這個1、2、3是對應前面的server.1、 server.2、 server.3
5、至此一個zookeeper的叢集就搭建OK.可以檢視哪個是leader哪個是follower
./ZkServer.sh status
6、配置mq
<persistenceAdapter>
<replicatedLevelDB
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="localhost:2182,localhost:2183,localhost:2184"/>
</persistenceAdapter>