在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。(nacos)
一、etcd的介绍
etcd 是一个高度一致的分布式键值(key-value)存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,即使在
领导者节点中也可以容忍机器故障。用于配置共享和服务发现。
etcd 是用Go语言编写的,它具有出色的跨平台支持,小的二进制文件和强大的社区。etcd机器之间的通信通过Raft共识算法处理。
服务发现要解决的也是分布式系统中最常见的问题之一。
服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以查找和连接
服务发现的三大支柱,缺一不可:
- 一个强一致性、高可用的服务存储目录。基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录。
- 一种注册服务和监控服务健康状态的机制。用户可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
- 一种查找和连接服务的机制。通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个Proxy模式的etcd,这样就可以确保能访问etcd集群的服务都能互相连接。
常见的可用作服务发现:
Raft选举算法
Raft 算法是典型的多数派投票选举算法,其选举机制与我们日常生活中的民主投票机制类似,核心思想是“少数服从多数”。
采用 Raft 算法选举,集群节点的角色有 3 种:
- Leader: 即主节点,同一时刻只有一个 Leader,负责协调和管理其他节点;
- Candidate: 即候选者,每一个节点都可以成为 Candidate,节点在该角色下才可以被选为新的 Leader;
- Follower: Leader 的跟随者,不可以发起选举。
流程:
1. 初始化时,所有节点均为 Follower 状态。
2. 开始选主时,所有节点的状态由 Follower 转化为 Candidate,并向其他节点发送选举请求。
3. 其他节点根据接收到的选举请求的先后顺序,回复是否同意成为主。这里需要注意的是,在每一轮选举中,一个节点只能投出一张票。
4. 若发起选举请求的节点获得超过一半的投票,则成为主节点,其状态转化为 Leader,其他节点的状态则由 Candidate 降为 Follower。Leader 节点与 Follower 节点之间会定期发送
心跳包,以检测主节点是否活着。5. 当 Leader 节点的任期到了,即发现其他服务器开始下一轮选主周期时,Leader 节点的状态由 Leader 降级为 Follower,进入新一轮选主
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)
- 上传etcd安装包(网络下载太慢了)
tar -zxvf etcd-v3.4.3-linux-amd64.tar.gz
- 切换至etcd根目录,将etcd和etcdctl二进制文件复制到/usr/local/bin目录这样系统中可以直接调用etcd/etcdctl这两个程序
cp etcd etcdctl /usr/local/bin
- 查看etcd版本
etcd --version
- 输入命令etcd,即可启动一个单节点的etcd服务,ctrl+c即可停止服
1.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,该参数的作用是指定有多少事务被提交时,触发截取快照保存到磁盘。8.集群和每个节点都会生成一个uuid。
9.启动的时候会运行raft,选举出leader
三、创建一个etcd服务
- 建立etcd相关目录(即数据文件和配置文件的保存位置)
mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd/
- 创建etcd配置文件
vim /etc/etcd/etcd.con
# 节点名称
ETCD_NAME="etcd0"
# 指定数据文件存放位置
ETCD_DATA_DIR="/var/lib/etcd/"
- 创建systemd配置文件
vim /etc/systemd/system/etcd.service
[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
- 启动/停止/查看etcd服务
systemctl daemon-reload && systemctl enable etcd && systemctl start etcd && systemctl status etcd
四、etcd的基本使用
etcdctl是一个命令行客户端,可以对etcd服务进行测试或者手动修改数据库内容。另外, etcdctl还支持HTTP API(之后介绍)。
etcdctl支持的命令大体上分为数据库操作和非数据库操作两类
put写
etcdctl put /testdir/testkey "123"
--sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性。
*因为ectd是服务端,客户端是etcdctl
get拿
- 帮助命令
etcdctl -h
- del 删除数据
清空数据
etcdctl del / --prefix /前缀
删除所有/test前缀的节点
etcdctl del /test --prefix
- watch,监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
etcdctl watch key1
启动一个监听key1