一、高可用概述:为什么需要高可用、CAP理论与BASE理论、常见高可用架构模式

各位同学,咱们今天聊聊高可用。说实话,这个词在云上数据库的圈子里,几乎天天被挂在嘴边。但你真的理解它吗?

我记得刚入行那会儿,带我的老大哥跟我说过一句话:「数据库挂了,公司就挂了。」当时我还觉得夸张,直到后来自己亲手经历了一次生产事故——凌晨三点,核心库宕机,整个支付链路断了四十分钟。那四十分钟,我坐在机房里,看着监控面板上红色的告警,后背全是冷汗。嗯,从那以后,我对「高可用」这三个字,再也不敢有半点马虎。

1.1 为什么需要高可用?

说白了,高可用就是为了让系统在面对各种故障时,依然能对外提供服务。你想想看,现在的业务几乎都是7×24小时在线,用户可不管你是不是在维护、是不是硬盘坏了、是不是网络波动。他们只关心一件事:能不能用。

我在项目中遇到过最典型的场景:某次双十一大促,流量峰值是平时的20倍。如果数据库扛不住,那前端页面再花哨也没用。高可用不是锦上添花,它是雪中送炭。

具体来说,高可用要解决这几类问题:

  • 硬件故障:磁盘坏了、内存坏了、网卡松了。这些事虽然概率低,但一旦发生就是灾难。
  • 软件崩溃:数据库进程挂了、操作系统OOM了、驱动有bug。我见过最离谱的一次,是某个版本的MySQL在特定条件下自己把自己搞死了。
  • 网络分区:机房光缆被挖断了、交换机挂了。云上环境虽然网络冗余做得不错,但也不是100%可靠。
  • 人为误操作:这个最要命。我曾经手滑执行过一条DROP TABLE,还好有备份,不然就真的凉了。

核心观点:高可用不是「不出故障」,而是「出了故障还能用」。衡量标准就是SLA,比如99.99%可用性,意味着一年宕机时间不能超过52.56分钟。

1.2 CAP理论与BASE理论

聊高可用,绕不开CAP。这个理论是分布式系统的基石,也是很多架构决策的出发点。

CAP说的是:一个分布式系统,在一致性(Consistency)可用性(Availability)分区容错性(Partition Tolerance)这三者中,最多只能同时满足两个。

你可能会问:为什么不能三个都要?我打个比方你就明白了。假设你有两个数据库节点A和B,它们之间网络断了(分区发生了)。这时候客户端写了一条数据到A,但B不知道。如果客户端去读B,B该不该返回数据?

  • 如果返回,那就是可用,但数据不一致(牺牲了C)。
  • 如果不返回,那就是一致,但服务不可用(牺牲了A)。

你看,鱼和熊掌不可兼得。在实际的云上数据库架构中,我们通常选择APCP。比如MySQL主从复制,默认是AP模式——主库挂了,从库可能丢数据,但服务不会断。

组合 典型场景 代表产品
CA 单机数据库(无分区) 单机MySQL
CP 强一致性要求 ZooKeeper、Etcd
AP 高可用优先 MySQL主从、Redis哨兵

再说说BASE理论。这个理论是对CAP的一种妥协和补充。BASE是Basically Available(基本可用)Soft State(软状态)Eventually Consistent(最终一致性)的缩写。

我个人习惯把BASE理解为「别太较真」。你不需要每时每刻都保证数据完全一致,只要最终能对上就行。比如你在淘宝下单,扣库存和生成订单这两个操作,不一定同时完成,但只要最终库存扣了、订单生成了,用户就满意了。

避坑指南:我曾经在一个金融项目中,试图用最终一致性来做账户余额扣减。结果发现不行——用户转完账,余额半天没变,投诉电话打爆了。所以,BASE不是万能的,对一致性要求高的场景,还是得走CP路线。

1.3 常见高可用架构模式

理论讲完了,咱们看看实战中怎么搭。常见的架构模式就那么几种,我一个个说。

1.3.1 主从复制模式

这是最基础的模式。一个主库负责写,多个从库负责读。主库挂了,手动或自动切一个从库上来。

优点:简单、成熟、成本低。
缺点:切换有延迟,可能丢数据。

我在项目中遇到过最头疼的事:主库突然宕机,从库的复制延迟还有几秒。这几秒的数据,就永远丢了。所以后来我养成了一个习惯——不管用哪种模式,一定要做数据备份

1.3.2 双主互备模式

两个节点互为主从,都可以读写。这种模式的好处是,任何一个节点挂了,另一个还能继续服务。

但坑也不少。最常见的问题是数据冲突——两个节点同时修改同一条记录,怎么办?解决办法通常是让业务层做路由,或者用分布式ID生成器保证主键不冲突。

1.3.3 集群模式(如MySQL InnoDB Cluster、Galera)

多节点组成一个集群,数据实时同步。任何一个节点挂了,集群自动剔除它,客户端无感知。

这种模式的好处是高可用性极强,坏处是网络要求高。如果节点之间延迟太大,整个集群的性能会急剧下降。

1.3.4 云原生高可用(如RDS、PolarDB)

现在云上数据库基本都自带高可用方案。比如阿里云的PolarDB,底层是共享存储,计算节点挂了,存储层数据还在,秒级切换。

我个人建议:如果你不是特别有经验,直接用云上的托管服务。省心、稳定、出了问题有人背锅。当然,前提是你得理解它的原理,不然出了问题你连怎么排查都不知道。

警告:不管用哪种架构模式,一定要做故障演练。我曾经见过一个团队,架构搭得漂漂亮亮,结果真出故障了,切换脚本跑不通。演练不是走过场,是救命。

知识体系结构图

下面这张图,是我自己总结的高可用知识体系。你可以把它当作本章的思维导图。

数据库高可用 为什么需要高可用 CAP与BASE理论 常见架构模式 硬件故障 软件崩溃 网络分区 人为误操作 一致性(C) 可用性(A) 分区容错(P) 基本可用(BA) 软状态(S) 最终一致性(E) 主从复制 双主互备 集群模式 云原生高可用 图:数据库高可用知识体系结构图 故障类型 理论模型 架构模式

好了,这一章的内容就到这里。高可用不是一蹴而就的事,它需要你在架构设计、运维流程、故障演练等多个维度持续投入。下一章咱们会深入聊聊具体的架构搭建细节,到时候见。


公众号:蓝海资料掘金营,微信deep3321