一、etcd安装
yum install -y etcd
安装etcd
或者https://github.com/coreos/etcd/releases/ 下载最新的文件,解压即可运行
#! /bin/bash ETCD_VER=v3.3.13 INSTALL_PATH=/tmp/install/etcd.$ETCD_VER if [ -d "$INSTALL_PATH" ]; then rm -rf $INSTALL_PATH fi mkdir -p "$INSTALL_PATH" # choose either URL GOOGLE_URL=https://storage.googleapis.com/etcd DOWNLOAD_URL=${GOOGLE_URL} SAVE_TAR_GZ=$INSTALL_PATH/etcd-${ETCD_VER}-linux-amd64.tar.gz if [ ! -f $SAVE_TAR_GZ ]; then curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o $SAVE_TAR_GZ fi tar xzvf $SAVE_TAR_GZ -C $INSTALL_PATH --strip-components=1 rm -f $SAVE_TAR_GZ $INSTALL_PATH/etcd --version ETCDCTL_API=3 $INSTALL_PATH/etcdctl versioner
二、启动
可以直接./etcd,配置集群时添加参数如下:
ETCD_VER=v3.3.13
CUR_DIR=$(cd `dirname $0` && pwd)
INSTALL_PATH=$CUR_DIR/etcd.$ETCD_VER
DATA_PATH=$CUR_DIR/data/`hostname`.etcd
HOSTS=`cat ./cluster.hosts`$INSTALL_PATH/etcd
–listen-client-urls http://$ETCD_IP:2379,http://127.0.0.1:2379
–advertise-client-urls http://$ETCD_IP:2379,http://127.0.0.1:2379
–initial-cluster-token etcd_service
–listen-peer-urls http://$ETCD_IP:2380
–initial-advertise-peer-urls http://$ETCD_IP:2380
–initial-cluster-state new
–initial-cluster $CLUSTER_HOSTS
–name $ETCD_NAME
刚开始启动集群的时候,如果还要其他机器未起来,集群处于不可用状态,等其他host的服务都起来了,服务才可用
防火墙
在这3台node服务器开放2379、2380端口,命令:
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2379 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2380 -j ACCEPT
三、检验是否启动成功
etcdctl member list
使用curl访问:
curl http://10.10.0.14:2379/v2/members
四、etcd备份
使用etcd自带命令etcdctl
进行etc备份,脚本如下:
etcdctl backup –data-dir /usr/local/etcd/niub3.etcd/ –backup-dir /niub/etcd_backup/${date_time}
五、etcdctl操作
更新一个节点
如果你想更新一个节点的 IP(peerURLS),首先你需要知道那个节点的 ID。你可以列出所有节点,找出对应节点的 ID。
$ etcdctl member list
6e3bd23ae5f1eae0: name=node2 peerURLs=http://localhost:23802 clientURLs=http://127.0.0.1:2379
2924e2e83e93f2560: name=node3 peerURLs=http://localhost:23803 clientURLs=http://127.0.0.1:2379
3a8266ecf031671f3: name=node1 peerURLs=http://localhost:23801 clientURLs=http://127.0.0.1:2379
在本例中,我们假设要更新 ID 为 a8266ecf031671f3
的节点的 peerURLs 为:http://10.0.1.10:2380
$ etcdctl member update a8266ecf031671f3 http://10.0.1.10:2380
Updated member with ID a8266ecf031671f3 in cluster
删除一个节点
假设我们要删除 ID 为 a8266ecf031671f3
的节点
$ etcdctl member remove a8266ecf031671f3
Removed member a8266ecf031671f3 from cluster
执行完后,目标节点会自动停止服务,并且打印一行日志
如果删除的是 leader
节点,则需要耗费额外的时间重新选举 leader
增加一个新的节点
增加一个新的节点分为两步:
- 通过
etcdctl
或对应的 API 注册新节 - 使用恰当的参数启动新节点
先看第一步,假设我们要新加的节点取名为 infra3, peerURLs
是 http://10.0.1.13:2380
$ etcdctl member add infra3 http://10.0.1.13:2380
ETCD_NAME=“infra3”
ETCD_INITIAL_CLUSTER=”infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380,infra3=http://10.0.1.13:2380″
ETCD_INITIAL_CLUSTER_STATE=existing
etcdctl
在注册完新节点后,会返回一段提示,包含3个环境变量。然后在第二部启动新节点的时候,带上这3个环境变量即可。
$ export ETCD_NAME=“infra3”
$ export ETCD_INITIAL_CLUSTER=”infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380,infra3=http://10.0.1.13:2380″
$ export ETCD_INITIAL_CLUSTER_STATE=existing
$ etcd -listen-client-urls http://10.0.1.13:2379 -advertise-client-urls http://10.0.1.13:2379 -listen-peer-urls http://10.0.1.13:2380 -initial-advertise-peer-urls http://10.0.1.13:2380 -data-dir %data_dir%
值得注意的是,如果原先的集群只有1个节点,在新节点成功启动之前,新集群并不能正确的形成。因为原先的单节点集群无法完成leader
的选举。
直到新节点启动完,和原先的节点建立连接以后,新集群才能正确形成。
六、服务故障恢复
在使用etcd集群的过程中,有时会出现少量主机故障,这时我们需要对集群进行维护。然而,在现实情况下,还可能遇到由于严重的设备 或网络的故障,导致超过半数的节点无法正常工作。
在etcd集群无法提供正常的服务,我们需要用到一些备份和数据恢复的手段。etcd背后的raft,保证了集群的数据的一致性与稳定性。所以我们对etcd的恢复,更多的是恢复etcd的节点服务,并还原用户数据
首先,从剩余的正常节点中选择一个正常的成员节点, 使用 etcdctl backup
命令备份etcd数据。
$ ./etcdctl backup –data-dir /var/lib/etcd -backup-dir /tmp/etcd_backup
$ tar -zcxf backup.etcd.tar.gz /tmp/etcd_backup
这个命令会将节点中的用户数据全部写入到指定的备份目录中,但是节点ID,集群ID等信息将会丢失, 并在恢复到目的节点时被重新。这样主要是防止原先的节点意外重新加入新的节点集群而导致数据混乱。
然后将Etcd数据恢复到新的集群的任意一个节点上, 使用 --force-new-cluster
参数启动Etcd服务。这个参数会重置集群ID和集群的所有成员信息,其中节点的监听地址会被重置为localhost:2379, 表示集群中只有一个节点。
$ tar -zxvf backup.etcd.tar.gz -C /var/lib/etcd
$ etcd –data-dir=/var/lib/etcd —force–new-cluster …
启动完成单节点的etcd,可以先对数据的完整性进行验证, 确认无误后再通过Etcd API修改节点的监听地址,让它监听节点的外部IP地址,为增加其他节点做准备。例如:
用etcd命令找到当前节点的ID。
$ etcdctl member list
98f0c6bf64240842: name=cd-2 peerURLs=http://127.0.0.1:2580 clientURLs=http://127.0.0.1:2579
由于etcdctl不具备修改成员节点参数的功能, 下面的操作要使用API来完成。
$ curl http://127.0.0.1:2579/v2/members/98f0c6bf64240842 -XPUT \ -H “Content-Type:application/json” -d ‘{“peerURLs”:[“http://127.0.0.1:2580”]}’
注意,在Etcd文档中, 建议首先将集群恢复到一个临时的目录中,从临时目录启动etcd,验证新的数据正确完整后,停止etcd,在将数据恢复到正常的目录中。
最后,在完成第一个成员节点的启动后,可以通过集群扩展的方法使用 etcdctl member add
命令添加其他成员节点进来。
七、扩展etcd集群
在集群中的任何一台etcd节点上执行命令,将新节点注册到集群:
curl http:
//127
.0.0.1:2379
/v2/members
-XPOST -H
"Content-Type: application/json"
-d
'{"peerURLs": ["http://192.168.73.172:2380"]}'
在新节点上启动etcd容器,注意-initial-cluster-state参数为existing
/usr/local/etcd/etcd \
-name etcd03 \
-advertise-client-urls http:
//192
.168.73.150:2379,http:
//192
.168.73.150:4001 \
-listen-client-urls http:
//0
.0.0.0:2379 \
-initial-advertise-peer-urls http:
//192
.168.73.150:2380 \
-listen-peer-urls http:
//0
.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster
"etcd01=http://192.168.73.140:2380,etcd02=http://192.168.73.137:2380,etcd03=http://192.168.73.150:2380"
\
-initial-cluster-state existing
Etcd数据迁移
数据迁移
在 gzns-inf-platform53.gzns.baidu.com 机器上运行着一个 etcd 服务器,其 data-dir 为 /var/lib/etcd/。我们要以 /var/lib/etcd 中的数据为基础,搭建一个包含三个节点的高可用的 etcd 集群,三个节点的主机名分别为:
gzns-inf-platform53.gzns.baidu.com gzns-inf-platform56.gzns.baidu.com gzns-inf-platform60.gzns.baidu.com
大体思路
先通过 –force-new-cluster 强行拉起一个 etcd 集群,抹除了原有 data-dir 中原有集群的属性信息(内部猜测),然后通过加入新成员的方式扩展这个集群到指定的数目。