Openfire Hazelcast集群详解

Openfire Hazelcast集群详解

作者: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广播数据包)。要注意一点,如果局域网不支持广播通信,那么可以使用一些初始化的配置选项。

每个Openfire服务器部署了Hazelcast插件后,在管理控制台的集群页面上使用单选按钮激活/启用集群。只需要启用一次集群,此变更会自动通知到集群的其它节点。在刷新集群页面后就能看到所有的服务器已经成功加入集群了。

注意,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插件的升级

升级Hazelcast插件需要额外的一些步骤,而且集群中的每个节点都需要安装同一个插件版本,以避免各种错误和数据同步的问题。

方法1:离线升级

这种升级方法很简洁,但会发生短暂的服务中断。

1)关闭集群中所有的Openfire服务

2)对集群中的第一台Openfire服务器,执行以下步骤:

a. 移除plugins目录下现有的Hazelcast插件hazelcast.jar;

b. 移除plugins目录下现有的hazelcast子目录;

c. 复制最新的hazelcast.jar文件到plugins目录;

d. 重启Openfire服务器,实现插件的解压和安装。

3)对剩余的每一个Openfire服务器重复以上工作。

方法2:在线升级

这种方法在升级期间也不影响Openfire的服务。

1. 关闭集群中的Openfire服务器,只保留一台还运行。

2. 登录这台Openfire服务器的管理控制台,在插件页面移除现有的Hazelcast插件。

3. 上传最新的Hazelcast插件,并完成安装。

4. 使用“离线”步骤升级并启动剩余的服务器。

方法3:分割升级

注意:如果你只能访问Openfire的控制台,那么可以使用本方法。但是要注意,在升级过程中,用户可能彼此无法互相通信。

1)在Openfire管理控制台的集群页面,让集群停用(Disable),这会对集群的所有成员都关闭集群。

2)对于每一台Openfire,更新其Hazelcast插件。

3)当所有Openfire服务器的Hazelcast插件都更新完毕后,在管理控制台的集群页面启用(Enable),它会激活集群中的所有Openfire成员。

五、配置

Hazelcast有数个配置选项可作为Openfire的系统属性。

1、hazelcast.startup.delay.seconds (5)

运行Hazelcast插件的等待时间(秒)。这可以让Openfire在初始化集群的缓存时部署其他插件。

2、hazelcast.startup.retry.count (1)

集群首次启动失败后重复启动的次数。

3、hazelcast.startup.retry.seconds (10)

相邻两次启动的间隔时间。(秒)

4、hazelcast.max.execution.seconds (30)

在集群成员间执行同步任务时的最大等待时间。

5、hazelcast.config.xml.filename (hazelcast-cache-config.xml)

Hazelcast插件配置文件的名字,便于安装自定义的缓存配置文件。

6、hazelcast.config.xml.directory ({OPENFIRE_HOME}/conf)

可以添加到插件类路径下的目录,便于加载自定义的Hazelcast配置文件。

7、hazelcast.config.jmx.enabled (false)

为Hazelcast集群启用JMX功能。

Hazelcast插件使用了XML配置建立器来初始化集群。默认情况下,集群的成员间会尝试通过广播下面的位置实现彼此互相发现。

IP地址: 224.2.2.3

端口:54327

六、Hazelcast使用

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"

版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

时间: 2024-08-08 22:00:32

Openfire Hazelcast集群详解的相关文章

Centos7安装mariadb galera cluster数据库集群 & 详解

#Galera集群特点 集群之间无延时,同步复制.而master-slave主从异步复制,存在延迟. active-active多主,集群内部服务器都是同时写,必须等所有集群内所有数据库都完成数据写入,才会反馈完成,所以不存在数据丢失的情况. 集群节点自动故障转移,如果集群中单个节点故障,失效节点会自动被清除. 扩展方便,只要将新的节点添加到集群,新节点自动复制数据. #Galera集群原理     #主要通过galera插件保证数据的一致性,该数据复制的过程是可认证的复制,原理如下: #解析

Linux集群详解

Linux集群详解 集群或者说是群集:其目的是为了实现将多台计算机组合以来完成特定的任务,比如天气预报,大型网络游戏,这些都需要很大的运算量,单台计算机实现成本太高,而且不显示.那么就需要通过集群的方式,将废弃的或者正在使用的计算机联合起来,结合整体的力量来解决这些问题 集群类型: 1.  负载均衡集群 load blancing ,简称LB 2.  高可用性集群 high availibility,简称 HA 3.  高性能集群 high performance,简称 HP 作用: 1.  负

LVS集群详解

一.什么是集群 LVS(Linux Virtual Server)Linux虚拟服务器,将多台虚拟主机组织起来满足同一个需求.由国人章文嵩开发,通过LVS提供的负载均衡可实现一个高性能.高可用的服务器群集,从而以低成本实现最优的服务性能. 二.集群类型   LB:Load balancing    高可用集群 HA:High Availavility    高可用集群 HP:High Performace     高性能集群 三.lvs的常用集群方式及其详解 1.lvs是由用户空间命令和工作在内

LVS集群详解(持续更新中)

一.LVS(Linux Virtual Server)简介: 背景:在Internet的飞速发展下,对于网络宽带和服务器的要求越来越高.因此,对用硬件和软件的方法实现高可用伸缩.高可用网络服务的需求不断增长.针对高可用伸缩.高可用网络服务的需求章文嵩博士在1988年5月成立了LVS自由软件项目,是基于IP层和基于内容请求分发的负载平衡调度方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的.高可用网络服务的虚拟服务器. 项目目标:使用集群技术和Linux操作系统实现一个高性

负载均衡LVS集群详解

 一.LB--负载均衡 在负载均衡集群中需要一个分发器,我们将其称之为Director,它位于多台服务器的上面的中间层,根据内部锁定义的规则或调度方式从下面的服务器群中选择一个以此来进行响应请求,而其分发的方式则是根据某个算法进行的. 二.HA--高可用 高可用顾名思义就是服务的可用性比较高,即当我们不会因为某台服务器的宕机,从而造成我们的服务不可用,其工作模式则是将一个具有故障的服务转交给一个正常工作的服务器,从而达到服务不会中断. 三.LVS: LVS:Linux Virtual Serve

linux下高可用集群详解

1.高可用集群简单效果图 1.1.Messaging Layer:主要收集节点间的事务资源心跳等信息,分别有以下几种: heartbeatV1 heartbeatV2 heartbeatV3 corosync cman keepalived ultramokey 1.2.CRM:cluster resourse manager,对Messaging Layer收集到的资源进行管理,分别有以下几种: Heartbeat v1 自带的资源管理器:haresources Heartbeat v2 自带

高性能MySQL集群详解(二)

一.通过Keepalived搭建MySQL双主模式的高可用集群系统 1.MySQL Replication介绍: MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一台MySQL服务器(称为Slave)从另一台MySQL服务器(称为Master)上复制日志,然后解析日志并应用到自身的过程.MySQL Replication是单向.异步复制,基本复制过程为:Master服务器首先将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志的循环,这些日志文件可以发送到

Rabbitmq集群详解

Rabbitmq简介 1.什么是rabbitmq? MQ全称为MessageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.RabbitMQ 是一个由 Erlang 语言开发的 AMQP(高级消息队列协议) 的开源实现.RabbitMQ 属于消息中间件,主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然. 2.rabbitmq特点 可靠性(Reliability)Rabb

动态上下线集群详解

动态上下线集群的一些配置: 1.namenode中 hdfs-site.xml 配置 <property> <name>dfs.hosts</name> <value>/ddmap/hadoop-1.0.4/conf/hdfs_include</value> </property> <property> <name>dfs.hosts.exclude</name> <value>/ddm