目录
SLA
三个指标
批处理和流处理
Workflow
发布-订阅模式
CAP
服务等级协议 Service-Level Agreement 服务等级协议
是系统服务提供者Provider对客户Customer的一个服务承诺
包括可用性,准确性,系统容量,延迟
1.可用性 Availabilty
表示系统可用的时间
2.准确性 Accuracy
是指我们设计的系统服务中,是否允许某些数据是不准确的或者是丢失了的,如果允许这样的情况发生,用户可以接受的概率是多少,系统架构会以错误率Error Rate来定义这一项SLA
可以采用 性能测试,或者查看系统日志 来评估
3.系统容量Capacity
通常指系统能够支付的预期负载量是多少,一般以每秒的请求数为单位来表示
评估系统QPS的方案
4.延迟 Latency
指系统在接收到用户的请求到响应这个请求之间的时间间隔
在定义延迟的SLA时,会看到SLA有p95或者p99这样的声明
这里的p是percentile,就是百分位的意思,p95表示延迟是1秒的话,那么100个请求有95个是小于1秒的
可扩展性 Scalability
包括水平扩展 Horzontal Scaling
垂直扩展 Vertical Scaling
一致性
强一致性
弱一致性,系统中某个数据被更新后,等待一个时间窗口才变成新值
最终一致性,在没有更新的条件下,最终所有的访问都是最后更新的值
此外还有顺序一致性
因果一致性
支付宝,银行转账,12306买票,其实不是强一致性的
持久性
数据一旦被成功存储就可以一直继续使用,即使系统中的节点下线,宕机或者数据损坏也是如此
有些系统支持机器/节点级别的持久性,也有些是集群,有些根本就没有持久性
提高持久性的做法就是复制,把数据复制到不同的节点上
分布式系统中,还有一个持久性的概念是 消息持久性
节点需要经常互发送消息去同步以保证一致性
消息通讯由分布式消息服务完成,包括两个方案
所有的数据都可以分为两种
无边界的数据(Unbounded Data)
有边界的数据(Bounded Data)
在处理数据的时候,我们要处理的任意数据都有两种时域
事件事件(Event Time),一个数据实际产生的时间点
处理事件(Processing Time),是处理数据的系统架构实际接收到的这个数据的时间点
批处理
处理的输入是有边界的,输出的结果也是有边界的,关心的是数据的事件事件
如支付宝的年度账单
批处理的适用场景
谷歌的MapReduce以及Hadoop,Spark等架构都是支持这种大数据的批处理架构
这种任务一般延迟高,如果要求快速响应,则可以使用流处理/实时处理
流处理
流处理的输入是无边界的,流处理系统关系的数据时间需要根据具体场景耳钉
像网页这样的流处理系统要计算网站QPS,关心的是 处理事件
医疗护理系统流处理中,关心的是 事件事件
流处理的特点是足够快以便能够处理来自各种数据源的大规模数据,其原理是在数据到达磁盘之间就进行了处理
当流处理架构拥有在一定时间间隔(毫秒)内产生逻辑上正确的结果是,这种架构可以定义为实时处理
如果是分钟级别的延迟,就是准实时处理
流处理架构特点是 高吞吐量和低延迟
流处理架构的适用场景
开源生态圈中,Apache Kafka,Flink,Strom,Samza等都是流处理架构平台
将不同的处理模块连接在一起,最后得出一个自己需要的结果的有向无环图(Directed Acyclic Graph),就称为一个工作流系统 Workflow System
在工作流系统的每个处理模块里,系统要执行的才做有可能不是单单一个数据转换这么简单的操作,是需要将多个不同的数据集合并在一起,也需要将不合格的数据过滤掉
Apache Spark1.4以上版本,就有完整的工作流图
下面介绍四种不同的 工作流设计模式,复制模式,过滤模式,分离模式,合并模式
复制模式(Copier Pattern)
通常将单个数据处理模块中的数据,完整的复制到两个或者更多的数据处理模块中,然后再由不同的数据处理模块进行处理,如下图所示
在处理大规模数据时,需要对同一个数据集采取多种不同的数据处理转换,优先考虑复制模式
以YouTube为例,视频平台很多时候会提供不同分辨率的视频,4K或者1080P的视频提供给带宽高的用户,在网络很慢时提供360P这样的视频格式
一个视频数据集可能会字段语言理解NLP 的数据处理模块分析,用以自动生成视频字幕,还有可能被视频分析的处理模块分析,用以产生更好的内容推荐系统,它的整个工作流如下
过滤模式(Filter Pattern)
过滤掉不符合特定条件的数据
针对一个数据集中某些特定数据采取数据处理时,可以优先采用过滤模式
在商城中有各种会员,现在要求只针对钻石会员才发出邀请,这时候采用过滤模式,将钻石用户从所有用户中筛选出来
再这个工作流系统中,一个数据处理模块会将输入的数据集过滤成符合条件的数据,然后传输到下一个数据处理模块进行单独处理
分离模式(Splitter Pattern)
如果在处理数据集时候并不想丢弃里面的任何数据,而是想把数据分类为不同的类别来进行处理
分离模式不会过滤任何数据,只是将原来的数据集分组了
假设系统针对商城不同的等级的用户,做不同的活动邀请
需要注意的是,分离模式下,同样的数据是可以被划分到不同的数据处理模块的
数据B是可以同时划分到工作流1 和工作流2中
比如用户可以通过勾选短信通知,邮件通知的方式来提醒用户一笔交易成功,如果用户同时勾选了这两种方式,那么属于这个用户的交易信息就会收到短信和邮件两个通知
合并模式(Joiner Pattern)
将多个不同的数据集转换集中到一起,成功一个总数据集,然后将这个总的数据集放在一个工作流中进行处理
以美团外卖电动车数据评估股价为例
数据接入在这一处理模块中,我们的输入数据有自己团队在街道上拍摄到的美团外卖电动车图片,以及第三方公司提供的美团外卖电动车图片
我们打算先整合所有数据,然后再进行其他数据处理的话,工作流系统如下所示
两个基本的概念,消息和消息队列
消息队列发送流程如下
发布/订阅模式,是消息的发送方可以将消息异步的发送给一个系统中不同组件,而不需知道接收方是谁
如果A系统做了改动,B和C系统根据这个改动做相应的动作
这个是观察者模式Observer Pattern,系统中的各个组件紧耦合Tightly Coupled
采用 发布/订阅模式后,整个系统就解耦合了
发布/订阅模式的优缺点
缺点是
不能保证发送的消息一定会送达订阅者,如果要保证数据一定送达,需要开发者自己实现响应机制
Kafka架构,Producer,Consumer,消息队列Topic
Kafka在判断消息是否接收是利用了Log offset机制
假设发送方连续发送了5条数据到消息队列Topic中,编号分别为100,101,102,103,104
如果接收方读取数据之后回应消息队列它接收的Log offset是100,101,103,那么消息队列会认为接收方最多只接收了100,101,剩下的102,103,104会继续发送给接收方,直到收到了确认回应
发布/订阅模式适用的场景
一致性Consistency
可用性Availability
分区容错性Partition-tolerance
C属性 一致性
一致性在这里是指 线性一致性 Linerizability Consistency
在线性一致性的保证下,所有分布式环境下的操作都像是在单机上完成的一样
也就是图中A,B,C状态是一致的
A属性 可用性
在分布式系统中,任意非故障的服务器都必须对客户的请求产生响应
P属性 分区容错性
在一个分布式系统里,如果出现一些故障,可能会使得部分节点之间无法连通,由于这些故障节点无法连通,造成整个网络就会被分成几块区域,从而使数据分散在这些无法连通的区域中的情况,可以认为这是发生了分区错误
分区容错性,是系统允许网络丢失从一个节点发送到另一个节点的任意多条消息
下面是一些典型的系统属性
CP系统,谷歌的BigTable,HBase,MongoDB,Redis
AP系统,Amazon Dynamo,Cassandra,Voldemort
CA系统,Apache的Kafka
放弃了P属性的Kafka Replication
Kafka也有三副本备份概念
一个Leader和两个Follow
假如三个节点都写入成功,结果如下,其中Leader保存两个Replication的信息
如果两个从节点都挂了,但只要Leader还在,仍然可以接受读写请求
如果Leader也挂了就无法接受请求了
这时候需要等待三个节点(一个主两个从)其中任意一个活过来才可以
另一种方式是等待其他任意一个节点可用,将数据复制过去