2011-03-01 93 views
2

我想知道是否可以使用Postgres數據庫設置ejabberd集羣? (我發現的Mnesia DB僅ejbberd羣集文檔)Ejabberd集羣

我運行此配置: ejabberd 2.1.2(ubuntu的封裝) Postgres的8.4

回答

18

ejabberd是像任何其他應用程序的Erlang。爲了理解如何對ejabberd進行集羣化,您需要一些erlang集羣基礎知識。之所以你只找到有關設置mnesia集羣的文檔,是因爲即使你配置了一些模塊以使用postgres,你仍然在使用mnesia進行大量的ejabberd。

Mnesia用於存儲核心會話和路由信息。這些信息必須在本地erlang數據格式的集羣中隨處可見,因此使用mnesia。 Mnesia還維護架構表中其他mnesia節點的信息,該節點允許節點在啓動時記住其他羣集成員的身份。

當你形成一個ejabberd集羣時,你仍然需要按照以下步驟來形成mnesia集羣關係。我假設你已經制定了你的erlang cookies,這樣net_adm:ping('ejabberd @ node1')從你的ejabberd @ node2節點工作,並且你在兩個節點上都有相同的ejabberd.cfg。

  1. /etc/init.d/ejabberctl live以'活'模式啓動新節點。
  2. application:stop(ejabberd).停止ejabberd應用程序。
  3. mnesia:stop().停止mnesia應用程序。
  4. mnesia:delete_schema([node()]).刪除本地節點上的模式。這使節點進入乾淨狀態,準備加入基於mnesia的羣集。
  5. mnesia:start().開始你的清空和清潔mnesia實例。當你要求他們加入下一步時,Mnesia現在處於可以接受你的第一個ejabberd節點提供的任何表信息的狀態。
  6. mnesia:change_config(extra_db_nodes,['[email protected]']).告訴你的新ejabberd節點在哪裏找到它的集羣鄰居。
  7. mnesia:change_table_copy_type(schema,node(),disc_copies).通過保留「模式」表的本地副本,告訴mnesia通過節點重新記住它的新羣集鄰居。
  8. application:start(ejabberd).啓動ejabberd應用程序,以便它創建它真正需要的所有mnesia表副本。
  9. q().退出erlang虛擬機,重新啓動以確保集羣正確形成。當我驗證羣集狀態時,我呼叫mnesia:info().並查看running_db_nodes值。

您可能想知道爲什麼當我的問題是關於使用PostgreSQL進行羣集時,我經歷了所有這些。這是因爲在ejabberd中沒有使用PostgreSQL進行羣集,因爲應用程序的狀態仍然與mnesia集羣在一起。當你使用Postgres作爲你的存儲後端來處理用戶和離線消息等事情時,你仍然在使用mnesia進行集羣化,而你恰好將Postgres用作某些服務的數據存儲。正是由於這個原因,你在ejabberd集羣上看到的大多數指南只能解決mnesia問題,並且未能提及其他數據庫後端。

您使用的SQL數據庫的詳細信息與您的ejabberd.cfg文件有關,這對ejabberd羣集指南的大多數作者來說已成定局。