ActiveMQ的安全認證和持久化

1 安全認證

ActiveMQ提供了安全認證。 就是用戶名密碼登錄規則ActiveMQ 如果需要使用安全認 證 的 話 , 必 須 在 activemq 的 核 心 配 置 文 件 中 開 啓 安 全 配 置 。

1.1 添加插件

配 置 文 件 就 是conf/activemq.xml
conf/activemq.xml 配置文件的 broker 標籤中增加下述內容:

  • <jaasAuthenticationPlugin configuration="activemq" />指定了使用JAAS插件管理權限,至於 configuration="activemq"是在 login.conf文件裏定義的
  • <authorizationEntry topic="名字" read="用戶組名" write="用戶組名" admin="用戶組名"/>指定了具體的Topic/Queue與用戶組的授權關係
  • <authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins"/>這個是必須的配置, 不能少
<plugins>
<!-- use JAAS to authenticate using the login.config file on the classpath to
configure JAAS -->
<!-- 添加 jaas 認證插件 activemq 在 login.config 裏面定義,詳細見 login.config-->
<jaasAuthenticationPlugin configuration="activemq" />
<!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<!-- 這裏面的大於號是指所有的連接,不管是consumer還是provider都需要認證,其後是 讀寫管理的權限,其中 admins是用戶組的名字 -->
<authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
<authorizationEntry queue=">" read="admins" write="admins" admin="admins" />
<!-- 此處的ActiveMQ.Advisory.>大於號之前是指的系統級別的 -->
<authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins"/>
<authorizationEntry queue="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>

1.2 其他配置

開啓認證後, 認證使用的用戶信息由其他配置文件提供:conf/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";
};

user代表用戶信息配置文件, group 代表用戶組信息配置文件。 尋址路徑爲相對當前配置文件所在位置開始尋址。
conf/users.properties

#用戶名=密碼
admin=admin

conf/groups.properties

#用戶組名=用戶名, 用戶名(多個用戶名用逗號分隔開來)
admins=admin

1.3 開啓效果

因爲只配置了admin,因此當使用guest時在java中就無法通過此用戶訪問服務器了,就算訪問網頁管理網站也是隻能用admin,而不能用guest

2 ActiveMQ的持久化

ActiveMQ 中, 持久化是指對消息數據的持久化。 在 ActiveMQ中, 默認的消息是保存在內存中的。 當內存容量不足的時候, 或ActiveMQ 正在關閉的時候, 會將內存中的未處理的消息持久化到磁盤中。
具體的持久化策略由配置文件中的具體配置決定
ActiveMQ 的默認存儲策略是 kahadb。 如果使用 JDBC 作爲持久化策略, 則會將所有的需要持久化的消息保存到數據庫中。
所有的持久化配置都在 conf/activemq.xml 中配置, 配置信息都在 broker(代理) 標籤內部定義。

2.1 kahadb方式

kahadb方式是 ActiveMQ 默認的持久化策略。 kahadb 是一個文件型數據庫。
是使用內存+文件保證數據的持久化的。 kahadb 可以限制每個數據文件的大小。 不代表總計數據容量。

<persistenceAdapter>
<!-- directory:保存數據的目錄; journalMaxFileLength:保存消息的文件大小 -->
<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
</persistenceAdapter>

特性是:

  • 日誌形式存儲消息;
  • 消息索引以 B-Tree 結構存儲, 可以快速更新;
  • 完全支持 JMS 事務;
  • 支持多種恢復機制;

2.2 AMQ 方式

AMQ 方式只適用於 5.3 版本之前。
AMQ 也是一個文件型數據庫, 消息信息最終是存儲在文件中。 內存中也會有緩存數據。

<persistenceAdapter>
<!-- directory:保存數據的目錄 ; maxFileLength:保存消息的文件大小 -->
<amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb"/>
</persistenceAdapter>

AMQ優點:

  • 性能高於JDBC, 寫入消息時, 會將消息寫入日誌文件, 由於是順序追加寫, 性能很高。爲了提升性能, 創建消息主鍵索引, 並且提供緩存機制, 進一步提升性能。
  • 每個日誌文件的大小都是有限制的(默認 32m, 可自行配置)。當超過這個大小, 系統會重新建立一個文件。 當所有的消息都消費完成, 系統會刪除這個文件或者歸檔。
    AMQ缺點:
  • AMQ Message 會爲每一個 Destination 創建一個索引, 如果使用了大量的Queue, 索引文件的大小會佔用很多磁盤空間。
  • 且由於索引巨大, 一旦 BrokerActiveMQ 應用實例) 崩潰, 重建索引的速度會非常慢。
  • 雖然AMQ 性能略高於Kaha DB 方式, 但是由於其重建索引時間過長, 而且索引文件佔用磁盤空間過大, 所以已經不推薦使用。

2.3 JDBC持久化方式

ActiveMQ將數據持久化到數據庫中。 不指定具體的數據庫。 可以使用任意的數據庫中。
以下以使用 MySQL 數據庫爲例
下述文件爲 activemq.xml 配置文件部分內容

  • 首先定義一個 mysql-dsMySQL 數據源, 然後在<broker>標籤中的persistenceAdapter 節點中配置jdbcPersistenceAdapter 並且引用剛纔定義的數據源。
  • dataSource 指定持久化數據庫的 beancreateTablesOnStartup 是否在啓動的時候創建數據表, 默認值是 true, 這樣每次啓動都會去創建數據表了, 一般是第一次啓動的時候設置爲true, 之後改成 false,如果要反覆重啓的話就要改爲false
  • <broker>標籤之外配置<bean>標籤
  • activemqlib目錄裏面增加連接數據庫的jar包
<broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<!-- 此處的true或false要特別注意 -->
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter>
</broker>
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>

配置成功後, 需要在數據庫中創建對應的 database, 否則無法訪問。 表格ActiveMQ 可以自動創建。
activemq_msgs 用於存儲消息, QueueTopic 都存儲在這個表中:

  • ID: 自增的數據庫主鍵
  • CONTAINER: 消息的 Destination
  • MSGID_PROD: 消息發送者客戶端的主鍵
  • MSG_SEQ: 是發送消息的順序, MSGID_PROD+MSG_SEQ 可以組成 JMSMessageID
  • EXPIRATION: 消息的過期時間, 存儲的是從 1970-01-01 到現在的毫秒數
  • MSG: 消息本體的 Java 序列化對象的二進制數據
  • PRIORITY: 優先級, 從 0-9, 數值越大優先級越高

activemq_acks 用於存儲訂閱關係。 如果是持久化 Topic, 訂閱者和服務器的訂閱關係在這個表保存:
主要的數據庫字段如下:

  • CONTAINER: 消息的Destination
  • SUB_DEST: 如果是使用 Static 集羣, 這個字段會有集羣其他系統的信息
  • CLIENT_ID: 每個訂閱者都必須有一個唯一的客戶端 ID 用以區分
  • SUB_NAME: 訂閱者名稱
  • SELECTOR: 選擇器, 可以選擇只消費滿足條件的消息。 條件可以用自定義屬性實現,可支持多屬性 ANDOR 操作
  • LAST_ACKED_ID: 記錄消費過的消息的ID

activemq_lock 在集羣環境中才有用, 只有一個Broker可以獲得消息, 稱爲Master Broker,其他的只能作爲備份等待 Master Broker 不可用, 纔可能成爲下一個 Master Broker。這個表用於記錄哪個 Broker 是當前的Master Broker
只有在消息必須保證有效, 且絕對不能丟失的時候。 使用JDBC存儲策略。
如果消息可以容忍丟失, 或使用集羣/主備模式保證數據安全的時候, 建議使用levelDBKahadb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章