我想知道是否可以使用Postgres数据库设置ejabberd集群? (我发现只有mnesia DB的ejbberd集群文档)
我正在运行此配置: ejabberd 2.1.2(ubuntu包) Postgres 8.4
答案 0 :(得分:18)
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聚类指南的编写者来说这已成定局。