高可用性就是保证尽量少的宕机时间。
尽量少的数据损坏。
一般会受到如下因素影响:
- 环境因素, 比如磁盘耗尽
- 性能问题, 可能是运行了超级慢的sql
- 糟糕的schema和索引设计
- 复制导致数据不一致。
提升平均失效时间 (MTBF)
就是连续运行的时间。 我们可以通过如下的注意点尽量避免:
- 测试回复工具和流程
- 最小权限
- 用好的命名和组织约定避免混乱,比如测试开发库分离
- 升级服务器前使用Percona Tookit检查系统
- 确认服务器配置项
- 通过skip_name_resolve禁止DNS
- 除非证明有效,否则不使用查询缓存。
- 避免使用复杂的特性,如触发器等
- 监控重要组件
- 尽量记录服务器状态和性能做成曲线查看走向
- 定期检查复制完整性
- 备库设置为只读,不要让复制自动启动
- 对查询语句做检查
- 归档并清理不需要的数据
- 为文件系统保留空余空间,在linux中可以使用-m选项为系统本身保留空间。或者创建很大的空文件,在快满是删除
- 养成习惯,评估和管理系统的改变,状态以及性能信息。
降低平均恢复时间(MTTR)
通过建立冗余来避免系统完全失效,比如避免单点。
能够提供冗余和故障转移能力的系统架构
熟悉业务的员工和详细的文档和流程
宕机事后反思
避免单点失效
单个磁盘,单台服务器,单台交换机路由器,单电力网。 任何不冗余的部分都可能是一个失败的单点。
用池加负载均衡,可以动态的切换及避免冗余
共享存储或者复制,做到数据的冗余。
共享存储就是在华为的时候的存储产品,比如NAS。
同步复制
mysql 普通的复制,主服务器挂掉之后会丢数据,使用同步复制保证至少在一条备机持久化之后才能持久化本地,所以减少了丢失。
通常可用的工具:
Mysql Cluster . 可以在任何节点上写入。这些节点拥有等同的读写能力,美羊羊都是冗余数据。
Percona XtraDB Cluster,可以基于已有的存储引擎增加同步复制和集群的特性。其有很多有死的特性:
- 跨界点复制比没有集群快,因为网络写RAM比本地写磁盘块,可以通过降低单节点持久性获得更好的性能。
- 行级并发。可以更好的利用多核CPU
故障转移和恢复
冗余只是一个基础,真正影响可用性的是如何利用这些冗余做转移和恢复。
转移是A出问题了切到B上,等A好了再切回去,这要比仅仅恢复A要好。
通常有如下的手段来做:
- 提升备库。
- 使用虚拟IP,如果服务器出问题,则让虚拟ip指向备库。但是这样可能会因为网络缓存,ip接管等引起错误
- 中间件 可以使用代理,端口转发,LVS等等方法来作为中间件,屏蔽应用和数据库。比如最简单的http代理
总结:
- 两方面考虑增加可用性。 增加两次故障之间的运行时间MTBF,减少从故障恢复的时间。MTTR
- MTBF要减少出错,尽量减少宕机
- MTTR要尽早发现,可以使用监控。
- MTTR还可以使用冗余,并提供故障注意能力。但是遮阳系统更复杂,变成了分布式的。 意味着协调、同步、CAP(一致可用容错只能满足两个)、拜占庭将军问题等
- 如果需要很强的可用性保证不宕机,那么需要Mysql Cluster这样的集群产品。 如果可以容忍故障转移慢一点,标准mYSQL复制也可以
- 如果不是很在意故障转移时间,可以使用NAS等存储层的技术。