在 Linux 上用 DNS 實現簡單的負載均衡

在 Linux 上用 DNS 實現簡單的負載均衡

編譯自: https://www.linux.com/learn/intro-to-linux/2018/3/simple-load-balancing-dns-linux

譯者: qhwdw

DNS 輪詢將多個服務器映射到同一個主機名,並沒有為這裡展示的魔法做更多的工作。

如果你的後端服務器是由多臺服務器構成的,比如集群化或者鏡像的 Web 或者文件服務器,通過負載均衡器提供了單一的入口點。業務繁忙的大型電商在高端負載均衡器上花費了大量的資金,用它來執行各種各樣的任務:代理、緩存、狀況檢查、SSL 處理、可配置的優先級、流量整形等很多任務。

但是你並不需要做那麼多工作的負載均衡器。你需要的是一個跨服務器分發負載的簡單方法,它能夠提供故障切換,並且不太在意它是否高效和完美。DNS 輪詢和使用輪詢的子域委派是實現這個目標的兩種簡單方法。

DNS 輪詢是將多臺服務器映射到同一個主機名上,當用戶訪問 foo.example.com 時多臺服務器都可用於處理它們的請求,使用的就是這種方式。

當你有多個子域或者你的服務器在地理上比較分散時,使用輪詢的子域委派就比較有用。你有一個主域名服務器,而子域有它們自己的域名服務器。你的主域名服務器將所有的到子域的請求指向到它們自己的域名服務器上。這將提升響應時間,因為 DNS 協議會自動查找最快的鏈路。

DNS 輪詢

輪詢和 旅鶇鳥(robins)沒有任何關係,據我相熟的圖書管理員說,它最初是一個法語短語,ruban rond、或者 round ribbon。很久以前,法國政府官員以不分級的圓形、波浪線、或者直線形狀來在請願書上簽字,以蓋住原來的發起人。

DNS 輪詢也是不分級的,簡單配置一個服務器列表,然後將請求轉到每個服務器上。它並不做真正的負載均衡,因為它根本就不測量負載,也沒有狀況檢查,因此如果一個服務器宕機,請求仍然會發送到那個宕機的服務器上。它的優點就是簡單。如果你有一個小的文件或者 Web 服務器集群,想通過一個簡單的方法在它們之間分散負載,那麼 DNS 輪詢很適合你。

你所做的全部配置就是創建多條 A 或者 AAAA 記錄,映射多臺服務器到單個的主機名。這個 BIND 示例同時使用了 IPv4 和 IPv6 私有地址類:

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.12

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::12

Dnsmasq 在 /etc/hosts 文件中保存 A 和 AAAA 記錄:

172.16.1.10 fileserv fileserv.example.com

172.16.1.11 fileserv fileserv.example.com

172.16.1.12 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::12 fileserv fileserv.example.com

請注意這些示例都是很簡化的,解析完全合格域名有多種方法,因此,關於如何配置 DNS 請自行學習。

使用 dig 命令去檢查你的配置能否按預期工作。將 ns.example.com 替換為你的域名服務器:

$ dig @ns.example.com fileserv A fileserv AAA

它將同時顯示出 IPv4 和 IPv6 的輪詢記錄。

子域委派和輪詢

子域委派結合輪詢要做的配置會更多,但是這樣有一些好處。當你有多個子域或者地理位置比較分散的服務器時,就應該去使用它。它的響應時間更快,並且宕機的服務器不會去響應,因此客戶端不會因為等待回覆而被掛住。一個短的 TTL,比如 60 秒,就能幫你做到。

這種方法需要多臺域名服務器。在最簡化的場景中,你需要一臺主域名服務器和兩個子域,每個子域都有它們自己的域名服務器。在子域服務器上配置你的輪詢記錄,然後在你的主域名服務器上配置委派。

ns1.sub.example.com. IN A 172.16.1.20

ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20

ns2.sub.example.com. IN A 172.16.1.21

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 ns2.sub.example.com.

zone "sub.example.com" {

type master;

file "db.sub.example.com";

};

然後數據文件也是相同的,除了那個 A/AAAA 記錄使用的是各個服務器自己的 IP 地址。SOA 記錄都指向到主域名服務器:

; first subdomain name server

$ORIGIN sub.example.com.

$TTL 60

sub.example.com IN SOA ns1.example.com. admin.example.com. (

2018123456 ; serial

3H ; refresh

15 ; retry

3600000 ; expire

)

sub.example.com. IN NS ns1.sub.example.com.

sub.example.com. IN A 172.16.1.20

ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20

; second subdomain name server

$ORIGIN sub.example.com.

$TTL 60

sub.example.com IN SOA ns1.example.com. admin.example.com. (

2018234567 ; serial

3H ; refresh

15 ; retry

3600000 ; expire

)

sub.example.com. IN NS ns1.sub.example.com.

sub.example.com. IN A 172.16.1.21

ns2.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::21

接下來生成子域服務器上的輪詢記錄,方法和前面一樣。現在你已經有了多個域名服務器來處理到你的子域的請求。再說一次,BIND 是很複雜的,做同一件事情它有多種方法,因此,給你留的家庭作業是找出適合你使用的最佳配置方法。

在 Dnsmasq 中做子域委派很容易。在你的主域名服務器上的 dnsmasq.conf 文件中添加如下的行,去指向到子域的域名服務器:

server=/sub.example.com/172.16.1.20

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::21

然後在子域的域名服務器上的 /etc/hosts 中配置輪詢。

獲取配置方法的詳細內容和幫助,請參考這些資源:

  • Dnsmasq
  • DNS and BIND, 5th Edition

通過來自 Linux 基金會和 edX 的免費課程 "Linux 入門" 學習更多 Linux 的知識。


via: https://www.linux.com/learn/intro-to-linux/2018/3/simple-load-balancing-dns-linux


分享到:


相關文章: