我想知道是否可以使用 Postgres 数据库设置 ejabberd 集群?(我只找到了 mnesia DB 的 ejbberd 集群文档)
我正在运行这个配置:ejabberd 2.1.2 (ubuntu package) Postgres 8.4
我想知道是否可以使用 Postgres 数据库设置 ejabberd 集群?(我只找到了 mnesia DB 的 ejbberd 集群文档)
我正在运行这个配置:ejabberd 2.1.2 (ubuntu package) Postgres 8.4
ejabberd 就像任何其他 erlang 应用程序一样。为了了解如何对 ejabberd 进行集群,您需要一些 erlang 集群基础知识。您只找到有关使用 mnesia 设置集群的文档的原因是,即使您将某些模块配置为与 postgres 一起使用,您仍在使用 mnesia 进行很多 ejabberd。
Mnesia 用于存储核心会话和路由信息。该信息必须以原生 erlang 数据格式在集群中的任何地方都可用,因此使用了 mnesia。Mnesia 还在模式表中维护有关其他 mnesia 节点的信息,这允许节点在启动时记住其他集群成员是谁。
当你形成一个 ejabberd 集群时,你仍然需要按照这些步骤来形成 mnesia 集群关系。我假设您已经制定了您的 erlang cookie,以便 net_adm:ping('ejabberd@node1') 在您的 ejabberd@node2 节点上工作,并且您在两个节点上都有相同的 ejabberd.cfg。
/etc/init.d/ejabberctl live
以“实时”模式启动新节点。application:stop(ejabberd).
停止 ejabberd 应用程序。mnesia:stop().
停止 mnesia 应用程序。mnesia:delete_schema([node()]).
删除本地节点上的架构。这会将节点置于干净状态,准备好加入基于 mnesia 的集群。mnesia:start().
启动您的空且干净的 mnesia 实例。Mnesia 现在处于一种状态,当您要求他们加入下一步时,它可以接受您的第一个 ejabberd 节点提供的任何表信息。mnesia:change_config(extra_db_nodes,['ejabberd@node1']).
告诉您的新 ejabberd 节点在哪里可以找到它的集群邻居。mnesia:change_table_copy_type(schema,node(),disc_copies).
通过保留“模式”表的本地副本,告诉 mnesia 在节点重新启动时记住它的新集群邻居。application:start(ejabberd).
启动 ejabberd 应用程序,以便它创建它真正需要的所有 mnesia 表副本。 q().
退出 erlang vm,然后重新启动以确保集群正确形成。当我验证我的集群状态时,我调用mnesia:info().
并查看 running_db_nodes 值。当您的问题是关于使用 PostgreSQL 进行集群时,您可能想知道为什么我经历了所有这些。这是因为在 ejabberd 中没有使用 PostgreSQL 集群这样的东西,因为应用程序的状态仍然使用 mnesia 集群。当你使用 Postgres 作为存储后端来存储用户和离线消息时,你仍然使用 mnesia 进行集群,你只是碰巧使用 Postgres 作为某些服务的数据存储。正是出于这个原因,您在 ejabberd 集群上看到的大多数指南仅针对 mnesia,而没有提及其他数据库后端。
您使用的 SQL 数据库的详细信息取决于您的 ejabberd.cfg 文件,这对于大多数 ejabberd 集群指南的作者来说已成定局。