PRF:20180322 Simple Load Balancing with DNS on Linux.md

@qhwdw
This commit is contained in:
Xingyu.Wang 2018-06-24 23:07:37 +08:00
parent a6568e0926
commit 206dc00d70

View File

@ -1,8 +1,11 @@
在 Linux 上用 DNS 实现简单的负载均衡 在 Linux 上用 DNS 实现简单的负载均衡
====== ======
> DNS 轮询将多个服务器映射到同一个主机名,并没有为这里展示的魔法做更多的工作。
![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/american-robin-920.jpg?itok=_B_RRbfj) ![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/american-robin-920.jpg?itok=_B_RRbfj)
如果你的后端服务器是由多台服务器构成的,比如集群化或者镜像的 Web 或者文件服务器通过一个负载均衡器提供了单一的入口点。业务繁忙的大型电商花费大量的资金在高端负载均衡器上用它来执行各种各样的任务代理、缓存、状况检查、SSL 处理、可配置的优先级、流量整形等很多任务。
如果你的后端服务器是由多台服务器构成的,比如集群化或者镜像的 Web 或者文件服务器通过负载均衡器提供了单一的入口点。业务繁忙的大型电商在高端负载均衡器上花费了大量的资金用它来执行各种各样的任务代理、缓存、状况检查、SSL 处理、可配置的优先级、流量整形等很多任务。
但是你并不需要做那么多工作的负载均衡器。你需要的是一个跨服务器分发负载的简单方法它能够提供故障切换并且不太在意它是否高效和完美。DNS 轮询和使用轮询的子域委派是实现这个目标的两种简单方法。 但是你并不需要做那么多工作的负载均衡器。你需要的是一个跨服务器分发负载的简单方法它能够提供故障切换并且不太在意它是否高效和完美。DNS 轮询和使用轮询的子域委派是实现这个目标的两种简单方法。
@ -12,11 +15,12 @@ DNS 轮询是将多台服务器映射到同一个主机名上,当用户访问
### DNS 轮询 ### DNS 轮询
轮询和旅鸫鸟robins没有任何关系据我喜欢的图书管理员说它最初是一个法语短语_`ruban rond`_、或者 `round ribbon`。很久以前,法国政府官员以不分级的圆形、波浪形、或者辐条形状去签署请愿书以掩盖请愿书的发起人。 轮询和<ruby>旅鸫鸟<rt>robins</rt></ruby>没有任何关系据我相熟的图书管理员说它最初是一个法语短语_ruban rond_、或者 _round ribbon_。很久以前,法国政府官员以不分级的圆形、波浪线、或者直线形状来在请愿书上签字,以盖住原来的发起人。
DNS 轮询也是不分级的,简单配置一个服务器列表,然后将请求转到每个服务器上。它并不做真正的负载均衡,因为它根本就不测量负载,也没有状况检查,因此如果一个服务器宕机,请求仍然会发送到那个宕机的服务器上。它的优点就是简单。如果你有一个小的文件或者 Web 服务器集群,想通过一个简单的方法在它们之间分散负载,那么 DNS 轮询很适合你。 DNS 轮询也是不分级的,简单配置一个服务器列表,然后将请求转到每个服务器上。它并不做真正的负载均衡,因为它根本就不测量负载,也没有状况检查,因此如果一个服务器宕机,请求仍然会发送到那个宕机的服务器上。它的优点就是简单。如果你有一个小的文件或者 Web 服务器集群,想通过一个简单的方法在它们之间分散负载,那么 DNS 轮询很适合你。
你所做的全部配置就是创建多条 A 或者 AAAA 记录,映射多台服务器到单个的主机名。这个 BIND 示例同时使用了 IPv4 和 IPv6 私有地址类: 你所做的全部配置就是创建多条 A 或者 AAAA 记录,映射多台服务器到单个的主机名。这个 BIND 示例同时使用了 IPv4 和 IPv6 私有地址类:
``` ```
fileserv.example.com. IN A 172.16.10.10 fileserv.example.com. IN A 172.16.10.10
fileserv.example.com. IN A 172.16.10.11 fileserv.example.com. IN A 172.16.10.11
@ -25,10 +29,10 @@ fileserv.example.com. IN A 172.16.10.12
fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::10 fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::10
fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::11 fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::11
fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::12 fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::12
``` ```
Dnsmasq 在 _/etc/hosts_ 文件中保存 A 和 AAAA 记录: Dnsmasq 在 `/etc/hosts` 文件中保存 A 和 AAAA 记录:
``` ```
172.16.1.10 fileserv fileserv.example.com 172.16.1.10 fileserv fileserv.example.com
172.16.1.11 fileserv fileserv.example.com 172.16.1.11 fileserv fileserv.example.com
@ -36,15 +40,14 @@ Dnsmasq 在 _/etc/hosts_ 文件中保存 A 和 AAAA 记录:
fd02:faea:f561:8fa0:1::10 fileserv fileserv.example.com fd02:faea:f561:8fa0:1::10 fileserv fileserv.example.com
fd02:faea:f561:8fa0:1::11 fileserv fileserv.example.com fd02:faea:f561:8fa0:1::11 fileserv fileserv.example.com
fd02:faea:f561:8fa0:1::12 fileserv fileserv.example.com fd02:faea:f561:8fa0:1::12 fileserv fileserv.example.com
``` ```
请注意这些示例都是很简化的,解析完全合格域名有多种方法,因此,关于如何配置 DNS 请自行学习。 请注意这些示例都是很简化的,解析完全合格域名有多种方法,因此,关于如何配置 DNS 请自行学习。
使用 `dig` 命令去检查你的配置能否按预期工作。将 `ns.example.com` 替换为你的域名服务器: 使用 `dig` 命令去检查你的配置能否按预期工作。将 `ns.example.com` 替换为你的域名服务器:
``` ```
$ dig @ns.example.com fileserv A fileserv AAA $ dig @ns.example.com fileserv A fileserv AAA
``` ```
它将同时显示出 IPv4 和 IPv6 的轮询记录。 它将同时显示出 IPv4 和 IPv6 的轮询记录。
@ -56,6 +59,7 @@ $ dig @ns.example.com fileserv A fileserv AAA
这种方法需要多台域名服务器。在最简化的场景中,你需要一台主域名服务器和两个子域,每个子域都有它们自己的域名服务器。在子域服务器上配置你的轮询记录,然后在你的主域名服务器上配置委派。 这种方法需要多台域名服务器。在最简化的场景中,你需要一台主域名服务器和两个子域,每个子域都有它们自己的域名服务器。在子域服务器上配置你的轮询记录,然后在你的主域名服务器上配置委派。
在主域名服务器上的 BIND 中,你至少需要两个额外的配置,一个区声明以及在区数据文件中的 A/AAAA 记录。主域名服务器中的委派应该像如下的内容: 在主域名服务器上的 BIND 中,你至少需要两个额外的配置,一个区声明以及在区数据文件中的 A/AAAA 记录。主域名服务器中的委派应该像如下的内容:
``` ```
ns1.sub.example.com. IN A 172.16.1.20 ns1.sub.example.com. IN A 172.16.1.20
ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20 ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20
@ -64,64 +68,65 @@ ns2.sub.example.com. IN AAA fd02:faea:f561:8fa0:1::21
sub.example.com. IN NS ns1.sub.example.com. sub.example.com. IN NS ns1.sub.example.com.
sub.example.com. IN NS ns2.sub.example.com. sub.example.com. IN NS ns2.sub.example.com.
``` ```
接下来的每台子域服务器上有它们自己的区文件。在这里它的关键点是每个服务器去返回它**自己的** IP 地址。在 `named.conf` 中的区声明,所有的服务上都是一样的: 接下来的每台子域服务器上有它们自己的区文件。在这里它的关键点是每个服务器去返回它**自己的** IP 地址。在 `named.conf` 中的区声明,所有的服务上都是一样的:
``` ```
zone "sub.example.com" { zone "sub.example.com" {
type master; type master;
file "db.sub.example.com"; file "db.sub.example.com";
}; };
``` ```
然后数据文件也是相同的,除了那个 A/AAAA 记录使用的是各个服务器自己的 IP 地址。SOA 记录都指向到主域名服务器: 然后数据文件也是相同的,除了那个 A/AAAA 记录使用的是各个服务器自己的 IP 地址。SOA 记录都指向到主域名服务器:
``` ```
; first subdomain name server ; first subdomain name server
$ORIGIN sub.example.com. $ORIGIN sub.example.com.
$TTL 60 $TTL 60
sub.example.com IN SOA ns1.example.com. admin.example.com. ( sub.example.com IN SOA ns1.example.com. admin.example.com. (
2018123456 ; serial 2018123456 ; serial
3H ; refresh 3H ; refresh
15 ; retry 15 ; retry
3600000 ; expire 3600000 ; expire
) )
sub.example.com. IN NS ns1.sub.example.com. sub.example.com. IN NS ns1.sub.example.com.
sub.example.com. IN A 172.16.1.20 sub.example.com. IN A 172.16.1.20
ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20 ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20
; second subdomain name server ; second subdomain name server
$ORIGIN sub.example.com. $ORIGIN sub.example.com.
$TTL 60 $TTL 60
sub.example.com IN SOA ns1.example.com. admin.example.com. ( sub.example.com IN SOA ns1.example.com. admin.example.com. (
2018234567 ; serial 2018234567 ; serial
3H ; refresh 3H ; refresh
15 ; retry 15 ; retry
3600000 ; expire 3600000 ; expire
) )
sub.example.com. IN NS ns1.sub.example.com. sub.example.com. IN NS ns1.sub.example.com.
sub.example.com. IN A 172.16.1.21 sub.example.com. IN A 172.16.1.21
ns2.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::21 ns2.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::21
``` ```
接下来生成子域服务器上的轮询记录方法和前面一样。现在你已经有了多个域名服务器来处理到你的子域的请求。再说一次BIND 是很复杂的,做同一件事情它有多种方法,因此,给你留的家庭作业是找出适合你使用的最佳配置方法。 接下来生成子域服务器上的轮询记录方法和前面一样。现在你已经有了多个域名服务器来处理到你的子域的请求。再说一次BIND 是很复杂的,做同一件事情它有多种方法,因此,给你留的家庭作业是找出适合你使用的最佳配置方法。
在 Dnsmasq 中做子域委派很容易。在你的主域名服务器上的 `dnsmasq.conf` 文件中添加如下的行,去指向到子域的域名服务器: 在 Dnsmasq 中做子域委派很容易。在你的主域名服务器上的 `dnsmasq.conf` 文件中添加如下的行,去指向到子域的域名服务器:
``` ```
server=/sub.example.com/172.16.1.20 server=/sub.example.com/172.16.1.20
server=/sub.example.com/172.16.1.21 server=/sub.example.com/172.16.1.21
server=/sub.example.com/fd02:faea:f561:8fa0:1::20 server=/sub.example.com/fd02:faea:f561:8fa0:1::20
server=/sub.example.com/fd02:faea:f561:8fa0:1::21 server=/sub.example.com/fd02:faea:f561:8fa0:1::21
``` ```
然后在子域的域名服务器上的 `/etc/hosts` 中配置轮询。 然后在子域的域名服务器上的 `/etc/hosts` 中配置轮询。
获取配置方法的详细内容和帮助,请参考这些资源:~~(致校对:这里的资源链接全部丢失了!!)~~ 获取配置方法的详细内容和帮助,请参考这些资源:
- [Dnsmasq][2]
- [DNS and BIND, 5th Edition][3]
通过来自 Linux 基金会和 edX 的免费课程 ["Linux 入门" ][1] 学习更多 Linux 的知识。 通过来自 Linux 基金会和 edX 的免费课程 ["Linux 入门" ][1] 学习更多 Linux 的知识。
@ -131,9 +136,11 @@ via: https://www.linux.com/learn/intro-to-linux/2018/3/simple-load-balancing-dns
作者:[CARLA SCHRODER][a] 作者:[CARLA SCHRODER][a]
译者:[qhwdw](https://github.com/qhwdw) 译者:[qhwdw](https://github.com/qhwdw)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/cschroder [a]:https://www.linux.com/users/cschroder
[1]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux [1]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
[2]:http://www.thekelleys.org.uk/dnsmasq/doc.html
[3]:http://shop.oreilly.com/product/9780596100575.do