天天看點

ActiveMQ學習4-ActiveMQ的安全機制和叢集模式20 ActiveMQ安全機制21 ActiveMQ主從叢集21 Zookeeper叢集

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 使用叢集的重要性

叢集就是将相同的程式、功能,部署在兩台或多台伺服器上,這些伺服器對外提供的功能是完全一樣的。叢集是通過不斷橫向擴充增加伺服器的方式,以提高服務的能力。

ActiveMQ學習4-ActiveMQ的安全機制和叢集模式20 ActiveMQ安全機制21 ActiveMQ主從叢集21 Zookeeper叢集
ActiveMQ學習4-ActiveMQ的安全機制和叢集模式20 ActiveMQ安全機制21 ActiveMQ主從叢集21 Zookeeper叢集

1、叢集可以解決單點故障問題;

2、叢集可以提高系統的可用性;

3、叢集可以提高系統的服務能力;

20.2 主從叢集的方式

20.2.1 shared filesystem Master-Slave方式主從叢集

  通過共享存儲目錄(kahaDB)來實作master和slave的主從資訊同步;

  所有ActiveMQ的broker都在不斷地擷取共享目錄的控制權,哪個broker搶到了控制權,它就成為master,它将鎖定該目錄,其他broker就隻能成為slave;

  當master主出現故障後,剩下的slave從将再進行争奪共享目錄的控制權,誰搶到共享目錄的控制權,誰就成為主,其他沒有搶到控制權的稱為從;

  由于他們是基于共享目錄,是以當主出現故障後,其上沒有被消費的消息在接下來産生的新的master主中可以繼續進行消費;

ActiveMQ學習4-ActiveMQ的安全機制和叢集模式20 ActiveMQ安全機制21 ActiveMQ主從叢集21 Zookeeper叢集

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&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"/>
           

其中:

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方式類似,隻是共享的存儲媒體由檔案系統改成了資料庫。

ActiveMQ學習4-ActiveMQ的安全機制和叢集模式20 ActiveMQ安全機制21 ActiveMQ主從叢集21 Zookeeper叢集

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&amp;characterEncoding=utf8&amp;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&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"/>
           

其中:

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,進而導緻叢集不可用;

ActiveMQ學習4-ActiveMQ的安全機制和叢集模式20 ActiveMQ安全機制21 ActiveMQ主從叢集21 Zookeeper叢集

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>