接着原来《DNS原理与应用》的文章,本章内容主要通过实现DNS的主从,转发,及基于域名解析不同的ip实现后端服务负载均衡的效果。最后再实现DNS的高级功能:类似CDN原理实现基于IP实现区域分流负载,通过以上内容更好地理解DNS的工作原理以及拓展高性能的web服务实现思路

利用DNS解析实现简单的web负载均衡

我们常说的负载均衡解决方案大多是通过nginx、lvs,haporxy等实现业务或者流程的负载,通过DNS也可以实现简单的负载功能,并且在用户请求解析的过程中就能实现负载,DNS默认会使用轮询的机制轮流将请求解析到后端不同主机:这样就可以将同一站点域名解析到不同的主机IP,让各主机提供相同的服务。在DNS中配置如下即可实现:

webserver       IN      A       192.168.214.135
webserver IN A 192.168.214.136
www IN CNAME webserver
@ IN A 192.168.214.135
@ IN A 192.168.214.136

上面的配置将一个站点部署在两台主机上,通过定义别名DNS会轮询解析请求到这两台主机上

解析测试:

[root@yufu ~]# curl http://yufu.com/index.html
<html>
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
this is test page
ip:192.168.214.135
</html>
[root@yufu ~]# curl http://www.yufu.com/index.html <html>
<head>
<h1>Welcome to nginx!</h1>
this is test page
IP: 192.168.214.136
</body>
</html>

DNS负载缺点:为了降低DNS请求的次数以提高訪问效率。浏览器经常缓存了DNS查询的结果。假设一个IP处的服务失效。那么浏览器可能仍会依据DNS缓存中所记录的信息向该不可用的服务发送请求(不同的浏览器可能有不同的行为)。尽管说整个服务仅仅有一处IP所相应的服务失效了,可是从用户的角度看来该站点已经不可訪问。因此基于DNS的负载平衡方案并不能作为一个独立的负载平衡解决方式来提供高可用性的保障,而是作为其他负载平衡解决方式的补充方案来使用。

DNS主从同步

要实现DNS的主从复制,必须要在主DNS区域解析库文章中定义从服务器地址:

思路:

  1. 主DNS解析库文件中定义从服务器信息
  2. 从服务器在区域库定义文件中添加要解析的区域信息,大致与主DNS上相同,但是type是为slave;要指定master是谁,以及同步的解析库文件存放位置
  3. 关于安全考虑:在主从的named.conf文件中要添加访问控制:允许区域传送的主机-白名单(allow-transfer {})

实现上面的过程:

  • 主DNS服务器定义从服务器信息/var/named/gudaoyufu.com.zone
$TTL 1D
@ IN SOA ns1.yufu.com. amin.yufu.com (
2018051503
1H
5M
7D
1D ) IN NS ns1.yufu.com.
IN NS ns2.yufu.com. #定义从DNS
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.214.128
ns2 IN A 192.168.214.134 #定义从DNS的IP地址
mx1 IN A 192.168.214.189
mx2 IN A 192.168.214.190
webserver IN A 192.168.214.135
webserver IN A 192.168.214.136
www IN CNAME webserver
@ IN A 192.168.214.135
@ IN A 192.168.214.136
;* IN CNAME webserver
  • 在从服务器中定义区域解析信息 /etc/named.rfc1912.zones
zone "yufu.com" IN {
type slave;
masters { 192.168.214.128; };
file "slaves/gudaoyufu.com.zone";
};

注意:从服务器上定义的域必须要与主服务器上相同,从的type类型为:slave,必须要是指定master是谁,否则找不到同步对象,定义的同步解析库文件存放文章默认在/var/named/slaves目录下

  • 在主从的named.conf文件中添加要、区域库传送控制,以保障服务器的信息安全:这个的作用是干嘛的?用一个示列一下就看明白

不做区域传送控制前,用任意一台主机都可以获取到DNS区域解析库文件中的服务器信息

[root@localhost html]# dig -t axfr yufu.com @192.168.214.128

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> -t axfr yufu.com @192.168.214.128
;; global options: +cmd
yufu.com. 86400 IN SOA ns1.yufu.com. amin.yufu.com.yufu.com. 2018051504 3600 300 604800 86400
yufu.com. 86400 IN A 192.168.214.135
yufu.com. 86400 IN A 192.168.214.136
yufu.com. 86400 IN NS ns1.yufu.com.
yufu.com. 86400 IN NS ns2.yufu.com.
yufu.com. 86400 IN MX 10 mx1.yufu.com.
yufu.com. 86400 IN MX 20 mx2.yufu.com.
mx1.yufu.com. 86400 IN A 192.168.214.189
mx2.yufu.com. 86400 IN A 192.168.214.190
ns1.yufu.com. 86400 IN A 192.168.214.128
ns2.yufu.com. 86400 IN A 192.168.214.134
webserver.yufu.com. 86400 IN A 192.168.214.135
webserver.yufu.com. 86400 IN A 192.168.214.136
www.yufu.com. 86400 IN CNAME webserver.yufu.com.
yufu.com. 86400 IN SOA ns1.yufu.com. amin.yufu.com.yufu.com. 2018051504 3600 300 604800 86400
;; Query time: 2 msec
;; SERVER: 192.168.214.128#53(192.168.214.128)
;; WHEN: Sat May 19 20:13:07 2018
;; XFR size: 15 records (messages 1, bytes 344)

添加传送控制,只允许主从间传送,定义规则:allow-transfer { 192.168.214.134; };

[root@localhost html]# dig -t axfr yufu.com @192.168.214.128

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> -t axfr yufu.com @192.168.214.128
;; global options: +cmd
; Transfer failed.

看到区别了吧,如果不做限制,任何人可以获取到服务器的部署情况这是一个很大的安全隐患。

在主DNS服务器中只允许从服务器传送,而对于从服务器,则要拒绝任何主机进行传送

最终在/etc/named.conf中配置如下:

  • 主:allow-transfer { 192.168.214.134; };

  • 备:allow-transfer { none; };

配置好主从服务器后检查配置有没有问题,执行:** named-checkconf**

没问题后重启或重载服务器:rndc reload

如果顺利的话,在从服务器的/var/named/slaves目录中已经有了主服务器中的gudaoyufu.com.zone文件

[root@dns-slave ~]# ls /var/named/slaves/
1 gudaoyufu.com.zone

从服务器已经同步成功,这时可以关闭主服务器,测试解析,先将测试的客户端添加DNS地址

echo "nameserver 192.168.214.128" > /etc/resolv.conf
echo "nameserver 192.168.214.134" > /etc/resolv.conf

关闭主DNS服务器: systemctl stop named

在客户端请求www.yufu.com 如下:

[root@yufu ~]# curl http://www.yufu.com/index.html
<html>
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
this is test page
ip:192.168.214.135
</html> [root@yufu ~]# curl http://www.yufu.com/index.html
<html>
<head>
this is test page
IP: 192.168.214.136
</body>
</html>

DNS转发

如果客户端向DNS服务器发起的解析请求内容不在本服务器上,那么可以设置DNS转发,将解析请求转发到其他DNS服务器。DNS转发分两种情况,一种是只要本地没有解析内容的都转发到指定的DNS服务器上这种转发叫(全局转发),另一种是进行匹配转发,只要解析请求符合定义的某个域,就把该请求转发到指定的DNS服务器上这种转发叫(区域转发):

要实现上面的过程,要在两台DNS上做相应的配置:

  • 在主DNS上要定义转发规则,
  • 开启请求者做递归,否则转发请求不予进行

recursion yes;

  • 第二台DNS上要有相应的域解析库内容

  • 注意:关闭dnssec功能:

    dnssec-enable no;

    dnssec-validation no;

配置主DNS转发规则

(1) 全局转发: 对非本机所负责解析区域的请求,全转发给指定的服务器,在/etc/named.conf中options定义

forward first|only;
forwarders { ip;};

(2) 特定区域转发:仅转发对特定的区域的请求,比全局转发优先级高,在 /etc/named.rfc1912.zones中定义区域信息

zone "ZONE_NAME" IN {
type forward;
forward first | only;
forwarders { ip;};
};

下面分别实现这两种转发方式,先看第一种转发:全局转发

全局转发

配主DNS配置文件/etc/named.conf

forward only;
forwarders { 192.168.214.134; };
dnssec-enable no;
dnssec-validation no;

**注意:recursion yes; 主DNS必须要开启递归查询,否则解析请求转发不出去 **

接收转发DNS端配置:

定义区域文件信息:vim /etc/named.rfc1912.zones

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

编写区域解析库文件:vim /var/named/abc123.com.zone

$TTL 1D
@ IN SOA ns1.abc123.com. amin.abc123.com (
2018051507
1H
5M
7D
1D ) IN NS ns1.abc123.com.
ns1 IN A 192.168.214.134
www IN A 192.168.214.133
@ IN A 192.168.214.133

重载DNS并测试:

rndc reload

dig测试:

[root@localhost ~]# dig www.abc123.com @192.168.214.128

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> www.abc123.com @192.168.214.128
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11968
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION:
;www.abc123.com. IN A ;; ANSWER SECTION:
www.abc123.com. 86268 IN A 192.168.214.133 ;; AUTHORITY SECTION:
abc123.com. 86268 IN NS ns1.abc123.com. ;; ADDITIONAL SECTION:
ns1.abc123.com. 86268 IN A 192.168.214.134 ;; Query time: 1 msec
;; SERVER: 192.168.214.128#53(192.168.214.128)
;; WHEN: Sun May 20 02:01:31 2018
;; MSG SIZE rcvd: 82

访问测试

[root@localhost ~]# curl http://www.abc123.com/index.html

<html>
<body>
www.abc123.com
IP: 192.168.214.133
</body>
</html> [root@localhost ~]# cat /etc/resolv.conf
nameserver 192.168.214.128

区域转发

设置区域转发要在主DNS的named.rfc.1912.zones文件中定义区域信息:

zone "abc123.com"  IN {
type forward;
forward only;
forwarders { 192.168.214.134; }; };

设置后情况一下DNS缓存再重载服务:

rndc flush

rndc reload

测试访问

[root@localhost ~]# curl http://www.abc123.com/index.html

<html>
<body>
www.abc123.com
IP: 192.168.214.133
</body>
</html>

智能DNS

智能DNS解析根据客户机IP地址归属地区域进行区别响应,这里根据ip地址网段实现按ip地址区域解析的过程:

  • 在DNS的主配置文件中定义ACL规则,注意,ACL规则必须定义在named.conf的最前面;

    acl是根据从上到下顺序查找匹配的,acl中ip存在包含关系,应该小范围地址段先定义,大网段在后面,如果大网段在上面会使下面有包含关系的小网段不生效
acl beijing {
192.168.214.0/24; }; acl jiangsu {
172.20.110.0/24;
}; acl other {
any;
};
  • 定义解析库文件

为每个IP地址范围定义单独的解析库文件

[root@dns-1 named]# cp gudaoyufu.com.zone gudaoyufu.com.zone.beijing
[root@dns-1 named]# cp gudaoyufu.com.zone gudaoyufu.com.zone.jiangsu

记得修改解析库文件的属组为named

  • 将acl与各区域解析库文件关联起来:使用view

注意:一旦采用view,必须把所以的区域信息放在view语句块中,所以named.conf中的这段内容移动到named.rfc1912.zones中

zone "." IN {
type hint;
file "named.ca";
};
  • 创建view

先创建单独区域文件,在view中要指定

[root@dns-1 named]# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.beijing
[root@dns-1 named]# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.jiangsu

在named.rfc1912.zones.beijing单独的文件中定义如下:


zone "yufu.com" IN {
type master;
file "gudaoyufu.com.zone.beijing";
};

在named.rfc1912.zones.jiangsu单独的文件中定义如下:

zone "yufu.com" IN {
type master;
file "gudaoyufu.com.zone.jiangsu";
};

在named.conf中定义view

view beijngview {
match-clients {beijing;};
include "/etc/named.rfc1912.zones.beijing"; }; view jiangsuview {
match-clients {jiangsu;};
include "/etc/named.rfc1912.zones.jiangsu"; }; view otherview {
match-clients {other;};
include "/etc/named.rfc1912.zones"; };

这里的other就使用默认的区域文件,

上面的view信息也可以直接将etc/named.rfc1912.zones.jiangsu中的内容直接写在view块中

DNS的主从,转发与负载功能的更多相关文章

  1. DNS的主从、子域授权和转发服务器

    DNS的主从.子域授权和转发服务器 主从DNS 注意: 1.全局配置options{} 里面的内容,其中 listen-on port 53 {any or local:}:或者直接注释掉,或删掉 a ...

  2. LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡

    前言 首先声明下,由于这两天找资料,看了不少博客 ,但是出于不细心,参考者的博客地址没有记录下来,所有文中要是出现了与大家博客相同的地方,那么请大家在评论区说明并附上博客地址,我好引用进来:这里表示抱 ...

  3. iptables常用规则:屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链

    iptables常用规则:屏蔽IP地址.禁用ping.协议设置.NAT与转发.负载平衡.自定义链 时间 -- :: IT社区推荐资讯 原文 http://itindex.net/detail/4772 ...

  4. 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能

    在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...

  5. DNS正、反向解析+负载均衡+智能DNS+密钥认证

    主机名 IP 软件包 系统版本 内核版本 实验环境 master 192.168.30.130 bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6 bind-chroot.x8 ...

  6. 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  7. 【转】浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  8. powershell加win的dns服务器,解决网站负载均衡问题

    用我发明的powershell填坑法,加windows的dns服务器.从调整dns服务器解析ip时间段的角度,解决网站负载均衡问题. ------------------------win2012r2 ...

  9. (转)iptables常用规则:屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链

    转自:http://lesca.me/archives/iptables-examples.html 本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇ipt ...

随机推荐

  1. EasyUI 数据网格 - 设置排序并自定义排序

    数据网格(DataGrid)的所有列可以通过点击列表头来排序.您可以定义哪列可以排序.默认的,列是不能排序的,除非您设置 sortable 属性为 true. 当排序时,数据网格(DataGrid)将 ...

  2. C#数字图像处理算法学习笔记(二)--点运算与直方图

    C#数字图像处理算法学习笔记(二)--点运算与直方图 在数字图像处理中,点运算是一种简单而重要的技术.点运算只是根据对象的像素的输入灰度值来决定像素的输出灰度值的图像处理运算.它有时也被称为对比度增强 ...

  3. 什么是css sprites,如何使用?

    css sprites:精灵图(雪碧图):把一堆小图片整合在一张大图上,通过背景图片相关设置(背景图片.背景图是否重复.背景图定位),显示图片,减轻服务器对图片的请求数量 优点: 1.减少网页的HTT ...

  4. 织梦channelartlist标签内使用currentstyle

    找到文件\include\taglib\channelartlist.lib.php 找到代码 $pv->Fields['typeurl'] = GetOneTypeUrlA($typeids[ ...

  5. (六)JavaScript之[Regular Expression]与[错误(try, catch, throw)]

    10].正则表达式 /** * 正则表达式(Regular Expression): * * 用于文本搜索和文本替换 * */ /** * /good/i是一个正则表达式. * good是一个模式(用 ...

  6. Shader学习笔记整理

    1.常用矩阵 UNITY_MATRIX_V 视口矩阵 UNITY_MATRIX_P 投影矩阵 UNITY_MATRIX_MV 模型矩阵 * 视口矩阵 UNITY_MATRIX_MVP 模型矩阵 * 视 ...

  7. Office加载项对Excel进行读写操作

    转载自我的个人主页 前言 在开发ExcelWeb插件的时候,一大亮点就是可以在web项目中操作Excel,读取Excel的内容,也可以将服务端的数据写入的 Excel中,大大方便的用户使用Excel, ...

  8. Element(Vue)+Express(Node)模拟服务器获取本地json数据

    网上很多教程说需要在build目录下的dev-server.js文件中配置,但目前最新的vue-cli是没有dev-server.js这个文件的,因为已经被合并到webpack.dev.conf.js ...

  9. Git的使用(详细)

    一下内容引自网络 原帖:http://blog.jobbole.com/78960/ 原文出处: 涂根华的博客

  10. ASP.NET Core - 各项配置

    之前搭建好了各项开发环境,现在来说说ASP.NET Core的各项配置.项目结构.以及在请求管道中挂载的各式各样的中间件.今天先来探讨探讨其各项配置及其项目结构   ASP.NET Core和上一代F ...