目录
1.etcd 简介
etcd是一个高可用的分布式的键值对存储系统,常用做配置共享和服务发现,由CoreOS公司发起的一个开源项目,受到ZooKeeper与doozer启发而催生的项目,名称”etcd”源自两个想法,即Unix的”/etc”文件夹和”d”分布式系统。”/etc”文件夹是用于存储单个系统的配置数据的地方,而etcd用于存储大规模分布式的配置信息,etcd有如下特点:
- 简单:基于HTTP+JSON的API,用curl就可以轻松使用。
- 可信:使用Raft算法充分实现了分布式。
- 安全:可选SSL客户认证机制。
- 快速:每个节点可支持上万QPS读写。
etcd有V2和V3两个版本,V3版本供了更多功能并提高了性能,应用程序使用新的grpc API访问mvcc存储,mvcc存储区和旧存储区v2是分开且隔离的,写入存储v2不会影响mvcc存储,写入mvcc存储也不会影响存储v2。
API v2和API v3之间存在一些显着差异:
- 事务:在v3中,etcd提供了多键条件事务。应用程序应使用事务代替Compare-And-Swap操作。
- 平面键空间:API v3中没有目录,只有键。例如,”/a/b/c/“是键。范围查询支持获取与给定前缀匹配的所有键。
- 紧凑的响应:delete操作不再返回以前的值。为了获得删除的值,可以使用事务原子地获取密钥,然后删除其值。
- 租约:替代v2 TTL;TTL绑定到租约,密钥附加到租约。TTL过期后,租约将被撤销,所有附加密钥也将被删除。
2. Raft选举算法
集群一般是由两个或两个以上的服务器组建而成,每个服务器都是一个节点。数据库集群、管理集群...数据库集群提供了读写功能,管理集群提供了管理、故障恢复等功能。
对于一个集群来说,多个节点的协同和管理是非常重要的。而主节点则实现了协同和管理,主节点的存在,就可以保证其他节点的有序运行,以及数据库集群中的写入数据在每个节点上 的一致性。
这里的一致性是指,数据在每个集群节点中都是一样的,不存在不同的情况。分布式选举的作用就是选出一个主节点,由它来协调和管理其他节点,以保证集群有序运行和节点间数据的一致性。
采用 Raft 算法选举,集群节点的角色有 3 种:
- Leader: 即主节点,同一时刻只有一个 Leader,负责协调和管理其他节点;
- Candidate: 即候选者,每一个节点都可以成为 Candidate,
- 节点在该角色下才可以被选为新的 Leader; Follower: Leader 的跟随者,不可以发起选举。
选举特点如下:
- 当集群初始化时候,每个节点都是Follower角色。
- 集群中存在至多1个有效的主节点,通过心跳与其他节点同步数据;
- 当Follower在一定时间内没有收到来自主节点的心跳,会将自己角色改变为Candidate,并发起一次选举投票。
- 当收到包括自己在内超过半数节点赞成后,选举成功。
- 当收到票数不足半数选举失败,或者选举超时。
- 若本轮未选出主节点,将进行下一轮选举(出现这种情况,是由于多个节点同时选举,所有节点均为获得过半选票)。
- Candidate节点收到来自主节点的信息后,会立即终止选举过程,进入Follower角色。
为了避免陷入选举失败循环,每个节点未收到心跳发起选举的时间是一定范围内的随机值,这样能够避免2个节点同时发起选举。
3. etcd 安装
下载地址:Releases · etcd-io/etcd · GitHub
切换至etcd根目录,将etcd和etcdctl二进制文件复制到/usr/local/bin目录这样系统中可以直接调用etcd/etcdctl这两个程序
cp etcd etcdctl /usr/local/bin
输入命令etcd,即可启动一个单节点的etcd服务,ctrl+c即可停止服务
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: name = default
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: data dir = default.etcd
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: member dir = default.etcd/member
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: heartbeat = 100ms
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: election = 1000ms
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: snapshot count = 100000
xxxx-xx-xx xx:xx:xx.xxxxxx I | embed: advertise client URLs = http://localhost:2379
xxxx-xx-xx xx:xx:xx.xxxxxx I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32
建立etcd相关目录(即数据文件和配置文件的保存位置)
mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd/
创建etcd配置文件
vim /etc/etcd/etcd.conf
# 节点名称
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
4. etcd基本使用
增加和修改,如果存在则替换
etcdctl put <键名> <键值>
查询
etcdctl get <键名>
删除
etcdctl del <键名>
查看集群状态
etcdctl endpoint status --write-out=table
watch命令
watch是监听键或前缀发生改变的事件流。
# 对某个key监听操作,当/key1发生改变时,会返回最新值
etcdctl watch /key1
# 监听key前缀
etcdctl watch /key --prefix
# 监听到改变后执行相关操作
etcdctl watch /key1 -- etcdctl member list