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.2和Java SDK 1.70_25。
以下是 JMX 屏幕截图:
节点 0:
节点 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
也许这会有所帮助......我们实际上不知道在哪里寻找。
谢谢!