一、CAP原理(CAPTheorem)
一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance)
CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分布式架构设计时,必须做出取舍。而对于
分布式数据系统,分区容忍性是基本要求 ,否则就失去了价值。因此设计分布式数据系统,就是在一致性和可用性之间取一个平
衡。
二、BASE理论BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
ACID和BASE的区别和联系
ACID是传统数据库常用的设计理念,追求强一致性模型。
BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
ACID和BASE代表了两种截然相反的设计哲学,在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE又会结合使用。
三、数据分割
数据分割是指把逻辑上是统一整体的数据分割成较小的、可以独立管理的物理单元进行存储,以便于重构、重组和恢复,以提高创建索引和顺序扫描的效率。数据分割使数据仓库的开发人员和使用者具有更大的灵活性。大数据核心是利用多台计算机组成的分布式系统来协调解决单台计算机所不能解决的大数据的计算,存储等问题
哈希函数
只有一个输入不管输入长度如何,都返回m个输出中的一个输出,如:哈希函数的输入可以是一个理论上无限长的字符创,它的输出可以是一个32位整数,因此有2^32个可能输出。
常用的哈希函数:FNV,jenkins,murmur
FNV是实现最简单的哈希函数,它依靠从表中选择的两个常数来确定生成结果的位数
staticlong fnv64(byte[] input){
long output=oxcbf29ce484222325L;
for(vari=0;i<input.length;i++){
output ^=(long)input[i]; //在intel处理器上运行很快
output *=0x100000001b3L;
}
returnoutput;
}
哈希函数的特点:
1相同输入总会产生相同的输出
2.随机输入产生的输出服从均匀分布
对于略图需要哈希函数速度要快,基本是MD5和SHA等加密哈希函数都排除。
尽管随机性好,但被设计的计算很慢。使用它们的好处是被内置在公共库中
大多数使用各种快速哈希,而不是加密哈希
数据分布方式
1、哈希方式
2、按数据范围分布
3、按数据量分布
与按范围分布数据方式类似,元信息容易成为瓶颈
4、一致性哈希
四、副本策略(primary-secondary,paxos)
中心化副本控制协议
副本控制协议指按特定的协议流程控制副本数据的读写行为,使得副本满足一定的可用性和一致性要求的分布式协议。副本控制协议可以分为两大类“中心化(centralized)副本控制协议”和“去中心化(decentralized)副本控制协议”
中心化副本控制协议的基本思路:由一个中心节点协调副本数据的更新、维护副本之间的一致性。所有副本相关的控制交由中心节点完成,并发控制由中心节点完成,从而简化一个分布式并发控制问题为一个单机并发控制问题。而所谓并发控制,即多个节点同时需要修改副本数据时,需要解决“WW”,"RW"等并发冲突
副本的一致性副本的consistency是针对分布式系统而言的,不是针对某一个副本而言。根据强弱程度分为:
强一致性:任何时刻任何用户/节点都可以读到最近一次更新成功的副本数据
单调一致性:任何时刻任何用户一旦读到某个数据某次更新后的值,就不会再读到更旧的值。
会话一致性:任何时刻任何用户在某次会话内一旦读到某个数据某次更新后的值,就不会在这次会话再读到更旧的值
最终一致性:各个副本的数据最终将达到一致状态,但时间不保证。
弱一致性:没有实用价值。
Primary-secondary协议
该协议是中心化副本控制协议中常常用到的,该协议将副本分为两大类:其中有且仅有一个副本作为primary副本,除primary意外的副本都作为secondary副本。维护primary副本的节点作为中心节点,中心节点负责维护数据的更新、并发控制、协同副本的一致性。
(1)数据更新基本流程
①数据更新都由primary节点协调完成
②外部节点将更新操作发给primary节点
③primary节点进行并发控制即确定并发更新操作的先后顺序
④primary节点将更新操作发送给secondary节点
⑤primary根据secondary节点的完成情况决定更新是否成功并将结果返回外部节点
(2)数据读取方式
与数据更新流程类似,读取方式也与一致性高度相关。使用primary-secondary比较困难的是实现强一致性。实现强一致性一般有如下几个思路:
①始终只读primary副本的数据
②由primary控制节点secondary节点的可用性。
(3)基于Quorum机制
Primary副本的确定和切换
primary副本的确定通常由原信息管理,由专门的元数据服务器维护,执行更新操作时,首先查询元数据服务器获取副本的primary信息,从而进一步执行数据更新流程。
primary副本的切换通常可以使用lease机制来完成。
(4)数据同步
数据同步是因为primary副本可能会存在于secondary副本不一致的问题。通常有如下三种形式:
(1)由于网络分化等异常,secondary上的数据落后于primary上的数据。—— redo primary副本上的操作日志。
(2)在某些协议下,secondary上的数据有可能是脏数据,需要被丢弃。—— undo日志的方法删除脏数据
3.secondary是一个新增加的副本,完全没有数据,需要从其他副本上拷贝数据。—— 使用primary副本的snapshot(快照)功能
paxos协议多个节点直接通过操作日志同步数据,如果只有一个节点称为主节点,就很容易在多个节点之间维护数据一致性。然后主节点可能出现故障,那么就需要选出主节点。Paxos协议就是用于解决多个节点之间的一致性问题
在paxos算法中,分为4种角色:
Proposer:提议者; Acceptor:
决策者;Client:产生议题者;
Learner:最终决策学习者
4种角色中,提议者和决策者是很重要的,其他的2个角色在整个算法中较弱
Proposer 就像 Client 的使者,由 Proposer 使者拿着 Client 的议题去向 Acceptor 提议,让 Acceptor 来决策最终决策的paxos算法行为