1. 程式人生 > >lvs-dr+keepalived實例架設

lvs-dr+keepalived實例架設

連接 地址 service nec 8 8 ××× devel curl virt

lvs-dr+keepalived實例架設
一、 實戰基於ipvs的集群
集群的拓撲圖
node1:17216.100.67
node2:170.16.100.68
VIP:172.16.100.88
RS1:172.16.100.6
RS2:172.16.100.69
技術分享圖片

1、 檢查配置real server1(172.16.100.6)的web服務。
~] rpm –q httpd
技術分享圖片

~] echo ‘’<h1>RS1 CentOS 6</h1>” > /var/www/html/index.html
開啟apache服務
~] service httpd start
技術分享圖片

2、 檢查配置real server2(172.16.100.69)的web服務。

~] rpm –q httpd
技術分享圖片

檢查到RS2沒有安裝httpd
~] yum install httpd -y
技術分享圖片

~] echo ‘’<h1>RS2 CentOS 7</h1>” > /var/www/html/index.html
開啟apache服務
~] systemctl start httpd.service
查看服務是否啟動
~] ss –tnl
技術分享圖片

3、 安裝director的ipvsadm
確保ipvs功能存在。(此處不用確認,因為內核中有ipvs功能)
安裝ipvsadm。
~] yum install ipvsadm –y

4、 配置director1的vip地址。
~] ifconfig

技術分享圖片

~] ip addr add 172.16.100.88/32 dev eno16777736
技術分享圖片

~] ip addr list
技術分享圖片

5、 在node2上檢查node1(director1)的vip地址是否通。
~] ping 172.16.100.88
技術分享圖片

6、 配置real server1的arp_announce,arp_ignore。
在real server1上編輯一個執行腳本(修改arp_announce,arp_ignore兩個內核參數腳本)。
~] vim set.sh

#!/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
;;
stop)
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
;;
esac
技術分享圖片

執行腳本
~] bash set.sh start
技術分享圖片

檢查內核參數修改情況。
~] cat /proc/sys/net/ipv4/conf/all/arp_ignore
~] cat /proc/sys/net/ipv4/conf/all/arp_announce
技術分享圖片

7、 把set.sh腳本傳遞給另一個RS2
~] scp set.sh 172.16.100.69:/root/
技術分享圖片

8、 在RS2(172.16.100.69)上運行set.sh腳本修改內核參數。
~] bash set.sh start
技術分享圖片
驗證內核參數修改情況
~] cat /proc/sys/net/ipv4/conf/all/arp_ignore
技術分享圖片

9、 配置RS1(172.16.100.6)的ip地址。
~] ifconfig lo:0 172.16.100.88 netmask 255.255.255.255 broadcast 172.16.100.88 up
~] route add –host 172.16.100.88 dev lo:0
技術分享圖片

10、 配置RS2(172.16.100.69)的ip地址。
~] ifconfig lo:0 172.16.100.88 netmask 255.255.255.255 broadcast 172.16.100.88 up
~] route add –host 172.16.100.88 dev lo:0
技術分享圖片

11、 在node1(172.16.100.67)上添加ipvs規則。(下面的-s是算法,-g指明的是dr類型)
~] ipvsadm –A –t 172.16.100.88:80 –s rr
~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.6 –g –w 1
~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.69 –g –w 2
查看ipvs規則
~] ipvsadm –Ln
技術分享圖片

12、 用node2作為客戶端請求vip看結果。
~] curl http://172.16.100.88
技術分享圖片
此時證明第一個director1(node1)已經ok。

13、 在node1上清空的ipvs規則,並刪除eno16777736的網卡。
~] ipvsadm -C
~] ip addr del 172.16.100.88/32 dev eno16777736
~] ip addr list
技術分享圖片

14、 安裝第二個director2(node2)172.16.100.68。
~] yum –y install ipvsadm
技術分享圖片

15、 配置node2的vip。
~] ip addr add 172.16.100.88/32 dev eno16777736
技術分享圖片

16、 生成ipvs規則。
~] ipvsadm –A –t 172.16.100.88:80 –s wrr
~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.6 –g –w 1
~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.69 –g –w 2

17、 在node1檢查node2(172.16.100.68)的LB功能是夠正常。
~] curl http://172.16.100.88
技術分享圖片
此時證明director2功能正常。

18、 在node2上清空的ipvs規則,並刪除eno16777736的網卡。
~] ipvsadm –C
~] ip addr del 172.16.100.88/32 dev eno16777736
~] ip addr list
技術分享圖片

19、 為了讓兩個node節點都有sorry server,所以兩個節點上安裝httpd服務。
~] yum –y install httpd
技術分享圖片
技術分享圖片

20、 在兩個node節點上各自給一個sorry頁面。
root@node1 ~] echo “<h1>Sorry, under maintenance</h1>” > /var/www/html/index.html
root@node2 ~] echo “<h1>Sorry, under maintenance(68)</h1>” > /var/www/html/index.html
技術分享圖片

21、 兩個節點上apache服務啟動。
node1(172.16.100.67)上執行apache服務啟動。
root@node1 ~] systemctl start httpd.service
node2(172.16.100.68)上執行apache服務啟動。
root@node2 ~] systemctl start httpd.service

22、 兩個節點上安裝配置keepalived。
root@node1 ~] yum install keepalived –y
root@node2 ~] yum install keepalived –y

23、 備份兩個節點的keepalived.conf配置文件。
root@node1 ~] cd /etc/keepalived/
root@node1 ~] cp keepalived.conf{,.backup}
root@node2 ~] cd /etc/keepalived/
root@node2 ~] cp keepalived.conf{,.backup}

24、 編輯node1節點上的keepalived.conf配置文件和notify.sh腳本。

配置node1節點上的keepalived.conf配置文件。
! Configuration File for keepalived

global_defs {
notification_email { [email protected]
br/>[email protected]
}
notification_email_from [email protected]
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}

vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1 #檢查的時間間隔為1秒
weight -2 #一但-f的down文件存在,weight權重-2
}

vrrp_instance VI_1 {
interface eno16777736
state MASTER # BACKUP for slave routers
priority 101 # 100 for BACKUP
virtual_router_id 51
garp_master_delay 1
advert_int 1

authentication {  
    auth_type PASS  
    auth_pass 2231da37af98 #openssl rand –hex 6命令生成隨機數
}    
virtual_ipaddress {  
    172.16.100.88/32 dev eno16777736 label eno16777736:1
}  
track_script {  
    chk_mantaince_down
}  

notify_master "/etc/keepalived/notify.sh master"  
notify_backup "/etc/keepalived/notify.sh backup"  
notify_fault "/etc/keepalived/notify.sh fault"  

}

virtual_server 172.16.100.88 80 {
delay_loop 6 #檢查失敗要轉6圈
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
persistence_timeout 50 #做持久連接
protocol TCP

sorry_server 127.0.0.1 80 #定義當所有RS掛掉,node的sorry server
real_server 172.16.100.6 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.100.69 80 {
    weight 2
    HTTP_GET {
        url { 
          path /
          status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}

}

編輯node1上的/etc/keepalived/notify.sh腳本。
#!/bin/bash

vip=172.16.100.88
contact=‘root@localhost‘

notify() {
mailsubject="hostname to be $1: $vip floating"
mailbody="date ‘+%F %H:%M:%S‘: vrrp transition, hostname changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo ‘Usage: basename $0 {master|backup|fault}‘
exit 1
;;
esac

給予notify.sh執行權限。
~] chmod +x notify.sh

25、 編輯node2節點上的keepalived.conf配置文件和notify.sh腳本。
配置node2節點上的keepalived.conf配置文件。
! Configuration File for keepalived

global_defs {
notification_email { [email protected]
br/>[email protected]
}
notification_email_from [email protected]
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}

vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1 #檢查的時間間隔為1秒
weight -2 #一但-f的down文件存在,weight權重-2
}

vrrp_instance VI_1 {
interface eno16777736
state BACKUP # BACKUP for slave routers
priority 100 # 100 for BACKUP
virtual_router_id 51
garp_master_delay 1
advert_int 1

authentication {  
    auth_type PASS  
    auth_pass 2231da37af98 #openssl rand –hex 6命令生成隨機數
}    
virtual_ipaddress {  
    172.16.100.88/16 dev eno16777736 label eno16777736:1
}  
track_script {  
    chk_mantaince_down
}  

notify_master "/etc/keepalived/notify.sh master"  
notify_backup "/etc/keepalived/notify.sh backup"  
notify_fault "/etc/keepalived/notify.sh fault"  

}

virtual_server 172.16.100.88 80 {
delay_loop 6 #檢查失敗要轉6圈
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
persistence_timeout 50 #做持久連接
protocol TCP

sorry_server 127.0.0.1 80 #定義當所有RS掛掉,node的sorry server
real_server 172.16.100.6 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.100.69 80 {
    weight 2
    HTTP_GET {
        url { 
          path /
          status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}

}

編輯node2上的/etc/keepalived/notify.sh腳本。
#!/bin/bash

vip=172.16.100.88
contact=‘root@localhost‘

notify() {
mailsubject="hostname to be $1: $vip floating"
mailbody="date ‘+%F %H:%M:%S‘: vrrp transition, hostname changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo ‘Usage: basename $0 {master|backup|fault}‘
exit 1
;;
esac

給予notify.sh執行權限。
~] chmod +x notify.sh

26、 啟動兩個節點上的keepalived服務。
root@node1 ~] systemctl start keepalived.service
root@node2 ~] systemctl start keepalived.service

27、 檢查node1的keepalived服務生成狀況。
在node1(172.16.100.67)節點上執行tcpdump命令。
~] tcpdump –i eno16777736 –nn host 172.16.100.68
技術分享圖片

以上可以看到對RS1(172.16.100.6)和RS2(172.16.100.69)做健康狀態檢查,說明keepalived服務已經啟動。

在node1上使用ip addr list查看vip情況。
root@node1 ~] ip addr list
技術分享圖片
在利用ipvsadm –Ln檢查ipvs規則生成情況。
root@node1~] ipvsadm –Ln
技術分享圖片

28、 檢查node2的keepalived生成情況。

在node2上使用ip addr list查看vip情況,ipvs規則情況。
root@node2 ~] ip addr list
root@node2 ~] ipvsadm -Ln
技術分享圖片

29、 利用mail查看自己定義的腳本(notify)郵件傳送的情況。
root@node1 ~] mail
技術分享圖片
root@node2 ~] mail
技術分享圖片
此時看出notify的郵件傳送也能實現。

30、 用node2節點來訪問vip看集群架設是否正常。
root@node2 ~] crul http://172.16.100.88
技術分享圖片

31、 此時讓RS1(172.16.100.6)下線,看分發情況。
root@RS1 ~] service httpd stop
技術分享圖片
在node1(MASTER)上查看ipvs規則,是否自動清掉RS1。
root@node1 ~] ipvsadm –Ln
技術分享圖片
在node2上執行curl命令看訪問效果。
root@node2 ~] curl http://172.16.100.88
技術分享圖片

32、 此時讓RS1(172.16.100.6)上線,還在node2上執行curl命令查看RS1是否被重新加入ipvs規則中。
root@node2 ~] curl http://172.16.100.88
技術分享圖片

33、 當所有的RS掛掉後,node節點上應該有個sorry server提示,sorry server定義在virtual server裏面。

34、 關閉一臺node1,看vip能否轉移。可以stop keepalived服務,也可以在keepalived目錄中創建一個/etc/keepalived/down文件讓vip從master中轉移到backup中;在刪除node1的down文件,看vip轉移。以此來證明HA的架構是否有問題。

35、 關閉兩臺node。訪問vip(172.16.100.88)看是否有sorry server。
技術分享圖片

lvs-dr+keepalived實例架設