做者:chszs,版权全部,未经赞成,不得转载。博主主页:http://blog.csdn.net/chszs数据库
Openfire Hazelcast插件提供了在一个集群上运行多个冗余Openfire服务器的支持。经过把Openfire运行为一个集群,能够把终端的链接分配到多 台Openfire服务器上,同时还提供了服务器的故障转移。Hazelcast个插件是Openfire原集群插件的替代,它使用了开源的 Hazelcast数据分布框架来代替昂贵的专有第三方产品。目前Hazelcast版本是3.5.1。缓存
Hazelcast的主页: http://www.hazelcast.org/安全
XMPP协议的设计与邮箱类似,每一个Openfire的安装支持单个的XMPP域,且服务器到服务器(Server to Server,S2S)协议在XMPP规范中描述为把多个XMPP域链接到一块儿,也就是联邦(Federation)。联邦表明了XMPP横向扩展的有效 方式,由于它容许一个XMPP用户可以安全地与其余联邦域的任意用户进行通讯。这些联邦能够是公共的或者是私有的。联邦域能够在互联网上交换XMPP节 (Stanzas),甚至可使用基于DNS的服务查找或是地址解析进行发现。服务器
与之相反,集群是单个XMPP域进行纵向扩展的技术,集群内的诚意共享相同的配置。集群中的每个成员都容许任意用户在域内进行链接、受权认证、交 换节。全部集群的服务器都共享单个的数据库,所以须要部署在同一个局域网内,以保持网络通讯的低延迟。集群的部署适合提供运行时的冗余,并且能支持更大的 用户数量和更多的链接数。网络
对于比较大的Openfire部署,结合联邦和集群两种技术能提供比较佳的效果。单个的XMPP域可以支持数万甚至数十万的用户,再结合联邦部署,就能达到支持百万级以上的用户规模。负载均衡
要建立Openfire集群,至少要有2台Openfire服务器,每一台都必须安装Hazelcast插件。要按照Hazelcast,只需简单的把hazelcast.jar包放入Openfire的plugins子目录。还能够在管理控制台的插件页直接安装此插件。框架
要注意,集群内的每一台Openfire服务器都必须配置为链接同一个外部数据库。性能
默认状况下,Openfire在启动并初始化进程期间,服务器节点会彼此互相发现(经过彼此互相交换UDP广播数据包)。要注意一点,若是局域网不支持广播通讯,那么可使用一些初始化的配置选项。spa
每一个Openfire服务器部署了Hazelcast插件后,在管理控制台的集群页面上使用单选按钮激活/启用集群。只须要启用一次集群,此变动会自动通知到集群的其它节点。在刷新集群页面后就能看到全部的服务器已经成功加入集群了。.net
注意,Hazelcast和更早的集群插件(如clustering.jar或enterprise.jar)是互斥的。也就是说,使用了Hazelcast插件,就不能使用早期的集群插件。
在集群运行后,你就须要某种形式的负载均衡来把用户的访问分配到各个Openfire节点上。这里有多个商业解决方案和开源解决方案。若是你使用 HTTP/BOSH Openfire链接器来链接Openfire的话,那么可使用Apache HTTP Server来作负载均衡器(使用mod_proxy_balancer模块)。一些流行的选项如F5 LTM(商业解决方案)和HAProxy(开源解决方案)均可以。
F5 LTM: http://www.f5.com/products/big-ip/big-ip-local-traffic-manager/overview/
HAProxy: http://haproxy.1wt.eu/
还有一个简单的Round-robin DNS配置能够帮助分配XMPP链接到集群中的uogeOpenfire服务器节点。尽管流行的轻量级、低成本的方法提供了基本的可扩展性,但要注意这些方法是既没有考虑到足够知足实际的负载均衡,又没有提供高可用性的能力。
升级Hazelcast插件须要额外的一些步骤,并且集群中的每一个节点都须要安装同一个插件版本,以免各类错误和数据同步的问题。
这种升级方法很简洁,但会发生短暂的服务中断。
1)关闭集群中全部的Openfire服务
2)对集群中的第一台Openfire服务器,执行如下步骤:
a. 移除plugins目录下现有的Hazelcast插件hazelcast.jar;
b. 移除plugins目录下现有的hazelcast子目录;
c. 复制最新的hazelcast.jar文件到plugins目录;
d. 重启Openfire服务器,实现插件的解压和安装。
3)对剩余的每个Openfire服务器重复以上工做。
这种方法在升级期间也不影响Openfire的服务。
1. 关闭集群中的Openfire服务器,只保留一台还运行。
2. 登陆这台Openfire服务器的管理控制台,在插件页面移除现有的Hazelcast插件。
3. 上传最新的Hazelcast插件,并完成安装。
4. 使用“离线”步骤升级并启动剩余的服务器。
注意:若是你只能访问Openfire的控制台,那么可使用本方法。可是要注意,在升级过程当中,用户可能彼此没法互相通讯。
1)在Openfire管理控制台的集群页面,让集群停用(Disable),这会对集群的全部成员都关闭集群。
2)对于每一台Openfire,更新其Hazelcast插件。
3)当全部Openfire服务器的Hazelcast插件都更新完毕后,在管理控制台的集群页面启用(Enable),它会激活集群中的全部Openfire成员。
Hazelcast有数个配置选项可做为Openfire的系统属性。
一、hazelcast.startup.delay.seconds (5)
运行Hazelcast插件的等待时间(秒)。这可让Openfire在初始化集群的缓存时部署其余插件。
二、hazelcast.startup.retry.count (1)
集群首次启动失败后重复启动的次数。
三、hazelcast.startup.retry.seconds (10)
相邻两次启动的间隔时间。(秒)
四、hazelcast.max.execution.seconds (30)
在集群成员间执行同步任务时的最大等待时间。
五、hazelcast.config.xml.filename (hazelcast-cache-config.xml)
Hazelcast插件配置文件的名字,便于安装自定义的缓存配置文件。
六、hazelcast.config.xml.directory ({OPENFIRE_HOME}/conf)
能够添加到插件类路径下的目录,便于加载自定义的Hazelcast配置文件。
七、hazelcast.config.jmx.enabled (false)
为Hazelcast集群启用JMX功能。
Hazelcast插件使用了XML配置创建器来初始化集群。默认状况下,集群的成员间会尝试经过广播下面的位置实现彼此互相发现。
IP地址: 224.2.2.3
端口:54327
Hazelcast对于延迟是很是敏感的,它或许会致使一个长期运行的GC周期,尤为是在使用默认的JVM配置时。在大多数状况下,优先激活并行的垃圾收集器(CMS)或者是使用新的G1垃圾收集器来使得阻塞最小化。
另外,Openfire集群的运行特色在很大程度上取决于客户端的数量、链接的类型、以及部署的XMPP服务类型。可是要注意,许多在堆(Heap)上分配的对象是短活动期的,增长年轻代的空间或许会对性能产生积极的影响。
好比,下面提供一个适合3个节点的服务器集群(4核CPU),支持大约5万个活动用户:
OPENFIRE_OPTS="-Xmx4G -Xms4G -XX:NewRatio=1 -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=1 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintPromotionFailure"