1 .cap原理 BASE理论
CAP原理(CAP Theorem):
一致性(C onsistency)、可用性(A vailability)、分区容忍性(P artition tolerance)
● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
一个经典的分布式系统理论。CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。
1、一致性
在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一直的状态。
对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是老数据(或称为脏数据),这就是典型的分布式数据不一致的情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性
2、可用性
可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。这里的重点是"有限时间内"和"返回结果"。
"有限时间内"是指,对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。另外,"有限的时间内"是指系统设计之初就设计好的运行指标,通常不同系统之间有很大的不同,无论如何,对于用户请求,系统必须存在一个合理的响应时间,否则用户便会对系统感到失望。
"返回结果"是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出队请求的处理结果,即成功或失败,而不是一个让用户感到困惑的返回结果。
3、分区容错性
分区容错性约束了一个分布式系统具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络)中,由于一些特殊的原因导致这些子网络出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看作是一个特殊的网络分区。
既然一个分布式系统无法同时满足一致性、可用性、分区容错性三个特点,所以我们就需要抛弃一样:
用一张表格说明一下:
选 择 | 说 明 |
CA | 放弃分区容错性,加强一致性和可用性,其实就是传统的单机数据库的选择 |
AP | 放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性,这是很多分布式系统设计时的选择,例如很多NoSQL系统就是如此 |
CP | 放弃可用性,追求一致性和分区容错性,基本不会选择,网络问题会直接让整个系统不可用 |
需要明确的一点是,对于一个分布式系统而言,分区容错性是一个最基本的要求。因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓分布式系统了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然需要面对和解决的问题。因此系统架构师往往需要把精力花在如何根据业务特点在C(一致性)和A(可用性)之间寻求平衡。
BASE理论:
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
基本可用(Basically Available)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
软状态( Soft State)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
最终一致性( Eventual Consistency)
最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
2.数据分割
大数据核心是利用多台计算机组成的分布式系统来协调解决单台计算机所不能解决的大数据的计算,存储等问题。大数据与传统数据分析的最大区别就是问题的规模,即计算,存储等问题
如何将问题拆解为可以使用多机分布式解决,使得分布式系统中的每台机器负责问题的一个子集。不管计算还是存储,问题输入对象都是数据,所以如何拆解数据依然是大数据系统的基本问题
哈希函数只有一个输入,不管输入长度如何,都返回m个输出中的一个输出。
如哈希函数的输入可以是一个理论上无限长的字符串,它的输出可以是一个32位整数,因此有2^32个可能输出。
常用的哈希函数:FNV,jenkins,murmur
FNV是实现最简单的哈希函数,它依靠从表中选择的两个常数来确定生成结果的位数
static long fnv64(byte[] input){
long output=oxcbf29ce484222325L;
for(var i=0;i<input.length;i++){
output ^=(long)input[i]; //在intel处理器上运行很快
output *=0x100000001b3L;
}
return output;
}
哈希函数的特点:
1相同输入总会产生相同的输出
2.随机输入产生的输出服从均匀分布
对于略图需要哈希函数速度要快,基本是MD5和SHA等加密哈希函数都排除。尽管随机性好,但被设计的计算很慢。使用它们的好处是被内置在公共库中。大多数使用各种快速哈希,而不是加密哈希
数据分布方式
1.哈希方式
优点:
散列性:好
元信息:只需要函数+服务器总量
缺点:
可扩展性:差。一旦集群规模扩展,大多数数据都需要被迁移并重新分布
数据倾斜:当某个用户id的数据量异常庞大时,容易达到单台服务器处理能力的上限
2.按数据范围分布
优点:
可扩展性:好。灵活根据数据量拆分原有数据区间
缺点:
元信息:大。容易成为瓶颈
将数据按特征值的值域范围划分数据。
例如将用户id的值域分为[1, 33), [33, 90), [90, 100),由三台服务器处理。
注意区间大小与区间内的数据大小没有关系
3 按数据量分布
与按范围分布数据方式类似,元信息容易成为瓶颈
4 一致性哈希
优点:
可扩展性:极好。任意动态添加、删除节点,只影响相邻节点
缺点:
元信息:大而且复杂
随机分布节点容易造成不均匀
动态增加节点后只能缓解相邻节点
一个接点异常时压力全转移到相邻节点
用一个hash函数计算数据(特征)的hash值,令该hash函数的值域成为一个封闭的环,将节点随机分布在环上。每个节点负责处理从自己开始顺时针到下一节点的值域上的数据。
3. 副本策略
(1) primary-secomdary
(2) paxos协议
(1) 副本控制协议指按特定的协议流程控制副本数据的读写行为,使得副本满足一定的可用性和一致性要求的分布式协议。副本控制协议可以分为两大类“中心化(centralized)副本控制协议”和“去中心化(decentralized)副本控制协议”。
中心化副本控制协议的基本思路:由一个中心节点协调副本数据的更新、维护副本之间的一致性。所有副本相关的控制交由中心节点完成,并发控制由中心节点完成,从而简化一个分布式并发控制问题为一个单机并发控制问题。而所谓并发控制,即多个节点同时需要修改副本数据时,需要解决“WW”,"RW"等并发冲突
Primary-secondary协议
该协议是中心化副本控制协议中常常用到的,该协议将副本分为两大类:其中有且仅有一个副本作为primary副本,除primary意外的副本都作为secondary副本。维护primary副本的节点作为中心节点,中心节点负责维护数据的更新、并发控制、协同副本的一致性。
数据更新基本流程
1.数据更新都由primary节点协调完成
2.外部节点将更新操作发给primary节点
3.primary节点进行并发控制即确定并发更新操作的先后顺序
4.primary节点将更新操作发送给secondary节点
5.primary根据secondary节点的完成情况决定更新是否成功并将结果返回外部节点
数据读取方式
与数据更新流程类似,读取方式也与一致性高度相关。使用primary-secondary比较困难的是实现强一致性。实现强一 致性一般有如下几个思路:
1.始终只读primary副本的数据
2.由primary控制节点secondary节点的可用性。
3.基于Quorum机制
Primary副本的确定和切换
primary副本的确定通常由原信息管理,由专门的元数据服务器维护,执行更新操作时,首先查询元数据服务器获取副 本的primary信息,从而进一步执行数据更新流程。
primary副本的切换通常可以使用lease机制来完成。
数据同步
数据同步是因为primary副本可能会存在于secondary副本不一致的问题。通常有如下三种形式:
1.由于网络分化等异常,secondary上的数据落后于primary上的数据。—— redo primary副本上的操作日志。
2.在某些协议下,secondary上的数据有可能是脏数据,需要被丢弃。—— undo日志的方法删除脏数据
3.secondary是一个新增加的副本,完全没有数据,需要从其他副本上拷贝数据。—— 使用primary副本的 snapshot(快照)功能
(2)paxos协议
多个节点直接通过操作日志同步数据,如果只有一个节点称为主节点,就很容易在多个节点之间维护数据一致性。然后主节点可能出现故障,那么就需要选出主节点。Paxos协议就是用于解决多个节点之间的一致性问题。
在paxos算法中,分为4种角色:
Proposer :提议者
Acceptor:决策者
Client:产生议题者
Learner:最终决策学习者
4种角色中,提议者和决策者是很重要的,其他的2个角色在整个算法中较弱
Proposer就像Client的使者,由Proposer使者拿着Client的议题去向Acceptor提议,让Acceptor来决策。
最终决策的paxos算法行为
Proposer提出议题
Acceptor初步接受 或者 Acceptor初步不接受
如果上一步Acceptor初步接受则Proposer再次
向Acceptor确认是否最终接受
Acceptor 最终接受 或者Acceptor 最终不接受
最终学习的目标是Acceptor们最终接受了什么议题?
这里是向所有Acceptor学习,
如果有多数派个Acceptor最终接受了某提议,
那就得到了最终的结果,
算法的目的就达到了