Etcd 简介

  • Etcd 是 CoreOS 团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 Etcd 内部采用 Raft 协议作为一致性算法, Etcd 基于 Go 语言实现。
  • Etcd 官方对其的定义为:A highly-available key value store for shared configuration and service discovery. 即用于配置共享和服务发现。
  • 作为服务发现系统,有以下的特点:

    • 简单:安装配置简单,而且提供了 HTTP API(GRPC)进行交互,使用也很简单
    • 安全:支持 SSL 证书验证
    • 快速:根据官方提供的 benchmark 数据,单实例支持每秒2k+读操作
    • 可靠:采用 Raft 算法,实现分布式系统数据的可用性和一致性
  • Etcd 项目地址:https://github.com/coreos/etcd

Raft 介绍

  • 不同于Paxos算法直接从分布式一致性问题出发推导出来,Raft算法则是从多副本状态机的角度提出,用于管理多副本状态机的日志复制。Raft实现了和Paxos相同的功能,它将一致性分解为多个子问题。同时,Raft算法使用了更强的假设来减少了需要考虑的状态,使之变的易于理解和实现。
  • 它有许多开源参考实现,具有 Go,C ++,Java 和 Scala 中的完整规范实现
  • 一个 Raft 集群包含若干个服务器节点,通常是5个,这允许整个系统容忍2个节点的失效,每个节点处于以下三种状态之一

    • follower(跟随者) :所有节点都以 follower 的状态开始。如果没收到 leader 消息则会变成 candidate 状态
    • candidate(候选人):会向其他节点“拉选票”,如果得到过半数的票则成为leader,这个过程就叫做Leader选举(Leader Election)
    • leader(领导者):所有对系统的修改都会先经过leader
    • learning(学习者):Etcd 新版本中出现的一个新的节点状态,该状态下的节点无选举权和被选举权

Raft 一致性算法

  • 在 Raft 体系中,有一个强 leader ,由它全权负责接收客户端的请求命令,并将命令作为日志条目复制给其他服务器,在确认安全的时候,将日志命令提交执行。当 leader 故障时,会选举产生一个新的 leader 。在强 leader 的帮助下,Raft 将一致性问题分解为了三个子问题:

    • Leader election (领导选举):当已有的leader故障时必须选出一个新的leader。
    • Log replication (日志复制):leader接受来自客户端的命令,记录为日志,并复制给集群中的其他服务器,并强制其他节点的日志与leader保持一致。
    • Safety (安全性):通过一些措施确保系统的安全性,如确保所有状态机按照相同顺序执行相同命令的措施

Raft 动画演示

  • 地址:点击跳转
  • 动画主要包含三部分:

    • 第一部分介绍简单版的领导者选举和日志复制的过程
    • 第二部分介绍详细版的领导者选举和日志复制的过程
    • 第三部分介绍如果遇到网络分区,raft 算法是如何恢复网络一致的
最后修改:2023 年 04 月 05 日
如果觉得我的文章对你有用,请随意赞赏