https://blog.csdn.net/aa1215018028/article/details/81116435
从etcd的架构图中我们可以看到,etcd主要分为四个部分。
HTTP Server: 用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。
Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
Raft:Raft强一致性算法的具体实现,是etcd的核心。
WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。
通常,一个用户的请求发送过来,会经由HTTP Server转发给Store进行具体的事务处理
如果涉及到节点的修改,则交给Raft模块进行状态的变更、日志的记录,然后再同步给别的etcd节点以确认数据提交
最后进行数据的提交,再次同步
2 新版etcd重要变更列表
获得了IANA认证的端口,2379用于客户端通信,2380用于节点通信,与原先的(4001 peers / 7001 clients)共用。
每个节点可监听多个广播地址。监听的地址由原来的一个扩展到多个,用户可以根据需求实现更加复杂的集群环境,如一个是公网IP,一个是虚拟机(容器)之类的私有IP。
etcd可以代理访问leader节点的请求,所以如果你可以访问任何一个etcd节点,那么你就可以无视网络的拓扑结构对整个集群进行读写操作。
etcd集群和集群中的节点都有了自己独特的ID。这样就防止出现配置混淆,不是本集群的其他etcd节点发来的请求将被屏蔽。
etcd集群启动时的配置信息目前变为完全固定,这样有助于用户正确配置和启动。
运行时节点变化(Runtime Reconfiguration)。用户不需要重启 etcd 服务即可实现对 etcd 集群结构进行变更。启动后可以动态变更集群配置。
重新设计和实现了Raft算法,使得运行速度更快,更容易理解,包含更多测试代码。
Raft日志现在是严格的只能向后追加、预写式日志系统,并且在每条记录中都加入了CRC校验码。
启动时使用的_etcd/* 关键字不再暴露给用户
废弃集群自动调整功能的standby模式,这个功能使得用户维护集群更困难。
新增Proxy模式,不加入到etcd一致性集群中,纯粹进行代理转发。
ETCD_NAME(-name)参数目前是可选的,不再用于唯一标识一个节点。
摒弃通过配置文件配置 etcd 属性的方式,你可以用环境变量的方式代替。
通过自发现方式启动集群必须要提供集群大小,这样有助于用户确定集群实际启动的节点数量
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开始竞选。
Term:某个节点成为Leader到下一次竞选时间,称为一个Term。
Index:数据项编号。Raft中通过Term和Index来定位数据。
etcd作为一个高可用键值存储系统,天生就是为集群化而设计的。
由于Raft算法在做决策时需要多数节点的投票,所以etcd一般部署集群推荐奇数个节点,推荐的数量为3、5或者7个节点构成一个集群。
4.1 集群启动
etcd有三种集群化启动的配置方案,分别为静态配置启动、etcd自身服务发现、通过DNS进行服务发现。
通过配置内容的不同,你可以对不同的方式进行选择。值得一提的是,这也是新版etcd区别于旧版的一大特性,它摒弃了使用配置文件进行参数配置的做法,转而使用命令行参数或者环境变量的做法来配置参数。
搭建etcd集群(静态发现)
节点名称 | 节点IP |
---|---|
master | 192.168.0.100 |
node1 | 192.168.0.101 |
node2 | 192.168.0.102 |
搭建etcd集群时需要将防火墙关闭,否则节点间无法通信,使用以下命令关闭防火墙和禁止开机启动。
systemctl stop firewalld.service //关闭防火墙
systemctl disable firewalld.service //禁止开机启动
在CentOS上软件安装很简单,直接使用yum命令,
yum install etcd -y
etcd的配置文件为:/etc/etcd/etcd.conf,三台环境的配置如下:
master的配置:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="master"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.100:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.100:2379,http://192.168.0.100:4001"
ETCD_INITIAL_CLUSTER="master=http://192.168.0.100:2380,node1=http://192.168.0.101:2380,node2=http://192.168.0.102:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
node1的配置:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="node1"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.101:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.101:2379,http://192.168.0.101:4001"
ETCD_INITIAL_CLUSTER="master=http://192.168.0.100:2380,node1=http://192.168.0.101:2380,node2=http://192.168.0.102:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
node2的配置:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="node2"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.102:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.102:2379,http://192.168.0.102:4001"
ETCD_INITIAL_CLUSTER="master=http://192.168.0.100:2380,node1=http://192.168.0.101:2380,node2=http://192.168.0.102:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_DATA_DIR:数据存储目录
ETCD_LISTEN_PEER_URLS:与其他节点通信时的监听地址列表,通信协议可以是http、https
ETCD_LISTEN_CLIENT_URLS:与客户端通信时的监听地址列表
ETCD_NAME:节点名称
ETCD_INITIAL_ADVERTISE_PEER_URLS:节点在整个集群中的通信地址列表,可以理解为能与外部通信的ip端口
ETCD_ADVERTISE_CLIENT_URLS:告知集群中其他成员自己名下的客户端的地址列表
ETCD_INITIAL_CLUSTER:集群内所有成员的地址,这就是为什么称之为静态发现,因为所有成员的地址都必须配置
ETCD_INITIAL_CLUSTER_TOKEN:初始化集群口令,用于标识不同集群
ETCD_INITIAL_CLUSTER_STATE:初始化集群状态,new表示新建
配置完后,在三台环境上启动etcd服务,
systemctl start etcd
然后查看集群节点信息,
[root@CentOS-7-3 ~]# etcdctl member list
9148b70e8c09dda7: name=master peerURLs=http://192.168.0.100:2380 clientURLs=http://192.168.0.100:2379,http://192.168.0.100:4001 isLeader=true
94da6adc7e389c7b: name=node1 peerURLs=http://192.168.0.101:2380 clientURLs=http://192.168.0.101:2379,http://192.168.0.101:4001 isLeader=false
cab12768ca3506a9: name=node2 peerURLs=http://192.168.0.102:2380 clientURLs=http://192.168.0.102:2379,http://192.168.0.102:4001 isLeader=false
接下来我们简单测试一下功能,在master上设置一个键值,在其余两台环境上查询该键值。
假设我们设置这样一个键值对 hello:world,
[root@CentOS-7-3 ~]# etcdctl set hello world
world
[root@CentOS-7-4 ~]# etcdctl get hello
world
[root@CentOS-7-5 ~]# etcdctl get hello
world
集群节点操作member
list:展示集群节点信息
[root@k8s-master-116 ~]# etcdctl --endpoints=http://etcd-116:2379,http://etcd-118:2379,http://etcd-117:2379 member list
1e82894832618580, started, k8s-produce-117, http://etcd-117:2380, http://etcd-117:2379,http://etcd-117:4001
828b5bb8d2185604, started, k8s-produce-118, http://etcd-118:2380, http://etcd-118:2379,http://etcd-118:4001
ac4878ce274a1536, started, k8s-master-116, http://etcd-116:2380, http://etcd-116:2379,http://etcd-116:4001
[root@k8s-master-116 ~]#
显示所有节点的信息且谁是leader
[root@k8s-produce-118 ~]# etcdctl member list
1e82894832618580: name=k8s-produce-117 peerURLs=http://etcd-117:2380 clientURLs=http://etcd-117:2379,http://etcd-117:4001 isLeader=false
828b5bb8d2185604: name=k8s-produce-118 peerURLs=http://etcd-118:2380 clientURLs=http://etcd-118:2379,http://etcd-118:4001 isLeader=false
ac4878ce274a1536: name=k8s-master-116 peerURLs=http://etcd-116:2380 clientURLs=http://etcd-116:2379,http://etcd-116:4001 isLeader=true
remove:集群中移除几点
[root@k8s-master-116 ~]# etcdctl --endpoints=http://etcd-116:2379,http://etcd-118:2379,http://etcd-117:2379 member remove 1e82894832618580
Member 1e82894832618580 removed from cluster 1880d5001826d469
# etcdctl member list
# etcdctl member remove memberID
# etcdctl member list
# ps -ef|grep etcd //在相关节点上kill掉etcd进程
此时移除的节点上面的etcd服务也关闭了systemctl status etcd
更新一个节点
如果你想更新一个节点的IP(peerURLS),首先你需要知道那个节点的ID
# etcdctl member list
# etcdctl member update memberID http://ip:2380
查看集群健康状态
# etcdctl cluster-health
查看集群成员
# etcdctl member list
增加一个新节点(Etcd集群成员的伸)
注意:步骤很重要,不然会报集群ID不匹配
# etcdctl member add --help
a. 将目标节点添加到集群
[root@k8s-master-116 ~]# etcdctl member add name=k8s-produce-117 --peer-urls="http://etcd-117:2380"
Member d89e7051a2080b71 added to cluster 1880d5001826d469
ETCD_NAME="name=k8s-produce-117"
ETCD_INITIAL_CLUSTER="k8s-produce-118=http://etcd-118:2380,k8s-master-116=http://etcd-116:2380,name=k8s-produce-117=http://etcd-117:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd-117:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
[root@k8s-master-116 ~]#
b. 查看新增成员列表,etcd3状态为unstarted
[root@k8s-produce-118 ~]# etcdctl member list
828b5bb8d2185604: name=k8s-produce-118 peerURLs=http://etcd-118:2380 clientURLs=http://etcd-118:2379,http://etcd-118:4001 isLeader=false
ac4878ce274a1536: name=k8s-master-116 peerURLs=http://etcd-116:2380 clientURLs=http://etcd-116:2379,http://etcd-116:4001 isLeader=true
d89e7051a2080b71[unstarted]: peerURLs=http://etcd-117:2380
c. 清空目标节点etcd3的data-dir
节点删除后,集群中的成员信息会更新,新节点是作为一个全新的节点加入集群,如果data-dir有数据,etcd启动时会读取己经存在的数据,仍然用老的memberID会造成无法加入集群,所以一定要清空新节点的data-dir。
rm -rf /var/lib/etcd/*
此时在目标节点上(注意是目标节点117上面操作)启动新增加的成员
117节点
vim /etc/etcd/etcd.conf
ETCD_INITIAL_CLUSTER_STATE="existing" new 改为existing
systemctl start etcd
d步骤是手动代替systemctl start etcd操作
d. 在目标节点上(注意是目标节点117上面操作)启动新增加的成员
这里的initial标记一定要指定为existing,如果为new,则会自动生成一个新的memberID,这和前面添加节点时生成的ID不一致,故日志中会报节点ID不匹配的错。
nohup ./etcd3.sh &
把下面的内存复制到etcd3.sh
etcd --name k8s-produce-117 --data-dir /var/lib/etcd/default.etcd --advertise-client-urls http://etcd-117:2379,http://etcd-117:4001 --listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 --initial-advertise-peer-urls http://etcd-117:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster-token etcd-cluster --initial-cluster k8s-master-116=http://etcd-116:2380,k8s-produce-117=http://etcd-117:2380,k8s-produce-118=http://etcd-118:2380 --initial-cluster-state existing
etcdctl member list
顺序一定是先加入成员,在启动etcd服务
etcdctl member add(任意节点【除了移除的节点外】)
rm -rf /var/lib/etcd/* (在移除的节点操作)
systemctl start etcd(在移除的几点操作)
REST API
# curl http://10.30.30.116:2379/v2/members
{"members":[{"id":"31f09ad1008e83e0","name":"k8s-produce-117","peerURLs":["http://etcd-117:2380"],"clientURLs":["http://etcd-117:2379","http://etcd-117:4001"]},{"id":"828b5bb8d2185604","name":"k8s-produce-118","peerURLs":["http://etcd-118:2380"],"clientURLs":["http://etcd-118:2379","http://etcd-118:4001"]},{"id":"ac4878ce274a1536","name":"k8s-master-116","peerURLs":["http://etcd-116:2380"],"clientURLs":["http://etcd-116:2379","http://etcd-116:4001"]}]}
1
查看集群成员,其中,id是集群成员的全局唯一的身份标识,name是成员的名字,peerURLs是成员之间通信的入口,clientURLs是成员跟用户通信的访问入口
nohup——真正的Shell后台运行
# nohup /path/to/start_etcd.sh>/dev/null &
https://blog.csdn.net/yjk13703623757/article/details/54142242/