1

Windows Server 2003R2/2008R2/2012,Openfire 3.8.1,Hazelcast 1.0.4,MySQL 5.5.30 -ndb-7.2.12-cluster-gpl-log

我们在Openfire Cluster中设置了5 台服务器。它们每个都在不同的子网中,子网位于不同的城市,并通过 VPN 路由器(2-8 Mbps )相互连接

192.168.0.1 - node0
192.168.1.1 - node1
192.168.2.1 - node2
192.168.3.1 - node3
192.168.4.1 - node4

Openfire 配置为使用MySQL 数据库,该数据库成功地节点 0 复制到所有从节点(每个节点使用它自己的本地数据库服务器,充当从节点)。

Openfire Web Admin > Server Manager > Clustering我们可以看到所有集群节点

Hazelcast的 Openfire 自定义设置:

hazelcast.max.execution.seconds - 30
hazelcast.startup.delay.seconds - 3
hazelcast.startup.retry.count - 3
hazelcast.startup.retry.seconds - 10

node0 的 Hazelcast 配置(在其他节点上类似,除了接口部分)(%PROGRAMFILES%\Openfire\plugins\hazelcast\classes\hazelcast-cache-config.xml):

<join>
  <multicast enabled="false" /> 
  <tcp-ip enabled="true">
    <hostname>192.168.0.1:5701</hostname> 
    <hostname>192.168.1.1:5701</hostname> 
    <hostname>192.168.2.1:5701</hostname> 
    <hostname>192.168.3.1:5701</hostname> 
    <hostname>192.168.4.1:5701</hostname>
  </tcp-ip>
  <aws enabled="false" /> 
</join>
<interfaces enabled="true">
  <interface>192.168.0.1</interface> 
</interfaces>

这些是从默认设置更改的唯一设置。

问题是 XMPP 客户端授权时间过长,大约 3-4 分钟,授权后roster 中的其他用户处于非活动状态5-7 分钟,在此期间登录用户在Openfire Web Admin > Sessions被标记为Offline。即使在用户能够看到其他登录用户处于活动状态后,消息也不会传递,或者在 5-10 分钟后或在几次 Openfire 重新启动后传递......

我们感谢任何帮助。我们花了大约 5 天的时间试图设置这个怪物,但没有任何想法...... :(

提前非常感谢!

UPD 1:使用 Hazelcast 2.5.1 Build 20130427安装 Openfire 3.8.2 alpha相同的问题

UPD 2:尝试在同一城市的两台服务器上启动集群,在 1-5ms ping 时可能间隔 1-2 跳。一切正常!然后我们停止了其中一台服务器并在另一个城市启动了一台(3-4 跳 @ 80-100 毫秒 ping)问题再次发生......授权缓慢,名册中的用户注销,消息未按时传递等。

UPD 3:安装了没有 JRE 的 Openfire 3.8.2Java SDK 1.70_25

以下是 JMX 屏幕截图:

节点 0:节点0

节点 1:节点1

红线是第一个客户端连接(Openfire 重启后)。在两个用户上测试。同样的事情......第一个用户(node0)立即连接,第二个用户(node1)在连接上花费了5秒。名册一直在显示双方的离线用户 20-30 秒,然后在线用户开始出现在其中。第一个用户向第二个用户发送消息。第二个用户等待 20 秒,然后收到第一条消息。回复和所有其他消息都会立即传输。

更新 4:

在通过 JConsole“线程”选项卡进行挖掘的过程中,我们发现了这些不同的状态:

例如hz.openfire.cached.thread-3

WAITING on java.util.concurrent.SynchronousQueue$TransferStack@8a5325
Total blocked: 0  Total waited: 449

也许这会有所帮助......我们实际上不知道在哪里寻找。

谢谢!

4

1 回答 1

1

[更新] 根据Hazelcast 文档的注意事项- 仅在其企业版本中支持 WAN 复制,而不在 Openfire 附带的社区版本中支持。如果您想使用此功能,您必须从 Hazelcast 获取企业许可证密钥。

您可以选择设置多个基于 LAN 的 Openfire 集群,然后使用跨不同 XMPP 域的 S2S 集成来联合它们。这是为庞大的用户群扩展 Openfire 的首选方法。

[原帖如下]

我的猜测是,远程集群配置中较长的网络延迟可能会占用 Hazelcast 执行程序线程(用于查询和事件)。其中一些事件和查询在 Openfire 集群中同步调用。尝试调整以下属性:

hazelcast.executor.query.thread.count (default: 8)
hazelcast.executor.event.thread.count (default: 16)

我将首先将这些值分别设置为 40/80 (5x),以查看整体应用程序响应能力是否有任何改进,并且根据您的预期负载可能会更高。可以在此处找到其他 Hazelcast 设置(包括其他线程池)以及将这些属性添加到配置 XML 中的说明:

Hazelcast 配置属性

希望对您有所帮助……祝您好运!

于 2013-05-22T06:37:59.703 回答