系统设计中的权衡取舍_系统设计笔记2

写在前面

我们没有办法拥有一块又大、又快、又便宜的存储,所以出现了许多权衡之下的产物:

  • CPU寄存器:非常快,但不便宜也不大

  • RAM:不太快也不太大,还算便宜

  • 硬盘:非常便宜而且容量很大,但读写慢

并最终形成了这样的层次结构:

Computer Memory Hierarchy

类似的,系统设计中也面临许多权衡取舍:

  • 性能与可扩展性

  • 延迟与吞吐量

  • 可用性与一致性

一.性能与可扩展性

可扩展,意味着服务能以加资源的方式成比例地提升性能

A service is scalable if it results in increased performance in a manner proportional to resources added.

性能提升体现在能够承担更多的工作量,或者处理更大更重的工作(比如数据量增多)

P.S.当然,增加资源也有可能是为了提升服务的可靠性,比如引入冗余

加资源也会引入多样性,一些节点可能比其它节点的处理能力更强大,另一些老旧节点可能弱一些,而系统又必须适应这种异质性(heterogeneity),那么依赖均匀性的算法就会对新节点利用不足,继而产生性能影响

二.延迟与吞吐量

延迟(Latency)是指从执行操作到产生结果所需要的时间:

Latency is the time required to perform some action or to produce some result.

其度量单位是时间,例如秒(seconds)、纳秒(nanoseconds),系统时钟周期数(clock periods)等

吞吐量(Throughput)是指单位时间内所能处理的操作数,或能产生的结果数:

Throughput is the number of such actions executed or results produced per unit of time.

通过单位时间所生产的东西来计量,例如内存带宽(memory bandwidth)用来衡量内存系统的吞吐量,而对于Web系统,有这些度量单位:

  • QPS(Queries Per Second):用来衡量信息检索系统(如搜索引擎、数据库等)在1秒内的搜索流量

  • RPS(Requests Per Second):请求-响应系统(如Web服务器)每秒所能处理的最大请求数量

  • TPS(Transactions Per Second):广义上指在1秒内所能执行的原子操作数量,狭义上指DBMS在1秒所能执行的transaction数量

P.S.通常也用QPS衡量Web服务的吞吐量,但更准确的单位是RPS

同样,由于无法兼具低延迟和高吞吐量,所以权衡之下的原则是:

Generally, you should strive for maximal throughput with acceptable latency.

在确保延迟尚可接受的前提下,转而追求最大的吞吐量

三.可用性与一致性

关于可用性与一致性,有个著名的CAP定理

Of three properties of distributed data systems – consistency, availability, partition tolerance – choose two. —— Eric Brewer, CAP theorem, PODC 2000

在分布式计算机系统中,一致性、可用性和分区容错性三者只能择其二(而且分区容错性必选)

  • 一致性(Consistency):每次读取都能得到最新写入的结果,抑或出错

  • 可用性(Availability):每个请求都能收到正常响应,但不保证返回的是最新信息

  • 分区容错性(Partition Tolerance):即便有一部分由于网络故障down掉了,系统仍能继续运行

因为网络不完全可靠,所以必须保证分区容错性(P必选)。当部分节点出现网络故障时,有2个选择:

  • 取消操作:能确保一致性,但会降低可用性(用户可能收到超时错误),即CP(Consistency and Partition Tolerance),适用于需要原子读写的场景

  • 继续操作:保证可用性,但存在一致性风险(返回的信息可能是旧的),即AP(Availability and Partition Tolerance),适用于可接受最终一致性(Eventual consistency)的场景

也就是说,在P必须满足的前提下(网络故障是系统之外的不可控因素,没得选),只能在C和A之间进行取舍,要么保证一致性(牺牲可用性),要么保证可用性(牺牲一致性),即:

Possibility of Partitions => Not (C and A)

(摘自10. Why do some people get annoyed when I characterise my system as CA?

P.S.当然,在中心化系统(例如RDBMS)中,不存在网络可靠性的问题,此时C和A能够两全

四.一致性模式

如果同一数据存在多份拷贝,那么就需要考虑如何保证其一致性。而严格的一致性意味着要么读到最新数据,要么出错

但并非所有场景下都需要达到这样的一致性要求,所以出现了弱一致性与最终一致性等妥协产物

弱一致性

写完之后,不一定能读到

弱一致性模式(Weak consistency)适用于网络电话、视频聊天、实时多人游戏等实时场景,而网络电话断线重连后,不会再收到断线期间的通话内容

最终一致性

写完之后,异步复制数据,保证最终能读到

最终一致性模式(Eventual consistency)适用于DNS、email等高可用系统

强一致性

写完之后,同步复制数据,立即就能读到

强一致性模式(Strong consistency)适用于文件系统、RDBMS等需要事务机制的场景

五.可用性模式

可用性保障方面,主要有两种方式:故障转移与复制

故障转移

一个节点down掉之后,迅速用另一个点代替它,以缩减宕机时间。具体的,有两种故障转移模式:

  • 主动-被动(主从故障转移):只由主动服务器处理流量,在工作的主动服务器与待命的被动服务器之间发送心跳包,如果心跳断了,由被动服务器接管主动服务器的IP地址并恢复服务,宕机时间的长短取决于被动机器是热启动还是冷启动

  • 主动-主动(主主故障转移):两台服务器都处理流量,共同承担负载

主动-被动模式下,(切换时)存在数据丢失的风险,而且无论哪种方式,故障转移都会增加硬件资源和复杂度

复制

分为主从复制与主主复制,多用于数据库,暂不展开

可用性指标

可用性通常用几个9来衡量,表示服务可用时间占运行时间的百分比

3个9意味着可用性为99.9%,即:

期限 宕机时间不得超过
每年宕机时间 8小时45分钟57秒
每月宕机时间 43分钟49.7秒
每周宕机时间 10分钟4.8秒
每天宕机时间 1分钟26.4秒

4个9就是99.99%可用:

期限 宕机时间不得超过
每年宕机时间 52分钟35.7秒
每月宕机时间 4分钟23秒
每周宕机时间 1分钟5秒
每天宕机时间 8.6秒

特殊的,对于由多部分组成的服务,其整体可用性取决于这些组成部分是串行的还是并行的:

// 串行
Availability (Total) = Availability (Foo) * Availability (Bar)
// 并行
Availability (Total) = 1 - (1 - Availability (Foo)) * (1 - Availability (Bar))

可用性都达不到100%的两个服务组合起来,如果是串行的,其整体可用性会下降(99.9% * 99.9% = 99.8%),而并行的话,整体可用性会提高(1 - 0.1% * 0.1% = 99.9999%

参考资料

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code