LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡
前言
LVS專題寫到第三篇了, 前兩篇我們對LVS的基礎使用也有了一些了解, 這篇我們將做一個比較復雜的實驗, 話不多說, 開始吧!
什么是KeepAlived
What is Keepalived ?
Keepalived is a routing software written in C. The main goal of this project is to provide simple and robust facilities for loadbalancing and high-availability to Linux system and Linux based infrastructures. Loadbalancing framework relies on well-known and widely used Linux Virtual Server (IPVS) kernel module providing Layer4 loadbalancing. Keepalived implements a set of checkers to dynamically and adaptively maintain and manage loadbalanced server pool according their health. On the other hand high-availability is achieved by VRRP protocol. VRRP is a fundamental brick for router failover. In addition, Keepalived implements a set of hooks to the VRRP finite state machine providing low-level and high-speed protocol interactions. Keepalived frameworks can be used independently or all together to provide resilient infrastructures. ##轉自官方文檔大體的意思就是
keepalived
是一個由C語言編寫的項目, 主要目標是提供負載均衡和高可用的Linux服務.keepalived
依賴于Linux Virtual Server(IPVS)內核提供的四層負載均衡,keepalived
實現了動態自適應和維護, 能夠檢測負載均衡池中的主機的健康狀態, 而keepalived
的高可用是通過VRRP(virtual route redundancy protocol)
實現的.關于
VRRP
協議參考文檔H3C技術白皮書: VRRP、RFC 3768:Virtual Router Redundancy Protocol (VRRP)
實驗介紹
大家都知道LVS雖然性能很強勁但是功能上有很多不足, 例如:
不能提供后端健康狀態檢查功能, director容易成為單點故障
…, 而這些功能我們都可以通過第三方軟件keepalived
來提供, 而本次實驗我們就要使用keepalived
提供lvs-director的高可用, 并讓兩臺director分別互為主從都能接受客戶端通過dns對A記錄的輪詢請求從而轉發至后端主機. 實現Director的高可用和負載均衡
實驗拓撲
圖畫的不夠形象, 實驗中我們使用DR模型來進行實驗
實驗環境
VIP1為172.16.1.8、VIP2為172.16.1.9
主機 | IP地址 | 功用 |
---|---|---|
director1.anyisalin.com | VIP1,VIP2, DIP: 172.16.1.2 | Director1 |
director2.anyisalin.com | VIP1,VIP2, DIP: 172.16.1.3 | Director2 |
rs1.anyisalin.com | VIP, RIP: 172.16.1.4 | RealServer 1 |
rs2.anyisalin.com | VIP, RIP: 172.16.1.5 | RealServer 2 |
ns.anyisalin.com | IP: 172.16.1.10 | DNS |
注意: 本文實驗中所有主機SElinux和iptables都是關閉的
實驗步驟
配置KeepAlived(1)
實現Director 的VIP互為主從
下面的操作都在director1上執行
[root@director1 ~]# ntpdate 0.centos.pool.ntp.org #同步時間
[root@director1 ~]# yum install keepalived &> /dev/null && echo success #安裝keepalived
success
[root@director1 ~]# vim /etc/keepalived/keepalived.conf #修改配置文件的部分配置如下
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.1.8 dev eth0 label eth0:0
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
172.16.1.9 dev eth0 label eth0:1
}
}
下面的操作都在director1上執行
[root@director2 ~]# ntpdate 0.centos.pool.ntp.org #同步時間
[root@director2 ~]# yum install keepalived &> /dev/null && echo success #安裝keepalived
success
[root@director2 ~]# vim /etc/keepalived/keepalived.conf #修改配置文件的部分配置如下
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.1.8 dev eth0 label eth0:0
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
172.16.1.9 dev eth0 label eth0:1
}
}
同時在director1和director2上啟動keepalived
[root@director1 ~]# service keepalived start
[root@director2 ~]# service keepalived start
測試
默認情況
director1
和director2
的ip如下
我們將
director1
的keepalived
服務停止, 效果如下, IP自動轉移到director2
我們將
director1
的keepalived
服務再次啟動, 效果如下, IP地址轉回director1
配置LVS
配置KeepAlived(2)
這里我們使用DR模型進行實驗, 因為
keepalived
可以通過調用ipvs的接口來自動生成規則, 所以我們這里無需ipvsadm, 但是我們要通過ipvsadm命令來查看一下ipvs規則
下面的操作在director1和director2都要執行
, 由于篇幅過長, 遂不演示director2的操作
[root@director1 ~]# yum install ipvsadm httpd &> /dev/null && echo success
success
[root@director1 ~]# echo "<h1>Sorry, Service is Unavailable </h1>" > /var/www/html/index.html #配置sorry頁面
[root@director1 ~]# vim /etc/keepalived/keepalived.conf #修改keepalived配置文件, 添加以下段落
virtual_server 172.16.1.8 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.1.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.1.5 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 172.16.1.9 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.1.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.1.5 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
同時在director1和director2上重啟keepalived
[root@director2 ~]# service keepalived restart
[root@director2 ~]# service keepalived restart
查看ipvs規則
[root@director1 ~]# ipvsadm -L -n #正常
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.8:80 rr
-> 172.16.1.4:80 Route 1 0 0
-> 172.16.1.5:80 Route 1 0 0
TCP 172.16.1.9:80 rr
-> 172.16.1.4:80 Route 1 0 0
-> 172.16.1.5:80 Route 1 0 0
配置RS的IP和web服務
下面的操作都在rs1上執行
[root@rs1 ~]# yum install httpd -y &> /dev/null && echo success #安裝httpd
success
[root@rs1 ~]# echo "<h1>This is 172.16.1.4</h1>" > /var/www/html/index.html #創建網頁文件
[root@director1 ~]# service httpd start #啟動httpd服務
Starting httpd: httpd: apr_sockaddr_info_get() failed for director1.anyisalin.com
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
[root@rs1 ~]# vim setup.sh #編寫腳本配置相關內核參數和IP, 對這里不了解的看我上篇文章
#!/bin/bash
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 172.16.1.8/32 broadcast 172.16.1.8 up
ifconfig lo:1 172.16.1.9/32 broadcast 172.16.1.9 up
;;
stop)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 down
ifconfig lo:1 down
esac
[root@rs1 ~]# bash setup.sh start #運行腳本
[root@rs1 ~]# scp setup.sh 172.16.1.5:/root #將腳本傳給rs2
下面的操作都在rs1上執行
[root@rs1 ~]# yum install httpd -y &> /dev/null && echo success #安裝httpd
success
[root@rs1 ~]# echo "<h1>This is 172.16.1.4</h1>" > /var/www/html/index.html #創建網頁文件
[root@rs2 ~]# bash setup.sh start #運行腳本
測試LVS
測試
director1
和director2
當我們關閉
rs1
的web服務, 會自動檢查健康狀態并刪除
當我們同時關閉
rs1
和rs2
的web服務, 會自動啟用sorry server
配置DNS
配置dns的過程沒什么好說的, 有興趣可以看我的博客DNS and BIND 配置指南
下面的操作都在ns上執行
[root@ns /]# yum install bind bind-utils -y --nogpgcheck &> /dev/null && echo success #安裝bind
success
[root@ns /]# vim /etc/named.conf #修改主配置文件如下
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
[root@ns /]# vim /etc/named.rfc1912.zones #在文件尾部加上下列字段
zone "anyisalin.com" IN {
type master;
file "anyisalin.com.zone";
};
[root@ns /]# vim /var/named/anyisalin.com.zone #創建區域配置文件
$TTL 600
$ORIGIN anyisalin.com.
@ IN SOA ns.anyisalin.com. admin.anyisalin.com. (
20160409
1D
5M
1W
1D
)
IN NS ns
ns IN A 172.16.1.10
www IN A 172.16.1.8
www IN A 172.16.1.9
[root@ns /]# service named start #啟動named
Generating /etc/rndc.key: [ OK ]
Starting named: [ OK ]
測試DNS輪詢效果
已經實現DNS輪詢效果
最終測試
做了那么實驗, 結合前面實驗的效果, 來一次最終測試, 我將本機的DNS server指向了172.16.1.10以便測試
默認情況如下
我們將
director2
的keepalived
強制關閉,依然不會影響訪問
此時我們的
director1
的IP地址如下, 接管了director2
的IP
總結
我們通過DNS輪詢實現LVS-Director的負載均衡, KeepAlived實現Director的高可用, 而Director本身就可以為后端的RS進行負載均衡, 這一套架構還是很完整的. 其實本文還有很多不完善的地方, 但是由于我時間較緊, 遂不對其進行敘述, 希望大家多多諒解, LVS專題到這里可能結束了, 也可能會不定期的更新, 希望大家多多關注我的博客!
作者: AnyISalIn QQ:1449472454
感謝:MageEdu
原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/14485