skydns+etcd域名服务集群


1、  背景

机器迁移到云端,使用机器名方式统一命名规范,更加易于集群管理、运维管理工作。往往根据机器可以得知,机器所属地区、部门、业务、集群等信息,有利于记忆辨认。网络上还是以IP地址形式通信,统一命名规范要求机器名与网络地址映射支持。

早期使用本机hosts进行机器名解析,主机不断增多时,hosts文件管理变得复杂,解析性能也在下降;使用第三方域名服务,方便快捷不在需要调研开发等工作,只是处理问题变得繁琐,域名信息暴露给第三方,存在安全信息泄漏等隐患;如果机器数量达到成千上万级别,可以考虑自建DNS服务集群。

bind域名服务支持各种测试工具,包括压测工具。服务端要求与客户端时间保持一致性,大量配置文件也增加了使用难度,对高可用集群支持性不好。skydns+etcd方式,从成功项目摘出来的模块。配置简单,服务稳定。支持高可用集群,灵活性高,这样也导致etcd集群配置管理变得过于复杂。

 

2、  调研目的与结果

l  Dns服务集群结构

基于skydns与etcd配合的Dns模型,skydns负责域名解析,etcd集群保存域名记录,skydns与etcd出自同一个项目,两者之间有良好的配合接口。

 

l  Dns服务集群高可用性

搭建skydns域名解析集群,提供域名解析服务负载均衡功能;内部搭建etcd集群,为skydns提供域名解析记录服务;每一个skydns可以访问多个etcd服务器获取域名记录,同集群的etcd数据一致性同步。

 

l  Dns服务集群稳定性

经过测试,skydns服务长期稳定运行,可以支撑大量域名请求涌入;etcd集群数据同步到全部节点,稳定的集群管理协议,leader与节点出现故障对集群正常工作没有影响。

 

l  DnS服务数据一致性

etcd集群扩缩容对数据一致性没有影响;etcd集群中故障节点恢复对数据一致性没有影响;etcd集群peers同步协议,维护集群数据一致性。

 

l  Dns服务集群灵活性

etcd集群扩缩容灵活性高,可以跨机房或者多机房部署etcd集群,集群节点数据一致性同步;skydns同机房部署集群,统一管理机器就近访问dns服务。

 

l  Dns服务集群管理

主要是etcd集群管理,集群创建、集群扩缩容等

 

l Dns服务域名解析性能

正常情况下,可以支撑成千上万级别机器域名服务功能。

 

3、  网络拓扑图

       

客户端发送dns域名解析请求到skydns负载服务器,负载服务器把请求代理到各个skydns子节点。skydns接受域名解析请求,使用接口到etcd集群查询域名记录,把域名解析请求结果返回到客户端。




域名记录存储服务集群(etcd集群),下面可以部署多台etcd服务器。分别对应同机房部署、跨机房部署、多机房部署几种方式。多机房部署优势,把数据信息同步到不同机房,各台机器上面。不同机房搭建不同skydns服务集群,使用相同etcd集群保存的域名记录信息,也就保证了不同skydns域名解析记录一致性同步。不同机房搭建不同skydns服务原因是:同机房访问节省了跨机房网络访问时间。etcd跨机房集群对网络响应时间并不高,保证数据一致性同步即可。

 

 

 

 

4、  服务性能分析

高可用、稳定性、灵活性、数据一致性、成千上万级别域名解析;

etcd集群管理复杂性,需要后期调研解决该问题;

压测性能详细数据分析参考压测文档;

 

5、  etcd集群管理

l  创建

A、静态创建:

需要提前使用IP构成集群创建,在需要加入依次执行下面命令,ip1、ip2、ip3换成真是ip地址。具体命令:

 

./etcd -name infra0 -initial-advertise-peer-urls http://ip1:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip1:2380 -data-dir '/root/dns/my.etcd' -initial-cluster-token etcd-cluster-1 -initial-cluster infra0=http://ip1:2380,infra1=http://ip2:2380,infra2=http://ip3:2380 -initial-cluster-state new

 

 

./etcd -name infra1 -initial-advertise-peer-urls http://ip2:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip2:2380 -data-dir '/root/dns/my.etcd' -initial-cluster-token etcd-cluster-1 -initial-cluster infra0=http://ip1:2380,infra1=http://ip2:2380,infra2=http://ip3:2380 -initial-cluster-state new

 

 

 

./etcd -name infra2 -initial-advertise-peer-urls http://ip3:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip3:2380 -data-dir '/root/dns/my.etcd' -initial-cluster-token etcd-cluster-1 -initial-cluster infra0=http://ip1:2380,infra1=http://ip2:2380,infra2=http://ip3:2380 -initial-cluster-state new

 

 

其中参数含义:

-initial-cluster-token etcd-cluster-1创建集群名称

-data-dir '/root/dns/my.etcd'  etcd数据保存目录,创建新集群使用新目录

-initial-advertise-peer-urls 集群使用同步,地址:端口形式

-advertise-client-urls  集群使用客户端,地址:端口形式

-listen-peer-urls 用户使用同步,地址:端口形式

-listen-client-urls 用户使用客户端,地址:端口形式

 

B、动态创建:

需要在一个已经存在的集群,创建新集群的key,把key写入到etcd数据库同时,设置新集群容量,新集群节点加入集群URL等。各个节点使用动态发现集群方式,带上URl参数,加入新集群。等待其他节点完全加入新集群,集群真正创建成功。具体命令如下:

 

创建一个token服务器或者集群:

./etcd -name infra0 -initial-advertise-peer-urls http://tokenip:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http:// tokenip:2380 -data-dir '/root/dns/keys.etcd' -initial-cluster-token etcd-cluster-1 -initial-cluster infra0=http:// tokenip:2380 -initial-cluster-state new

 

在token服务器生产key

uuidgen

 

设置token。使token生效,其他etcd使用discovery协议,加入token对应集群。

curl -X PUT http:// tokenip:4001/v2/keys/_etcd/registry/90b885c6-9cb1-46e3-b044-82b75d67e0ae/_config/size -d value=3

 

 

其他节点加入动态集群:

./etcd -name infra1 -initial-advertise-peer-urls http://ip1:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip1:2380 -data-dir '/root/dns/dhcp.etcd' -discovery http:// tokenip:4001/v2/keys/_etcd/registry/90b885c6-9cb1-46e3-b044-82b75d67e0ae

 

    

./etcd -name infra2 -initial-advertise-peer-urls http://ip2:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip2:2380 -data-dir '/root/dns/dhcp.etcd' -discovery http:// tokenip:4001/v2/keys/_etcd/registry/90b885c6-9cb1-46e3-b044-82b75d67e0ae

 

 

./etcd -name infra3 -initial-advertise-peer-urls http://ip3:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip3:2380 -data-dir '/root/dns/dhcp.etcd' -discovery http:// tokenip:4001/v2/keys/_etcd/registry/90b885c6-9cb1-46e3-b044-82b75d67e0ae

 

 

为了保证集群稳定性、数据一致性维护,token服务器需要长期存在。

 

l  扩缩容

A、添加一个节点:集群中需要同步新添加节点信息,新加节点加入集群。

集群中任意节点同步新加节点信息:

./etcdctl member add infra3 http://ip4:2380

 

新节点加入集群:

./etcd -name infra4 -initial-advertise-peer-urls http://ip4:2380 -listen-client-urls http://0.0.0.0:4001 -advertise-client-urls http://0.0.0.0:4001 -listen-peer-urls http://ip4:2380 -data-dir '/root/dns/1q.etcd' -initial-cluster-token etcd-cluster-1 -initial-cluster infra0=http://ip0:2380,infra1=http:// ip1:2380,infra2=http:// ip2:2380,infra3=http:// ip3:2380, infra3=http://ip4:2380 -initial-cluster-state existing

 

B、删除一个节点:集群中同步删除节点信息即可

etcdctl member remove a8266ecf031671f3

a8266ecf031671f3 是被删除节点ID

 

l  数据稳定性验证

A、集群停止各个节点,各个节点再次重启,数据依然存在;

B、集群删除各个节点,再次添加各个节点,数据已经不存在;

C、关闭leader情况:

其他节点选举新leader;

重启前leader会以普通节点角色正常运行;

下一次leader选举时,前leader仍然参加leader选举;

 D、关闭任意节点情况:

其他节点继续正常工作;

重启后该节点正常加入集群;

重启节点前插入数据,该节点重启后会同步数据;

该节点重启后同步集群数据;

 

l  数据一致性验证

节点加入集群同步集群原有数据;

节点加入集群插入数据会同步到新节点;

删除节点原有数据,新节点同步删除

新插入数据,新节点同步更新;

 

l  不同集群间数据迁移

使用数据备份与恢复的方式迁移,目前,在A集群备份数据,B集群以备份数据新建集群,启动成功。存在问题,备份数据配置信息校验,导致新建集群节点服务IP地址不可设置情况,节点强制以localhost启动。

 

 

6、  域名服务监控

l  sykdns监控:

监听skydns端口;

监听skydns功能:使用dig命令方式,探测skydns健康状态;

 

l  etcd监控

提供集群健康状态询问接口:

./etcdctl cluster-health

 

l  趋势图与报警

把skydns、etcd监控信息发送到监控平台,生成趋势图,配合相应规则,出现异常时触发报警。

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章