etcd+skydns构建私有域名解析服务器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxcaifly/article/details/79646357

1.研究背景

       在大数据和云计算等领域应用中,如果机器数量达到一定的量时,可以考虑自建域名解析服务集群。构建私有的域名解析主要是出于两个目的:(1)通过域名,而不是ip来记忆服务,是更方便的事情;(2)在做主备切换的时候,只需要更改域名对应的ip值,从而实现在服务域名不变的情况下实现主备切换,这里如果没有域名,实现起来怎样,读者可以思考下。

       本文讲解用etcd+ skydns构建域名解析服务的方法。etcd集群保存域名记录,skydns负责域名解析,skydns和etcd出自同一个项目,两者之间有良好的配合接口。skydns是基于etcd的, etcd是一个键值存储仓库,用于配置共享和服务发现。

     skydns的github:https://github.com/skynetservices/skydns1

     etcd的github:https://github.com/coreos/etcd

      

  如上图,可以很好地诠释出skydns + etcd的搭配方式。客户端发送dns域名解析请求到skydns服务器Server1, skydns服务接受域名解析请求,会到etcd集群查询域名记录,把域名解析请求结果返回到客户端。如果Server1宕机了,那么Server2就会继续服务,客户端发出的请求就由Server2来解析,从而实现双机热备。

2. 高可用性部署过程

   这里以两台服务器10.36.220.12和10.36.220.13和10.36.220.14三台服务器集群部署为例。

2.1.集群部署etcd 

   etcd是一个分布式的键值存储数据库,其内部是通过raft算法来实现leader节点的选举和实现内部各节点数据的同步。因为raft选举必须至少是2个节点。我们这里为了实现高可用性,就准备了3台服务器集群,就是防止其中一台服务器中途宕机,剩下的两台服务器可以重新进行raft选举,从而不影响正常工作。

   分别在三台服务器开启etcd:

   10.36.220.12执行:

etcd --name etcd1  \
--listen-client-urls http://127.0.0.1:2379,http://10.36.220.12:2379  \
--initial-advertise-peer-urls http://10.36.220.12:2379 \
--initial-cluster etcd1=http://10.36.220.12:2380,etcd2=http://10.36.220.13:2380 \ --listen-peer-urls http://10.36.220.14:2380 \
--initial-cluster-state new \
--initial-cluster-token etcd-cluster \
--advertise-client-urls http://10.36.220.12:2379

   10.36.220.13执行:

etcd --name etcd2  \
--listen-client-urls http://127.0.0.1:2379,http://10.36.220.13:2379  \
--initial-advertise-peer-urls http://10.36.220.13:2379:2380  \
--initial-cluster etcd1=http://10.36.220.12:2380,etcd2=http://10.36.220.13:2380 \ --listen-peer-urls http://10.36.220.14:2380 \
--initial-cluster-state existing\                           
--initial-cluster-token etcd-cluster \
--advertise-client-urls http://10.36.220.13:2379

   10.36.220.14执行:

etcd --name etcd3  \
--listen-client-urls http://127.0.0.1:2379,http://10.36.220.13:2379  \
--initial-advertise-peer-urls http://10.36.220.14:2379 \
--initial-cluster etcd1=http://10.36.220.12:2380,etcd2=http://10.36.220.13:2380 \ --listen-peer-urls http://10.36.220.14:2380 \
--initial-cluster-state existing\                            
--initial-cluster-token etcd-cluster \
--advertise-client-urls http://10.36.220.14:2379

   在任意一台服务器执行:

etcdctl member list

  可以查看etcd集群的各个节点情况。

  这里要注意一个细节,就是etcd各个节点之间是通过2379和2380端口通信的,所以最好是在部署etcd集群环境之前,先对每台服务器开放2379和2380端口:

iptables –I INPUT –p tcp –dport  2379  –j  ACCEPT
iptables –I INPUT –p tcp –dport  2380  –j  ACCEPT

2.2.开启skydns服务

 这里只需要在这3台服务器的其中2台开启skydns服务,既可以实现通过双机热备来对外提高高可用性的服务。因此选择10.36.220.12和10.36.220.13这两台服务器来开启skydns服务。

 10.36.220.12执行:

   先配置/etc/resolv.conf文件

nameserver 10.36.220.12

 执行指令,存入skydns的一些配置项。

etcdctl set skydns/config ‘{"nameservers":["10.36.220.12:53","10.36.220.13:53"],"domain":"cloud.mayor"}'

       这里的几个参数说明下,skydns会默认去etcd读取skydns/config作为自己的配置项。其中namesevers是说明有哪些域名解析服务器,domain是说明skydns提供的域名解析限制,只解析第一级域名是mayor和第二级域名是cloud的域名,比如解析chx.cloud.mayor。

  开启skydns

./skydns –addr 10.36.220.12:53

  10.36.220.13执行:

  先配置/etc/resolv.conf文件

nameserver 10.36.220.13

 开启skydns

./skydns –addr 10.36.220.13:53

这样子这两台服务器的 skydns服务就开启了。

 

2.3.存入域名

环境搭好了之后,就需要向etcd数据库里存储一些键值对了 ,比如:

curl -XPUT http://10.36.220.12:2379/v2/keys/skydns/arpa/mayor/cloud/chx -d value='{"host":"10.35.24.35"}'

这个指令操作是说存入了域名为chx.cloud.mayor,ip为10.35.24.35的映射关系。这一步还不够,还需要存入ip(10.35.24.35)的反向域名:

curl -XPUT http://10.36.220.12:2379/v2/keys/skydns/arpa/in-addr/10/35/24/35 -d value='{"host":"chx.cloud.mayor"}'

需要这样配置执行,这个和DNS的原理有关系,涉及到arpa解析过程。如果不配置arpa的值,那么域名解析的时候会碰到不畅通的现象。


 

2.4.客户机应用私有域名解析服务

客户机应用我构建的域名解析服务时,操作很简单,只需要配置客户机的/etc/resolv.conf文件:

nameserver 10.36.220.12
nameserver 10.36.220.13

现在就可以ping下,刚刚存入的域名

ping chx.cloud.mayor

发现可以正常地解析得到域名对应的ip。

3. 后续问题

3.1.兼容内外网域名解析

   配置了某台服务器的/etc/resolv.conf文件之后,虽说是实现了内部域名解析的功能。但是如果我想ping 外网ip怎么办,比如ping www.baidu.com。我们知道外网解析服务一般是通过114.114.114.114这个ip的。那么怎样实现客户机同时进行私有域名解析和外网域名解析呢。

   方法很简单,客户机的/etc/resolve.conf不需要修改。执行如下:

etcdctl set skydns/config {"dns_addr":"10.36.220.12:53","nameservers":["10.36.220.13:53",114.114.114.114:53"],”ttl”:500,"domain":"cloud.mayor"}

   这个配置的意思是说,如果ping 一个外网域名,会先经过10.36.220.12和10.36.220.13来做域名解析,显然是不会通的,这里ttl是等待时间,等待500毫秒之后,私有域名解析服务器还没有返回ip。那么就会继续通过114.114.114.114:53来进一步解析。

3.2.压力测试

   私有域名解析服务器的性能测试可以用queryperf这个工具来进行。queryperf的安装可以参考网上教程。

   执行如下shell:

var=1
while [ $var –le 100000 ]
do 
echo “chx.cloud.mayor A” >> test.txt
var =$(($var + 1 ))
done
exit 0

   那么就会向test.txt文件里面写入10w行“chx.cloud.mayor A”

   然后执行:

queryperf -d test.txt -s 10.36.220.12

      这里会同时向10.36.220.12服务器发起10w次域名解析服务。然后可以查看性能:

[Status] Processing input data
[Status] Sending queries (beginning with 172.25.9.85)
[Status] Testing complete

Statistics:

  Parse input file:     once
  Ended due to:         reaching end of file

  Queries sent:         100000 queries
  Queries completed:    100000 queries
  Queries lost:         0 queries
  Queries delayed(?):   0 queries

  RTT max:              0.003361 sec
  RTT min:              0.000142 sec
  RTT average:          0.000782 sec
  RTT std deviation:    0.000414 sec
  RTT out of range:     0 queries

  Percentage completed: 100.00%
  Percentage lost:        0.00%

  Started at:           Fri Sep  8 14:29:29 2017
  Finished at:          Fri Sep  8 14:29:33 2017
  Ran for:              3.990581 seconds

  Queries per second:   25059.007698 qps

  qps是25059次,然后解析正确率是100%,性能还是不错的。

      后记:以上一套方案,目前已经在我部门内已经正式使用,还有一些其他的小细节,我这里不方便记录,如果有读者正好需要构建这么一套私有域名解析服务器,可以沟通交流,我会把我踩过的坑分享给大家。

猜你喜欢

转载自blog.csdn.net/hxcaifly/article/details/79646357