一:環境介紹
1.操作系統:
centos6.9和7.3,censtos6用作keepalived調度,centos7用作realserver
2.服務安裝:
keepalived-1.2.13-5.el6_6.x86_64
nginx-1.10.2-1.el7.x86_64
mariadb-5.5.52-1.el7.x86_64
php-fpm-5.4.16-42.el7.x86_64
以上都是yum倉庫安裝
3.實驗環境
關閉selinux,關閉iptables,時間同步
二:原理及拓撲圖
1.lvs概念
lVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。主要是工作在內核中,通過其他工具配置調用,只認識IP地址和端口。例如ipvsadm,但是在本案例中,keepalived完全可以代理ipvsadm調用lvs。
1.VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)
可以認爲是實現路由器高可用的協議,簡單的說,當一個路由器故障時可以由另一個備份路由器繼續提供相同的務。
VRRP根據優先級來確定虛擬路由器中每臺路由器的角色(Master路由器或Backup路由器)。 VRRP優先級的取值範圍爲0到255(數值越大表明優先級越高),可配置的範圍是1到254,優先級0爲系統保留給路由器放棄Master位置時使用,255則是系統保留給IP地址擁有者使用。優先級越高,則越有可能成爲Master路由器。當兩臺優先級相同的路由器同時競爭Master時,比較接口IP地址大小,接口地址大者當選爲Master。
2.keepalived簡介
Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),但是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現。
3.lvs_dr
直接路由,LVS默認模式,應用最廣泛,通過爲請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變。
工作原理:DR和REAL SERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有REAL SERVER對本身這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算法,找出對應的 REAL SERVER,把目的MAC地址改爲REAL SERVER的MAC併發給這臺REAL SERVER。這時REAL SERVER收到這個數據包,則等於直接從客戶端收到這個數據包無異,處理後直接返回給客戶端。由於DR要對二層包頭進行改換,所以DR和REALSERVER之間必須在一個廣播域,也可以簡單的理解爲在同一臺交換機上。
需要注意的是:
第一:確保client能夠直接訪問web服務器。因爲在LVS-DR模式下web服務器回覆client的時候,是直接回復給client的,不需要經過LVS,所以web服務器必須能夠和client的網絡互通。
第二,lvs服務器和web-server他們必須在同一個網段內,因爲LVS轉發包的時候,是直接修改了包目標的MAC地址,直接扔給了rs,基於MAC地址的修改是活動在OSI二層數據鏈路層的,工作在數據鏈路層的網絡設備就是交換機了,所以必須在一個交換機下面,也就是一個局域網內。
第三爲啥抑制real-server的ARP,是這樣的,我們在DR模式要更改web-server的ARP的模式,arp_ignore爲1是說只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,我們都在迴環接口上配置了一個VIP,當arp模式更改以後,那麼如果有誰在請求VIP的mac地址時,那麼那些web-server就會回答arp廣播報文了,只有lvs纔會,如果沒有更改arp模式,那麼大家都喊我是VIP,這就亂套了。
4.拓撲圖
三:keepalived配置
1.安裝keepalived
yum install keepalived -y
2.高可用的ipvs雙主集羣配置
1.節點一的配置:
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 172.0.0.1
smtp_connect_timeout 30
router_id LVS_KEEPALIVED
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 10
priority 100
advert_int 1
#nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.200
}
}
virtual_server 172.17.250.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server 172.17.252.78 80 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 172.17.110.110 80 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 20
priority 98
advert_int 1
#nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.250
}
}
virtual_server 172.17.250.250 443 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server 172.17.252.78 443 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 172.17.110.110 443 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
第二步:節點二的配置
global_defs {
notification_email {
root@localhost
}
smtp_server 172.0.0.1
smtp_connect_timeout 30
router_id LVS_KEEPALIVED
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 10
priority 98
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.200
}
}
virtual_server 172.17.250.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server172.17.252.78 80 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
real_server172.17.110.110 80 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 20
priority 100
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.250
}
}
virtual_server 172.17.250.250 443 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server172.17.252.78 443 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
real_server 172.17.110.110 443 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
}
四:realserver配置
我的realserv服務器實現的小米電子網站,所以就不過多介紹了,用的是lnmp的架構,80端口和443端口分別代表不同的虛擬ip訪問的不同站點,互爲主備。
1.nginx加密的步驟如下:
mkdir /usr/local/nginx/conf -p --建立一個存放加密文件的目錄
cd /usr/local/nginx/conf/
openssl genrsa -des3 -out server.key 1024 --創建服務器私鑰會讓你輸入一個口令
openssl req -new -key server.key -out server.csr --創建簽名請求的證書csr
cp server.keyserver.key.org
openssl rsa -in server.key.org -out server.key --加載ssl支持nginx的時候使用私鑰除去必須的口令
openssl x509 -req -days 365 -in server.csr -signkey server.key-out server.crt --標誌證書使用上述私鑰和csr
2.主要修改配置文件如下:
讓站點兼容80端口和443端口
server {
listen 80;
listen 443 ssl;
server_name xiaomi.magedu.com;
root /data/web;
#charset koi8-r;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
}
3.修改內核參數:
dr模型中,各主機上均需要配置VIP,解決地址衝突的方式有三種:
(1) 在前端網關做靜態綁定;
(2) 在各RS使用arptables;
(3) 在各RS修改內核參數,來限制arp響應和通告的級別;
限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應;
1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,纔給予響應;
限制通告級別:arp_announce
0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告;
1:儘量避免向非直接連接網絡進行通告;
2:必須避免向非本網絡通告。
#配置本地迴環網卡路由
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
#1 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
#2 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
#關閉arp應答
1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應
2:必須避免將接口信息向非本網絡進行通告
4.配置迴環網卡和路由:
ifconfig lo:0 172.17.250.200 broadcast 172.17.250.200 netmask255.255.255.255 up
route add -host 172.17.250.200 lo:0
ifconfig lo:1 172.17.250.250 broadcast 172.17.250.250 netmask255.255.255.255 up
route add -host 172.17.250.250 lo:1
五:測試
1.啓動服務
ip漂移前:
ip漂移後:
2.模擬一臺keepalived服務器宕機:
service stop keepalived
3.模擬一臺web服務宕機:
systemctl stop nginx
4.實驗總結:
由此我們發現即使一臺高可用負載均衡器的主機宕機了,我們依然可以通過另外一個虛擬ip進行wab訪問,體現了高可用的實用性,Keepalived檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web 服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。lvs只是能夠負載均衡,爲後端的web服務器分流,降低web負載,加上keepalived就能夠實現高可用負載均衡,而且主主模式也能夠避免主備模式一臺調度器完全被壓榨的狀態,可以爲客戶端提供更高效的服務。