什么是高可用
高可用就是指服务随时可用。通常以百分比表示,这本身也是一种暗示:高可用性不是绝对的,只有相对更高的可用性
。100%的可用性是不可能达到的。可用性的“9”规则是表示可用性目标最普遍的方法。你可能也知道,“5个9”表示99.999%的正常可用时间。换句话说,每年只允许5分钟的宕机时间
服务不可用的原因有哪些
MySQL服务不可用的情形可以分为性能问题、服务器问题。性能问题主要可能是执行了糟糕的SQL、使用了糟糕的schema和索引设计。服务器问题主要可能是磁盘空间耗尽、服务器bug、错误的行为或者主从延时。
因为糟糕的SQL或索引设计会导致MySQL执行效率降低,从而影响MySQL的服务能力
由于误操作执行了DROP TABLE导致数据丢失
备库与主库出现了较大的延时,对读取备库数据的业务产生影响
如何实现高可用
描述系统的可用性有两个指标,分别是平均失效时间(MTBF)和平均恢复时间(MTTR)。
平均失效时间(Mean Time Between Failures,MTBF)是一个衡量系统或组件在运行期间平均能够无故障运行多久的指标。
平均修复时间(Mean Time To Repair,MTTR)是一个衡量在系统或设备出现故障后,平均需要多长时间才能完成修复并恢复其正常运行状态的时间指标。
提升平均失效时间(MTBF)
在日常开发和维护中,要按照一定规范执行,可以避免大多数宕机的风险。
避免服务器问题
- 升级前仔细检查系统
- 确认基本的服务器配置是正确的
- 避免使用复杂的特性,例如复制过滤和触发器,除非确实需要
- 监控重要的组件和功能,特别是像磁盘空间和RAID卷状态这样的关键项目,但也要避免误报,只有当确实发生问题时才发送告警
- 定期检查复制完整性
- 归档并清理不需要的数据
- 遵从最小权限原则
避免性能问题 - 定期进行查询语句审查
- 使用好的命名和组织约定来避免产生混乱,例如服务器是用于开发还是用于生产环境。
降低平均修复时间(MTTR)
服务不可能100%可用,所以当服务不可用时能尽快恢复可用是很有必要的。
避免单点失效
为服务添加冗余节点,当服务失效时及时切换到冗余节点保障服务正常运行。
MySQL提供的复制功能可以很好的解决这个问题。一主多备的结构虽然可以提高数据的安全性和服务的可用性,但是并没有为系统性能带来提升。MySQL cluster
解决了一主多备带来的问题。集群中的每个节点都是主-主结构的复制,都有读写能力,即为服务提供了冗余能力,也可以提高服务的并发性能。
故障转移和故障恢复
冗余是很好的技术,但实际上只有在遇到故障需要恢复时才会用到。在故障转移的过程中,高可用性是建立在冗余的基础上
。当有一个组件失效,但存在冗余时,可以停止使用发生故障的组件,而使用冗余备件。冗余和故障转移结合可以帮助更快地恢复。
提升备库或切换角色
提升一台备库为主库,或者在一个主—主复制结构中调换主动和被动角色
中间件解决方案
可以使用代理、端口转发、网络地址转换(NAT)或者硬件负载均衡来实现故障转移和故障恢复。
在应用中处理故障转移
有时候让应用来处理故障转移会更简单或者更加灵活。例如,如果应用遇到一个错误,这个错误外部观察者正常情况下是无法察觉的,例如关于数据库损坏的错误日志信息,那么应用可以自己来处理故障转移过程。