当流量在应用集群中流转完毕之后,他行至的终点一般是将数据与各种类型的数据服务进行交换,如:从缓存读取数据返回、将订单记录存储在数据库中、将交易数据与外围的支付服务进行数据交换等。但是只要是和外面的服务进行数据访问,就会出现外围服务不可用的情况,常见的一些情况比如:因为被依赖过重或数据过载而导致雪崩,因为数据中心整体不可用导致大面积瘫痪。比如最近一个比较有名的事件就是 Meta 公司的大规模宕机事件,其原因正是下发了一条错误的配置切断了数据中心之间的主干路由。
01
常用解决方案:分库分表
针对国内互联网公司海量数据的场景,当我们的业务成长到一定的阶段就会带来缓存或者 DB 的容量问题,以 MySQL 举例子,当单表的容量在千万级别的时候,如果这张表还需要和其他表进行关联查询,就会出现数据库在 IO、CPU 各方面的压力。此时就需要开始考虑分库分表的方案。但是分完了之后并不是一蹴而就,他会引入诸如分布式事务、联合查询、跨库 Join 等新的问题,每个问题如果人肉去搞定会更加的棘手,不过好在市面上针对这些领域也出现了很多优秀的框架,比如社区的 Sharding JDBC,阿里云刚刚开源的 PolarDB-X 等。
02
常用解决方案:数据中心容灾
为防止数据中心出现整体不可用的情况,一个常规的思路是需要针对性建设好容灾多活的高可用能力,数据中心级别的容灾常见的是同城和异地,但一个数据中心部署的服务很可能是分布式服务,针对每一个分布式服务的容灾策略都略有不同,本篇以常见的 MySQL 来举例子说一些常见的思路。
容灾的核心是需要解决 CAP 中的两个问题,即:C(数据一致性)、A(服务可用性),但是根据 CAP 理论我们只能保 CP 和 AP 中的一个,所以这里到底选择什么样子的策略,其实是需要根据业务形态来制定的。对于同城 IDC 级别的容灾而言,由于他的 RT 一般都很小,数据一致性上能最大的得以满足。只是在 Paxos(MySQL 中的一致性算法)的 Master 节点所在的机房如果挂掉的情况下,会面临再次选主,如果集群较大可能会因为选主造成的几十秒级别 DB 不可用的情况。 而对于异地场景而言,由于数据链路太长的问题,他的数据一致性基本上不可能满足,所以业务必须配合改造,做到业务级别的横向切分,如:华南数据中心服务华南客户群体,华北数据中心服务华北客户群体。而分片的数据再通过数据同步的方式做到最终一致性。