SLA:Service-Level-Aggrement,即服务等级协议。常见的4中SLA指标:可用性、准确性、系统容量和延迟。
可用性(Availability)
可用性指的是系统服务能正常运行所占的时间百分比。
一般情况下,四个9的可用性(99.99%)或每年50分钟以内的中断时间,就被定义为高可用。
虽然理论上来说,可用性越高越好,最好是到100%,但是现实告诉我们,从99% —》99.9% —》 99.99% —》99.9999% —》100%,难度是几何增加的,并且成本也越来越大。
我们在做系统设计或架构时,这是一个很重要的权衡点,假设可用性从99到99.9的成本是1,那么99.9到99.99的成本可能是10或20,这个代价是不是值得,很多时候是需要做一个trade-off的。
强如阿里云、亚马逊、谷歌等提供的云服务,也不能做到说100%的可用性。极端情况也会出现服务中断(机房着火、网线被挖断、发生地震等)。
我们以99.99%的可用性为例,这就意味着,我们一年的服务不可用时间最多为:365 * 24* 3600 * 0.0001 = 3153.6秒, 约等于52分钟。现在就能够看出来,假如说多一个9的可用性,其实就意味着服务不可用时间缩短了10倍,难度是倍增的。
准确性(Accuracy)
准确性指的是系统在一定时间段内,能够接受的数据丢失或数据不准确的程度。
往往有两个指标:一定时间范围内数据错误率、一定时间范围内数据丢失的比例,我这里用Error Rate和Miss Rate来表示。
不准确率,一般是针对OLAP系统来说的,因为更加注重分析的能力,因此能够接受一定程度的不准确性。假设5分钟内的错误率为1%,意味着,在五分钟内,假如来了10000的请求,那么允许错误的请求为10000 * 1% = 100个。
丢失率其实同理,就是能接受的数据丢失的比例。
关于OLAP和ALTP系统,我这里不做展开,分别举两个例子,详细的内容自行google。
OLAP:Doris数据库、ClickhouseOLTP:Mysql、Oracle
系统容量(Capacity)
系统容量通常指的就是系统的负载,我们可以用核心链路的QPS(Query per second)和TPS(Transaction per second)或者吞吐量来表示。
那我们在系统建设完成之后,怎么给出这个系统的负载呢?通常有以下几种方式:
- 压测,可以通过Jmeter压测工具
- 限流,在网关或server端做限流,例如使用google 的guava中的RateLimit或者使用分布式的缓存中间件。
当然,我们在压测或限流中,需要注意几点:
- 压测数据尽量避免热点、需要做到足够分散,数学上叫离散。
- 压测环境的配置要跟生产环境严格一致,这里给出几个细项:服务器的cpu、内存、磁盘(是否SSD)、服务器的带宽、所在网络域、数据库的相关配置等。
- 一般系统都会用到缓存,那么需要考虑缓存命中率。因为命中缓存和直接查库,性能相差很大。性能差距可以参考下面的延迟数量级。
- 限流,假如是利用的进程级别的限流,那么可能会不准,依赖于上游流量负载的策略。
Latency numbers every programmer should know
L1 cache reference ......................... 0.5 ns
Branch mispredict ............................ 5 ns
L2 cache reference ........................... 7 ns
Mutex lock/unlock ........................... 25 ns
Main memory reference ...................... 100 ns
Compress 1K bytes with Zippy ............. 3,000 ns = 3 µs
Send 2K bytes over 1 Gbps network ....... 20,000 ns = 20 µs
SSD random read ........................ 150,000 ns = 150 µs
Read 1 MB sequentially from memory ..... 250,000 ns = 250 µs
Round trip within same datacenter ...... 500,000 ns = 0.5 ms
Read 1 MB sequentially from SSD* ..... 1,000,000 ns = 1 ms
Disk seek ........................... 10,000,000 ns = 10 ms
Read 1 MB sequentially from disk .... 20,000,000 ns = 20 ms
Send packet CA->Netherlands->CA .... 150,000,000 ns = 150 ms
延时(Latency)
延迟指的是系统在收到用户请求到响应这个请求所耗费的时间。针对某次请求,也可以用rt来表示。
更通用的延迟表示格式为,P95为20ms或p99在20ms。这里的P99表示的是百分之99的请求,都在20ms内返回了,剩余百分之一的请求超过了20ms。
这是一项很重要的指标,往往系统容量和延迟是我们讨论的最多的。
总结
假如作为一个架构师,利用SLA精准的描述和定义一个系统是非常重要的。在做架构演进或优化过程中,始终将SLA作为衡量标准。
当然作为一名技术,当下次客户问到,你们系统/产品提供什么样的SLA?就可以按照以上四个维度来解释。