Keepalived + dns高可用域名服务器

1 dns简介

域名系统(英文:DomainNameSystem,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

2 dns原理

2.1 域名结构

域名只是逻辑概念,并不代表计算机所在的物理地点。据2006年12月统计,现在顶级域名TLD(Top Level Domain)已有265个,分为三大类:

(1)国家顶级域名nTLD:采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。国家域名又常记为ccTLD(cc表示国家代码contry-code)。

(2)通用顶级域名gTLD:最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。

(3)基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名。
在这里插入图片描述

2.2 域名服务器

如果采用上述的树状结构,每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在DNS中,采用划分区的方法来解决。

一个服务器所负责管辖(或有权限)的范围叫做区(zone)。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS服务器实际管辖的范围。区 <= 域。

下图是区的不同划分方法的举例。假定abc公司有下属部门x和y,部门x下面有分三个分布们u,v,w,而y下面还有下属部门t。图a表示abc公司只设一个区abc.com。这是,区abc.com和域abc.com指的是同一件事。但图b表示abc公司划分为两个区:abc.com和y.abc.com。这两个区都隶属于域abc.com,都各设置了相应的权限域名服务器。不难看出,区是域的子集。
在这里插入图片描述

下图是以上图b中abc公司划分的两个区为例,给出了DNS域名服务器树状结构图。这种DNS域名服务器树状结构图可以更准确地反映出DNS的分布式结构。图中的每一个域名服务器都能够部分域名到IP地址的解析。当某个DNS服务器不能进行域名到IP地址的转换时,它就会设法找因特网上别的域名服务器进行解析。

从下图可以看出,因特网上的DNS服务器也是按照层次安排的。每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。
在这里插入图片描述

根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。

顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。

权限域名服务器:负责一个“区”的域名服务器。

本地域名服务器:本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。

2.3 递归查询与迭代查询

参考书籍《计算机网络第5版》–谢希仁 第6.1章节。

2.3.1 迭代查询

在这里插入图片描述
查询过程:
在这里插入图片描述

2.3.2 递归查询

在这里插入图片描述
查询过程:
在这里插入图片描述

2.3.3 迭代查询与递归查询对比

递归查询这种解析过程可以看到这种解析过程会导致根服务器压力过大,所以,迭代就很好的减少了根服务器的压力。详细说明:请参考:《dns的递归和迭代查询及linux下dns主从关系的部署(推荐)》:https://blog.csdn.net/professorman/article/details/82685860

3 高可用架构

VIPIPKeepalivednamedCentOS默认主从
172.16.159.140172.16.159.142keepalived-1.2.12.tar.gzBIND 9.8.2rc1CentOS release 6.6 (Final)master
172.16.159.140172.16.159.143keepalived-1.2.12.tar.gzBIND 9.8.2rc1CentOS release 6.6 (Final)slave

4 安装

4.1 安装dns

在172.16.159.142和172.16.159.143上面

# yum -y install bind

4.2 安装keepalived

请参考《Keepalived + Nginx高可用(主从+双主模式)》:https://blog.csdn.net/CleverCode/article/details/100975642

5 配置

5.1 配置dns

5.1.1 配置主dns

1 在172.16.159.142配置主dns。配置文件中需要修改两处,就是那两个any。 forwarders { 114.114.114.114;};dnssec-enable no;dnssec-validation no;dnssec-lookaside auto;。当你设置了转发器后,所有非本域的和在缓存中无法找到的域名查询都将转发到设置的DNS转发器上,由这台DNS来完成解析工作并做缓存,因此这台转发器的缓存中记录了丰富的域名信息。因而对非本域的查询,很可能转发器就可以在缓存中找到答案,避免了再次向外部发送查询,减少了流量。
vi /etc/named.conf

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
	listen-on port 53 { any; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
	allow-query     { any; };
	recursion yes;

	dnssec-enable no;
    dnssec-validation no;
    dnssec-lookaside auto;

    forwarders { 114.114.114.114;};

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";

	managed-keys-directory "/var/named/dynamic";

	max-cache-size 1024M;
    max-cache-ttl 86400;
    recursive-clients 40960;
    tcp-clients 2048;
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
	type hint;
	file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

2 编辑zone文件。在文件中我们复制其中的一个zone,并修改。
vi /etc/named.rfc1912.zones

zone "clevercode.com" IN {
        type master;
        file "clevercode.com.zone";
};

3 编辑clevercode.com.zone。ns1 A 172.16.159.140。配置到了虚IP:172.16.159.140

# -p 保留源文件权限
# cp -p /var/named/named.localhost /var/named/clevercode.com.zone

vi /var/named/clevercode.com.zone

$TTL 300        ; 5 minutes
@       IN SOA  @ mail.clevercode.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
clevercode.com.      NS      ns1.clevercode.com.
ns1     A       172.16.159.140
www     A       172.16.159.144

NS 是nameserver的缩写,也就是dns服务器的缩写,后面跟的是dns服务器
A 是Address的缩写,后面记录的是ipv4地址
这几条记录的意思就是,将域名zhang.com域名指向ns1.clevercode.com,ns1代表的就是ns1.clevercode.com,指向172.16.159.140的vip,而www指的就是www.clevercode.com,指向172.16.159.144(VIP是172.16.159.140)

5.1.2 配置从dns

1)配置named.conf
vi /etc/named.conf

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
	listen-on port 53 { any; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
	allow-query     { any; };
	recursion yes;

	dnssec-enable yes;
	dnssec-validation yes;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";

	managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
	type hint;
	file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";


  1. 配置named.rfc1912.zones
    vi /etc/named.rfc1912.zones
zone "clevercode.com" IN {
        type slave;
        masters { 172.16.159.142; };
        file "slaves/clevercode.com.zone";
};

跟上面不同的是 类型为slave(仆人),指定自己的master(主人),在这里要说的是,其实这种主从关系就是从主哪里下载数据库文件,也就是我们在主上编辑的/var/named下的文件,这样实现备份。file就是指定下载的文件放在那个目录下取名什么。

5.2 配置keepalived

配置keepalived参考《Keepalived + Nginx高可用(主从+双主模式)》:https://blog.csdn.net/CleverCode/article/details/100975642

  1. vi /etc/keepalived/keepalived.conf,将/etc/keepalived/nginx_check.sh 改变变成 /etc/keepalived/dns_check.sh,其他的不用修改
  2. 复制check脚本,并修改/etc/keepalived/dns_check.sh
# cp -p /etc/keepalived/nginx_check.sh /etc/keepalived/dns_check.sh
[root@localhost keepalived]# cat /etc/keepalived/dns_check.sh
#!/bin/bash
A=`ps -C named --no-header |wc -l`
if [ $A -eq 0 ];then

    /etc/init.d/named start

    sleep 2

    if [ `ps -C named --no-header |wc -l` -eq 0 ];then
	/etc/init.d/keepalived stop
    fi
fi
[root@localhost keepalived]#

3 配置notify.sh

[root@localhost keepalived]# cat /etc/keepalived/notify.sh
#!/bin/bash

SMS_LIST="18688888881 18688888882 18688888883"

host_name=`hostname`

notify ( ) {

  local now_time=$(date "+%Y-%m-%d %H:%M:%S")

  #记录日志
  echo $now_time keepalived ${host_name} change $1 $2 >> /etc/keepalived/notify.log

  #发送告警短信
  for i in $SMS_LIST
  do

       #python /etc/keepalived/sendsms.py $i keepalived "${now_time} ${host_name} change $1"
       echo "" > /dev/null
  done
}

reload_all(){
   /etc/init.d/named reload
}

case "$1" in
    master)
       #切换成为主后,需要reload以下,这样可以tcp可以去监听 VIP:53端口。
       reload_all
       notify master $2
    exit 0
    ;;
    backup)
       notify backup $2
    exit 0
    ;;
    fault)
       notify fault $2
    exit 0
    ;;
    *)
      echo 'Usage: `basename $0` {master|backup|fault}'
    exit 1
    ;;
esac
[root@localhost keepalived]#

这里有一个可nginx不一样的地方就是需要reload以下named因为。tcp监听的方式不一样,切换ip后,需要重新绑定ip监听端口。
1)nginx监听的端口是:0 0.0.0.0:80
在这里插入图片描述
2)默认named监听端口。172.16.159.142:53
在这里插入图片描述
3)当realServer获取到vip:172.16.159.140。如果不重启named,监听端口不会发生变化。
在这里插入图片描述
4)当realServer获取到vip:172.16.159.140。重启named,监听端口发生变化。
在这里插入图片描述

6 启动

6.1 启动主

在172.16.159.142

# /etc/init.d/named start

6.2 启动从

在172.16.159.143

# /etc/init.d/named start

cat /var/named/slaves/clevercode.com.zone 。启动从之后,数据会从主上同步过来。
在这里插入图片描述

7 配置dns客户端

7.1 配置dns

在172.16.159.145配置dns使用172.16.159.140。如下。
vi /etc/resolv.conf

nameserver 172.16.159.140

7.2 使用ping

ping www.clevercode.com。发现了解析的ip是:172.16.159.144
在这里插入图片描述

7.3 使用nslookup与dig

7.3.1 安装nslookup与dig

# 安装nslookup与dig
# yum -y install bind-utils

7.3.2 使用nslookup

1 交互模式
输入nslookup。可以看到Server: 172.16.159.140。指的是域名服务器:172.16.159.140

[root@localhost ~]# nslookup
> www.clevercode.com
Server:		172.16.159.140
Address:	172.16.159.140#53

Name:	www.clevercode.com
Address: 172.16.159.144
>
>
> www.qq.com
Server:		172.16.159.140
Address:	172.16.159.140#53

Non-authoritative answer:
www.qq.com	canonical name = public.sparta.mig.tencent-cloud.net.
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.149
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.148
>
>
> www.baidu.com
Server:		172.16.159.140
Address:	172.16.159.140#53

Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 61.135.169.125
Name:	www.a.shifen.com
Address: 61.135.169.121
>
>

2 非交互模式
不指定dns方式,使用本地/etc/resolv.conf配置的dns。

[root@localhost ~]# nslookup www.clevercode.com
Server:		172.16.159.140
Address:	172.16.159.140#53

Name:	www.clevercode.com
Address: 172.16.159.144

[root@localhost ~]# nslookup www.qq.com
Server:		172.16.159.140
Address:	172.16.159.140#53

Non-authoritative answer:
www.qq.com	canonical name = public.sparta.mig.tencent-cloud.net.
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.148
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.149

[root@localhost ~]#

指定dns方式。
nslookup www.qq.com 172.16.159.140
nslookup www.qq.com 114.114.114.114

[root@localhost ~]# nslookup www.clevercode.com 172.16.159.140
Server:		172.16.159.140
Address:	172.16.159.140#53

Name:	www.clevercode.com
Address: 172.16.159.144

[root@localhost ~]# nslookup www.qq.com 172.16.159.140
Server:		172.16.159.140
Address:	172.16.159.140#53

Non-authoritative answer:
www.qq.com	canonical name = public.sparta.mig.tencent-cloud.net.
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.149
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.148

[root@localhost ~]# nslookup www.qq.com 114.114.114.114
Server:		114.114.114.114
Address:	114.114.114.114#53

Non-authoritative answer:
www.qq.com	canonical name = public.sparta.mig.tencent-cloud.net.
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.148
Name:	public.sparta.mig.tencent-cloud.net
Address: 220.194.111.149

7.3.3 使用dig

格式:dig @server name type
使用172.16.159.140这个DNS服务器来解析www.clevercode.com的A记录
dig @172.16.159.140 www.clevercode.com A
在这里插入图片描述
从根服务器逐级解析
dig @172.16.159.140 www.qq.com A +trace
在这里插入图片描述

8 参考文档

《dns的递归和迭代查询及linux下dns主从关系的部署(推荐)》:
https://blog.csdn.net/professorman/article/details/82685860
《DNS原理总结及其解析过程详解》:
https://www.cnblogs.com/lidabo/p/8426647.html

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值