架构师训练营:第六周总结
分布式系统的CAP
什么是CAP
C (consistency) : 一致性,一致性是说,每次读取的数据都应该是最近写入的数据或者返回一个错误,而不是过期的数据,也就是说数据时一致的。
A (Availability) : 可用性,可用性是说,每次请求都应该得到一个响应,而不是返回一个错误或者失去响应,但是不保证返回的数据时最近写入的。也就是说系统需要一直都是可以正常使用的,不会引起调用者的异常,但并不保证响应的数据时最新的。
P (Tolerance to newowrk Partitions) : 分区耐受性,即使因为网络原因,部分服务器节点之间消息对视或者延迟了,系统依然是可以操作的。
cap原理:
在分布式系统必须要满足分区耐受性的前提下,可用性和一致性无法同时得到满足。
cap原理下数据存储冲突的示例图:
分布式存储系统有三个节点,当节点B与A和C之间的网络通信故障时。 客户端1对节点A的数据更新,客户端3对节点的数据更新,由于节点B与节点C和A之间的网络故障无法进行数据同步,导致客户端4查询出来的数据与客户端2查询出来的数据不一致。
数据不一致的解决办法
1、保持最终一致性(最终一致意思为,用户读取的时候数据保证一致,在发现分布式系统中某个节点的网络故障时,限制向该节点读写)
2、保证最终写入一致 (根据写入的时间戳覆盖,新的覆盖旧的,需要节点的时间必须做到精确同步)
3、业务场景解决(比如数据不一致导出出现了多个购物车数据,在业务中可以直接将内容合并为一个)
4、投票解决冲突 (分布式系统每个服务器投票,多数覆盖少数)
NOSQL分布式数据库
Cassandra
cassandra是一套开源分布式NoSQL数据库系统。
它的名称来源于希腊神话。最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBig Table的数据模型与Amazon Dynamo的完全分布式的架构于一身。Facebook于2008将cassandra开源,后逐渐成为了一种流行的分布式结构化数据存储方案。
cassandra 解决分布式一致性的方式是,使用投票方式,在写入和读取的时候,根据数据的值计算出对应的三个节点,同时向三个节点写入。读取时向三个节点读取,使用投票的方式决策返回的数据。
HBase
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。
HBase 使用Region把数据分片存储了,再使用HFile 自动3备份的特性保证数据可用性,数据一致性保证是使用数据分片算法,指定到一个Region上不存在多个节点同时写的情况,所以数据一致性高。但是HBase的服务的可用性比较低,如果其中一个Region服务器宕机,指向该Region的数据读写操作都不能进行,只能等待备份文件迁移到其他Region上才可用。
Hbase的架构图
Hbase数据访问访问时序图:
HBase的数据存储结构是使用 LSMT(log struct merge tree)日志合并树的结构。最近写入的数据会先存放在内存中,之后向硬盘的数据合并。所以Hbase 查询最近更新的数据会比较快。
结构示意图:
分布式一致性解决产品Zookeeper
分布式系统脑裂问题
分布式系统中一般会有一个决策中心,为了保证决策中心高可用,会双机部署决策中心,但是就会产生系统有两个决策者的问题。这就是脑裂问题。
paxos算法,解决脑裂
有三个角色
proposer(提议者):决策中心服务器
accptor(提议接收者,不能同时接受两个相同的提议,且只能接受最新的提议):分布式服务器的节点
leaner(学习者):分布式服务器的节点
大致思路:1、提议者向所有接受者发出提议信号,接受者接受或拒绝。当提议超过一半接受者接受时。2、向接受者发出执行信号,3、接受者向所有学习者发出执行信号。最终达到整个系统一致。(个人认为主要还是使用了投票的方法决策的,大致思路是个人理解的。听说事实算法很复杂,论文好几页)
Zookeeper解决脑裂
zookeeper 使用zab协议简化了 paxos算法,
大致也分为三步,1、leader服务器发出propose信号,2、其他节点ack响应,3、超过半数响应时发出commit信号。
原理是,在自动从所有可用的节点中选举出leader服务器作为控制中心,保证决策一致性。
zookeeper使用树状记录结构,记录分布式系统中的信息。
zookeeper的几种使用方式
1、做动态配置管理,分布式系统从zookeeper监听获取配置,实现动态添加配置
2、分布式系统选举Master
3、集群管理(负载均衡),集群节点配置到zookeeper中。实现动态添加集群节点。
zookeeper的性能
分布式系统的节点数越大,zookeeper的读取性能越好。
分布式系统的节点数越大,zookeeper的写入性能越不好(因为需要做决策)。
最后:分布式系统节点数最好是单数,便于zookeeper投票决策。
评论