数据系统的一些要求

构建一个数据系统,书中讲到了三个基本要求,即:可靠性、可扩展性与可维护性。

Reliability(可靠性)

可靠性,也就是要求系统不要(轻易)出错,最起码在正常情况下运作是正常的(落数据,传输数据,计算数据等)。但天灾人祸总是不可避免的,可靠性也是有一定条件的。

硬件出错

硬件机器出故障是可能的,尤其是机器数量极多的条件下。硬盘坏了是做常见的,然后可能内存出错,突然停电,又或者有人把光纤剪了。面对这些意外,解决方式基本都是“备份”,如存储最常见的raid,数据中心的备份电源,“双机房”等。

软件出错

这个主要是程序员的Bug导致的,没啥办法,也就只能在写代码的时候多加小心,各种手段用起来,比如:高层架构设计的时候,或者多设置一些contract,然后test的时候尽可能全面等等。

人为错误

这个跟软件出错差不多一个意思,不过可能是用的人用错了。书里面提到两个建议:

  1. quick roll back,我理解也就是版本控制吧

  2. 加上监控,这个也是工作中常见的做法

Scalability(可扩展性)

可扩展性,也就是系统能更容易扩容,能轻松处理更海量的数据(分为垂直扩展,把机器变牛逼,也就是HPC;或者水平扩展,叠加机器,传统理解的分布式)。

书中提到了衡量指标,在离线处理中关注的是吞吐量(throughput),在实时系统中关注的则是响应时间。衡量方法是所谓的percentile,即百分位数,这个在spark监控页面上也是有所体现的。

一个twitter的例子解释了可扩展性,为了让订阅者及时看到自己关注的帖子,原始的方法是写数据库,然后读数据库,但数据量大了之后性能存在问题,所以后来做成MQ的形式,相当于做了个本地缓存,不需要频繁查询数据库了。

Maintainability(可维护性)

可维护性本来是说代码的,数据系统借用过来有更多的含义。

可操作性/运维(Operability)

我感觉这个概念比较模糊,大概是说系统的设计让运维团队更轻松吧。比如监控,系统恢复,系统升级,文档之类的要做好。

简单性(Simplicity)

这个主要是说对使用者(也就是我们跑数的)要简单,做到好的高层抽象,比如一个SQL就可以做数据分析。

进化性(Evolvability)

这个跟可扩展有点像,也就是系统要容易升级出来更复杂的情形(或者变化的情形)。