在合并复制中,每个节点都独立完成属于自己的任务,不像事务复制和快照复制那样订购者与出版者之间要相互连接,完全不必连接到其它节点,也不必使用MS DTC来实现两阶段提交就可以在多个节点对出版进行修改,只是在某一时刻才将该节点与其它节点相连(此时所指的其它节点并不一定指所有其它节点),然后将所发生的数据变化复制到这些相连节点的数据库中。复制的时机是可以配置的,SQL Server提供“连续”选项可以最短的时间复制数据,虽然会存在一定的时延,但是时延很少。
如果在复制时因多个节点更新同一数据而发生冲突,则数据的最终结果并不总是出版者修改后的结果,也不一定包含在所有节点上所做的所有修改。因为各节点都有自主权,都可以对出版物(复制数据)进行修改。这种情况将按照所设定的冲突解决规则对冲突进行处理,可能有点节点的修改将被丢弃,因此合并复制并不维护事务的一致。可以看出尽管最后所有的数据库都有相同的结果集,但这个结果是在多个节点共同参与下形成的,是多个修改合并到目标数据库的结果。
本方案中,正常使用时每台服务器只提供一项服务,只操作本机的主数据库,不直接对备数据库进行操作,备数据库只被动接收数据同步。当出现异常时,主数据库切换到备数据库时,此时也只对备数据库进行操作,不对主数据库操作。即同一时刻任一套系统只对一个数据库进行直接操作。并且两台服务器在同一局域网内,稳定的连接不存在问题。所以我们可以采用事务复制和连续地合并复制。
采用事务复制,可以保证数据实时一致,从而当主数据库宕机的时候,主备数据库完全一致。适用于不允许数据丢失的系统。
采用合并复制,主备数据库数据存在一定时延,当主数据库宕机的时候主备数据库可能存在很小的数据差异。适用能够容忍很少的数据丢失的系统。采用合并复制还有一个优点就是当主数据库恢复后,此时主数据库系统与备机数据库系统连接,备数据库也能够自动将数据同步到主数据库中。而事务复制当主数据库恢复后则需要手动地同步主备数据库。
2.3 数据库访问模块

图3 数据库访问模块
1.数据库操作封装类
封装所有数据库操作,用户对数据库不感知。操作主要包括如下[2]:
执行存储过程获取数据集
public DataSet getdataset(string proc,SqlParameter[] para)
执行sql语句获取数据集
public DataSet getdataset(string sql)
执行存储过程获取数据集游标
public SqlDataReader getDataReader(string proc,SqlParameter[] para)
执行sql语句获取数据集游标
public SqlDataReader getDataReader(string sql);
执行存储过程更新数据
public int updata(string proc,SqlParameter[] para)
执行sql语句更新数据
public int update(string sql)
数据库操作类从数据库连接管理模块中获取数据库连接进行数据库操作,对数据库连接不感知。
2. 数据库连接管理
初始时只使用主数据库连接池,备数据库连接池为空,当用户进行数据库操作时连续3次捕获到连接异常(非其他sql错误),这时表明主数据库服务已经崩溃,关闭所有主数据库连接池中的连接,开启备数据库连接。
3. 检测线程
使用主数据库时,对于没有用户操作的空闲时间段,检测线程轮询检测连接池中连接,当出现异常时,自动切换到备数据库,这样当再次有用户使用时就不会出现错误。
当切换到备数据库后检测线程按照一定时间间隔检测主数据库,当主数据库得到恢复时又自动逐步切换到主数据库。返回到备数据库连接池的空闲连接关闭,新的连接请求打开主数据库的连接。这样就逐步关闭所有备数据库的连接,无缝切换回主数据库。
连接异常检测>>切换到备数据库>>主数据库连接恢复检测>>恢复到主数据库都为自动过程,极大地提高数据库异常的容灾。
2.4 心跳检测
1.网络检测
定时Ping某服务器来检测对方网络是否正常(必须允许Ping的服务器)。Ping是向远程主机发送一个ICMP包,如果给定时间内没有接收到回应就认为是超时,如果收到回应则分析接收到的ICMP包,得到TTL、类型以及用时。
2.Web服务检测
通过HTTP协议访问Web服务,得到返回码,判断Web服务是否正常

图4 心跳检测流程
心跳检测流程如图4所示,当目标机出现问题是,系统切换到备用机上,此时人工切入处理后再恢复到正常部署状态。
3结束语
本方案以数据库的复制同步实现数据的实时备份;数据库访问模块的自动检测和切换,服务器的心跳检测,实现服务器异常时自动无缝切换继续提供服务。正常每台服务器都提供各自服务,充分利用资源。本方案总体成本较低,适合于小型企业和单位,实际当中也已经应用了多个案例,总的情况运转良好。当然相对于典型的方案,还有不少不足的地方,针对这些不足在今后长期的实践工作中进行改进。
参考资料:
[1] 郭宏志. JAVA EE WEB工程师培训JDBC+Servlet+JSP整合开发 M .北京 北京赛迪电子出版社, 2008.
[2] (美)维埃拉著,董明等译.SQL Server 2005高级程序设计 M .北京 人民邮电出版社, 2008.
2/2 首页 上一页 1 2 |