源码: https://github.com/coreos/etcd
说明:
- master分支可能还不稳定,使用最新的release分支(下面测试的是2.3.6)
- 源码编译需要下载100MB左右的源文件,包含依赖文件(如果是在新的golang环境上编译的话)
- 如果在etcd目录下go install的话,只编译安装etcd,不编译etcdctl;需要进入ectdetl目录下go install,才会有etcdctl; 基本上就这两个二进制文件了
- 直接下载编译的文件比较快捷,而且这里有最新的release的二进制文件: https://github.com/coreos/etcd/releases/
- https://github.com/coreos/etcd 下面有一些参考文档的链接
集群配置:
https://github.com/coreos/etcd/blob/master/Documentation/op-guide/clustering.md
集群实现方式有三种:
今天了解了DNS Discovery,其中:
- DNS server使用的是dnsmasq
- DNS配置
添加文件: /etc/dnsmasq.d/etcd.srv.conf
1234567srv-host=_etcd-server._tcp.etcd.i.beebank.com,172.16.22.36,2380srv-host=_etcd-server._tcp.etcd.i.beebank.com,172.16.22.37,2380srv-host=_etcd-server._tcp.etcd.i.beebank.com,172.16.22.38,2380srv-host=_etcd-client._tcp.etcd.i.beebank.com,172.16.22.36,2379srv-host=_etcd-client._tcp.etcd.i.beebank.com,172.16.22.37,2379srv-host=_etcd-client._tcp.etcd.i.beebank.com,172.16.22.38,2379
其中:_etcd-server._tcp. _etcd-client._tcp. 都是etcd自动添加的
_etcd-server._tcp. 用于server之间交互,使用 2380 端口
_etcd-client._tcp. 用于client(如: etcdctl )发现server,使用 2379端口
问题:
上面的dns配置基本是可用的,目前发现的唯一问题是: etcdctl –discovery-srv etcd.i.beebank.com 来工作时,期望srv记录中拿到的是域名,而不是ip;不过etcd –discovery-srv etcd.i.beebank.com 却没有这种苛求; 解决办法,把上面的IP换成域名,然后对域名做解析,而且,同一个域名解析出来多个IP也是不错的
修改如下:
/etc/hosts
1 2 3 |
172.16.22.36 etcd.i.beebank.com 172.16.22.37 etcd.i.beebank.com 172.16.22.38 etcd.i.beebank.com |
/etc/dnsmasq.d/etcd.srv.conf
1 2 |
srv-host=_etcd-server._tcp.etcd.i.beebank.com,etcd.i.beebank.com,2380 srv-host=_etcd-client._tcp.etcd.i.beebank.com,etcd.i.beebank.com,2379 |
今天的测试没有涉及认证,server端启动参数:
1 2 3 4 5 6 7 8 |
etcd --name 22_38 \ --discovery-srv etcd.i.beebank.com \ --initial-advertise-peer-urls http://172.16.22.38:2380 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster-state new \ --advertise-client-urls http://172.16.22.38:2379 \ --listen-client-urls http://172.16.22.38:2379 \ --listen-peer-urls http://172.16.22.38:2380 |
其中:
–discovery-srv: 用于服务发现
–initial-advertise-peer-urls: 告诉其他成员,通过这个地址来联系我(对于服务发现的时候似乎用途不大,因为dns上已经注册了呀)
–initial-cluster-token: 应该是加群的暗号,暗号对不上是不让进群的
测试点:
- 通过proxy进行读写
- 同时通过单个实例进行读写
- 通过etcdctl的–discovery-srv进行读写
- 其中一个实例死掉一会儿,重启后依然能读到死后写入的数据
- 集群中一个节点到另一个节点之间都不止一个长连接
- 稍后测试一个全新的节点接入会是什么样子
======= v3.0.4 试用 ======
server端通过srv记录发现时,如果srv记录中解析到的是域名,则不会发现该域名下的所有IP (这个行为和v2.3.6不一致)
client端通过srv记录发现时,如果srv记录中解析到的是多个IP:PORT, 则etcdctl会试图解析已解析到的IP而报错
所以配置可修改成这样:
1 2 3 4 |
srv-host=_etcd-server._tcp.etcd.i.beebank.com,172.16.22.36,2380 srv-host=_etcd-server._tcp.etcd.i.beebank.com,172.16.22.37,2380 srv-host=_etcd-client._tcp.etcd.i.beebank.com,etcd.i.beebank.com,2379 |
看起来好恶心