在 Linux 上用 DNS 實現簡單的負載均衡
DNS 輪詢將多個伺服器對映到同一個主機名,並沒有為這裡展示的魔法做更多的工作。
如果你的後端伺服器是由多臺伺服器構成的,比如叢集化或者映象的 Web 或者檔案伺服器,透過負載均衡器提供了單一的入口點。業務繁忙的大型電商在高階負載均衡器上花費了大量的資金,用它來執行各種各樣的任務:代理、快取、狀況檢查、SSL 處理、可配置的優先順序、流量整形等很多工。
但是你並不需要做那麼多工作的負載均衡器。你需要的是一個跨伺服器分發負載的簡單方法,它能夠提供故障切換,並且不太在意它是否高效和完美。DNS 輪詢和使用輪詢的子域委派是實現這個目標的兩種簡單方法。
DNS 輪詢是將多臺伺服器對映到同一個主機名上,當使用者訪問 foo.example.com
時多臺伺服器都可用於處理它們的請求,使用的就是這種方式。
當你有多個子域或者你的伺服器在地理上比較分散時,使用輪詢的子域委派就比較有用。你有一個主域名伺服器,而子域有它們自己的域名伺服器。你的主域名伺服器將所有的到子域的請求指向到它們自己的域名伺服器上。這將提升響應時間,因為 DNS 協議會自動查詢最快的鏈路。
DNS 輪詢
輪詢和旅鶇鳥沒有任何關係,據我相熟的圖書管理員說,它最初是一個法語短語,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 秒,就能幫你做到。
這種方法需要多臺域名伺服器。在最簡化的場景中,你需要一臺主域名伺服器和兩個子域,每個子域都有它們自己的域名伺服器。在子域伺服器上配置你的輪詢記錄,然後在你的主域名伺服器上配置委派。
在主域名伺服器上的 BIND 中,你至少需要兩個額外的配置,一個區宣告以及在區資料檔案中的 A/AAAA 記錄。主域名伺服器中的委派應該像如下的內容:
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.
接下來的每臺子域伺服器上有它們自己的區檔案。在這裡它的關鍵點是每個伺服器去返回它自己的 IP 地址。在 named.conf
中的區宣告,所有的服務上都是一樣的:
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
作者:CARLA SCHRODER 譯者:qhwdw 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- Nginx實現簡單的負載均衡Nginx負載
- Python實現簡單負載均衡Python負載
- 在Linux中,如何實現負載均衡?Linux負載
- 簡單實踐搭建 nginx 負載均衡Nginx負載
- linux實現DNS輪詢實現負載平衡LinuxDNS負載
- 簡單瞭解負載均衡負載
- 技術|如何為MySQL MGR實現簡單的負載均衡代理?MySql負載
- nginx Win下實現簡單的負載均衡(1)nginx搭建部署Nginx負載
- nginx Win下實現簡單的負載均衡(2)站點共享SessionNginx負載Session
- 超實用:實現負載均衡技術的方式負載
- SAP 應用服務負載均衡的實現負載
- Ribbon實現負載均衡負載
- GRPC 負載均衡實現RPC負載
- nginx實現負載均衡Nginx負載
- nginx Win下實現簡單的負載均衡(3)Session的SqlServer模式配置Nginx負載SessionSQLServer模式
- 做了反向代理和負載均衡的nginx配置檔案簡單示例(nginx.conf) HTTP負載均衡/TCP負載均衡負載NginxHTTPTCP
- 在 kubernetes 環境中實現 gRPC 負載均衡RPC負載
- 在Linux中,什麼是負載均衡,並且如何在Linux中實現它。Linux負載
- 在Linux中,nginx反向代理和負載均衡實現原理是什麼?LinuxNginx負載
- HaProxy 實現 MySQL 負載均衡MySql負載
- 負載均衡簡介負載
- Linux LVS 負載均衡Linux負載
- Docker Swarm :gRPC 基於 DNS 的負載均衡DockerSwarmRPCDNS負載
- Spring Cloud:使用Ribbon實現負載均衡詳解(上)SpringCloud負載
- Kafka 負載均衡在 vivo 的落地實踐Kafka負載
- nginx+tomcat實現負載均衡NginxTomcat負載
- dubbo(三):負載均衡實現解析負載
- 使用YARP來實現負載均衡負載
- Linux下玩轉nginx系列(五)---nginx實現負載均衡LinuxNginx負載
- 在阿里雲上單機使用Nginx負載均衡釋出網站阿里Nginx負載網站
- SpringCloud微服務中使用RestTemplate+Ribbon實現負載均衡(實現方法+實現原理+替換負載均衡策略)SpringGCCloud微服務REST負載
- 在Linux中,什麼是負載均衡?它是如何工作的?Linux負載
- Kubernetes上的負載均衡詳解負載
- Haproxy搭建 Web 群集實現負載均衡Web負載
- Nginx如何實現四層負載均衡?Nginx負載
- Keepalived實現Nginx負載均衡高可用Nginx負載
- Docker Compose+nginx實現負載均衡DockerNginx負載
- orleans叢集及負載均衡實現負載