概述
etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。
类似项目有zookeeper和consul。
etcd具有以下特点:
- 完全复制:集群中的每个节点都可以使用完整的存档
- 高可用性:Etcd可用于避免硬件的单点故障或网络问题
- 一致性:每次读取都会返回跨多主机的最新写入
- 简单:包括一个定义良好、面向用户的API(gRPC)
- 安全:实现了带有可选的客户端证书身份验证的自动化TLS
- 快速:每秒10000次写入的基准速度
- 可靠:使用Raft算法实现了强一致、高可用的服务存储目录
etcd安装使用方法
etcd支持单机模式,以及使用集群模式部署,支持部署在各种操作系统中。
mac安装etcd单机模式
mac安装etcd整体上来说非常简单,只需要一个命令即可(linux其实也是一个命令即可)
1 | brew install etcd |
etcdctl命令使用
1 | NAME: |
etcdctl 命令分为几大模块,分别是跟etcd集群现网的命令例如member, endpoint, 第二个是租约有关的lease(类似ttl), 第三个是数据相关的,包括watch、put、get等,第四个是跟角色认证相关的信息,常见的命令如下:
1 | # -w 参数用于输出执行的格式,只是fields, json, protobuf, sample, table 默认sample |
golang操作使用etcd
1 | package main |
etcd工作原理
etcd 是一个基于 Raft 共识算法实现的分布式键值存储服务,在项目结构上采用了模块化设计,其中最主要的三个部分是实现分布式共识的 Raft 模块、实现数据持久化的 WAL 模块和实现状态机存储的 MVCC 模块。
Leader 选举
Raft 是一种用来管理日志复制过程的算法,Raft 通过『领导选举机制』选举出一个 Leader,由它全权管理日志复制来实现一致性。一个 Raft 集群包含若干个服务器节点,每一个节点都有一个唯一标识 ID。Raft 算法论文规定了三种节点身份:Leader、Follower 和 Candidate,etcd 的实现中又添加了 PreCandidate 和 Learner 这两种身份。
leader选择过程
- 集群启动时所有节点初始状态均为 Follower,同时启动选举定时器(时间随机,降低冲突概率),随后会有一个节点选举成功成为 Leader,在绝大多数时间里集群内的节点会处于这两种身份之一。
- 当某个节点当选成为Leader后,需要定期的向Follower发送心跳包,Follower收到心跳包后会重置选举定时器。
- 当一个 Follower 节点的选举计时器超时后(节点在指定的时间之内没有收到leader或者candidate的有效消息时会发起选举),会先进入
preVote
状态(切换为 PreCandidate 身份),在它准备发起一次选举之前,需要尝试连接集群中的其他节点,并询问它们是否愿意参与选举 - 如果集群中的其它节点能够正常收到 Leader 的心跳消息,那么会拒绝参与选举。
- 如果有超过法定人数的节点响应并表示参与新一轮选举,该节点会从 PreCandidate 身份切换到 Candidate,发起新一轮的选举。