启动cluster
启动集群有3个方式:
1,static方式
这种方式可以参考 Set up a local cluster 的设置方法。这种设置方式的特点时,需要提前知道参与 cluster 机器的 IP。
2,etcd discovery方式
这种方式避免了 static 方式中存在的问题:需要提前知道参与 cluster 机器的 IP。这种方式的做法就是:
- 需要一个“已经存在”的 etcd cluster
- 借用这个“已经存在”的 etcd cluster,创建我们需要的cluster
做法如下:
1,先启动一个 etcd ,把这个 etcd 作为“已经存在”的 etcd cluster。
etcd –name infra4 –listen-client-urls http://127.0.0.1:42379 –advertise-client-urls http://127.0.0.1:42379 –listen-peer-urls http://127.0.0.1:42380 –initial-advertise-peer-urls http://127.0.0.1:42380 –discovery http://127.0.0.1:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
2,在这个 etcd 上,创建一个 key ,让我们要创建的 cluster 向这个 key 注册。
curl -X PUT http://localhost:42379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
要注意两点:
(1) discovery 后面的一串16进制数,也可以是其它普通的字符串,是唯一的就行。
(2) value后面的数字,是 size 对应的值,是指“cluster 节点数目”。如果节点不达到这个数目,是无法启动 cluster 的。
设置成功之后,可以使用 curl 看一下具体的内容:
curl http://localhost:42379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
3,然后分别开启3个窗口,启动3个 etcd 节点。
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:2380 –initial-advertise-peer-urls http://127.0.0.1:2380 –discovery http://127.0.0.1:42379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
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 –discovery http://127.0.0.1:42379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
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 –discovery http://127.0.0.1:42379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
4,测试
向一个节点写数据:
curl -X PUT http://localhost:22379/v2/keys/test -d value=3
从另一个节点读数据:(python -m json.tool
是为了美化数据显示,如果没有安装python,就把这段代码去掉 )
curl http://localhost:32379/v2/keys/test | python -m json.tool
// output
{
"action": "get",
"node": {
"createdIndex": 8,
"key": "/test",
"modifiedIndex": 8,
"value": "3"
}
}
注意:
(1) 不要向“已经存在”的 etcd 写数据,这个“已经存在”的 etcd cluster 的数据,“不与”依靠它创建的 cluster 同步。
(2) 上面在一台机器上搭建的 cluster,如果要在多台机器上创建的话,IP最好改成本机IP。注意,下面例子中,listen-client-urls
有两个地址,一个本地IP,另一个是回环地址。加上回环地址,是为了在这台机器上,操作etcdctl
方便一一些。
etcd –name infra1 –listen-client-urls http://172.31.0.145:2379,http://127.0.0.1:2379 –advertise-client-urls http://172.31.0.145:2379 –listen-peer-urls http://172.31.0.145:2380 –initial-advertise-peer-urls http://172.31.0.145:2380 –discovery https://discovery.etcd.io/4aae8fd7b09dea57543faeffde3eac83
问题:
- 这种方式启动的“已经存在”的 etcd cluster 是单点的,如果这个 etcd cluster 死掉的话,依靠它创建的 cluster 就无法使用了。所以,可以使用 static 方式创建方式一个稳定的 cluster。
- 这个“已经存在”的 etcd cluster 的数据,“不与”依靠它创建的 cluster 同步。也就是说,在创建 key/value 时,要向后创建的 cluster 的机器/端口 去写数据。
关于“已经存在”的 cluster
前面介绍了自己创建“已经存在”的 cluster的方法,还可以使用 etcd 官方提供的一个 etcd cluster 来做同样的事。方法就是把上面第2步做的事,按下面这样做:
这个 rest api 会返回一个URL(https://discovery.etcd.io/7516d270897711210002f268813b44ce
),把这个URL替换第3步命令中,--discovery
后面的参数。
3,DNS discovery
这种方法不做介绍了,有兴趣的可以看一下官网介绍:https://github.com/coreos/etcd/blob/master/Documentation/op-guide/clustering.md#dns-discovery
创建 cluster 遇到的问题:
1,启动完 cluster 后,把 cluster 停掉。修改启动的IP地址(例如:从本地IP 换成 回环IP),再次进行启动 cluster 的话,会出现下面这样的错误。提示无法连接“修改IP前”的节点。
2017-11-14 17:47:50.927633 W | rafthttp: health check for peer 6381d1a8f6227a14 could not connect: dial tcp 127.0.0.1:22380: getsockopt: connection refused
2017-11-14 17:47:50.932444 W | rafthttp: health check for peer db5dfd394e5b8b78 could not connect: dial tcp 127.0.0.1:32380: getsockopt: connection refused
例如:
1,第1次启动的 cluster 时有3个节点:2379 / 22379 / 32379,IP地址都是 127.0.0.1。
2,在第二次启动前,把启动参数中的 IP 地址改成本机地址:192.168.0.5。
3,在启动2379那个节点服务时,就会出现上面问题。
解决办法:
因为在启动时,没有指定数据保存参数,保存到了~/infra1.etcd
/~/infra2.etcd
/~/infra3.etcd
下面。把这3个文件夹删除掉后,再用修改后的IP地址启动,就可以了。没有调查具体原因。
2,有一个想法。在使用 etcd discovery 进行启动 cluster,指定 size = 2。然后在把所有节点都启动后
或 在一部分节点启动后
,把 size 改成 3。再加入新节点,能不能成功?
结果不行。。。