etcd3 安装与运维

一、软件下载

etcd最新版可以从官网github中下载,地址是https://github.com/etcd-io/etcd/releases,本次安装使用的版本是当前最新版本v3.3.12

二、环境准备

要部署集群需要至少三台服务器,因为etcd是基于raft协议实现数据一致性,所以安装的节点数量最好是奇数,方便做选举。这里我们准备的三台服务器如下:

主机名IP地址
master0110.70.68.122
master0210.70.67.149
master0310.70.67.150

确保三台主机之间的网络可以互通。

三、安装

1. 安装

在主机上创建目录/opt/apps/etcd, 并在下面创建dataconf目录。

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 <destination>  &> /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的任何未提交的条目。从用户的角度来看,一些写入请求可能会超时,但是,没有提交的写入会丢失。

转载于:https://my.oschina.net/eonezhang/blog/3038156

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值