keepalived
keepalived實現ha+lvs-DR
client 172.16.2.9
|
eth0 172.16.2.8
[router 或 firewall] <--------|
eth1 1.1.1.8 |
|
VIP eth0:0 1.1.1.2 |
|
vrrp1(相似心跳) |
1.1.1.3 eth0 --- eth0 1.1.1.4 |
主lvs 備lvs |
2.2.2.3 eth1 --- eth1 2.2.2.4 |
vrrp2(相似心跳) |
|
|----------------------| |
web1 web2-----|
1.1.1.5 1.1.1.6
lo:0 1.1.1.2/255.255.255.255
準備上面的架構圖:
1,client我這裏用的是宿主機,有一個elinks就ok了
2,router我這裏使用雙網卡kvm虛擬機
3,主和備lvs調度服務器,也都使用雙網卡kvm虛擬機
4,web1和web2使用單網卡kvm虛擬機
而後我這裏所有使用kvm虛擬機,這個結構圖一共須要三個網段
我這裏分別使用
br0橋接模擬外網172.16.0.0/16網絡
default網絡(virbr0)模擬1.1.1.0/24網絡(但由於默認此網絡是192.168.122.0/24網段,我這裏就是嫌ip太長,不方便畫圖講解,才換成1.1.1.0/24來測試).因此我這裏就使用ifconfig virbr0:0 1.1.1.1/24在宿主機上模擬此網段(還要保證宿主機上不要有兩個網卡同網段)
default1網絡(virbr1)模擬2.2.2.0/24網絡;我這裏就使用ifconfig virbr1:0 2.2.2.1/24在宿主機上模擬此網段
其它相關準備:(centos7.3平臺)
1,靜態ip
2,主機名配置和綁定
# hostnamectl set-hostname --static master.cluster.com
# vim /etc/hosts
1.1.1.8 router.cluster.com
1.1.1.3 master.cluster.com
1.1.1.4 backup.cluster.com
1.1.1.5 web1.cluster.com
1.1.1.6 web2.cluster.com
3,時間同步
4,關閉firewalld(這裏準備來講只關firewalld,不關iptables),selinux
5,配置yum (本地iso鏡像yum源)
6,準備客戶端,只須要有firefox或elinks命令就能夠了
第一大步:
router上作SNAT,DNAT將外網鏈接轉到內網
也就是把
sip:172.16.2.9 dip:172.16.2.8
轉成
sip:1.1.1.8 dip:1.1.1.2
1,在router上打開ip_forward
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p 使之生效
2,在router上使用iptables(不是firewalld)實現snat,dnat
# systemctl stop firewalld
# systemctl disable firewalld
# yum install iptables-services iptables
# iptables -t filter -F
# iptables -t nat -F
# iptables -t mangle -F
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 1.1.1.2
# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to 1.1.1.8
# iptables-save > /etc/sysconfig/iptables
# systemctl start iptables.service
# systemctl enable iptables.service
第二大步:
在主lvs調度器和備lvs調度器上安裝keepalived包
# yum install keepalived ipvsadm
第三大步:
在主lvs調度器和備lvs調度器上配置keepalived
先在主lvs調度器上配置,配置完了再拷到備lvs調度器進行簡單修改
# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL --同一個局域網內注意要惟一。用私有網段作實驗的話保持默認就行了
}
vrrp_instance VI_1 { --定義整個VRRP(virtual router reduntancy protocol)實例
state MASTER --主DR要爲MASTER,並大寫
interface eth0 --提供服務的網卡,在我這裏是外網網卡
lvs_sync_daemon_interface eth0 --指定它爲一個心跳網卡
virtual_router_id 51 --ID值,主DR和備DR要一致 ; 這裏要特別注意;若是都在同一個網段,每一個人的ID值請使用不一樣的,以避免衝突(範圍爲1-255,不能超過這個範圍)
priority 100 --優先級,主DR要大於備DR
advert_int 1 --主備同步的時間間隔
authentication {
auth_type PASS --驗證類型,還有一種驗證類型爲AH,這裏建議使用pass就能夠了(明文的,這裏不必去加密)
auth_pass 1111 --驗證字符串,隨便寫均可以
}
virtual_ipaddress { --vip
1.1.1.2/24
}
}
vrrp_instance VI_2 {
state MASTER
interface eth1
lvs_sync_daemon_interface eth1
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --由於是DR架構,只有一個VIP,這個VIP爲空
}
}
virtual_server 1.1.1.2 80 {
delay_loop 6 --健康檢查時間間隔
lb_algo rr --rr算法
lb_kind DR --LVS-DR模式
nat_mask 255.255.255.0 --掩碼
protocol TCP
real_server 1.1.1.5 80 {
weight 1 --權重
TCP_CHECK {
connect_timeout 3
connect_port 80 --簡單的健康檢查方式,3秒連不上80端口就認爲不健康
}
}
real_server 1.1.1.6 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
把上面的配置文件拷給備lvs調度器
# scp /etc/keepalived/keepalived.conf 1.1.1.4:/etc/keepalived/
把兩個vrrp的
state MASTER 改成 state BACKUP
priority 100 改成 priority 99
兩臺lvs調度器都啓動keepalived服務
# systemctl start keepalived
# systemctl enable keepalived
第四大步:
配置real server(web1,web2)
在web1服務器上作
# echo 'web1'> /var/www/html/index.html
在web2服務器上作
# echo 'web2'> /var/www/html/index.html
2,
# ifconfig lo:0 1.1.1.2 netmask 255.255.255.255
--想要永久生效,要寫一個ifcfg-lo:0的網卡配置文件
3,
# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# sysctl -p使它生效
4,
# yum install arptables_jf
# arptables -A INPUT -d 1.1.1.2 -j DROP
# arptables-save -n > /etc/sysconfig/arptables
# systemctl start arptables
# systemctl enable arptables
--第3和第4小步都是解決LVS-DR的arp問題,能夠二選一,也能夠二個步驟都作
5,,在主DR和備DR上都綁定web1和web2的網卡物理地址
(這一步在這個架構中能夠不用作,由於web1和web2虛擬了lo:0 1.1.1.2/32後,不會形成主DR和備DR與web1,web2不通的狀況,由於主DR和備DR有心跳線路的IP1.1.1.3和1.1.1.4,它們能夠與web1,web2通迅,也就是說能夠獲得web1和web2的MAC地址)
# arp -s 1.1.1.5 1.1.1.5的MAC地址
# arp -s 1.1.1.6 1.1.1.6的MAC地址
第五大步:
測試驗證
驗證1:
客戶端
# elinks 172.16.2.8
結果爲web1和web2的rr輪循ok
驗證2:
查看資源
# ip addr
# ipvsadm -ln
驗證結果
在主lvs調度器上有1.1.1.2/24這個vip,備lvs調度器沒有這個vip
主和備lvs調度器使用ipvsadm -ln都能查看lvs信息(此軟件比較特殊,備也能看到信息是爲了高可用切換到備時,lvs調度數據保持一致;其它的ha軟件通常只能主上看到信息)
驗證3:
驗證健康檢查
驗證4:
在主lvs調度器reboot
結果:客戶端訪問幾乎不中斷,資源切換到了備,主啓動後,資源又切回了主
驗證5:
在主lvs調度器ifconfig eth0 down,正常切換到備;在主lvs調度器ifconfig eth0 up回來,又切換回主
在主lvs調度器ifconfig eth1 down,不用切換(由於eth1網卡只是心跳備份,也沒有vip在此網卡上)
驗證6:
在主lvs調度器不當心kill殺掉了keepalived的進程
# ps -ef |grep keepa |grep -v grep
root 2310 1 0 17:30 ? 00:00:00 /usr/sbin/keepalived -D
root 2311 2310 0 17:30 ? 00:00:00 /usr/sbin/keepalived -D
root 2312 2310 0 17:30 ? 00:00:00 /usr/sbin/keepalived -D
# kill -15 2310
結果:正常切換到備,當主keepalived服務再啓動後,又會切換回主
驗證7:
在主lvs調度器刪除了1.1.1.2這個vip
# ip address del 1.1.1.2/24 dev eth0
結果:沒有切換到備,整個架構完蛋
解決方法:能夠寫個shell監控此vip,若是不存在,則加回來;或者若是不存在,直接把主lvs調度器reboot