生产环境搭建etcd
以搭建3节点高可用ETCD集群为例,分别在三台主机上初始化ETCD1
,ETCD2
,ETCD3
作为机器IP地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| $ ETCD1=http://10.0.0.1 $ ETCD2=http://10.0.0.2 $ ETCD2=http://10.0.0.3
$ etcd --name etcd1 \ --initial-advertise-peer-urls $ETCD1:2380 \ --listen-peer-urls $ETCD1:2380 \ --listen-client-urls $ETCD1:2379,http://127.0.0.1:2379 \ --advertise-client-urls $ETCD1:2379 \ --initial-cluster-token etcd-cluster \ --initial-cluster etcd1=$ETCD1:2380,etcd2=$ETCD2:2380,etcd3=$ETCD3:2380 \ --auto-compaction-retention=1 \ --quota-backend-bytes=$((4*1024*1024*1024)) \ --initial-cluster-state new
$ etcd --name etcd2 \ --initial-advertise-peer-urls $ETCD2:2380 \ --listen-peer-urls $ETCD2:2380 \ --listen-client-urls $ETCD2:2379,http://127.0.0.1:2379 \ --advertise-client-urls $ETCD2:2379 \ --initial-cluster-token etcd-cluster \ --initial-cluster etcd1=$ETCD1:2380,etcd2=$ETCD2:2380,etcd3=$ETCD3:2380 \ --auto-compaction-retention=1 \ --quota-backend-bytes=$((4*1024*1024*1024)) \ --initial-cluster-state new
$ etcd --name etcd3 \ --initial-advertise-peer-urls $ETCD3:2380 \ --listen-peer-urls $ETCD3:2380 \ --listen-client-urls $ETCD3:2379,http://127.0.0.1:2379 \ --advertise-client-urls $ETCD3:2379 \ --initial-cluster-token etcd-cluster \ --initial-cluster etcd1=$ETCD1:2380,etcd2=$ETCD2:2380,etcd3=$ETCD3:2380 \ --auto-compaction-retention=1 \ --quota-backend-bytes=$((4*1024*1024*1024)) \ --initial-cluster-state new
$ etcdctl --endpoints=$ETCD1:2379 member list 400938f1eaf1d0ed: name=etcd3 peerURLs=http://10.0.0.1:2380 clientURLs=http://10.0.0.1:2379 isLeader=false bd0ff97b33ac1165: name=etcd2 peerURLs=http://10.0.0.2:2380 clientURLs=http://10.0.0.2:2379 isLeader=false be62429afec4445f: name=etcd1 peerURLs=http://10.0.0.3:2380 clientURLs=http://10.0.0.3:2379 isLeader=true
|
历史记录压缩
如果将etcd用作服务发现,每次服务注册和更新都可以看做一条新数据,日积月累,这些数据的量会导致etcd占用内存越来越大,直到etcd到达空间配额限制的时候,etcd的写入将会被静止,影响线上服务,定期删除历史记录就是避免这种情况。
1 2
| $ etcd --auto-compaction-retention=1
|
磁盘去碎片化
etcd官方是说在进行compaction操作之后,旧的revision被压缩,会产生内部的碎片,内部碎片是指空闲状态的,能被后端使用但是仍然消耗存储空间的磁盘空间。去碎片化实际上是将存储空间还给文件系统。
空间配额
空间配额用来保障集群可靠地进行操作。如果没有限制配额,当键空间变大之后,直到用光了磁盘空间,它就会影响etcd集群的表现。当任意节点超出空间配额, 那么它将进入维护状态,只接受读/删操作。只有释放了足够空间、去碎片化了后端数据库并且清理了空间配额之后,集群才能继续正常操作。
默认限制是2GB,可以通过--quota-backend-bytes
配置,最高上限为8GB。
1 2 3
| $ etcd --quota-backend-bytes=$((16*1024*1024)) $ ETCDCTL_API=3 etcdctl --write-out=table endpoint status
|
如果遇到空间配额不足的情况,那么需要对etcd进行操作。
1 2 3 4 5 6 7 8 9 10
| $ rev=$(ETCDCTL_API=3 etcdctl --endpoints=:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9]*')
$ ETCDCTL_API=3 etcdctl compact $rev
$ ETCDCTL_API=3 etcdctl defrag
$ ETCDCTL_API=3 etcdctl alarm disarm
$ ETCDCTL_API=3 etcdctl put newkey 123
|
快照备份
1 2 3 4 5 6 7
| $ etcdctl snapshot save backup.db $ etcdctl --write-out=table snapshot status backup.db +----------+----------+------------+------------+ | HASH | REVISION | TOTAL KEYS | TOTAL SIZE | +----------+----------+------------+------------+ | fe01cf57 | 10 | 7 | 2.1 MB | +----------+----------+------------+------------+
|
调优
跨数据中心时,需要调整心跳间隔和选举超时时间
默认的心跳时间是100ms,建议为round trip时间
默认选举超时是1000ms
参考
- 详细配置
- etcd运维