複製的 LevelDB 儲存
警告
LevelDB 儲存已棄用,不再支援或建議使用。建議使用的儲存是 KahaDB
概要
複製的 LevelDB 儲存使用 Apache ZooKeeper 從一組設定為複製 LevelDB 儲存的代理節點中選取一個主節點。然後將所有從屬 LevelDB 儲存與主節點同步,並透過複製主節點的所有更新來保持它們的最新狀態。
複製的 LevelDB 儲存使用與 LevelDB 儲存相同的資料檔案,因此您可以隨時在複製和非複製之間切換代理設定。
版本相容性
自 ActiveMQ Classic 5.9.0 起可用。
運作方式。
它使用 Apache ZooKeeper 來協調叢集中哪個節點成為主節點。選出的主節點代理啟動並接受用戶端連線。其他節點進入從屬模式,連線到主節點並與之同步其持久狀態。從屬節點不接受用戶端連線。所有持久操作都會複製到已連線的從屬節點。如果主節點失效,則具有最新更新的從屬節點會被提升為成為主節點。然後可以將失效的節點重新上線,它將進入從屬模式。
所有需要同步到磁碟的訊息傳遞操作都會等待更新複製到節點的仲裁數後才完成。因此,如果您將儲存設定為 replicas="3"
,則仲裁大小為 (3/2+1)=2
。主節點將在本地儲存更新,並等待其他 1 個從屬節點儲存更新後才回報成功。另一種思考方式是,儲存將對複製節點的仲裁數進行同步複製,並對任何其他節點進行非同步複製。
當選出新的主節點時,您還需要至少一個在線的節點仲裁,才能找到具有最新更新的節點。具有最新更新的節點將成為新的主節點。因此,建議您至少執行 3 個複本節點,以便您可以關閉一個節點而不會導致服務中斷。
部署提示
用戶端應使用 容錯轉移傳輸 連線到複製叢集中的代理節點。例如,使用類似以下的 URL
failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)
您應該至少執行 3 個 ZooKeeper 伺服器節點,以確保 ZooKeeper 服務具有高可用性。不要過度使用您的 ZooKeeper 伺服器。過度工作的 ZooKeeper 可能會因為處理其「保持活動」訊息的延遲而開始認為即時複製節點已離線。
為了獲得最佳結果,請確保您明確地為節點設定主機名稱屬性,其中包含其他叢集成員可以存取該機器的的主機名稱或 IP 位址。自動決定的主機名稱並非始終可供其他叢集成員存取,並且會導致從屬節點無法與主節點建立複製連線。
組態
您可以設定 ActiveMQ Classic 使用 LevelDB 作為其持久性配接器 - 如下所示
<broker brokerName="broker" ... >
...
<persistenceAdapter>
<replicatedLevelDB
directory="activemq-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="zoo1.example.org:2181,zoo2.example.org:2181,zoo3.example.org:2181"
zkPassword="password"
zkPath="/activemq/leveldb-stores"
hostname="broker1.example.org"
/>
</persistenceAdapter>
...
</broker>
複製的 LevelDB 儲存屬性
屬於同一個複製集的所有代理節點都應具有相符的 brokerName
XML 屬性。以下設定屬性在屬於同一個複製集的所有代理節點上都應相同
屬性名稱 | 預設值 | 註解 |
---|---|---|
replicas |
3 |
叢集中存在的節點數。必須至少有 (replicas/2)+1 個節點在線上,以避免服務中斷。 |
securityToken |
一個安全令牌,必須在所有複製節點上相符,它們才能接受彼此的複製請求。 | |
zkAddress |
127.0.0.1:2181 |
逗號分隔的 ZooKeeper 伺服器清單。 |
zkPassword |
連線到 ZooKeeper 伺服器時使用的密碼。 | |
zkPath |
/預設 |
ZooKeeper 目錄的路徑,Master/Slave 選舉資訊將在此處交換。 |
zkSessionTimeout |
2 秒 |
ZooKeeper 將偵測到節點故障的速度。(在 5.11 之前 - 此處有拼寫錯誤 zkSessionTmeout) |
sync |
quorum_mem |
控制更新在被視為完成之前駐留在何處。此設定是以下選項的逗號分隔清單:local_mem 、local_disk 、remote_mem 、remote_disk 、quorum_mem 、quorum_disk 。如果您將兩個設定合併用於目標,則會使用較強的保證。例如,設定 local_mem, local_disk 與僅使用 local_disk 相同。quorum_mem 與 local_mem, remote_mem 相同,而 quorum_disk 與 local_disk, remote_disk 相同 |
不同的複製集可以共用相同的 zkPath
,只要它們具有不同的 brokerName
。
以下設定屬性在每個節點上可以是唯一的
屬性名稱 | 預設值 | 註解 | |
---|---|---|---|
bind |
tcp://0.0.0.0:61619 |
當此節點成為主節點時,它會將設定的位址和連接埠綁定以服務複製協定。也支援使用動態連接埠。只需使用 tcp://0.0.0.0:0 設定即可 |
|
hostname |
當此節點成為主節點時,用於宣告複製服務的主機名稱。如果未設定,則會自動決定。 | ||
weight |
1 |
具有最新更新且權重最高的複製節點將成為主節點。用於優先選擇某些節點成為主節點。 |
儲存也支援標準 LevelDB 儲存的相同設定屬性,但它不支援可插入的儲存鎖定器
標準 LevelDB 儲存屬性
屬性名稱 | 預設值 | 註解 |
---|---|---|
directory |
LevelDB |
儲存將用來保存其資料檔案的目錄。如果目錄尚不存在,儲存將會建立該目錄。 |
readThreads |
10 |
允許的並行 IO 讀取執行緒數。 |
logSize |
104857600 (100 MB) |
每個資料記錄檔在發生記錄檔輪換前的最大大小(以位元組為單位)。 |
verifyChecksums |
false |
設定為 true 可強制驗證從檔案系統讀取的所有資料的校驗和。 |
paranoidChecks |
false |
如果儲存偵測到內部損壞,請使其儘快發生錯誤。 |
indexFactory |
org.fusesource.leveldbjni.JniDBFactory, org.iq80.leveldb.impl.Iq80DBFactory |
建立 LevelDB 索引時要使用的工廠類別 |
indexMaxOpenFiles |
1000 |
索引可以使用的開啟檔案數。 |
indexBlockRestartInterval |
16 |
用於鍵的增量編碼的重新啟動點之間的鍵數。 |
indexWriteBufferSize |
6291456 (6 MB) |
在轉換為排序的磁碟檔案之前,在記憶體中累積的索引資料量。 |
indexBlockSize |
4096 (4 K) |
每個區塊封裝的索引資料大小。 |
indexCacheSize |
268435456 (256 MB) |
用於快取索引區塊的最大堆外記憶體量。 |
indexCompression |
snappy |
套用至索引區塊的壓縮類型。可以是 snappy 或 none。 |
logCompression |
none |
套用至記錄記錄的壓縮類型。可以是 snappy 或 none。 |
注意事項
LevelDB 儲存尚未支援儲存與 延遲和排程訊息傳遞相關聯的資料。這些資料儲存在單獨的非複製 KahaDB 資料檔案中。如果將 延遲和排程訊息傳遞與複製的 leveldb 儲存一起使用,則會發生非預期的結果,因為當主節點容錯移轉至從屬節點時,該資料將不存在。