前言

  Openfire的单机并发量,一直是一个比较含糊的东西,即使官方也没有很清楚的介绍。但按我自已评估,以4核、8G内存这样的机器配置,5万+的并发应问题不大。而当用户体量逐步上涨,前期可以通过扩容的方式提升性能,但若体量足够大,如几十万并发,单机的扩容已不是首选的方案,一来考虑性价比,二来如果整套系统跑在一台机器上,出现异常可能会波及所有在线的用户,用户感受极差。这时候,就需要把系统的压力分摊到多个服务器上,这就是集群。

  集群的引入,是为了解决单机的并发瓶颈,在多个服务器上,分别运行Openfire实例,并进行数据共享,使得多台机器的协作运行效果,与单机一样。

  而优秀的集群系统,不仅仅能提升性能,而且能自我管理。当其中某台机器出现异常,将触发集群的维护机制,比如剔除该异常节点,为系统的稳定性提供保障。

  Openfire为集群的接入提供了透明接口,可以通过添加插件的形式实现集群。

  具体Openfire的集群机制是如何,我们在后面的章节再来分析,本章主要讲解集群的配置,使用的集群插件是:Hazelcast。

  硬件说明

  1、两台服务器
IP1:192.168.5.1

IP2:192.168.5.2

  2、Mysql数据库,安装在服务器1

数据地址:192.168.5.1:

  插件安装与配置

  1、安装插件:Hazelcast Plugin,直接在Openfire管理后台安装即可。
  2、配置:
  (1)两台Openfire服务器配置相同的域
  (2)连接同一个数据库
  (3)服务器的集群配置:
  服务器1:
<join>
<multicast enabled="false">
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled="true">
<member>192.168.5.2:5701</member>
<member>192.168.5.1:5701</member>
</tcp-ip>
<aws enabled="false"/>
</join>
<interfaces enabled="true">
<interface>192.168.5.1</interface>
</interfaces>

  服务器2:

<join>
<multicast enabled="false">
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled="true">
<member>192.168.5:1:5701</member>
<member>192.168.5.2:5701</member>
</tcp-ip>
<aws enabled="false"/>
</join>
<interfaces enabled="true">
<interface>192.168.5.2</interface>
</interfaces>
  说明:其中member中是集群中各节点的IP地址和端口号,interface中是当前机器的IP地址。
  (4)在Openfire控制台,Server-->Clustering-->Clutering Enabled中,选择Enabled,保存,集群启动。

  测试

  使用两个客户端,分别登录两个机器,如果客户端能进行通信,则集群功能已经具备。

  (1)在任意一台服务器,登录Openfire管理后台,创建两个用户如:10023、10024
  (2)在另一台服务器的管理后台用户列表,即可看到刚刚创建的用户
  (3)在两台PC机,用Spark分别登录上面两个帐号,注意设置连接不同的主机:
  客户端 1 连接服务器 1(下图为Spark高级设置界面):

    

  客户端 2 连接服务器 2:
    
  (4)测试互发消息,若能完成通信说明集群OK。

  说明

  本章节以最简化了的操作,配置Openfire集群,仅是为验证Openfire集群的可行性,并为后续的分析做准备。
  但实际使用中,要使不同的客户端连接分配到不同的服务器,需要加入一台服务器,作为负载均衡,可安装开源的负载均衡组件Haproxy,或者用nginx都可以。
  另外,数据库方面,实际的Openfire集群中,数据库也应是集群使用。
 
 
  下一章,集群分析
 

  OVER!

即时通信系统Openfire分析之七:集群配置的更多相关文章

  1. openfire Hazelcast插件集群配置

    原文:http://blog.csdn.net/frankcheng5143/article/details/48708899 注意虽然hazelcast 官方已经有了3.5.2版本,但是openfi ...

  2. 即时通信系统Openfire分析之八:集群管理

    前言 在第六章<路由表>中,客户端进行会话时,首先要获取对方的Session实例.获取Session实例的方法,是先查找本地路由表,若找不到,则通过路由表中的缓存数据,由定位器获取. 路由 ...

  3. 即时通信系统Openfire分析之六:路由表 RoutingTable

    还是从会话管理说起 上一章,Session经过预创建.认证之后,才正常可用.认证时,最重要的操作,就是将Session加入到路由表,使之拥用了通信功能. 添加到至路由表的操作,是在SessionMan ...

  4. 即时通信系统Openfire分析之一:Openfire与XMPP协议

     引言 目前互联网产品使用的即时通信协议有这几种:即时信息和空间协议(IMPP).空间和即时信息协议(PRIM).针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP.PRIM与 ...

  5. 即时通信系统Openfire分析之三:ConnectionManager 连接管理

    Openfire是怎么实现连接请求的? XMPPServer.start()方法,完成Openfire的启动.但是,XMPPServer.start()方法中,并没有提及如何监听端口,那么Openfi ...

  6. 即时通信系统Openfire分析之二:主干程序分析

    引言 宇宙大爆炸,于是开始了万物生衍,从一个连人渣都还没有的时代,一步步进化到如今的花花世界. 然而沧海桑田,一百多亿年过去了…. 好复杂,但程序就简单多了,main()函数运行,敲个回车,一行Hel ...

  7. 即时通信系统Openfire分析之四:消息路由

    两个人的孤独 两个人的孤独,大抵是,你每发出去一句话,都要经由无数网络.由几百个计算机处理后,出在他的面前,而他就在你不远处. 连接管理之后 Openfire使用MINA网络框架,并设置Connect ...

  8. 即时通信系统Openfire分析之五:会话管理

    什么是会话? A拨了B的电话 电话接通 A问道:Are you OK? B回复:I have a bug! A挂了电话 这整个过程就是会话. 会话(Session)是一个客户与服务器之间的不中断的请求 ...

  9. Spring+quartz 实现定时任务job集群配置

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

随机推荐

  1. 【1414软工助教】团队作业3——需求改进&系统设计 得分榜

    题目 团队作业3--需求改进&系统设计 作业提交情况情况 本次作业所有团队都按时提交作业. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 ...

  2. 【Alpha】第三次Daily Scrum Meeting

    GIT 一.今日站立式会议照片 二.会议内容 1.确定开发人员负责开发模块 开发人员 开发模块 杨嘉成 注册登陆模块 吴文庆 服务模块 程志铭 个人中心 2.测试人员在开发人员完成该模块后紧跟测试 三 ...

  3. Git与码云(Git@OSC)入门-如何在实验室和宿舍同步你的代码(1)

    0.几个基本概念 本地仓库:本机上某个存放代码的仓库. 远程仓库:码云服务器上的代码仓库. 重要提醒:当我们在本地操作(新增.删除.修改)文件.目录时,并将其提交(commit),就是提交到了本地仓库 ...

  4. 201521123016 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避 ...

  5. PHP封装数据库连接

    将数据库连接放在类里面,用的时候直接实例化类. 将数据库地址,用户名,密码做成成员变量 将数据库连接做成成员方法,通过传入的sql语句返回结果集对象 class DBDA{ public $host= ...

  6. 多线程面试题系列(6):经典线程同步 事件Event

    上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...

  7. Spark Streaming socketTextStream简单demo

    正文 SparkStreaming的入口是StreamingContext,通过scala实现 一个简单的实时获取数据.代码SparkStreaming官网也可以找到. object SocketDS ...

  8. Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】

    什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...

  9. 理解 IntelliJ IDEA 的项目配置和Web部署

    1.项目配置的理解 IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行.最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse ...

  10. 在ZABBIX平台上通过SNMP协议监控网络设备

    在ZABBIX平台上通过SNMP协议监控网络设备 方法一:自动发现监控项 ZABBIX自带模板Template SNMP Interfaces中有"自动发现规则"这一选项,在主机选 ...