etcd安装
etcd有三种集群化启动的配置方案,分别为静态配置启动、etcd自身服务发现、通过DNS进行服务发现,重点讲一下静态配置启动。
根据启动环境,可以选择不同的配置方式。这也是新版etcd区别于旧版的一大特性,它摈弃了使用配置文件进行参数配置的做法,转而使用命令行参数或环境变量来配置参数。
1. 静态配置启动
比较适合于离线环境,在启动整个集群之前,如果已经预先清楚锁要配置的集群大小,以及集群上各节点的地址和端口信息,那么启动时,你就可以通过配置initial-cluster参数进行etcd集群的启动。
在每个etcd机器启动时,配置环境变量或添加启动参数的方式如下:
ETCD_INITIAL_CLUSTER="etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new
参数方法:
-initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
-initial-cluster-state new
-initial-cluster参数中配置的url地址必须与各个节点启动时设置的initial-advertise-peer-urls参数相同。initial-advertise-peer-urls参数表示节点监听其他节点同步信号的地址。
如果你所在的网络环境配置了多个etcd集群,为了避免意外发生,最好使用initial-cluster-token参数为每一集群单独配置一个token认证。这样就可以确保每个集群和集群的成员都拥有独特的ID。
综上所述,如果你要配置包含3个etcd节点的集群,那么你在3个机器上的启动命令分别如下所示
$ etcd -name etcd0 -initial-advertise-peer-urls http://10.0.1.10:2380 \
-listen-peer-urls http://10.0.1.10:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://10.0.1.10:2380,etcd=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
-initial-cluster-state new
$ etcd -name etcd1 -initial-advertise-peer-urls http://10.0.1.11:2380 \
-listen-peer-urls http://10.0.1.11:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
-initial-cluster-state new
$ etcd -name etcd2 -initial-advertise-peer-urls http://10.0.1.12:2380 \
-listen-peer-urls http://10.0.1.12:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
-initial-cluster-state new
在初始化完成后,etcd还提供动态增、删、改etcd集群节点的功能,这个需要用到etcdctl命令进行操作。
补充常见参数的解释:
-name:本member的名字。
-initial-advertise-peer-urls:其他member使用,其他member通过该地址与本member交互信息。
-listen-peer-urls:本member侧使用,用于监听其他member发送信息的地址。
-listen-client-urls:本member侧使用,用于监听etcd客户发送信息的地址。该地址用于ASR业务访问。
-advertise-client-urls:etcd客户使用,客户通过该地址与本member交互信息,一定要保证从客户侧能可访问该地址。
-initial-cluster-state:填new。
-initial-cluster:本member侧使用。描述集群中所有节点的信息,本member根据此信息去联系其他member。
-data-dir:指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件等。
检查集群成员状态:
./etcdctl --endpoints=http://10.1.92.192:23000 member list
2. 运行时节点变更
etcde集群启动完毕后,可以在运行的过程中对集群进行重构,包括核心节点的增加、删除、迁移、替换等。
只有当集群中多数节点正常的情况下,才可以进行运行时的配置管理。因为配置更改的信息也会被etcd当成一个信息存储和同步,如果集群多数节点损坏,集群就失去了写入数据的能力。所以在配置etcd集群数量时,强烈推荐至少配置3个核心节点,配置数量越多,可用性越强。
2.1 节点迁移、替换
当你节点所在的机器出现硬件故障,或节点出现如数据目录损坏等问题,导致节点永久性的不可恢复时,就需要对节点进行迁移或替换。当一个节点失效以后,必须尽快修复,因为etcd集群正常运行的必要条件是集群中多数节点都正常工作。迁移一个节点需要进行4个步骤:
(1)暂停正在运行着的节点程序进程
(2)把数据目录从现有机器拷贝到新机器
(3)使用API更新etcd中对应节点指向机器的url记录更新为新机器的IP
(4)使用同样的配置项和数据目录,在新的机器上启动etcd
2.2 节点增加
增加节点可以让etcd的高可用性更强。如果有3个节点,那么最多允许1个节点失效;如果有5个节点,就可以允许有2个节点失效。同时,增加节点还可以让etcd集群具有更好的读性能。因为etcd的节点都是实时同步的,每个节点上都存储了所有的信息,所以增加节点可以从整体上提升读的吞吐量。
增加一个节点需要进行两步操作:
(1)在集群中增加这个节点的url记录,同时获得集群的信息
(2)使用获得的集群信息启动新etcd节点
实例操作:
其中endpoints是整个etcd集群的leader地址,-initial-cluster-state设置为existing。现在利用命令把节点信息加入集群./etcdctl --endpoints=http://10.31.10.19:13000 member add http://10.31.10.19.53001。
2.3 节点移除
有时你不得不在提高etcd的写性能和增加集群高可用性上进行权衡。Leader节点在提交一个写记录时,会吧这个信息同步到每个节点上,当得到多数节点的同意反馈后,才会真正写入数据。所以节点越多,写入性能越差。在节点过多时,你可能需要移除其中的一个或多个。移除节点非常简单,只需要一步操作,就是把集群中这个节点的记录删除,则对应机器上的该节点就会自动停止。
实例操作:
其中endpoints是整个etcd集群的leader地址./etcdctl --endpoints=http://10.31.10.19:13000 member remove 17d2d3fed8c2dda7
注意:执行member remove对应节点etcd的进程会自动销毁,不需要再去停止线程。