前文咱們聊了下keepalived的郵件通知相關配置,回顧請參考http://www.javashuo.com/article/p-txfiklji-nh.html;今天咱們來講說keepalived高可用LVS集羣;html
咱們知道一個服務一般是以一個套接字形式對外提供服務,所謂套接字就是ip+端口;前面的博客中咱們主要聊到了keepalived對ip地址的高可用,但一般對ip地址高可用沒有多大實質的做用,重要的是咱們高可用的ip地址後端對應的服務纔是根本,這一篇博客主要講怎麼利用keepalived高可用LVS集羣,生成ipvs規則,以及對LVS集羣的rs作健康狀態檢測;node
環境說明nginx
名稱 | 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 | 80 |
VIP | 192.168.0.111 | 80 |
準備LVS集羣RS1和RS2web
一、安裝webserver算法
yum install nginx -y
提示:rs1和rs2上都要安裝nginx服務,用於後端rs提供的服務;後端
二、提供測試頁瀏覽器
三、啓動rs1和rs2上的nginx服務bash
四、編寫修改內核參數,並配置vip給RS1和RS2的腳本服務器
#/bin/bash # vip='192.168.0.111' mask='255.255.255.255' interface='lo:0' case $1 in start) 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
提示:以上腳本主要實現了兩個參數,給定start參數就把對應的內核參數修改之後,並vip配置到指定的接口;給stop參數就把vip從指定的端口上刪除,並還原內核參數的設定;ide
在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集羣類型的相關說明請參考http://www.javashuo.com/article/p-pwviqlid-hz.html;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就從集羣下線;
到此基於keepalived高可用LVS集羣的配置,測試就結束了;