西安机场商务宾馆百度做网站,四川攀枝花网站建设,会所网站建设,云电脑免费体验目录
etcd介绍:
etcd工作原理
选举
复制日志
安全性
etcd工作场景
服务发现
etcd基本术语
etcd安装(centos)
设置#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…目录
etcd介绍:
etcd工作原理
选举
复制日志
安全性
etcd工作场景
服务发现
etcd基本术语
etcd安装(centos)
设置etcd后台运行 etcd 是云原生架构中重要的基础组件由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现还可以作为 key-value 存储的中间件
etcd介绍:
etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目它的目标是构建一个高可用的分布式键值(key-value)数据库。具有以下特点 简单安装配置简单而且提供了 HTTP API 进行交互使用也很简单用curl
curl www.baidu.com 键值对存储将数据存储在分层组织的目录中如同在标准文件系统中 监测变更监测特定的键或目录以进行更改并对值的更改做出反应 安全支持 SSL 证书验证 快速根据官方提供的 benchmark 数据单实例支持每秒 2k 读操作 可靠采用 raft 算法实现分布式系统数据的可用性和一致性
etcd 采用 Go 语言编写它具有出色的跨平台支持很小的二进制文件和强大的社区。 etcd 机器之间的通信通过 Raft 算法处理。
etcd 是一个高度一致的分布式键值存储它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的 leader 选举以应对机器的故障即使是在 leader 节点发生故障时。
从简单的 Web 应用程序到 Kubernetes 集群任何复杂的应用程序都可以从 etcd 中读取数据或将数据写入 etcd。
etcd工作原理
etcd集群本身是一个分布式系统由多个节点相互通信构成整体对外服务每个节点都存储了完整的数据并且通过Raft协议保证每个节点维护的数据是一致的在ETCD集群中任意时刻至多存在一个有效的主节点由主节点处理所有来自客户端写操作通过Raft协议保证写操作对状态机的改动会可靠的同步到其他节点Raft协议如下图所示
Raft协议主要分为三个部分选举复制日志安全性 选举
Raft协议是用于维护一组服务节点数据一致性的协议。这一组服务节点构成一个集群并且有一个主节点来对外提供服务。当集群初始化或者主节点挂掉后面临一个选举问题。集群中每个节点任意时刻处于Leader、Follower、Candidate这三个角色之一选举特点如下 当集群初始化时候每个节点都是Follower角色。 集群中存在至多1个有效的主节点通过心跳与其他节点同步数据 当Follower在一定时间内没有收到来自主节点的心跳会将自己角色改变为Candidate并发起一次选举投票。 当收到包括自己在内超过半数节点赞成后选举成功。 当收到票数不足半数选举失败或者选举超时。 若本轮未选出主节点将进行下一轮选举(出现这种情况是由于多个节点同时选举所有节点均为获得过半选票)。 Candidate节点收到来自主节点的信息后会立即终止选举过程进入Follower角色。
为了避免陷入选举失败循环每个节点未收到心跳发起选举的时间是一定范围内的随机值这样能够避免2个节点同时发起选举。
复制日志
日志复制是指主节点将每次操作形成日志条目并持久化到本地磁盘然后通过网络IO发送给其他节点。其他节点根据日志的逻辑时钟(TERM)和日志编号(INDEX)来判断是否将该日志记录持久化到本地。当主节点收到包括自己在内超过半数节点成功返回那么认为该日志是可提交的(committed)并将日志输入到状态机将结果返回给客户端。
这里需要注意的是每次选举都会形成一个唯一的TERM编号相当于逻辑时钟每一条日志都有全局唯一的编号。
主节点通过网络IO向其他节点追加日志。若某节点收到日志追加的消息首先判断该日志的TERM是否过期以及该日志条目的INDEX是否比当前以及提交的日志的INDEX跟早。若已过期或者比提交的日志更早那么就拒绝追加并返回该节点当前的已提交的日志的编号。否则将日志追加并返回成功。
当主节点收到其他节点关于日志追加的回复后若发现有拒绝则根据该节点返回的已提交日志编号发生其编号下一条日志。
主节点向其他节点同步日志还作了拥塞控制。主节点发现日志复制的目标节点拒绝了某次日志追加消息将进入日志探测阶段一条一条发送日志直到目标节点接受日志然后进入快速复制阶段可进行批量日志追加。
按照日志复制的逻辑我们可以看到集群中慢节点不影响整个集群的性能。另外一个特点是数据只从主节点复制到Follower节点这样大大简化了逻辑流程。Raft日志复制路程如下图所示
安全性
选举和复制日志并不能保证节点间数据一致。当一个某个节点挂掉了一段时间后再次重启并刚好当选为主节点。而在其挂掉这段时间内集群若有超过半数节点存活集群会正常工作那么会有日志提交这些提交的日志无法传递给挂掉的节点。当挂掉的节点再次当选举节点它将缺失部分已提交的日志。在这样场景下按Raft协议它将自己日志复制给其他节点会将集群已经提交的日志给覆盖掉这显然是不可接受的对于出现这种问题解决办法 其他协议解决这个问题的办法是新当选的主节点会询问其他节点和自己数据对比确定出集群已提交数据然后将缺失的数据同步过来。这个方案有明显缺陷增加了集群恢复服务的时间(集群在选举阶段不可服务)并且增加了协议的复杂度。 Raft解决的办法是在选举逻辑中对能够成为主节点加以限制确保选出的节点已定包含了集群已经提交的所有日志。如果新选出的主节点已经包含了集群所有提交的日志那就不需要从和其他节点比对数据了简化了流程缩短了集群恢复服务的时间。
为什么只要仍然有超过半数节点存活一定能够选出包含所有日志数据的节点作为主节点呢因为已经提交的日志必然被集群中超过半数节点持久化显然前一个主节点提交的最后一条日志也被集群中大部分节点持久化。当主节点挂掉后集群中仍有大部分节点存活那这存活的节点中一定存在一个节点包含了已经提交的日志了因此要求etcd集群节点数量为奇数(3579……)
etcd工作场景
服务发现
ETCD服务发现示意图如下图所示 服务发现是分布式系统中最常见的需要解决的问题之一即在同一个分布式集群中的进程或服务客户端通过名字就可以查找和连接服务端。要解决服务发现的问题需要有下面三点 一个强一致性、高可用的服务存储目录。基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录。 一种注册服务和监控服务健康状态的机制。用户可以在etcd中注册服务并且对注册的服务设置key TTL定时保持服务的心跳以达到监控健康状态的效果。 一种查找和连接服务的机制。通过在etcd指定的主题快速找到服务地址。
etcd基本术语 Raftetcd所采用的保证分布式系统强一致性的算法。 Node一个Raft状态机实例。 Member 一个etcd实例。它管理着一个Node并且可以为客户端请求提供服务。 Cluster由多个Member构成可以协同工作的etcd集群。 Peer对同一个etcd集群中另外一个Member的称呼。 Client 向etcd集群发送HTTP请求的客户端。 WAL预写式日志etcd用于持久化存储的日志格式。 snapshotetcd防止WAL文件过多而设置的快照存储etcd数据状态。 Proxyetcd的一种模式为etcd集群提供反向代理服务。 Leader(领导者)Raft算法中通过竞选而产生的处理所有数据提交的节点。 Follower(跟随者)竞选失败的节点作为Raft中的从属节点为算法提供强一致性保证。 Candidate当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选。 Term某个节点成为Leader到下一次竞选开始的时间周期称为一个Term。 lndex数据项编号。Raft中通过Term和Index来定位数据。 etcd安装(centos)
上传etcd解压安装包(网络下载太慢了)
tar -zxvf etcd-v3.4.3-linux-amd64.tar.gz ✨etcd:服务 ✨etcdctl:操作命令 切换至etcd根目录将etcd和etcdctl二进制文件复制到/usr/local/bin目录这样系统中可以直接调用etcd/etcdctl这两个程序
cp etcd etcdctl /usr/local/bin 查看etcd版本
etcd --version
输入命令etcd即可启动一个单节点的etcd服务,ctrlc即可停止服务
运行
输出内容 ✨name表示节点名称默认为default。
✨data-dir 保存日志和快照的目录默认为当前工作目录default.etcd/目录下。
✨在http://localhost:2380和集群中其他节点通信。
✨在http://localhost:2379提供客户端交互。
✨heartbeat为100ms该参数的作用是leader多久发送一次心跳到followers默认值是100ms。
✨election为1000ms该参数的作用是重新投票的超时时间如果follow在该时间间隔没有收到心跳包会触发重新投票默认为1000ms。
✨snapshot count为10000该参数的作用是指定有多少事务被提交时触发截取快照保存到磁盘
设置etcd后台运行 建立etcd相关目录(即数据文件和配置文件的保存位置)
mkdir -p /var/lib/etcd/ mkdir -p /etc/etcd/ 创建etcd配置文件
vim /etc/etcd/etcd.conf 创建systemd配置文件
vim /etc/systemd/system/etcd.service
service内容
[Unit]
DescriptionEtcd Server
Afternetwork.target
Afternetwork-online.target
Wantsnetwork-online.target
[Service]
Userroot
Typenotify
WorkingDirectory/var/lib/etcd/
## 根据实际情况修改EnvironmentFile和ExecStart这两个参数值
## 1.EnvironmentFile即配置文件的位置注意“-”不能少
EnvironmentFile-/etc/etcd/etcd.conf
## 2.ExecStart即etcd启动程序位置
ExecStart/usr/local/bin/etcd
Restarton-failure
LimitNOFILE65536
[Install]
WantedBymulti-user.target 启动/停止/查看etcd服务
systemctl daemon-reload 刷新服务
systemctl enable etcd 设置开机自启
systemctl start etcd 启动
systemctl status etcd 查看状态
编辑配置文件
查看etcd状态 默认关闭 systemctl status etcd
启动etcd systemctl start etcd
查看etcd指令内容 etcdctl -h put 放 etcdctl put name 内容 get 拿 etcdctl get name del 删除数据 清空数据
etcdctl del / --prefix
删除所有/test前缀的节点
etcdctl del /test --prefix
watch,监测一个键值的变化一旦键值发生更新就会输出最新的值并退出
etcdctl watch key1