分布式系统

Posted Nireus_LOVE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式系统相关的知识,希望对你有一定的参考价值。

1. 简介

分布式存储特点概括:规模大+成本低。
分布式存储的挑战来源自于其设计的两个技术领域:分布式 + 存储:

1.1 要素

可扩展:灵活水平扩展到成百上千上万,并且整体性能线性增长。
低成本:构建与低成本PC,兼备自动容错,自动负载均衡等机制。
高性能:秒,毫秒,亚秒级别。
易用:构建生态环境,与其它系统集成,如监控,运维,数据导入。

1.2 分布式数据分类

非结构化数据:如文本,图像,图片,视频,音频等
结构化数据:类似关系型数据库
半结构化数据:介于上面二者之间,如html文档,换言之其模式结构于内容混合。

1.3 分布式存储系统分类

分布式文件系统 : 存储非结构化文件对象;如FB Haystack; GFS, HDFS
分布式键值系统:存储半结构化数据,如Amazon Dynamo, Memcache
分布式表格:存储半结构化数据,如BigTable,HBase, DynamoDB
分布式数据库:存储结构化数据,如mysql Sharding, Amazon RDS,以及阿里OceanBase.

1.4 分布式存储特性

一致性:分布式存储系统会将数据冗余备份,称之为replication/copy. 副本是目前分布式存储系统容错的唯一方法。如有3个客户端A,B,C
强一致:如A先写入,系统保证后续A,B,C的读去都返回最新值
弱一致:如A先写入,系统不保证后续A,B,C的读去都返回最新值
最终一致:“最终”只有个时间的延迟,如replication等,如A先写入,同时假设后续无其他更新相同的值,“最终”A,B,C都会读到A写入的最新值
数据分布:分布式存储当然会设计数据如何分布了,同时要考虑自动负载均衡
哈希分布:无需多说,类似HashMap的index了,基本思路都是选取某业务相关主键key,然后hash(key) % N(服务器数量), 当然如果这里hash函数的散列性比较好的话,数据可以比较均匀的分布到集群。
顺序分布:通常做法是将一个大表顺序划分成连续范围,即子表。如经常用来举例的用户表,按照主键分为1-10000,10001-20000,… 80000-90000等。再添加类似B+树索引。其中叶子相当于子表。
分布式复制:replication,常见做法类似数据库同步操作日志(commit log)
容错:容错是分布式存储系统设计的重要目标,当然是自动容错。

故障检测:心跳,通用做法。官方叫法是,Lease(租约)协议,即带有超时时间的一种授权。
故障恢复:迁移,通用做法。但是当Master节点/总控节点出现故障时,为了HA, 我们就要重新选主了,正所谓国家不可一日无主,当然现代社会,要通过Paxos协议选举,如我们介绍过的ZK.

2. 分布式协议

2.1 两阶段提交协议

Two-phase Commit, 2PC.主要用来确保多个节点或者分布式操作的原子性。如果有使用过JTA或者做过大型银行转账系统的应该使用过。
恰如其名,2PC通常分为两个阶段:
阶段1: 请求阶段Prepare Phase, 协调者通知参与者准备提交或者取消事务;
阶段2: 提交阶段Commit Phase, 协调者将阶段1的结果进行投票表决,当且仅当所有参与者同意提交事务时,协调者才通知所有参与者提交,否则通知所有参与者取消。
两阶段提交协议是阻塞协议,执行过程中需要加锁,且无法容错,所以… 大多数分布式存储系统都避而远之。

2.2 Paxos协议

准备prepare: Proposer首先选择一个提议序号n给其它acceptor节点发送
prepare消息,Acceptor收到消息后,如果提议序号已经大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提议回复给proposer,并承诺不再回复小于n的提议。
批准accept:Proposer收到了acceptor中多数派队prepare的回复后,就进入批准阶段。如果在之前的prepare阶段acceptor回复了上次接受的提议,则提议值发给acceptor批准。Acceptor在不违背它之前在prepare阶段的承诺前提下接受这个请求。如果超过一半的acceptor接受,提议值生效,Proposer发送acknowledge消息通知所有acceptor。

3. 现有分布式系统

3.1 分布式文件系统

GFS是Google分布式存储的基石。
GFS系统节点可以分为三种角色:GFS Master, GFS ChunkServer, GFS Client.

GFS文件被划分固定大小的数据库,称为Chunk, 由Master分配一个64位全局唯一ID; ChunkServer(CS)以普通Linux文件形式将chunk存储在磁盘,为了HA, Chunk被replication,默认3份。

客户端访问GFS时,首先访问Master,获取CS信息,之后再去访问CS,完成数据存取。GFS目前主要用于MapReduce, Bigtable.

3.2 分布式键值系统

分布式键值类似于分布式表格模型Bigtable的一种特例。比较著名的有Amazon Dynamo, Memcache以及国内阿里的Tair系统。

Tair分布式系统
Tair是阿里/淘宝开发的一个分布式键/值存储系统,tair分为持久化和非持久化两种方式。非持久化的tair可以看作一个分布式缓存,持久化的tair将数据存放置磁盘,当然tair可以自动备份以避免磁盘损坏等问题。
Tair由一个Master和一系列Slave节点组成,称之为Config Server作为整体的控制中心,而服务节点为可伸缩的Data Server。Config Server负责管理所有的data server, 维护其状态信息。Data Server则对外提供各种数据服务,并以心跳来将自身信息反馈给config server。可以看到,Config Server是核心控制点,而且是单点,只有主-备形式保证其可靠性。
Tair:http://tair.taobao.org/

3.3 分布式表格系统

顾名思义,表格模型,多行多列,通过主键唯一标识。如始祖Google Bigtable。

Google Bigtable:
基于GFS与Chubby的分布式表格系统,目标是解决读取速度,许多Google数据如web索引,卫星图像数据都存放在bigtabe。

3.4 分布式数据库

关系型数据库汇集了计算机领域的智慧,也为如今互联网,大数据做好了铺垫。在互联网时代,如何水平扩展是传统关系型数据的最大挑战。

MySQL Sharding
通常水平扩展的做法是应用层按照规则将数据拆分到多个分片,分布到多个数据库节点,并引入一个中间层应用来屏蔽后段的拆分细节。

以上是关于分布式系统的主要内容,如果未能解决你的问题,请参考以下文章

TX-LCN:分布式事务框架

138 分布式事务之两阶段提交

如何保证分布式系统的消息最终一致性

安全多方计算之七:门限密码系统

微服务架构的分布式事务解决方案

微服务架构的分布式事务解决方案