ETCD原理详细解析

同样的,当你完成了集群的初始化后,这些信息就失去了作用 。
当你需要增加节点时,需要使用来进行操作 。
为了安全,请务必每次启动新etcd集群时,都使用新的 token进行注册 。
另外,如果你初始化时启动的节点超过了指定的数量,多余的节点会自动转化为Proxy模式的etcd 。
4.1.3. DNS自发现模式
etcd还支持使用DNS SRV记录进行启动 。关于DNS SRV记录如何进行服务发现,可以参阅,所以,你要在DNS服务器上进行相应的配置 。
(1) 开启DNS服务器上SRV记录查询,并添加相应的域名记录,使得查询到的结果类似如下 。
$ dig +noall + SRV
. 300 IN SRV 0 0 2380 .
. 300 IN SRV 0 0 2380 .
. 300 IN SRV 0 0 2380 .
(2) 分别为各个域名配置相关的A记录指向etcd核心节点对应的机器IP 。使得查询结果类似如下 。
$ dig +noall +
. 300 IN A 10.0.1.10
. 300 IN A 10.0.1.11
. 300 IN A 10.0.1.12
(3) 做好了上述两步DNS的配置,就可以使用DNS启动etcd集群了 。配置DNS解析的url参数为--srv,其中某一个节点地启动命令如下 。
$ etcd -name\
--srv\
---peer-urls :2380 \
---token etcd--1 \
---state new \
---urls :2379 \
---urls :2379 \
--peer-urls :2380
当然,你也可以直接把节点的域名改成IP来启动 。
4.2 关键部分源码解析
etcd的启动是从主目录下的main.go开始的,然后进入/etcd.go,载入配置参数 。
如果被配置为Proxy模式,则进入函数,否则进入,开启etcd服务模块和http请求处理模块 。
在启动http监听时,为了保持与集群其他etcd机器(peers)保持连接,都采用的.启动方式,这样在超过指定时间没有获得响应时就会出现超时错误 。
而在监听请求时,采用的是.,有助于连接的稳定 。
在/etcd.go中的函数可以看到,根据不同etcd的参数,启动集群的方法略有不同,但是最终需要的就是一个IP与端口构成的字符串 。
在静态配置的启动方式中,集群的所有信息都已经在给出,所以直接解析用逗号隔开的集群url信息就好了 。
DNS发现的方式类似,会预先发送一个tcp的SRV请求,先查看下是否有集群的域名信息,如果没有找到,则去查看 。
根据找到的域名,解析出对应的IP和端口,即集群的url信息 。
较为复杂是etcd式的自发现启动 。
首先就用自身单个的url构成一个集群,然后在启动的过程中根据参数进入/.go源码的函数 。
因为我们事先是知道启动时使用的etcd的token地址的,里面包含了集群大小(size)信息 。
在这个过程其实是个不断监测与等待的过程 。
启动的第一步就是在这个etcd的token目录下注册自身的信息,然后再监测token目录下所有节点的数量,如果数量没有达标,则循环等待 。
当数量达到要求时,才结束,进入正常的启动过程 。
配置etcd过程中通常要用到两种url地址容易混淆
一种用于etcd集群同步信息并保持连接,通常称为peer-urls;
另外一种用于接收用户端发来的HTTP请求,通常称为-urls 。
4.3 运行时节点变更
etcd集群启动完毕后,可以在运行的过程中对集群进行重构,包括核心节点的增加、删除、迁移、替换等 。
运行时重构使得etcd集群无须重启即可改变集群的配置,这也是新版etcd区别于旧版包含的新特性 。
只有当集群中多数节点正常的情况下,你才可以进行运行时的配置管理 。
因为配置更改的信息也会被etcd当成一个信息存储和同步,如果集群多数节点损坏,集群就失去了写入数据的能力 。
所以在配置etcd集群数量时,强烈推荐至少配置3个核心节点 。