vetcd+skydns构建私有域名解析服务器
kevin.Zhu 发布于:2019-10-25 9:22 分类:又一文摘 有 14 人浏览,获得评论 0 条
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%,性能还是不错的。
后记:以上一套方案,目前已经在我部门内已经正式使用,还有一些其他的小细节,我这里不方便记录,如果有读者正好需要构建这么一套私有域名解析服务器,可以沟通交流,我会把我踩过的坑分享给大家。
————————————————
版权声明:本文为CSDN博主「hxcaifly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hxcaifly/article/details/79646357