本節我們來講一講keepalived,它是基於虛擬路由冗餘協議vrrp (Virtual Router Redundancy Protocol)從而實現模擬路由器的高可用,通常Keepalived用於實現前端高可用,它是輕量級的高可用,且不需要共享存儲,常用於兩個節點的高可用,一個是主節點master,一個是從節點backup,但是對外邊來說只有一個IP地址,通常這個IP地址一開始都是在master,當master宕機時,backup會將該IP搶走並提供服務。好了下面我們就來實現下這個過程。
實驗拓撲圖:
本實驗是實現keepalived+lvs的DR模型,這裏介紹下DR模型的工作機制,當外部的請求送給director(即DR)時,DR將請求轉發給內部的real server(即RS)進行響應,而響應後的結果並沒有通過DR返回給用戶,而是RS直接響應給互聯網上的客戶端,但是由於RS在內網當中,因此需要額外加個路由器給RS,並且RS必須將網關指向該路由器。
爲了實驗簡便,本實驗涉及的服務全部爲yum安裝,這裏就不給出了。本實驗是在已安裝好的前提下配置的。
RS配置
RS1:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig eth0 192.168.1.21/24 up ifconfig lo:0 172.16.6.31 netmask 255.255.255.255 broadcast 172.16.6.31 route add -host 172.16.6.31 dev lo:0 配置爲lo:0端口 ifconfig lo:1 172.16.6.32 netmask 255.255.255.255 broadcast 172.16.6.32 route add -host 172.16.6.32 dev lo:1
RS2:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig eth0 192.168.1.22/24 up 與RS1相比只有IP不同 ifconfig lo:0 172.16.6.31 netmask 255.255.255.255 broadcast 172.16.6.31 route add -host 172.16.6.31 dev lo:0 ifconfig lo:1 172.16.6.32 netmask 255.255.255.255 broadcast 172.16.6.32 route add -host 172.16.6.32 dev lo:1
配置keepalived
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs
{
notification_email
{
root@localhost
}
notification_email_from [email protected]
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown
{
script
"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
#創建down文件權重減2
interval 2
weight -2
}
vrrp_instance VI_1 在第一個節點扮演的是主節點的角色
{
interface eth0
state MASTER
#此節點爲主節點
priority 100 優先級
virtual_router_id 1
garp_master_delay 1
authentication 認證部分
{
auth_type PASS
auth_pass password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16.6.31
/16
設定ipvs 規則的虛擬ip
}
track_script
{
chk_schedown
}
}
virtual_server 172.16.6.31 80
#配置一個VIP 工作在TCP的80端口上
{
delay_loop 6
lb_algo rr
#負載均衡的調度算法
lb_kind DR
#工作在DR模型上
#persistence_timeout 50 #是否啓用IPVS持久連接,這項要註銷.連接50S纔會切換
protocol TCP
#採用的是TCP協議
# sorry_server 192.168.1.2 1358 #錯誤提示頁面.要在這臺服務器上開啓http服務
real_server 192.168.1.21 80
#後面RIP地址
{
weight 1
#權重
HTTP_GET
{
url
{
path /
status_code 200
#取得主頁面的狀態,狀態碼爲200就意味着請求成功;也可寫入md5碼,但要制定靜態碼
}
connect_timeout 3
#每次測試3秒
nb_get_retry 3
#測試次數
delay_before_retry 3
#測試失敗在測試3次
}
}
real_server 192.168.1.22 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
vrrp_instance VI_2 在第二個模型中扮演的備節點的角色
{
interface eth0
state BACKUP
#此節點爲備節點
priority 99
virtual_router_id 2
garp_master_delay 1
authentication {
auth_type PASS
auth_pass 12345678
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.6.32
/16
設定ipvs 規則的虛擬
}
track_script {
chk_schedown
}
}
virtual_server 172.16.6.32 80
#配置一個VIP 工作在TCP的80端口上
{
delay_loop 6
#lb_algo rr
lb_kind DR
persistence_timeout 50 用於測試這邊啓用持久連接功能
protocol TCP
# sorry_server 192.168.1.2 1358
real_server 192.168.1.21 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.22 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3nb_get_retry 3delay_before_retry 3
}
}
}
配置第二個節點keepalived
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs
{
notification_email
{
root@localhost
}
notification_email_from [email protected]
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown
{
script
"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
#創建down文件權重減2
interval 2
weight -2
}
vrrp_instance VI_1 在第一個節點扮演的是從節點的角色
{
interface eth0
state BACKUP
#此節點爲從節點
priority 99 優先級
virtual_router_id 1
garp_master_delay 1
authentication 認證部分
{
auth_type PASS
auth_pass password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16.6.31
/16
設定ipvs 規則的虛擬ip
}
track_script
{
chk_schedown
}
}
virtual_server 172.16.6.31 80
#配置一個VIP 工作在TCP的80端口上
{
delay_loop 6
lb_algo rr
#負載均衡的調度算法
lb_kind DR
#工作在DR模型上
#persistence_timeout 50 #是否啓用IPVS持久連接,這項要註銷.連接50S纔會切換
protocol TCP
#採用的是TCP協議
# sorry_server 192.168.1.2 1358 #錯誤提示頁面.要在這臺服務器上開啓http服務
real_server 192.168.1.21 80
#後面RIP地址
{
weight 1
#權重
HTTP_GET
{
url
{
path /
status_code 200
#取得主頁面的狀態,狀態碼爲200就意味着請求成功;也可寫入md5碼,但要制定靜態碼
}
connect_timeout 3
#每次測試3秒
nb_get_retry 3
#測試次數
delay_before_retry 3
#測試失敗在測試3次
}
}
real_server 192.168.1.22 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
vrrp_instance VI_2 在第二個模型中扮演的主節點的角色
{
interface eth0
state MASTER
#此節點爲主節點
priority 100 注意修改節點狀態的時候優先級也要改
virtual_router_id 2
garp_master_delay 1
authentication {
auth_type PASS
auth_pass 12345678
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.6.32
/16
設定ipvs 規則的虛擬
}
track_script {
chk_schedown
}
}
virtual_server 172.16.6.32 80
#配置一個VIP 工作在TCP的80端口上
{
delay_loop 6
#lb_algo rr
lb_kind DR
persistence_timeout 50 用於測試這邊啓用持久連接功能
protocol TCP
# sorry_server 192.168.1.2 1358
real_server 192.168.1.21 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.22 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3nb_get_retry 3delay_before_retry 3
}
}
}
OK,全部配置完成之後就可以了,本節就到這裏,謝謝!