keepalived綁定單播地址、非搶占模式及LVS的TCP模式的高可用


背景:keepalived默認是組播地址進行播放,且默認地址是224.0.0.18,如果配置多個keepalived主機,會導致虛擬IP地址存在沖突問題,這種問題怎么解決呢?

解決辦法:就是將keepalived主機的多播地址修改為單播地址,綁定固定IP地址,避免在多播模式下,通過VRRP進行廣播地址,造成IP地址地址沖突。

vrrp_strict   #嚴格遵守VRRP協議,不允許狀況,在配置單播IP地址時,此行需要刪除或者注釋掉即可。

1、沒有VIP地址

2、單播鄰居

3、在VRRP版本2中有IPv6地址

實驗一:實現keepalived單播地址配置

1、在主節點配置keepalived文件

[root@centos_17~]#vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 50
    priority 100
    unicast_src_ip 192.168.37.17  配置源地址的IP地址
    unicast_peer {
       192.168.37.7  配置從節點的目標IP地址
    }
    advert_int 2
    authentication {
        auth_type pass
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

 配置完成之后重啟keepalived:

[root@centos_17~]#systemctl restart keepalived

2、在從節點配置keepalived文件  

[root@centos7~]#vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka2
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 50
    priority 80
    unicast_src_ip 192.168.37.7
    unicast_peer {
       192.168.37.17
        }
    advert_int 2
    authentication {
        auth_type pass
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

 配置完成之后重啟keepalived: 

[root@centos_17~]#systemctl restart keepalived

 3、驗證鎖單播IP地址效果。

此時由於綁定了雙方keepalived主機的IP地址,就只會對雙方進行廣播,避免多個keepalived的虛擬IP地址進行沖突。

 

 實驗二:實現非搶占模式漂移VIP

 原理:關閉VIP搶占模式,需要VIP state都為BACKUP,此時哪個keepalived的優先級大,優先占用哪個keepalived服務器,當此占用的服務器宕機后,另一個BACKUP主機才會進行占用,就算優先級高的恢復了,也不能進行搶占,除非優先級低的服務器宕機后,才會繼續占用到高優先級的keepalived服務器上。

1、在優先級高的keepalived主機進行配置

 vim   /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state BACKUP  角色必須是BACKUP
    interface ens33
    virtual_router_id 50
    priority 100
    unicast_src_ip 192.168.37.17
    unicast_peer {
       192.168.37.7
    }
    advert_int 2
    nopreempt  設置為非搶占模式
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

 

 2、在優先級低的keepalived主機配置

 vim   /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka2
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state BACKUP   角色必須是BACKUP
    interface ens33
    virtual_router_id 60
    priority 80
    unicast_src_ip 192.168.37.7
    unicast_peer {
       192.168.37.17
    }
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

 測試效果:

 此時手動將keepalived主機優先級高的進行宕機,VIP就會漂移到優先級低的主機上。

[root@centos_17~]#systemctl stop keepalived

 此時查看優先級低的主機IP地址情況:

 

 此時就算高優先級的主機恢復,也無法搶占VIP地址,此時需要宕機優先級低的主機才會占用VIP地址。

  啟動優先級高的主機:systemctl start keepalived

  停掉優先級低的主機:systemctl stop keepalived

 

 實戰三:實現兩個以上的Keepalived主機

 背景:當公司需求量較大時,兩個keepalived已經不能滿足公司需求,此時需要配置兩台以上的keepalived,應該怎么配置?

 實現方法如下:

1、在A主機配置keepalived

  vim   /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state MASTER  主節點服務器
    interface ens33
    virtual_router_id 60 
    priority 100   優先級為100
    unicast_src_ip 192.168.37.7  綁定單播地址,防止IP地址與其他keepalived地址沖突
    unicast_peer {
       192.168.37.17   目標keepalived主機IP地址
       192.168.37.27   目標keepalived主機IP地址                                                                                                                          
    }
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1  添加VIP地址,也可以多添加幾個地址
    }
}

 2、在B主機配置keepalived  

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state BACKUP  從節點服務器
    interface ens33
    virtual_router_id 50
    priority 80 優先級為80
    unicast_src_ip 192.168.37.17   綁定單播地址,源keepalived的IP地址
    unicast_peer {
       192.168.37.7   兩個目標的keepalived的IP地址
       192.168.37.27
    }
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

3、在C主機配置keepalived  

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state BACKUP   從節點服務器
    interface ens33
    virtual_router_id 50
    priority 60  優先級為60,要比前兩個的主機優先級都要低
    unicast_src_ip 192.168.37.27  綁定單播地址,源地址
    unicast_peer {
       192.168.37.7  兩個keepalived的目標地址
       192.168.37.17
    }   
    advert_int 2
    authentication {                                                                                                                             
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

 測試效果:  

將A主機的keepalived宕機,可以觀察此時的B主機成為MASTER主機,VIP地址就會漂移到B主機上。  

 

 當B主機的keepalived也宕機之后,此時的VIP就會漂移到C主機從節點的keepalived服務器上

 

  同理:當優先級高的keepalived服務器恢復后,VIP地址就又會漂移回去。

實戰四:實現TCP模式keepalived及LVS-DR模式高可用(此用法多於HTTP用法)

 參數含義:

delay_loop<INT>:檢查后端服務器的時間間隔
lb_algorr|wrr|lc|wlc|lblc|sh|dh:定義調度方法
lb_kindNAT|DR|TUN:集群的類型
persistence_timeout<INT>:持久連接時長
protocol TCP|UDP|SCTP:指定服務協議
sorry_server<IPADDR> <PORT>:所有RS故障時,備用服務器地址
real_server<IPADDR> <PORT>
{
weight <INT> RS權重
notify_up<STRING>|<QUOTED-STRING> RS上線通知腳本
notify_down<STRING>|<QUOTED-STRING> RS下線通知腳本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定義當前主機的健康狀態檢測方法
}

 HTTP監測含義

HTTP_GET|SSL_GET:應用層檢測
HTTP_GET|SSL_GET {
url{
path <URL_PATH>:定義要監控的URL
status_code<INT>:判斷上述檢測機制為健康狀態的響應碼
}
connect_timeout<INTEGER>:連接請求的超時時長
nb_get_retry<INT>:重試次數
delay_before_retry<INT>:重試之前的延遲時長
connect_ip<IP ADDRESS>:向當前RS哪個IP地址發起健康狀態檢測請求
connect_port<PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto<IP ADDRESS>:發出健康狀態檢測請求時使用的源地址
bind_port<PORT>:發出健康狀態檢測請求時使用的源端口
}

TCP監測

 傳輸層檢測TCP_CHECK

TCP_CHECK {
connect_ip<IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port<PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto<IP ADDRESS>:發出健康狀態檢測請求時使用的源地址
bind_port<PORT>:發出健康狀態檢測請求時使用的源端口
connect_timeout<INTEGER>:連接請求的超時時長
}

1、在A主機修改keepalived配置文件

vim  /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka2
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state MASTER
    interface ens33
    virtual_router_id 50
    priority 100
    unicast_src_ip 192.168.37.7
    unicast_peer {
       192.168.37.17
    }
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

include  /etc/keepalived/conf/*.conf   定義一個單獨管理的目錄,定義keepalived配置文件

 在A主機定義LVS-DR模式配置文件

如果后期keepalived的配置文件修改過大,我們可以調用include,新建一個目錄,並在此目錄下進行存放配置文件。

[root@centos7keepalived]#mkdir conf
[root@centos7keepalived]#vim conf/tcp.conf 
virtual_server 192.168.37.100 80 {     VIP地址                                                                                                          
        delay_loop 6
        lb_algo wrr  權重輪詢
        lb_kind DR   DR模式
        protocol TCP
        sorry_server 192.168.37.47  80  配置后端sorry服務器,當兩個keepalived主機都宕機之后,就在此主機進行顯示信息。

   real_server 192.168.37.27 80 {  后端RS1服務器IP地址
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
   }

   real_server 192.168.37.37 80 {  后端RS2服務器
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

2、在B主機修改keepalived配置文件 

 vim  /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     root@localhost.com
   }
   notification_email_from root@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VIP_1 {
    state BACKUP
    interface ens33
    virtual_router_id 50
    priority 80
    unicast_src_ip 192.168.37.17
    unicast_peer {
       192.168.37.7
    }
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.37.100 dev ens33 label ens33:1
    }
}

include  /etc/keepalived/conf/*.conf

 在B主機定義LVS-DR模式的配置文件 

 新建conf目錄,並在此目錄下新建一個配置文件

[root@centos_17keepalived]#mkdir conf
[root@centos_17keepalived]#vim conf/tcp.conf 
virtual_server 192.168.37.100 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP
        sorry_server 192.168.37.47  80  定義sorry server的后端主機,當兩個keepalived主機宕機后,就會提示此信息。

   real_server 192.168.37.27 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
   }

   real_server 192.168.37.37 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

 3、后端服務器RS1上修改配置  

  在RS1綁定VIP地址及lo回環網卡

[root@centos27~]#vim lvs_dr_rs.sh 
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13                                                                                                                                 
vip=192.168.37.100   綁定VIP地址
mask='255.255.255.255'
dev=lo:1  綁定在lo回環網卡上
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "<h1>`hostname`</h1>" > /var/www/html/index.html

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 $dev $vip netmask $mask #broadcast $vip up
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

執行腳本:

[root@centos27~]#bash lvs_dr_rs.sh  start

 4、在RS2后端服務器上修改配置  

 修改RS2的配置腳本,綁定VIP地址及lo回環網卡

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.37.100                                                                                                                               
mask='255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "<h1>`hostname`</h1>" > /var/www/html/index.html

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 $dev $vip netmask $mask #broadcast $vip up
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

 執行以上腳本

[root@centos37~]#bash lvs_dr_rs.sh  start

 4、在sorry后端服務器上修改配置  

 修改sorry后端服務器配置腳本,綁定VIP地址及lo回環網卡

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.37.100                                                                                                                               
mask='255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "<h1>`hostname`</h1>" > /var/www/html/index.html

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 $dev $vip netmask $mask #broadcast $vip up
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

 執行以上腳本

[root@centos47~]#bash lvs_dr_rs.sh  start

5、測試效果: 

將RS1和RS2及sorry后端服務器添加測試頁面,並啟動httpd服務:systemctl  start httpd

[root@cenots277~]#yum install httpd
[root@cenots27~]#cd /var/www/html
[root@cenots27html]#cat index.html 
<h1>cenots27</h1>
[root@cenots37html]#cat index.html 
<h1>cenots37</h1>
[root@cenots37html]#cat index.html 
sorry server !!

 客戶端訪問LVS的VIP地址,此時LVS將調度到后端服務器,進行輪詢訪問。

 

 當后端RS1和RS2后端服務器宕機后,此時就會顯示sorry server信息。

 

 

 

 

 

 

  

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM