一、Etcd介绍
etcd 是一个高度一致的分布式键值(key-value)存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,即使在领导者节点中也可以容忍机器故障。
etcd 是用Go语言编写的,它具有出色的跨平台支持,小的二进制文件和强大的社区。etcd机器之间的通信通过Raft共识算法处理。
1、服务发现
服务发现要解决的也是分布式系统中 常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。
本质上来说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以查找和连接。
要解决服务发现的问题,需要有下面三大支柱,缺一不可:
· 一个强一致性、高可用的服务存储目录。基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录。
· 一种注册服务和监控服务健康状态的机制。用户可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
· 一种查找和连接服务的机制。通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个Proxy模式的etcd,这样就可以确保能访问etcd集群的服务都能互相连接。
Feature
Consul
Zookeeper
Etcd
Eureka
Nacos
服务健康检查
服务状态,内存,硬盘等
(弱)长连接,
keepalive
连接心跳
可配支持
传输层 (PING 或 TCP)和应用层
(如 HTTP、MySQL、用户自定义)的健康检查
多数据中心
支持
—
—
—
支持
kv存储服务
支持
支持
支持
—
支持
一致性
Raft
Paxos
Raft
—
Raft
CAP定理
CP
CP
CP
AP
CP: 配置中心
AP: 注册中心
使用接口 (多语言能力)
支持http和dns
客户端
http/grpc
http(sidecar)
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent
watch支持
全量/支持long polling
支持
支持 long polling
支持 long polling/大部分
增量
支持 long polling/大部分增量
自身监控
metrics
—
metrics
metrics
安全
acl /https
acl
https支持
(弱)
—
acl
Spring Cloud集成
已支持
已支持
已支持
已支持
已支持
备注
可以作为eureka的替代使用
> 2.0不在更新
- 支持dubbo
- spring-cloud-alibaba支持
2、Raft选举算法
集群一般是由两个或两个以上的服务器组建而成,每个服务器都是一个节点。数据库集群、管理集群...数据库集群提供了读写功能,管理集群提供了管理、故障恢复等功能。
对于一个集群来说,多个节点的协同和管理是非常重要的。而主节点则实现了协同和管理,主节点的存在,就可以保证其他节点的有序运行,以及数据库集群中的写入数据在每个节点上的一致性。
这里的一致性是指,数据在每个集群节点中都是一样的,不存在不同的情况。分布式选举的作用就是选出一个主节点,由它来协调和管理其他节点,以保证集群有序运行和节点间数据的一致性。
Raft 算法是典型的多数派投票选举算法,其选举机制与我们日常生活中的民主投票机制类似,核心思想是“少数服从多数”。
也就是说,Raft 算法中,获得投票 多的节点成为主节点。
①、采用 Raft 算法选举,集群节点的角色有 3 种:
· Leader: 即主节点,同一时刻只有一个 Leader,负责协调和管理其他节点;
· Candidate: 即候选者,每一个节点都可以成为 Candidate,节点在该角色下才可以被选为新的 Leader;
· Follower: Leader 的跟随者,不可以发起选举。
②、Raft 选举的流程,可以分为以下几步:
- 初始化时,所有节点均为 Follower 状态。
- 开始选主时,所有节点的状态由 Follower 转化为 Candidate,并向其他节点发送选举请求。
- 其他节点根据接收到的选举请求的先后顺序,回复是否同意成为主。这里需要注意的是,在每一轮选举中,一个节点只能投出一张票。
- 若发起选举请求的节点获得超过一半的投票,则成为主节点,其状态转化为 Leader,其他节点的状态则由 Candidate 降为 Follower。Leader 节点与 Follower 节点之间会定期发送心跳包,以检测主节点是否活着。
- 当 Leader 节点的任期到了,即发现其他服务器开始下一轮选主周期时,Leader 节点的状态由 Leader 降级为 Follower,进入新一轮选主
每一轮选举,每个节点只能投一次票。
这种选举就类似人大代表选举,正常情况下每个人大代表都有一定的任期,任期到后会触发重新选举,且投票者只能将自己手里唯一的票投给其中一个候选者。
对应到 Raft 算法中,选主是周期进行的,包括选主和任值两个时间段,选主阶段对应投票阶段,任值阶段对应节点成为主之后的任期。
但也有例外的时候,如果主节点故障,会立马发起选举,重新选出一个主节点。
Google 开源的 Kubernetes,擅长容器管理与调度,为了保证可靠性,通常会部署 3 个节点用于数据备份。
这 3 个节点中,有一个会被选为主,其他节点作为备份。
Kubernetes 的选主采用的是开源的 etcd 组件。而,etcd 的集群管理器 etcd,是一个高可用、强一致性的服务发现存储仓库,就是采用了 Raft 算法来实现选主和一致性的。
Raft 算法具有选举速度快、算法复杂度低、易于实现的优点;
缺点是,它要求系统内每个节点都可以相互通信,且需要获得过半的投票数才能选主成功,因此通信量大。
该算法选举稳定性比 Bully 算法好,这是因为当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点获得投票数过半,才会导致切主。
3、 etcd术语
· Raft:etcd所采用的保证分布式系统强一致性的算法。
· Node:一个Raft状态机实例。
· Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
· Cluster:由多个Member构成可以协同工作的etcd集群。
· Peer:对同一个etcd集群中另外一个Member的称呼。
· Client: 向etcd集群发送HTTP请求的客户端。
· WAL:预写式日志,etcd用于持久化存储的日志格式。
· snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
· Proxy:etcd的一种模式,为etcd集群提供反向代理服务。
· Leader(领导者):Raft算法中通过竞选而产生的处理所有数据提交的节点。
· Follower(跟随者):竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。
· Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选。
· Term:某个节点成为Leader到下一次竞选开始的时间周期,称为一个Term。
· Index:数据项编号。Raft中通过Term和Index来定位数据。
二、etcd安装(centos)
1、上传etcd安装包(网络下载太慢了)
解压:
tar -zxvf etcd-v3.4.3-linux-amd64.tar.gz
2、切换至etcd根目录,将etcd和etcdctl二进制文件复制到 /usr/local/bin 目录,这样系统中可以直接调用这etcd和etcdctl两个程序
cp etcd etcdctl /usr/local/bin
3、查看etcd版本
etcd --version
4、输入命令etcd,即可启动一个单节点的etcd服务,Ctrl+C停止服务
etcd
xxxx - xx - xx xx : xx : xx . xxxxxx I | embed : name = defaultxxxx - xx - xx xx : xx : xx . xxxxxx I | embed : data dir = default . etcdxxxx - xx - xx xx : xx : xx . xxxxxx I | embed : member dir = default . etcd / memberxxxx - xx - xx xx : xx : xx . xxxxxx I | embed : heartbeat = 100 msxxxx - xx - xx xx : xx : xx . xxxxxx I | embed : election = 1000 msxxxx - xx - xx xx : xx : xx . xxxxxx I | embed : snapshot count = 100000xxxx - xx - xx xx : xx : xx . xxxxxx I | embed : advertise client URLs = http : //localhost:2379xxxx - xx - xx xx : xx : xx . xxxxxx I | etcdserver : starting member 8e9 e05c52164694d in cluster cdf818194e3a8c321.name 表示节点名称,默认为 default 。2.data-dir 保存日志和快照的目录,默认为当前工作目录 default.etcd/ 目录下。3. 在 http://localhost:2380 和集群中其他节点通信。4. 在 http://localhost:2379 提供客户端交互。5.heartbeat 为 100ms ,该参数的作用是 leader 多久发送一次心跳到 followers ,默认值是 100ms 。6.election 为 1000ms ,该参数的作用是重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000ms 。7.snapshot count 为 10000 ,该参数的作用是指定有多少事务被提交时,触发截取快照保存到磁盘。
5、创建一个etcd服务
①、建立etcd相关目录(即数据文件和配置文件的保存位置)
mkdir - p / var / lib / etcd / && mkdir - p / etc / etcd /
②、创建etcd配置文件
vim / etc / etcd / etcd . conf输入“i”进入编辑模式里面放入:# 节点名称
ETCD_NAME="etcd0"
# 指定数据文件存放位置
ETCD_DATA_DIR="/var/lib/etcd/"点击“Esc” , :wq 保存退出
③、创建systemd配置文件
vim /etc/systemd/system/etcd.service
输入“i”进入编辑模式里面放入:[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target[Service]
User=root
Type=notify
WorkingDirectory=/var/lib/etcd/
## 根据实际情况修改EnvironmentFile和ExecStart这两个参数值
## 1.EnvironmentFile即配置文件的位置,注意“-”不能少
EnvironmentFile=-/etc/etcd/etcd.conf
## 2.ExecStart即etcd启动程序位置
ExecStart=/usr/local/bin/etcd
Restart=on-failure
LimitNOFILE=65536[Install]
WantedBy=multi-user.target点击“Esc” , :wq 保存退出
④、启动/停止/查看etcd服务
systemctl daemon - reload && systemctl enable etcd && systemctl start etcd && systemctl status etcd![]()
三、etcd基本使用
1、帮助命令
etcdctl - h
2、put 放入数据
etcdctl put / testdir / testkey "Hello world"-- sort 对结果进行排序-- consistent 将请求发给主节点,保证获取内容的一致性。![]()
3、del 删除数据
清空数据etcdctl del / -- prefix删除所有 / test 前缀的节点etcdctl del / test -- prefix![]()
4、watch,监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
etcdctl watch key1![]()