etcd集群
This is the documentation for etcd2 releases. Read etcd3 doc for etcd3 releases.
集群指南
概观
静态启动etcd集群需要每个成员都知道集群中的另一个成员。在许多情况下,集群成员的IP可能未知。在这些情况下,可以在发现服务的帮助下引导etcd集群。
一旦etcd集群启动并运行,就可以通过 runtime reconfiguration. 添加或删除成员。为了更好地理解运行时重配置的设计,我们建议阅读 the runtime configuration design document.
本指南将介绍以下引导一个etcd集群的机制:
每个引导机制都将用于创建三台机器的etcd集群,其中包含以下详细信息:
名称 | 地址 | 主机名 |
---|---|---|
infra0 | 10.0.1.10 | infra0.example.com |
infra1 | 10.0.1.11 | infra1.example.com |
infra2 | 10.0.1.12 | infra2.example.com |
静态的
正如我们在启动之前知道集群成员,集群地址和集群大小一样,我们可以通过设置initial-cluster
标志来使用脱机引导配置。每台机器都将获得以下环境变量或命令行:
ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
请注意,在中指定的URL initial-cluster
是通告的对等URL,即它们应该匹配initial-advertise-peer-urls
各个节点上的值。
如果为了测试目的而旋转多个集群(或创建并销毁单个集群)具有相同的配置,强烈建议您initial-cluster-token
为不同的集群指定一个唯一的集群。通过这样做,etcd可以为集群生成唯一的集群ID和成员ID,即使它们具有完全相同的配置。这可以保护您免受可能破坏集群的跨集群交互。
etcd监听listen-client-urls
接受客户端流量。etcd成员将指定的URL广告advertise-client-urls
给其他成员,代理,客户端。请确保advertise-client-urls
可以从预期的客户到达。常见的错误是设置advertise-client-urls
为localhost,或者当您希望远程客户端到达etcd时将其保留为默认值。
在每台机器上,您都可以使用这些标志启动etcd:
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
--initial-cluster
在随后的etcd运行中,以开头的命令行参数将被忽略。初始引导过程后,您可以*删除环境变量或命令行标志。如果稍后需要对配置进行更改(例如,将成员添加到集群或从集群删除成员),请参阅运行时配置指南。
错误案例
在下面的例子中,我们没有将我们的新主机包含在枚举节点列表中。如果这是一个新集群,则该节点必须添加到初始集群成员列表中。
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls https://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--initial-cluster infra0=http://10.0.1.10:2380 \
--initial-cluster-state new
etcd: infra1 not listed in the initial cluster config
exit 1
在这个例子中,我们试图将一个节点(infra0)映射到不同的地址(127.0.0.1:2380),而不是它在集群列表(10.0.1.10:2380)中的枚举地址。如果此节点要侦听多个地址,则所有地址必须反映在“initial-cluster”配置指令中。
$ etcd --name infra0 --initial-advertise-peer-urls http://127.0.0.1:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state=new
etcd: error setting up initial cluster: infra0 has different advertised URLs in the cluster and advertised peer URLs list
exit 1
如果您使用不同的配置集配置对等设备并尝试加入此群集,则会出现群集ID不匹配,并且etcd将退出。
$ etcd --name infra3 --initial-advertise-peer-urls http://10.0.1.13:2380 \
--listen-peer-urls http://10.0.1.13:2380 \
--listen-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.13:2379 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra3=http://10.0.1.13:2380 \
--initial-cluster-state=new
etcd: conflicting cluster ID to the target cluster (c6ab534d07e8fcc4 != bc25ea2a74fb18b0). Exiting.
exit 1
发现
在许多情况下,您可能未提前知道集群对等方的IP。这在使用云提供商或您的网络使用DHCP时很常见。在这些情况下,您可以使用现有的etcd集群来引导新的集群,而不是指定静态配置。我们称这个过程为“发现”。
有两种可用于发现的方法:
- etcd发现服务
- DNS SRV记录
etcd发现
为了更好地理解有关发现服务协议的设计,我们建议您阅读它。
发现网址的有效期
发现URL标识唯一的etcd群集。您应该始终为新群集创建发现URL,而不是重复使用发现URL。
而且,发现URL只能用于群集的初始引导。要在群集已经运行后更改群集成员身份,请参阅运行时重新配置指南。
自定义etcd发现服务
Discovery使用现有群集自行引导。如果您使用自己的etcd集群,则可以创建如下所示的URL:
$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
通过将大小关键字设置为URL,您可以创建一个预期簇大小为3的发现URL。
如果使用发现服务引导etcd集群的次数超过预期的etcd成员数量,则额外的etcd进程将默认回退为代理服务器。
在这种情况下您将使用的URL将是https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
etcd成员将在https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
开始时使用该目录进行注册。
每个成员必须指定不同的名称标志。Hostname
或者machine-id
可以是一个不错的选择。或者发现将由于重复的名称而失败。
现在我们用每个成员的相关标志开始etcd:
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
这将导致每个成员向自定义etcd发现服务注册自己,并在所有机器注册后开始集群。
公共etcd发现服务
如果您无权访问现有群集,则可以使用托管于的公共发现服务discovery.etcd.io。您可以使用“新”端点创建私人发现网址,如下所示:
$ curl https://discovery.etcd.io/new?size=3
https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
这将创建初始预期大小为3个成员的群集。如果您未指定大小,则将使用默认值3。
如果使用发现服务引导etcd集群的次数超过预期的etcd成员数量,则额外的etcd进程将默认回退为代理服务器。
ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
-discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
每个成员必须指定不同的名称标志。Hostname或者machine-id可以是一个不错的选择。或者发现将由于重复的名称而失败。
现在我们用每个成员的相关标志开始etcd:
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
这将导致每个成员在发现服务中注册自己,并在所有成员注册后开始集群。
您可以使用环境变量ETCD_DISCOVERY_PROXY使etcd使用HTTP代理连接到发现服务。
错误和警告事例
发现服务器错误
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
etcd: error: the cluster doesn’t have a size configuration value in https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de/_config
exit 1
用户错误
如果发现群集已经具有配置数量的成员并且discovery-fallback被明确禁用,则会发生此错误
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \
--discovery-fallback exit
etcd: discovery: cluster is full
exit 1
警告
这是一个无害的警告,通知您此计算机上的发现URL将被忽略。
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
etcdserver: discovery token ignored since a cluster has already been initialized. Valid log found at /var/lib/etcd
DNS发现
DNS SRV记录可以用作发现机制。该-discovery-srv
标志可用于设置发现SRV记录的DNS域名。以列出的顺序查找以下DNS SRV记录:
- _etcd-server-ssl._tcp.example.com
- _etcd-server._tcp.example.com
如果_etcd-server-ssl._tcp.example.com找到,etcd将尝试通过SSL进行引导过程。
为帮助客户端发现etcd集群,以列出的顺序查找以下DNS SRV记录:
- _etcd-client._tcp.example.com
- _etcd-client-ssl._tcp.example.com
如果_etcd-client-ssl._tcp.example.com找到,客户端将尝试通过SSL与etcd集群进行通信。
该-discovery-srv-name标志还为发现期间查询的SRV名称配置后缀。使用此标志来区分同一个域下的多个etcd群集。例如,如果discovery-srv=example.com和-discovery-srv-name=foo设置,下面的DNS SRV查询由:
- _etcd-server-ssl-foo._tcp.example.com
- _etcd-server-foo._tcp.example.com
创建DNS SRV记录
$ dig +noall +answer SRV _etcd-server._tcp.example.com
_etcd-server._tcp.example.com. 300 IN SRV 0 0 2380 infra0.example.com.
_etcd-server._tcp.example.com. 300 IN SRV 0 0 2380 infra1.example.com.
_etcd-server._tcp.example.com. 300 IN SRV 0 0 2380 infra2.example.com.
$ dig +noall +answer SRV _etcd-client._tcp.example.com
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra0.example.com.
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra1.example.com.
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra2.example.com.
$ dig +noall +answer infra0.example.com infra1.example.com infra2.example.com
infra0.example.com. 300 IN A 10.0.1.10
infra1.example.com. 300 IN A 10.0.1.11
infra2.example.com. 300 IN A 10.0.1.12
使用DNS引导etcd集群
etcd集群成员可以监听域名或IP地址,引导进程将解析DNS A记录。
已解析的地址--initial-advertise-peer-urls 必须与 SRV目标中已解析的地址之一匹配。etcd成员读取已解析的地址,以确定它是否属于在SRV记录中定义的集群。
$ etcd --name infra0 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra0.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra0.example.com:2379 \
--listen-client-urls http://infra0.example.com:2379 \
--listen-peer-urls http://infra0.example.com:2380
$ etcd --name infra1 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra1.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra1.example.com:2379 \
--listen-client-urls http://infra1.example.com:2379 \
--listen-peer-urls http://infra1.example.com:2380
$ etcd --name infra2 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra2.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra2.example.com:2379 \
--listen-client-urls http://infra2.example.com:2379 \
--listen-peer-urls http://infra2.example.com:2380
您还可以使用IP地址而不是域名引导群集:
$ etcd --name infra0 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.10:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.10:2379 \
--listen-client-urls http://10.0.1.10:2379 \
--listen-peer-urls http://10.0.1.10:2380
$ etcd --name infra1 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.11:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.11:2379 \
--listen-client-urls http://10.0.1.11:2379 \
--listen-peer-urls http://10.0.1.11:2380
$ etcd --name infra2 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.12:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.12:2379 \
--listen-client-urls http://10.0.1.12:2379 \
--listen-peer-urls http://10.0.1.12:2380
etcd代理配置
DNS SRV记录也可用于配置以代理模式运行的etcd服务器的对等端列表:
$ etcd --proxy on --discovery-srv example.com
etcd客户端配置
DNS SRV记录也可以用来帮助客户端发现etcd集群。
etcdctl
通过指定--discovery-srv
选项还支持DNS发现。
$ etcdctl --discovery-srv example.com set foo bar
错误案例
您可能会看到类似的错误cannot find local etcd $name from SRV records.。这意味着etcd成员无法从SRV记录中定义的集群中找到自己。已解析的地址--initial-advertise-peer-urls 必须与 SRV目标中已解析的地址之一匹配。
0.4至2.0+的迁移指南
在etcd 2.0中,我们引入了侦听多个地址并发布多个地址的功能。当你有复杂的网络时,这使得使用etcd更容易,比如各种云提供商的私有和公共网络。
为了更容易理解这个特性,我们改变了一些标志的命名,但是我们支持旧的标志使得从旧版到新版的迁移更容易。
Old Flag | New Flag | Migration Behavior |
---|---|---|
-peer-addr | --initial-advertise-peer-urls | If specified, peer-addr will be used as the only peer URL. Error if both flags specified. |
-addr | --advertise-client-urls | If specified, addr will be used as the only client URL. Error if both flags specified. |
-peer-bind-addr | --listen-peer-urls | If specified, peer-bind-addr will be used as the only peer bind URL. Error if both flags specified. |
-bind-addr | --listen-client-urls | If specified, bind-addr will be used as the only client bind URL. Error if both flags specified. |
-peers | none | Deprecated. The --initial-cluster flag provides a similar concept with different semantics. Please read this guide on cluster startup. |
-peers-file | none | Deprecated. The --initial-cluster flag provides a similar concept with different semantics. Please read this guide on cluster startup. |
上一篇: PyQt5的信号和槽