可用性战术
恢复和修复是可用性的重要方面,为了阻止错误发展成故障,至少能够把错误限制在一定的范围内,从而使修复成为可能。维持可用性的所有方法包括某种类型的冗余,用来检测故障的某种类型的健康监视,以及当检测到故障时某种类型的恢复。有些情况下,监视或恢复是自动进行的,有时需要手动。
我们事项考虑错误检测,然后分析错误恢复,最后讨论错误预防。可用性指标是网站架构设计的重要指标,通常是用多少个9来衡量网站的可用性
网站不可用时间(故障时间)=故障修复时间点-故障发现(报告)时间点
网站年度可用性指标=(1-网站不可用时间/年度总时间)*100%
造成系统不可用的因素有很多,可以是服务器宕机,磁盘损坏等,也可以是代码层出现问题,当服务器宕机时,会通过心跳检测机制发现该服务器失去响应,就会从服务器列表中删除,而将请求发送到其他的服务器上
1> 错误检测
用于识别错误的3个战术是命令/响应、心跳和异常
⑴命令/响应。
当我们再写程序时候可以写入一些控制台输出语句,运行程序时可以通过控制台输出的信息来判断是否写入数据成功,如果数据写入不成功也可以通过控制台输出的信息来判断错误出现的地方,进而能够更快的修正错误。
⑵心跳。计时器
class Timer { private: _LARGE_INTEGER TimeStart; _LARGE_INTEGER TimeEnd; public: Start() {QueryPerformanceCounter(&TimeStart);}//计时开始 End() {QueryPerformanceCounter(&TimeEnd);}//计时结束 double Time();//返回时差 }; double Timer::Time() { static double Freq;//计时器频率 static getfreq(0); if (!getfreq)//获得计时器频率,只运行一次 { LARGE_INTEGER f; if (QueryPerformanceFrequency(&f)) Freq=f.QuadPart; else throw "无法获得定时器频率"; getfreq=1; } return (TimeEnd.QuadPart-TimeStart.QuadPart)/Freq; }
⑶异常。.java异常处理机制及实现方法
try…catch…finally处理机制:try关键字后跟一个花括号栝起的代码块(即使该代码块只有一行也不能省略花括号),简称try块。catch对应异常类型和代码块,用于表明更改catch块用于处理该种类型的异常。一个try块后可以跟多个catch块。在catch块后还可以跟一个finally块,finally块用于回收在try块里打开的资源。
public static Connection getConn () {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");//加载驱动
conn = DriverManager.getConnection(db_url, db_user, db_pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
2> 错误恢复
错误恢复由准备恢复和修复系统两部分组成。
⑴表决。运行在冗余处理器上的每个进程都具有相同的输入,它们计算发送给表决者的一个简单的输出值。如果表决者检测到单处理器的异常行为,那么就中止这一行为。表决算法可以是“多数规则”或“首选组件“或其他算法。该方法用于纠正算法的错误操作或者处理器的故障,通常用在控制系统。每个冗余组件的软件可以由不同的小组开发,并且在不同平台上执行。稍微好一点情况是在不同平台上开发一个软件组件,但是这样的开发和维护费用非常昂贵。
⑵主动冗余(热重启)。所有的冗余组件都以并行的方式对事件做出响应。因此他们都处在相同的状态。仅使用一个组件的响应,丢弃其他组件的响应。错误发生时,使用该战术的系统停机时间通常是几毫秒,因为备份是最新的,所以恢复所需要的时间就是切换时间。
⑶被动冗余(暖重启/双冗余/三冗余)
一个组件(主要的)对事件做出响应,并通知其他组件(备用的)必须进行状态更新。当错误发生时,在继续提供服务前,系统必须首先确保备用状态是最新的。该方法也用在控制系统中,通常情况是在输入信息通过通信通道或传感器到来时,如果出现故障必须从主组件切换到备用组件时使用。
⑷备件
备用件是计算平台配置用于更换各种不同的故障组件。出现故障时,必须将其重新启动为适当的软件配置,并对其状态进行初始化。定期设置持久设备的系统状态的检查点,并记录持久设备的所有状态变化能够使备件设置为适当的状态。这通常用作备用客户机工作站,出现故障时,用户可以离开。该战术的停机时间通常是几分钟。
3> 错误预防
(1)应用层主要负责具体业务逻辑处理;服务层负责提供可复用的服务;数据层负责数据的存储与访问。在代码中使用不同的类完成不同的功能,避免由于某一功能出现故障导致无法正常运行,当发生错误时也可以快速锁定并修正错误
(2)从服务中删除。
在连接数据库时,当程序完成后一般会关闭数据库,防止下次使用的时候出现故障
public static void close(Connection conn, Statement st, ResultSet rs) { try { if (conn != null) { conn.close(); } if (st != null) { st.close(); } if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } }
⑵事务。事务就是绑定几个有序的步骤,以能够立刻撤销整个绑定。如果进程中的一个步骤失败的话,可以使用事务来防止任何数据受到影响,还可以使用事务来防止访问相同数据的几个同时线程之间发生冲突。
⑶进程监视器。一旦检测到进程中存在着错误,监视进程就可以删除非执行进行,并为该进程创建一个新的实例,就像在备件战术中一样,初始化为某个适当的状态。