我們知道一個服務通常是以一個套接字形式對外提供服務,所謂套接字就是ip+端口;前面的部落格中我們主要聊到了keepalived對ip位址的高可用,但通常對ip位址高可用沒有多大實質的作用,重要的是我們高可用的ip位址後端對應的服務才是根本,這一篇部落客要講怎麼利用keepalived高可用LVS叢集,生成ipvs規則,以及對LVS叢集的rs做健康狀态檢測;
前文我們聊了下keepalived的郵件通知相關配置,回顧請參考https://blog.51cto.com/u_15127593/2803760;今天我們來說說keepalived高可用LVS叢集;
我們知道一個服務通常是以一個套接字形式對外提供服務,所謂套接字就是ip+端口;前面的部落格中我們主要聊到了keepalived對ip位址的高可用,但通常對ip位址高可用沒有多大實質的作用,重要的是我們高可用的ip位址後端對應的服務才是根本,這一篇部落客要講怎麼利用keepalived高可用LVS叢集,生成ipvs規則,以及對LVS叢集的rs做健康狀态檢測;
環境說明
名稱 | ip位址 | 端口 |
keepalived-node01(master) | 192.168.0.41 | \ |
keepalived-node02(backup) | 192.168.0.42 | |
LVS-RS1 | 192.168.0.43 | 80 |
LVS-RS2 | 192.168.0.44 | |
VIP | 192.168.0.111 |
準備LVS叢集RS1和RS2
1、安裝webserver
yum install nginx -y
提示:rs1和rs2上都要安裝nginx服務,用于後端rs提供的服務;
2、提供測試頁
3、啟動rs1和rs2上的nginx服務
4、編寫修改核心參數,并配置vip給RS1和RS2的腳本
#/bin/bash
#
vip='192.168.0.111'mask='255.255.255.255'interface='lo:0'
case $1 instart) echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore ifconfig $interface $vip netmask $mask broadcast $vip up
route add -host $vip dev $interface
;;
stop) ifconfig $interface down echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
;;*) echo "Usage:bash $0 start|stop"
exit 1
;;esac
View Code
提示:以上腳本主要實作了兩個參數,給定start參數就把對應的核心參數修改以後,并把vip配置到指定的接口;給stop參數就把vip從指定的端口上删除,并還原核心參數的設定;
在rs1和rs2上執行設定核心參數的腳本
提示:到此後端兩個RS的環境就準備好了;
配置keepalived,生成lvs規則
完整的配置
[root@node01 ~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from node01_keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node01
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.12.132}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress { 192.168.0.111/24 brd 192.168.0.255 dev ens33 label ens33:1
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"}
virtual_server 192.168.0.111 80 {
delay_loop 3
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.0.43 80 {
weight 1
nb_get_retry 2
delay_before_retry 2
connect_timeout 30
HTTP_GET {
url {
path /index.html
status_code 200
}
}
}
real_server 192.168.0.44 80 {
weight 1
nb_get_retry 2
delay_before_retry 2
connect_timeout 30
HTTP_GET {
url {
path /index.html
status_code 200
}
}
}
}
[root@node01 ~]#
提示:virtual_server用于定義LVS對外叢集ip位址和端口(vip),用大括号括起來,其中delay_loop用于指定對後端rs做健康狀态檢查的時間間隔;lb_algo/lvs_sched用于指定lvs的排程算法,常用的算法有rr,wrr,lc,wlc,lblc,sh,dh;lb_kind/lvs_method用于指定lvs叢集的類型,常用的類型有DR,NAT,TUN,需注意這裡的類型的值必須大寫,否則服務有異常;有關LVS叢集類型的相關說明;protocol用于指定4層協定,常用的4層協定有TCP ,UDP,SCTP,需注意這裡的值必須大寫;sorry_server用于指定,當後端RS都當機情況下,臨時對使用者說sorry的伺服器位址和端口;real_server:用來定義後端RS的相關配置,其中weight用于指定目前rs的權重,nb_get_retry用指定對rs檢測的重試次數,如果在指定的次數上都監測失敗就标記該RS為下線狀态,并從目前叢集中下線;delay_before_retry用于指定重試之前延遲的時間;connect_timeout用于指定對rs檢測的逾時時長;HTTP_GET 用于配置對rs的檢查方法,HTTP_GET表示應用層http檢測,其中path用于指定檢測到uri,status_code用于指定對指定URI檢測到狀态碼,通常為200;以上virtual_server的配置在node02上也是相同的配置;
安裝sorryserver,并配置測試頁面
啟動keepalived
提示:到此基于keepalived高可用LVS叢集就配置完成了;
驗證:用浏覽器對VIP通路,看看是否能夠通路到後端RS提供的頁面?
提示:我們用浏覽器通路VIP并沒有通路到後端的rs提供的頁面;其中的原因是我們在配置keepalived時,開啟了嚴格遵守vrrp協定,是以啟動keepalived它預設會自動生成iptables規則,禁止任何位址通路VIP;
提示:解決辦法用iptables -F清空iptables規則;這種清空iptables規則的方式隻是臨時的方式,重新開機以後,或者vip飄逸後,對應的規則又會生成,永久解決辦法是在keepalived的配置檔案,禁用它自動生成iptabels規則;
提示:在/etc/keepalived/keepalived.conf的global_defs中加上vrrp_iptables這個配置,這個配置表示禁用自動生成iptables規則;當然我們也可配置不嚴格遵守vrrp協定,把vrrp_strict去掉也行;選擇其中一種方式即可;
驗證:重新開機keepalived,看看對應iptables規則是否還會生成?
提示:可以看到現在vip所在節點的iptables規則就沒有在自動生成了,對于node02也是相同的配置,重新開機keepalived即可解決自動生成iptables規則的問題;
現在在用浏覽器通路vip,看看是否能夠通路到後端RS提供的頁面?
提示:可以看到我們在浏覽器上通路VIP是可以正常通路到後端rs提供的頁面;
驗證:把node01上的keepalived停掉,看看node02是否會自動将vip配置上對應的接口?用浏覽器是否還會通路到rs提供的頁面呢?
提示:可以看到當node01的keepalived當機以後,對應vip會自動飄逸到node02上去,并且在用戶端通路VIP幾乎不受影響;
驗證:在node01上檢視ipvs規則,看看是否都生成了ipvs規則呢?
提示:可以看到node01上并沒有生成ipvs規則,原因是keepalived停掉了,對應的ipvs規則也就删除了;node02上的keepalived是活躍狀态,是以對應ipvs規則也是有keepalived自動生成;
驗證:把rs1的web服務停掉,看看keepalived是否會檢測到rs1不再線,進而把rs1自動從叢集踢出去呢?
提示:可以看到當rs1故障以後,keepalived會檢測到rs1故障,然後把rs1從叢集中提出去,是以我們在ipvs規則表中就沒有rs1;
驗證:把rs2停掉,看看對應的sorryserver是否會被激活?
提示:可以看到把rs2停掉以後,對應ipvs規則表中就沒有RS2,并且它會把我們之前配置的sorryserver 的位址和端口配置上;
驗證:用浏覽器通路VIP看看對應相應的内容是否是vip所在節點的sorryserver提供的頁面呢?
提示:可以看到當rs都當機以後,再次通路VIP就會響應我們之前在配置檔案中提供的sorryserver的頁面;
驗證:啟動rs1或rs2看看對應sorryserver是否會下線呢?
提示:可以看到當rs2恢複以後,對應的sorryserver就從叢集下線;