raft原理(二):安全性和集群成员变更 | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
Introduction本文收录在paper项目中,papers项目旨在学习和总结分布式系统相关的论文;同时本文也是DSTORE项目的必备知识,DSTORE的目标是自己动手实现一个分布式KV存储引擎。
本文为raft系列文章第二篇,本系列其他文章为
raft原理(一):选举和日志复制raft原理(三):日志合并及客户端交互golang实现raft(一):选举和日志同步golang实现raft(二):集群成员变更本文将继续讨论raft原理,包括raft的安全性和集群成员变更,全文组织结构如下
SafetyCluster Membership ChangesSafety前面描述了raft是如何选主和复制日志的,但是没有讨论raft是如何保证所有server的状态机按照相同的顺序执行完全相同的指令的。本节将在server被选为主的限制进行补充,保证了任何term被选为leader都会包含前面所有提交过的log entry,具体地将会通过本节描述的一系列规则来阐述。
Election Restriction在一些一致性算法中,即使一台server没有包含所有之前已提交的log entr...阅读全文

 golang实现Raft(一):选主 | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
candidate状态下的选主功能candidate状态下的选主功能需要关注两个方面:
何时进入candidate状态,进行选主?选主的逻辑是怎样的?首先,来讨论何时进入candidate状态,进行选主。
在一定时间内没有收到来自leader或者其他candidate的有效RPC时,将会触发选主。这里需要关注的是有效两个字,要么是leader发的有效的心跳信息,要么是candidate发的是有效的选主信息,即server本身确认这些信息是有效的后,才会重新更新超时时间,超时时间根据raft论文中推荐设置为[150ms,300ms],并且每次是随机生成的值。
其次,来讨论选主的逻辑。
server首先会进行选主的初始化操作,即server会增加其term,把状态改成candidate,然后选举自己为主,并把选主的RPC并行地发送给集群中其他的server,根据返回的RPC的情况的不同,做不同的处理:
该server被选为leader其他的server选为leader一段时间后,没有server被选为leader针对情况一,该server被选为leader,当前仅当在大多数的se...阅读全文

 自己动手写分布式KV存储引擎(三):网络框架中的客户端实现原理 | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
客户端功能需求在分布式系统中,一台服务器在与其他服务器交互的过程中,既扮演server端,也扮演client端,因此,网络框架中client端的实现也是至关重要的,一般地,网络框架中client端至少提供以下接口:
connect: 连接其他服务器,因为是服务端程序,需要高性能,因此,此操作必须是非阻塞的read: 读server端发来的数据write: 往server端写数据客户端实现针对网络框架中的客户端需要的各种接口,本节讨论其功能实现。
connect先来看看阻塞方式的connect,一般其用法如下
123int ret = connect(fd, server_addr, server_len);send(fd, data);recv(fd, data);阻塞的connect函数调用如下,其TCP状态转换如下图:

如上图所示,整个流程如下:
client端调用阻塞式connect,操作系统会向server端发送SYN数据包,并且client端的TCP状态会变成SYNC_SENTserver端调用accept接受connect请求,首先设置其TCP状态为SYNC_...阅读全文

 Paxos原理(一):Basic Paxos | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
引言Paxos算法由lamport大师提出,目标是解决分布式环境下数据一致性的问题。Paxos算法自发表以来以晦涩难懂著称,因此,其作者于2001年发表了一篇简化版的论文,Paxos Made Simple。虽然这篇论文比前面的充满公式证明的论文容易理解,但是,如果对于Paxos算法本身要解决的问题不够理解的话,还是会很难理解该算法。Paxos原理系列文章的目标是在充分讨论Paxos要解决的问题的前提下,深入地分析和理解Paxos的原理。本文是此系列文章第一篇,主要内容如下:
Paxos算法要解决的问题是什么?Basic Paxos在整个Paxos算法中的地位及其原理本文收录在我的github中papers项目,papers项目旨在学习和总结分布式系统相关的论文。
Paxos算法要解决的问题首先,来描述一下Paxos要解决的问题,分布式环境下数据一致性问题。
考虑下面的环境,如下图:

在分布式环境中,为了保证服务的高可用,需要对数据做多个副本,一般是日志的方式来实现,即图中的log sequence,当某台机器宕机后,其上的请求可以自动的转到其他的Server上,同时会新找...阅读全文

 consistent hash原理,优化及实现 | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
引言在分布式环境中,由于数据量庞大,往往需要对数据做分区,分区有两种:一种是range分区,另一种是hash分区。顾名思义,hash分区是采用hash算法,将数据划分到不同的分区中,采用传统的hash算法能有效地将数据划分到不同的分区,但是,传统的hash算法在机器上下线时,由于hash映射的变化,会导致大量的数据发生迁移。本文以分布式缓存为场景,分析了传统hash算法的缺点,并讨论了consistent hash如何解决该问题,以及consistent hash的优化和实现。
本文的按如下组织:
传统hash算法的缺点consistent hash本文收录在我的github中papers项目,papers项目旨在学习和总结分布式系统相关的论文。
传统hash算法的缺点以分布式缓存场景为例,如下:

对于传统hash分区方法,针对某个(key,value)对,其存储的缓存节点下标可以用hash(key) % N,在正常情况下,能良好地工作。但是,当机器宕机宕机下线时,可能会涉及到大量的数据的迁移,因为机器数量减少为N-1,对应的hash取模后,大量的(key,value)对到...阅读全文