高可用與負載均衡(7)之聊聊Lvs-DR+Keepalived的解決方案


今天直接開門見山了,直接說配置吧。首先介紹下我這的環境
如有問題,請聯系我18500777133@sina.cn

IP 安裝軟件
192.168.1.7 lvs1+keepalived master角色
192.168.1.8 lvs2+keepalived backup角色
192.168.1.6 web1-Nginx
192.168.1.4 web2-Nginx

keepalived的vip是192.168.1.200,系統環境都是CentOs6.6 64位。
需要注意的是:
第一:確保client能夠直接訪問web服務器。因為在LVS-DR模式下web服務器回復client的時候,是直接回復給client的,不需要經過LVS,所以web服務器必須能夠和client的網絡互通。
第二,lvs服務器和web-server他們必須在同一個網段內,因為LVS轉發包的時候,是直接修改了包目標的MAC地址,直接扔給了rs,基於MAC地址的修改是活動在OSI二層數據鏈路層的,工作在數據鏈路層的網絡設備就是交換機了,所以必須在一個交換機下面,也就是一個局域網內。
第三為啥抑制real-server的ARP,是這樣的,我們在DR模式要更改web-server的ARP的模式,arp_ignore為1是說只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,我們都在回環接口上配置了一個VIP,當arp模式更改以后,那么如果有誰在請求VIP的mac地址時,那么那些web-server就會回答arp廣播報文了,只有lvs才會,如果沒有更改arp模式,那么大家都喊我是VIP,這就亂套了。

LVS+keepalived的調整

我們首先在LVS1和LVS2上開啟路由轉發的功能

[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1    #編輯這行
[root@localhost ~]# sysctl -p   
net.ipv4.ip_forward = 1

接下來安裝keepalived,我這里采用yum安裝,命令yum install keepalived的,安裝完系統自帶的yum源即可,安裝完之后配置keepalived。
先看keepalived master的配置文件

[root@localhost ~]# cat /etc/keepalived/keepalived.conf     
! Configuration File for keepalived

global_defs {            # 全局設置
   notification_email {    # 設置報警郵件地址
    18500777133@sina.cn
   }
   notification_email_from Alexandre.Cassen@firewall.loc   # 設置郵件的發送地址
   router_id test-1         # 表示該台服務的ID
}
vrrp_sync_group vg_1 {               # vrryp 同步組,組成員是vrrp實例的名字。
    group {
        VI_1
    }
}

vrrp_instance VI_1 {               # vrrp 實例
    state MASTER                   #master狀態
    interface eth0
    virtual_router_id 51           # master和backup的id一致
    priority 100
    advert_int 1                   # master和backup之間的檢測時間
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200/32 dev eth0          # 設置虛擬IP    
    }
}

virtual_server 192.168.1.200 80 {    # 設置虛擬服務器,ip端口以及花邊號用逗號隔開
    delay_loop 5         # 設置運行情況檢查時間,單位是秒
    lb_algo rr           # 負載算法,這里是rr表示輪詢
    lb_kind DR           # LVS工作機制,這里是DR模式
    persistence_timeout 50    # 會話保持時間,單位是秒,這個選項對動態網頁非常有幫助,為集群系統中的session共享提供了一個很好的解決方案,有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,知道超過這個會話的保持時間,需要注意的是,這個會話保持時間是最大無響應的超時時間,in other words,用戶在動態頁面50秒以內沒有執行任何操作,那么接下來的操作會重新調度到另一個節點上。如果一直在操作則不會影響
    protocol TCP   # 有TCP,UDP,好像還有哦http。

    real_server 192.168.1.6 80  {     #設定真實服務器地址以及端口,
        weight 1         # 設置權重,數字越低,調度的比例越小。
        HTTP_GET {      #以http模式檢查該服務器監控狀態 
            url {    
              path /      # 檢測的網頁路徑
              digest e3eb0a1df437f3f97a64aca5952c8ea0      # 采用genhash命令獲取
            }
            connect_timeout 1   # 連接超時時間,
            connect_port 80      連接的端口,
            nb_get_retry 3        # 表示重試次數,
            delay_before_retry 1   # 表示重試間隔。
        }
    }
    
    real_server 192.168.1.4 80  {
        weight 1
        HTTP_GET {
            url {
              path /test.html
              digest 1181c1834012245d785120e3505ed169
            }
            connect_timeout 2
            connect_port 80
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

再看看keepalived的backup配置:

[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    18500777133@sina.cn
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   router_id test-2
}

vrrp_sync_group vg_1 {
    group {
        VI_1
    }
}

vrrp_instance VI_1 { 
    state BACKUP            # backup狀態
    interface eth0         
    virtual_router_id 51      # master和backup的id一致
    priority 90              #優先級比master低些
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200/32 dev eth0
    }
}

virtual_server 192.168.1.200 80 {
    delay_loop 5
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.6 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              digest e3eb0a1df437f3f97a64aca5952c8ea0
            }
            connect_timeout 1
            connect_port 80
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    
    real_server 192.168.1.4 80  {
        weight 1
        HTTP_GET {
            url {
              path /test.html
              digest 1181c1834012245d785120e3505ed169
            }
            connect_timeout 2
            connect_port 80
            nb_get_retry 3
            delay_before_retry 1
        }
    }

}

我們這會用genhash來獲取web服務 url的校驗碼:

[root@localhost ~]# genhash -s 192.168.45.128 -p 80 -u /
MD5SUM = e3eb0a1df437f3f97a64aca5952c8ea0         # 把這個校驗碼放在keepalived的配置文件即可。

配置完后,暫且不着急啟動keepalived的服務。我們先行配置web服務器。

Web服務器的調整

兩台web服務器都做同樣的操作
首先更改sysctl.conf的配置文件。命令如下:

root@leo-virtual-machine:~# cat /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
root@leo-virtual-machine:~# sysctl -p   #使其剛才的配置立即生效

添加虛擬IP以及路由,命令如下:

root@leo-virtual-machine:~# ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200 up
@root@leo-virtual-machine:~# route add -host 192.168.1.200 dev lo:0         #先不添加這路由,如果出現無法訪問的時候再添加也不遲 

個人建議不要忘記在rc.local里面寫入增加VIP的添加命令,省去開機后人工配置的麻煩:

@root@leo-virtual-machine:~# cat /etc/rc.local 
ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200
route add -host 192.168.1.200 dev lo:0

完成之后,后端啟動httpd服務

啟動keepalived的服務

在master服務器上啟動

[root@localhost ~]# service  keepalived start
[root@localhost ~]# tail /var/log/messages -f     # 查看keepalived的日志,確保服務啟動正常
'''
Nov 19 17:09:28 localhost Keepalived_healthcheckers[14376]: Using LinkWatch kernel netlink reflector...
Nov 19 17:09:28 localhost Keepalived_healthcheckers[14376]: Activating healthchecker for service [192.168.1.6]:80   # 后端real-server校驗成功,可以提供服務
Nov 19 17:09:28 localhost Keepalived_healthcheckers[14376]: Activating healthchecker for service [192.168.1.4]:80   # 后端real-server校驗成功,可以提供服務
Nov 19 17:09:28 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Transition to MASTER STATE        # 設置本機為master角色
Nov 19 17:09:28 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
Nov 19 17:09:28 localhost Keepalived_vrrp[14377]: VRRP_Group(vg_1) Syncing instances to MASTER state
Nov 19 17:09:29 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 19 17:09:29 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) setting protocol VIPs.    #設置VIP到本機上
Nov 19 17:09:29 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.200     

[root@localhost ~]# ip a|grep 'inet '
    inet 127.0.0.1/8 scope host lo
    inet 192.168.1.7/24 brd 192.168.1.255 scope global eth0   
    inet 192.168.1.200/32 scope global eth0    # VIP已經在了。
You have new mail in /var/spool/mail/root

在backup以同樣的命令啟動keepalived的,測試負載功能和高可用功能。

檢測服務是否可以高可用以及負載均衡

1 在keepalived的master上停止keepalived的服務,模擬服務器宕機啦。等2秒后,到keepalived的backup服務器上查看VIP是否漂移過去。此時用瀏覽器繼續訪問192.168.1.200,看web服務器能夠正常響應。且注意網頁,看是不是負載均的效果(根據權重,權重高的服務提供的網頁次數多。)

2 在第一步的基礎上,我們在keepalived的master上重新啟動keepalived的服務,等待3秒后,看VIP是否正常切回,切回后檢測web服務器是否可用。


免責聲明!

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



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