etcd的proxy Mode

Proxy

etcd可以作为透明代理运行。这样做可以轻松地在您的基础架构中发现etcd,因为它可以作为本地服务在每台机器上运行。在这种模式下,etcd充当反向代理并将客户端请求转发到活动的etcd集群。 etcd代理不参与etcd集群的一致复制,因此既不增加韧性,也不会降低etcd集群的写入性能。

etcd目前支持两种代理模式:readwrite和readonly。默认模式是readwrite,它将读取和写入请求转发给etcd集群。只读etcd代理仅将读取请求转发给etcd集群,并将HTTP 501返回给所有写入请求。

代理将定期清理群集成员列表,以避免将所有连接发送给单个成员。

etcd代理使用的成员列表是在cluster里面通知的client的地址。这些client的URL在每个etcd集群成员的advertise-client-urls选项中指定。

一个etcd代理检查几个命令行选项来发现它的对等URL。按照优先顺序,这些选项是discoverydiscovery-srvinitial-clusterinitial-cluster选项设置为逗号分隔的一个或多个临时使用的etcd对等URL列表,以便发现永久群集。(这个设置和static的配置的集群一样)

在以这种方式建立对等URL列表之后,代理从第一可到达对等端检索客户端URL的列表(向cluster发送request,选择第一个response的对端Ip)。这些客户端URL由advertise-client-urls选项指定给etcd对等方。代理然后每隔30秒继续连接到第一个可访问的etcd集群成员,以刷新客户端URL列表。(防止数据一致发给一个node)

etcd代理不需要给予advertise-client-urls选项,因为它们从集群中检索此配置。这意味着必须为每个代理正确设置initial-cluster,而advertise-client-urls选项在非代理的节点上要保证设置的正确性。 否则,对任何etcd代理的请求将被不正确地转发。

请特别注意,不要将advertise-client-urls选项设置为指向代理自身的URL,因为这样的配置将导致代理进入循环,直到资源耗尽为止将请求转发给自身。 要纠正这两种情况,请停止etcd并使用正确的URL重新启动它。

下面的命令来声明etcd启动peer和proxy的不同:

# Use goreman to run `go get github.com/mattn/goreman`
etcd1: bin/etcd --name infra1 --listen-client-urls http://127.0.0.1:2379 --advertise-client-urls http://127.0.0.1:2379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
etcd2: bin/etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
etcd3: bin/etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
# in future, use proxy to listen on 2379
#proxy: bin/etcd --name infra-proxy1 --proxy=on --listen-client-urls http://127.0.0.1:2378 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --enable-pprof

总结一下etcd的 proxy的启动和peer的发现步骤:

1.etcd proxy将会执行下面的步骤来发现peer-urls:

    1.如果给proxy设置了discovery service, 那么就通过discovery service来发现cluster里面的非proxy的initial-advertise-peer-urls所有的URL。
    2.如果给proxy设置了discovery-srv,通过DNS发现peer-urls
    3.如果proxy设置了initial-cluster,那么将会变成peer-urls
    4.如果什么都没设置就采用默认的http://localhost:2380,http://localhost:7001.

2.peer-urls用来联系非proxy的cluster来发现他们的client-urls。因此client-urls是 所有cluter member的advertise-client-urls 集合

3.发给proxy的所有的request消息将被转发给client-urls

始终首先启动etcd集群成员(非proxy),然后任意的proxies。 代理必须能够到达群集成员以检索其配置,如果没有这种条件,那么将会尝试连接。 在任何代理之前启动成员可确保代理可以在稍后启动时发现客户端URL。

Using an etcd proxy

要以代理模式启动etcd,您需要提供三个标志:proxy,listen-client-urls和initial-cluster(或者discovery)。

要启动一个readwrite代理,请设置-proxy on;要启动只读代理,请设置-proxy readonly。

代理将监听listen-client-urls并将请求转发到从初始集群或发现url中发现的etcd集群。

Start an etcd proxy with a static configuration

静态配置proxy的时候只需要指定initial-cluster就行

etcd --proxy on \
--listen-client-urls http://127.0.0.1:2379 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380

Start an etcd proxy with the discovery service

如果你的etcd cluster 使用的是discovery service的部署方式,那么你也可以用discovery的方式启动proxy。
用discovery service启动proxy需要指定discovery 标志。proxy会一直等待etcd cluter的建立完成。然后开始转发请求信息。

etcd --proxy on \
--listen-client-urls http://127.0.0.1:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \

Fallback to proxy mode with discovery service

如果你cluster用的是discovery service模式,那么如果真实的节点的数目大于你配置的数目。那么多余的节点会自动变成readwrite的proxy模式。比如你配置的url的数量为5,但你有10个节点,那么其它5个会自动变为proxy的mdoe。当然你也可以使用discovery-fallback='exit' 来关闭这个功能。

Promote a proxy to a member of etcd cluster

proxy不参加etcd的同步,任何时候etcd都不会去主动把自己变为etcd的一个成员。如果你想添加proxy到etcd,需要下面四个步骤

use etcdctl to add the proxy node as an etcd member into the existing cluster
stop the etcd proxy process or service
remove the existing proxy data directory
restart the etcd process with new member configuration

例子

假设你有一个成员的cluster和一个proxy,信息如下:

NAME    ADDRESS
infra0  10.0.1.10
proxy0  10.0.1.11

当你完成下面操作,集群将变为两个成员的集群。

Add a new member into the existing cluster

首先你需要用etcdctl 来增加一个成员到cluster里面,它会输出对应新cluster数目的正确的配置信息:

$ etcdctl -endpoint http://10.0.1.10:2379 member add infra1 http://10.0.1.11:2380
added member 9bf1b35fc7761a23 to cluster

ETCD_NAME="infra1"
ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380"
ETCD_INITIAL_CLUSTER_STATE=existing

Stop the proxy process

停止proxy,我们可以擦出硬盘上的信息,然后重新导入新的配置。

ps aux | grep etcd
kill %etcd_proxy_pid%

如果用的systemd启动的etcd

sudo systemctl stop etcd

Remove the existing proxy data dir

rm -rf %data_dir%/proxy

Start etcd as a new member

最后,重新启动etcd用最新的配置:

$ export ETCD_NAME="infra1"
$ export ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380"
$ export ETCD_INITIAL_CLUSTER_STATE=existing
$ etcd --listen-client-urls http://10.0.1.11:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--listen-peer-urls http://10.0.1.11:2380 \
--initial-advertise-peer-urls http://10.0.1.11:2380 \
--data-dir %data_dir%

如果你用systemd跑的etcd,那么你可以编辑service 文件来得到正确的配置。然后使用下面命令

sudo systemd restart etcd# etcd的proxy Mode 

Proxy

etcd可以作为透明代理运行。这样做可以轻松地在您的基础架构中发现etcd,因为它可以作为本地服务在每台机器上运行。在这种模式下,etcd充当反向代理并将客户端请求转发到活动的etcd集群。 etcd代理不参与etcd集群的一致复制,因此既不增加韧性,也不会降低etcd集群的写入性能。

etcd目前支持两种代理模式:readwrite和readonly。默认模式是readwrite,它将读取和写入请求转发给etcd集群。只读etcd代理仅将读取请求转发给etcd集群,并将HTTP 501返回给所有写入请求。

代理将定期清理群集成员列表,以避免将所有连接发送给单个成员。

etcd代理使用的成员列表是在cluster里面通知的client的地址。这些client的URL在每个etcd集群成员的advertise-client-urls选项中指定。

一个etcd代理检查几个命令行选项来发现它的对等URL。按照优先顺序,这些选项是discoverydiscovery-srvinitial-clusterinitial-cluster选项设置为逗号分隔的一个或多个临时使用的etcd对等URL列表,以便发现永久群集。(这个设置和static的配置的集群一样)

在以这种方式建立对等URL列表之后,代理从第一可到达对等端检索客户端URL的列表(向cluster发送request,选择第一个response的对端Ip)。这些客户端URL由advertise-client-urls选项指定给etcd对等方。代理然后每隔30秒继续连接到第一个可访问的etcd集群成员,以刷新客户端URL列表。(防止数据一致发给一个node)

etcd代理不需要给予advertise-client-urls选项,因为它们从集群中检索此配置。这意味着必须为每个代理正确设置initial-cluster,而advertise-client-urls选项在非代理的节点上要保证设置的正确性。 否则,对任何etcd代理的请求将被不正确地转发。

请特别注意,不要将advertise-client-urls选项设置为指向代理自身的URL,因为这样的配置将导致代理进入循环,直到资源耗尽为止将请求转发给自身。 要纠正这两种情况,请停止etcd并使用正确的URL重新启动它。

下面的命令来声明etcd启动peer和proxy的不同:

# Use goreman to run `go get github.com/mattn/goreman`
etcd1: bin/etcd --name infra1 --listen-client-urls http://127.0.0.1:2379 --advertise-client-urls http://127.0.0.1:2379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
etcd2: bin/etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
etcd3: bin/etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
# in future, use proxy to listen on 2379
#proxy: bin/etcd --name infra-proxy1 --proxy=on --listen-client-urls http://127.0.0.1:2378 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --enable-pprof

总结一下etcd的 proxy的启动和peer的发现步骤:

1.etcd proxy将会执行下面的步骤来发现peer-urls:

    1.如果给proxy设置了discovery service, 那么就通过discovery service来发现cluster里面的非proxy的initial-advertise-peer-urls所有的URL。
    2.如果给proxy设置了discovery-srv,通过DNS发现peer-urls
    3.如果proxy设置了initial-cluster,那么将会变成peer-urls
    4.如果什么都没设置就采用默认的http://localhost:2380,http://localhost:7001.

2.peer-urls用来联系非proxy的cluster来发现他们的client-urls。因此client-urls是 所有cluter member的advertise-client-urls 集合

3.发给proxy的所有的request消息将被转发给client-urls

始终首先启动etcd集群成员(非proxy),然后任意的proxies。 代理必须能够到达群集成员以检索其配置,如果没有这种条件,那么将会尝试连接。 在任何代理之前启动成员可确保代理可以在稍后启动时发现客户端URL。

Using an etcd proxy

要以代理模式启动etcd,您需要提供三个标志:proxy,listen-client-urls和initial-cluster(或者discovery)。

要启动一个readwrite代理,请设置-proxy on;要启动只读代理,请设置-proxy readonly。

代理将监听listen-client-urls并将请求转发到从初始集群或发现url中发现的etcd集群。

Start an etcd proxy with a static configuration

静态配置proxy的时候只需要指定initial-cluster就行

etcd --proxy on \
--listen-client-urls http://127.0.0.1:2379 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380

Start an etcd proxy with the discovery service

如果你的etcd cluster 使用的是discovery service的部署方式,那么你也可以用discovery的方式启动proxy。
用discovery service启动proxy需要指定discovery 标志。proxy会一直等待etcd cluter的建立完成。然后开始转发请求信息。

etcd --proxy on \
--listen-client-urls http://127.0.0.1:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \

Fallback to proxy mode with discovery service

如果你cluster用的是discovery service模式,那么如果真实的节点的数目大于你配置的数目。那么多余的节点会自动变成readwrite的proxy模式。比如你配置的url的数量为5,但你有10个节点,那么其它5个会自动变为proxy的mdoe。当然你也可以使用discovery-fallback='exit' 来关闭这个功能。

Promote a proxy to a member of etcd cluster

proxy不参加etcd的同步,任何时候etcd都不会去主动把自己变为etcd的一个成员。如果你想添加proxy到etcd,需要下面四个步骤

use etcdctl to add the proxy node as an etcd member into the existing cluster
stop the etcd proxy process or service
remove the existing proxy data directory
restart the etcd process with new member configuration

例子

假设你有一个成员的cluster和一个proxy,信息如下:

NAME    ADDRESS
infra0  10.0.1.10
proxy0  10.0.1.11

当你完成下面操作,集群将变为两个成员的集群。

Add a new member into the existing cluster

首先你需要用etcdctl 来增加一个成员到cluster里面,它会输出对应新cluster数目的正确的配置信息:

$ etcdctl -endpoint http://10.0.1.10:2379 member add infra1 http://10.0.1.11:2380
added member 9bf1b35fc7761a23 to cluster

ETCD_NAME="infra1"
ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380"
ETCD_INITIAL_CLUSTER_STATE=existing

Stop the proxy process

停止proxy,我们可以擦出硬盘上的信息,然后重新导入新的配置。

ps aux | grep etcd
kill %etcd_proxy_pid%

如果用的systemd启动的etcd

sudo systemctl stop etcd

Remove the existing proxy data dir

rm -rf %data_dir%/proxy

Start etcd as a new member

最后,重新启动etcd用最新的配置:

$ export ETCD_NAME="infra1"
$ export ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380"
$ export ETCD_INITIAL_CLUSTER_STATE=existing
$ etcd --listen-client-urls http://10.0.1.11:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--listen-peer-urls http://10.0.1.11:2380 \
--initial-advertise-peer-urls http://10.0.1.11:2380 \
--data-dir %data_dir%

如果你用systemd跑的etcd,那么你可以编辑service 文件来得到正确的配置。然后使用下面命令

sudo systemd restart etcd 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343