0. 引入
在实际生产环境中,为了整个集群的高可用,etcd通常都会以集群方式部署,以避免单点故障。
etcd构建自身高可用集群主要有三种形式:
静态配置:预先已知etcd集群中有哪些节点,在启动时通过--initial-cluster参数直接指定好各节点地址etcd动态发现:静态配置前提是在搭建集群之前已经提前知道各节点的信息,而实际应用中可能存在预先并不知道各节点ip的情况,这时可通过已经搭建的etcd来辅助搭建新的etcd集群。通过已有的etcd集群作为数据交互点,在扩展新的集群时,通过已有集群进行服务发现的机制。DNS动态发现:通过DNS查询方式获取其他节点地址信息
以下内容都是在三台虚拟机上运行
| name | ip |
|---|---|
| infra1 | 192.168.99.131 |
| infra2 | 192.168.99.132 |
| infra3 | 192.168.99.133 |
1. 静态配置
#etcd1
etcd --name infra1 --listen-client-urls http://192.168.99.131:2379 --advertise-client-urls http://192.168.99.131:2379 --listen-peer-urls http://192.168.99.131:2380 --initial-advertise-peer-urls http://192.168.99.131:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://192.168.99.131:2380,infra2=http://192.168.99.132:2380,infra3=http://192.168.99.133:2380' --initial-cluster-state new
#etcd2
etcd --name infra2 --listen-client-urls http://192.168.99.132:2379 --advertise-client-urls http://192.168.99.132:2379 --listen-peer-urls http://192.168.99.132:2380 --initial-advertise-peer-urls http://192.168.99.132:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://192.168.99.131:2380,infra2=http://192.168.99.132:2380,infra3=http://192.168.99.133:2380' --initial-cluster-state new
#etcd3
etcd --name infra3 --listen-client-urls http://192.168.99.133:2379 --advertise-client-urls http://192.168.99.133:2379 --listen-peer-urls http://192.168.99.133:2380 --initial-advertise-peer-urls http://192.168.99.133:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://192.168.99.131:2380,infra2=http://192.168.99.132:2380,infra3=http://192.168.99.133:2380' --initial-cluster-state new
访问任意一个etcd server获取集群member信息
etcdctl --endpoints=192.168.99.131:2379 member list
2. etcd动态发现
使用已有的 etcd cluster 来注册和启动
实现机制
Discovery Service Protocol 帮助新的Etcd成员使用共享URL在集群引导阶段发现其他成员。该协议使用新的发现令牌来引导一个唯一的etcd集群,一个发现令牌只能代表一个etcd集群,只要此令牌上的发现协议启动,即使它中途失败,也不能用于引导另一个etcd集群。
协议的工作流程
Discovery protocol 使用内部etcd集群来协调新集群的引导程序。首先,所有新成员都与发现服务交互,并帮助生成预期的成员列表。然后每个新成员使用此列表引导其服务器,该列表执行与--initial-cluster标志相同的功能,即设置所有集群的成员信息。
Discovery service protocol 仅用于集群引导阶段,不能用于运行时重新配置或集群监视。
先使用公共etcd发现服务生成url
$ curl https://discovery.etcd.io/new?size=3
https://discovery.etcd.io/21c592d56701d2d081f78277348e87b8
#etcd1
etcd --name infra1 --listen-client-urls http://192.168.99.131:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.99.131:2379 --listen-peer-urls http://192.168.99.131:2380 --initial-advertise-peer-urls http://192.168.99.131:2380 --discovery https://discovery.etcd.io/21c592d56701d2d081f78277348e87b8
#etcd2
etcd --name infra2 --listen-client-urls http://192.168.99.132:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.99.132:2379 --listen-peer-urls http://192.168.99.132:2380 --initial-advertise-peer-urls http://192.168.99.132:2380 --discovery https://discovery.etcd.io/21c592d56701d2d081f78277348e87b8
#etcd3
etcd --name infra3 --listen-client-urls http://192.168.99.133:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.99.133:2379 --listen-peer-urls http://192.168.99.133:2380 --initial-advertise-peer-urls http://192.168.99.133:2380 --discovery https://discovery.etcd.io/21c592d56701d2d081f78277348e87b8
获取节点列表,由于我们在listen-client-urls中添加了127.0.0.1,所以不用添加endpoints
etcdctl member list
3.DNS动态发现
略