**主要是总结以前学习过相关分布式的知识点,能够一块儿学习,会有比较多口语化的词,以前作的笔记,见谅。 文章末尾会贴出相关学习理论资料,能够方便一块儿学习交流 **算法
( 真的很气,刚写好的发到网站上,挂掉了,如今要从新总结一次~)docker
指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供知足一致性和可用性的服务。也就是说部分故障不影响总体使用。数据库
事实上咱们在设计分布式系统是都会考虑到bug,硬件,网络等各类缘由形成的故障,因此即便部分节点或者网络出现故障,咱们要求整个系统仍是要继续使用的安全
(不继续使用,至关于只有一个分区,那么也就没有后续的一致性和可用性了)服务器
(网络出现故障 这个集群仍是可使用)markdown
P是必定要知足的,是基础的! 必须是这个架构网络
一直能够正常的作读写操做。简单而言就是客户端一直能够正常访问并获得系统的正常响应。用户角度来看就是不会出现系统操做失败或者访问超时等问题。(不能超时,在合理的时间内返回正确的结果)架构
在分布式系统完成某写操做后任何读操做,都应该获取到该写操做写入的那个最新的值。至关于要求分布式系统中的各节点时时刻刻保持数据的一致性。(也就是数据同步要快!能读到最新的)分布式
P和C一块儿知足是能够的! 若是在PC的基础上 还要知足可用的话,基本上不可能; 为何呢?(一致性的基础上,A 和B数据进行同步的话,同步是须要一段时间进行同步的,就会有延迟,若是在延迟的时候 要返回数据 那么就可能会形成可用性不能知足,必须等到同步完成! 或者说若是要知足可用性,那么一致性就知足不了,由于必须在这么短的时间内去处理!)学习
总结:不能同时知足 C(一致性)和A(可用性) 只能在里面选一个 ,由于知足C的时候,若是正在作同步,那么读取的速度就会很慢 ; 要么作一致性要么作可用性
最终一致性:在当下某个时间内 虽然没有同步,可是最后的状态必须是一致的。
牺牲强一致性来得到可用性!
弱一致性:最终一致性(DNS)
强一致性:同步,Paxos,Raft,ZAB
1.Paxos
里面的learner是两个备份数据库,中间的Acctpor是数据库节点(最重要的Server),proposer只是服务器?
第一轮接收提案以后去投票,投票经过 Acctpor会写log,而后最后的learner也会去备份
第一轮proposer会选主,当老大 无论client有没有提案过来
一开始一轮RPC选总统,两轮RPC; 后面都是一轮RPC,只有惟一一个Leader proposer,提出来就必须经过
第一个主机成为Leader,其与的都是slave 简化角色
Follower只是服从的角色,遵从Leader的指挥,Candidate是Leader挂了后填补的
第一轮进行竞选,而后投票
全部的请求先通过写入到Leader,而后同步,何时写系统文件呢? 要等待Follower确认以后,或者大多数确认;其余的Follower也要写
会有一个心跳机制 timeout,在必定时间内 若是没有Leader发送信息过来,那么就知道这个集群里是没有Leader的 ,能够竞选Leader
有Leader以后timeout刷新,而后Leader会发送心跳包过来,数据会跟着心跳包一块过来,每次发送心跳 都会更新那个定时器
若是Leader掉了,timeout到期 就会去竞选Leader
若是两个节点都想成为Leader,平票怎么办?随机的timeout,短的会很快去竞选,长的就会放弃;
全部的写请求都要通过Leader,而后Leader把数据报夹杂着心跳发送给 Follower,知道大多数Follower提交成功之后,本身就会写log到文件系统
分区的状况:
单数个节点
合并的话,会按照最新的系统来作Leader
如何保证安全性的:失败了会什么行为(另一个Leader会竞选,从新提升服务),分区了什么行为
若是某个宕机一段时间,数据后面会补上
没有达到多数派的话,是不会写log的
少数派的leader更新实际上是不会成功的
可能会丢失数据,覆盖掉以前的leader数据,可是整个系统的共识仍是没有问题的!须要客户端达到的!
其实也作不到彻底的强一致性!
leader挂掉了,在选举的时候 若是来了请求,怎么处理! 这个时候会超时,实现一致性确定会牺牲一点可用性的; 能够失败,只要保持一致性就能够了
很方便! 优点很大! 容器的管理 直接去拉那种环境就能够了
这么多节点由谁来负责随机呢?假设有专门的节点负责随机选举leader,又怎么保证这个节点挂掉后集群能正常工做。