某一天深夜,单盘配置的服务器出现硬盘损坏,导致该服务器上所提供的服务停止,于是有了开发双机热备服务的想法,经过长时间(半年)的多人的努力,这个东西慢慢就出来了。基于各种原因,这里不能提供相关源代码,仅仅提供设计思想,基本实现思路和实现过程遇到的问题和挑战,顺带记录下这半年努力的成果,若有描述不够详细或清楚的地方,敬请见谅!
1. 稳定性思考
废话不多说,本文所说的服务器特指使用C /C++ 实现的中间件角色的应用服务器,比如DB Proxy(Cache) Server,常规MMORPG架构中的中心服务器,在其整体应用中都是以单点的形式存在,而且所起的作用又及其重要,如何应对各种程序问题或者不可控因素引起的Crash,而把其Crash所造成的损失减少到最低,这里介绍一个已实现并且可行的双机热备(hot-standby)解决方案。
名词解释:
HS: 当前双机热备技术架构简称
Master: 主服务器,即当前online服务器
Slave: 从服务器,即备份服务器,offline服务器
服务器: Master或者Slave
2. 双机互备工作方式
HS工作在【主-从】模式下,即同一时间只有一台服务器提供服务,默认情况下Slave服务器不处理外部请求命令,只处理由Master端发来的同步请求。
这种情况下,服务器提供统一的接口给LVS,如果LVS检测到Master无响应或停止工作,则发命令使Slave变成服务器(online)模式,同时将客户端请求都转到Slave,此时Slave主机也就升级成为Master,工作方式如Figure.1所示:
Figure.1
3. 软件架构
HS是被设计成通用性模块,理论上可以供所有应用服务器接入使用,如Figure.2所示:
Figure.2
由于HS模块自身并没有网络传输功能,在集成中还需要将应用服务器的网络I/O接口接入到HS模块(常规情况下,应用服务器的网络I/O模块都会提供单独接口?)。
整体架构如Figure.3,HS自己运行一个线程,对所有异步传递到HS模块的数据,先使用queue进行排队缓存,再在本线程内一次性将其传输到配置的Slave端,同时这部分数据也会写入模块的第三方存储(HS目前只实现了Memory存储)。
Slave在接收到Master传输的data后,更新应用服务器相关内存(根据Master发送的KEY可以确定具体的内存类型),同时也会将接收到的数据写入自身的数据缓冲队列和第三方存储。
Master和Slave只要编写很少代码(发送时HOOK,接收时更新)就可以实现一个完备的hot-standby server。
Figure.3
这里就有个疑问了,为什么Slave也需要维护一个queue和第三方存储呢?这是因为Slave可能会在未来的某一天会变成Master,需要同步数据给未来的一个Slave。Figure.4流程图说明了服务器启动的过程。
Figure.4
4. 模块化
HS可以单独编译成动态库形式(.so)使用。
具体实现中使用boost的一些库,主要有io_service,thread,bind,shared_ptr等。
不过在编译时可以选择将boost库静态编译,实际使用上就不用单独进行依赖了。
需要说明的是,为了更好的支持HS的运行,远程过程调用模块被开发出来,这里就不详述了。
5. 网络传输如何处理突如其来的大数据量
在某种极端情况下,当Master启动了很久之后,Slave才姗姗来迟,Master可能积累了大量的数据(超过4G),这个时候如果Master对Slave进行无限制的传输数据,会占用大量的网卡资源(不过一般双网卡,不影响外网服务),最重要的会占用大量网络线程资源(HS和应用服务器公用网络线程)。
实际测试中发现,由于4G的小块数据大小不一,传输耗时超过1分钟。为了避免对应用服务器的网络线程拥塞,加入了传输数据的流量控制,在每个间隔时间内只传输指定配置的数据量,测试证明,这个方法解决了所有相关问题。
第三方存储有什么用?
Slave端断开后或者在Master启动一段时间后再连上来时,用于存储历史备份数据。就是说Slave 在断开很长时间之后再连上来,期间所有的历史数据都是在第三方存储中。连上后,首先需要同步的第三方存储的数据,完成后再对queue中的数据进行实时同步。
6. Socket的幽灵属性keepalive
为了检测网线断开或者不可知的网络异常,HS需要一套能够检测网络真断开,还是伪断开(比如网络短时间内的不通),首先想到了利用TCP/IP协议自身的属性,即KEEPALIVE,经使用测试发现,这个不是很好的检查机制,至少不是我们需要的。因为KEEPALIVE依赖系统的三个属性,如下所示:
系统设置
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
简单说明下,这个三个属性表示TCP/IP协议层会在7200秒没有收到客户端消息的情况下,发送10(9+1)个报文段,每两个间隔75秒,若客户端对这些信息都没有响应,则终止该连接。
不使用这个属性的两个理由,一是这些信息属于系统属性级别的改动,二是实际测试中发现很不稳定。
以下为设置keepalive的代码:
int optval = 1;
socketlen_t optlen = sizeof(optval);
setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen);
更有效的心跳方案:
就是自己实现,方案比较土,简单描述下:
服务器维护两个变量A和B,一个定时器,客户端每来一个请求包,A变量自增1,同时在定时器到点时,检测A和B是否相同,如果不同表明客户端是活动的,同时将A同步到B,开始下一轮定时器。若一个连接有N次的定时器到点是都未活动,则判定客户端断开,关闭该连接。
7. OVER
【编者加注】
专注于社交游戏的研发与运营,逐渐对社交游戏产品的业务越来越熟悉,不断地总结与分析,加快社交游戏产品的研发速度,我们技术团队做很多研究与尝试,为此我们开发出来产品:
1) 数据中间件:解决大用户并发与大数据量的问题,不需要游戏研发工程师关心数据的存取等;
2) 任务服务器:解决游戏产品众多活动或奖励活动的举办,以及游戏自身任务的配置与管理;
3) 统计服务器:我们玩家的操作日志数据量太大,无法全部存储到服务器上,为此有选择地存储相关玩家的行为日志数据,并且完成数据分析的工作;
4) 好友列表服务器:社交游戏产品主要是接入众多的社交网站平台,为此要实现一套通用的好友列表服务器;
5) …..等其他游戏引擎组建
随着推出上述相关通用性游戏引擎的组建,我们也逐渐赢得更多时间与精力可以做更有意义的事情,比如我们可以静下心研究解决这些服务器作为单点运行的问题,为此研发出解决各个游戏引擎组建服务的主备提供服务的通用性组建,也即其他游戏引擎组建通过引入hot-standby组建,可以解决单点故障的问题。这个通用性组建,也可以为非社交游戏行业的服务器后台程序的热备模式,提供一定的技术参考价值。感谢@ZEROV17的投稿支持,也欢迎各位技术朋友站内留言或者新浪微博直接交流,同时也非常感谢零度视角F为此项目所作的贡献!
分享到:
相关推荐
双机热备的实现方案大致可以分为三类:共享存储双机热备方案、镜像双机热备方案、双机双柜双机热备方案。下面分别介绍这些方案的特点及其适用场景。 ##### 2.2 镜像双机热备方案 **2.2.1 镜像双机热备方案简介** ...
Oracle数据库双机热备方案 Oracle 双机热备方案是指运用适当的拓扑结构将两台数据库连接起来,以主-从的方式实现数据库热备份。该方案可以避免由数据库崩溃而给前端服务造成损失。 一、数据库双机热备的概念和...
通常而言,实现双机热备的技术方案主要包括共享存储双机热备方案、镜像双机热备方案和双机双柜双机热备方案三种。 #### 二、镜像双机热备方案 **2.1 镜像双机热备方案简介及拓扑** 镜像双机热备方案是最简单的一...
综上所述,双机热备解决方案是当前保障关键业务系统高可用性的有效手段之一。企业可根据自身业务特性和资源状况选择合适的双机热备方案,确保在面临故障时能够迅速恢复服务,减少潜在损失,提升整体业务稳定性。
IBM双机热备方案解析 IBM双机热备方案是指系统对主机及硬盘、通訊线路等核心设备,采用双机备份,当系统正常时主机进行工作,并且每隔设定时间系统自动检测,若发现问题,系统能够自动切换到备份机继续工作,保证不...
总结而言,这个免费双机热备工具为Windows用户提供了一种实现高可用性的解决方案,通过监控、故障检测、虚拟IP管理和启动脚本执行,确保在主服务器故障时能迅速切换到备用服务器,保证关键业务的连续运行。...
usg双机热备-检测物理单点故障
双机热备是这样一种解决方案,它可以自动检测服务运行状态,当主服务器发生故障时,自动尝试修复故障或开启备用服务器,确保服务不间断运行。 双机热备方案有多种,包括共享存放双机热备方案、镜像双机热备方案和...
* 高可用性:MYSQL+KEEPALIVED 双机热备方案可以确保数据库的高可用性,避免单机故障对业务的影响。 * 高可靠性:MYSQL+KEEPALIVED 双机热备方案可以确保数据库的高可靠性,避免数据丢失和损坏。 但是,MYSQL+...
在用友U8软件的应用场景中,双机热备技术显得尤为重要,因为它可以帮助企业规避因单点故障导致的业务中断风险。 #### 二、双机热备实现模式 双机热备主要分为两种实现模式: 1. **基于共享存储设备的方式**:这是...
- **高可用性**: 双机热备方案通过两台服务器互相备份,能够在一台服务器发生故障时迅速切换到另一台,从而实现高可用性。 - **故障自动切换**: 当主服务器出现故障时,备份服务器会自动接管主服务器的工作,确保...
Sql Server 2012 双机热备方案实操详细配图教程 本文将详细讲解 Sql Server 2012 双机热备方案的实操过程,包括环境部署、主服务器发布部署和从服务器订阅部署三个部分。 一、环境部署 在开始双机热备之前,需要...
在Linux环境中,双机热备(High Availability, HA)是一种重要的技术,用于确保关键服务的持续可用性。当一台服务器出现故障时,另一...通过正确配置和维护,可以显著提高服务的稳定性,降低因单点故障导致的业务风险。
双机热备方案是服务器系统中的一种高可用性解决方案,它能够确保服务器在出现故障时能快速恢复,减少停机时间,提高服务器的可用性和可靠性。RoseHA是是一种热备软件,能够实现双机热备,提供高可用性和高可靠性的...
这种方案旨在预防服务器故障导致的服务中断,减少由此产生的经济损失和信誉损害。双机热备通过硬件冗余和专用的双机热备软件实现,当主服务器出现问题时,软件会自动检测并尝试修复,或者切换到备用服务器上,确保...
因此,双机热备方案应运而生,它结合硬件冗余和高可用性双机热备软件,能自动检测服务状态并在主服务器故障时切换到备用服务器,确保服务的连续运行。 双机热备方案主要有三种类型: 1. **共享存储双机热备**:...
在展开有关Hadoop HDFS系统双机热备方案的知识点前,首先需要了解双机热备的基本概念,HDFS的基本架构以及如何搭建Hadoop集群。在这些基础之上,才能更深入地理解双机热备方案的设计理念及其实施步骤。 双机热备,...