2011-03-01 24 views
2

Postgresデータベースでejabberdクラスタを設定することが可能かどうかを知りたかったですか? 私はこの設定を実行していますEjabberdクラスタリング

(私はmnesia DBのための唯一のejbberdクラスタのドキュメントを見つけた): ejabberd 2.1.2(Ubuntuのパッケージ) のPostgres 8.4

答えて

18

ejabberdは、他のErlangのアプリケーションのようなものです。 ejabberdをクラスタリングする方法を理解するためには、いくつかのerlangクラスタリングの基礎が必要です。 mnesiaでクラスタリングを設定する際にドキュメントを見つけただけの理由は、postgresで動作するようにいくつかのモジュールを設定しても、多くのejabberdに対してmnesiaを使用し続けているからです。

コアセッションとルーティング情報を格納するために使用されます。この情報は、ネイティブのerlangデータ形式のクラスタ内のどこでも利用できる必要があります。 Mnesiaはスキーマテーブル内の他のmnesiaノードに関する情報も保持しています。これにより、起動時に他のクラスタメンバーが誰であるかをノードが記憶できるようになります。

ejabberdクラスタを形成する場合、これらの手順に従ってmnesiaクラスタ関係を形成する必要があります。 net_adm:ping( 'ejabberd @ node1')がejabberd @ node2ノードから機能し、両方のノードで同じejabberd.cfgを持つように、あなたは既にerlangのクッキーを作成していると仮定しています。

  1. /etc/init.d/ejabberctl live新しいノードを「ライブ」モードで開始します。
  2. application:stop(ejabberd). ejabberdアプリケーションを停止します。
  3. mnesia:stop(). mnesiaアプリケーションを停止します。
  4. mnesia:delete_schema([node()]).ローカルノードのスキーマを削除します。これにより、ノードがクリーンな状態になり、そこで記憶媒体に基づくクラスタに参加する準備ができます。
  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).実際に必要なすべてのmnesiaテーブルのコピーを作成するように、ejabberdアプリケーションを起動します。
  9. q(). erlang vmを終了し、再起動してクラスタが正しく形成されていることを確認します。クラスタの状態を検証するときは、mnesia:info().と呼び出し、running_db_nodesの値を確認します。

PostgreSQLを使用してクラスタリングに関する質問をしたときに、なぜ私がすべての問題を解決したのか疑問に思うかもしれません。これは、アプリケーションの状態がmnesiaでまだクラスタ化されているため、ejabberdにPostgreSQLを使用したクラスタリングなどは存在しないからです。あなたがmnesiaでまだクラスタリングしているユーザやオフラインメッセージのようなもののためにPostgresをあなたのストレージバックエンドとして使用すると、特定のサービスのためにPostgresをデータストアとして使用するだけです。この理由から、ejabberdクラスタリングで参照するほとんどのガイドは、俗文にのみ対応し、他のデータベースバックエンドは言及していません。

使用するSQLデータベースの詳細は、ejabberd.cfgファイルの問題です。これは、ejabberdクラスタリングガイドのほとんどの作者にとって間違いない結論です。