2019独角兽企业重金招聘Python工程师标准>>>
一、软件下载
etcd
最新版可以从官网github中下载,地址是https://github.com/etcd-io/etcd/releases
,本次安装使用的版本是当前最新版本v3.3.12
二、环境准备
要部署集群需要至少三台服务器,因为etcd
是基于raft
协议实现数据一致性,所以安装的节点数量最好是奇数,方便做选举。这里我们准备的三台服务器如下:
主机名 | IP地址 |
---|---|
master01 | 10.70.68.122 |
master02 | 10.70.67.149 |
master03 | 10.70.67.150 |
确保三台主机之间的网络可以互通。
三、安装
1. 安装
在主机上创建目录/opt/apps/etcd
, 并在下面创建data
和conf
目录。
2. 配置
- A.
master01
的配置文件/opt/apps/etcd/conf/config.yml
如下
name: etcd-1
data-dir: /opt/apps/etcd/data
listen-client-urls: http://10.70.68.122:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.70.68.122:2379,http://127.0.0.1:2379
listen-peer-urls: http://10.70.68.122:2380
initial-advertise-peer-urls: http://10.70.68.122:2380
initial-cluster: etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
- B.
master02
的配置文件/opt/apps/etcd/conf/config.yml
如下
name: etcd-2
data-dir: /opt/apps/etcd/data
listen-client-urls: http://10.70.67.149:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.70.67.149:2379,http://127.0.0.1:2379
listen-peer-urls: http://10.70.67.149:2380
initial-advertise-peer-urls: http://10.70.67.149:2380
initial-cluster: etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
- C.
master03
的配置文件/opt/apps/etcd/conf/config.yml
如下
name: etcd-3
data-dir: /opt/apps/etcd/data
listen-client-urls: http://10.70.67.150:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.70.67.150:2379,http://127.0.0.1:2379
listen-peer-urls: http://10.70.67.150:2380
initial-advertise-peer-urls: http://10.70.67.150:2380
initial-cluster: etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
- D. 更新
etcd
系统默认配置 我们要使用etcd v3
的版本,系统默认的版本是v2
,通过下面的命令修改配置。
vi /etc/profile
在文件末尾追加:
export ETCDCTL_API=3
使文件生效
source /etc/profile
- E. 配置
systemd
服务 vi/usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/opt/apps/etcd/
# User=etcd
ExecStart=/opt/apps/etcd/etcd --config-file=/opt/apps/etcd/conf/config.yml
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
- F.
Centos6
及以下版本使用service
方式管理etcd
启动脚本vi /etc/init.d/etcd
#!/bin/bash
#chkconfig: - 99 01
##
#description: Etcd Server
case $1 in
start)
/opt/apps/etcd/etcd --config-file=/opt/apps/etcd/conf/config.yml &
;;
stop)
ps -ef | grep etcd| grep -v grep | awk '{print $2}'| xargs kill -QUIT
;;
*)
echo Usage:`basename $0 start|stop|restart`
esac
修改权限chmod +x /etc/init.d/etcd
添加服务 chkconfig --add etcd
设置开机自启动 chkconfig --level 3 etcd on
验证启动情况 chkconfig --list etcd
- G. 启动集群
在所有结点上运行service etcd start
启动etcd
服务
四、测试
- 查看集群状态
etcdctl --write-out="table" --endpoints='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379' endpoint status
五、运维相关
A. 快照定期数据备份
crontab定期执行备份脚本,每半小时备份一次,本地、异地都备份。
#!/bin/bash
#
ETCDCTL_PATH='/opt/apps/etcd/etcdctl'
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
BACKUP_DIR='/opt/apps/backup'
DATE=`date +%Y%m%d-%H%M%S`
[ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR
export ETCDCTL_API=3;$ETCDCTL_PATH --endpoints=$ENDPOINTS snapshot save $BACKUP_DIR/snapshot-$DATE\.db
cd $BACKUP_DIR;ls -lt $BACKUP_DIR|awk '{if(NR>11){print "rm -rf "$9}}'|sh
B. 镜像集群备份
1. 实时全量数据同步
nohup etcdctl make-mirror &> /apps/logs/etcdmirror.log &
/apps/logs/etcdmirror.log会保存已经同步的key数量,每30s打印一次
2. 定期数据同步
crontab定期数据同步,为避免数据遭到误删除清空造成灾难性影响,可恢复上一个同步周期之前的数据
#!/bin/bash
#
ETCDCTL_PATH='/apps/svr/etcd/bin/etcdctl'
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
DEST_ENDPOINT='10.70.67.151:2389'
CMD="$ETCDCTL_PATH make-mirror --endpoints=$ENDPOINTS $DEST_ENDPOINT"
BaseName=$(basename $BASH_SOURCE)
export ETCDCTL_API=3
$CMD & echo $! > /tmp/$BaseName\.pid
sleep 90
kill `cat /tmp/$BaseName\.pid`
C. 镜像集群备份
1. 集群故障恢复
为了从灾难性故障中恢复,etcd v3提供了快照和恢复功能,以便在没有v3密钥数据丢失的情况下重新创建群集. 要恢复集群,只需要一个快照“db”文件。集群恢复将etcdctl snapshot restore创建新的etcd数据目录; 所有成员应该使用相同的快照进行恢复。恢复会覆盖某些快照元数据(特别是成员ID和群集ID); 该成员失去了其以前的身份。此元数据覆盖可防止新成员无意中加入现有群集。因此,为了从快照启动集群,还原必须启动新的逻辑集群。
在还原时可以选择验证快照完整性。如果使用快照etcdctl snapshot save,它将具有通过检查的完整性散列etcdctl snapshot restore。如果快照是从数据目录复制的(配置文件中的data-dir),则不存在完整性哈希,并且只能使用恢复--skip-hash-check。
etcdctl snapshot restore snapshot.db \
--name etcd-1 \
--initial-cluster etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380 \
--initial-advertise-peer-urls http://10.70.68.122:2380
etcdctl snapshot restore snapshot.db \
--name etcd-2 \
--initial-cluster etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380 \
--initial-advertise-peer-urls http://10.70.67.149:2380
etcdctl snapshot restore snapshot.db \
--name etcd-3 \
--initial-cluster etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380 \
--initial-advertise-peer-urls http://10.70.67.150:2380
待数据恢复完毕后,启动服务
service etcd start
D. 镜像集群备份
1. 集群维护
- 查看现有成员
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
etcdctl --write-out="table" --endpoints="$ENDPOINTS" member list
- 删除成员
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
etcdctl --endpoints="$ENDPOINTS" member remove memberid
- 新增成员
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
etcdctl --endpoints="$ENDPOINTS" member add member-name --peer-urls=http://10.70.67.150:2380
删除新增成员旧数据目录,并且启动新增成员etcd服务,加入集群时要改下配置文件,把初始化集群状态由new改成existing
E. etcd v2数据迁移到v3版本
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
# 迁移前,需要逐台服务停止
service etcd stop
# 迁移数据,数据目录根据实际填写
export ETCDCTL_API=3
etcdctl --endpoints=$ENDPOINT migrate --data-dir="/opt/apps/etcd/data" --wal-dir="/opt/apps/etcd/data/member/wal"
# 逐台服务启动
service etcd start
# 检查确认数据已经迁移
export ETCDCTL_API=3;etcdctl --endpoints=$ENDPOINTS get /foo
F. 历史数据压缩
key空间长期的时候,如果没有做压缩清理,到达上限的阈值时,集群会处于一个只能删除和读的状态,无法进行写操作。因此对集群的历史日志做一个压缩清理是很有必要。
数据压缩并不是清理现有数据,只是对数据的历史版本进行清理,清理后数据的历史版本将不能访问,但不会影响现有最新数据的访问。
- 手动压缩
#压缩清理revision为10之前的历史数据
etcdctl compaction 10
#访问revision10之前的数据会提示已经不存在
etcdctl get aa --rev=9
Error: etcdserver: mvcc: required revision has been compacted
- 自动压缩
使用--auto-compaction-retention=1
,表示每小时进行一次数据压缩。
- 碎片清理
进行compaction操作之后,旧的revision被压缩,会产生内部的碎片,内部碎片是指空闲状态的,能被后端使用但是仍然消耗存储空间的磁盘空间。去碎片化实际上是将存储空间还给文件系统。
etcdctl defrag
五、总结
- etcd集群恢复
etcd集群与zk集群相似,建议采用基数设备来搭建集群,可用性为(N-1)/2,假设集群数量N是3台设备,可最多可故障1台设备,而不影响集群使用。
- leader故障
当leader故障时,etcd集群会自动选择一个新leader,由于失败检测模型是基于超时的(heartbeat-interval),因此选举新leader需要大约选举超时。 在leader选举期间,集群不能处理任何写入操作。在选举期间发送的写入请求排队等待处理,直到选出新的leader。
已经发送给old leader但尚未提交的
文字可能会丢
。新leader有权重写old leader的任何未提交的条目。从用户的角度来看,一些写入请求可能会超时,但是,没有提交的写入会丢失。