Keepalived+LVS_DR雙主架構

一:環境介紹

1.操作系統:

centos6.9和7.3,censtos6用作keepalived調度,centos7用作realserver

2.服務安裝:

keepalived-1.2.13-5.el6_6.x86_64

nginx-1.10.2-1.el7.x86_64

mariadb-5.5.52-1.el7.x86_64

php-fpm-5.4.16-42.el7.x86_64

以上都是yum倉庫安裝

3.實驗環境

關閉selinux,關閉iptables,時間同步

二:原理及拓撲圖

1.lvs概念

lVSLinux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。主要是工作在內核中,通過其他工具配置調用,只認識IP地址和端口。例如ipvsadm,但是在本案例中,keepalived完全可以代理ipvsadm調用lvs

1.VRRPVirtual Router Redundancy Protocol虛擬路由冗餘協議)

可以認爲是實現路由器高可用的協議,簡單的說,當一個路由器故障時可以由另一個備份路由器繼續提供相同的務。

VRRP根據優先級來確定虛擬路由器中每臺路由器的角色(Master路由器或Backup路由器) VRRP優先級的取值範圍爲0255(數值越大表明優先級越高),可配置的範圍是1254,優先級0爲系統保留給路由器放棄Master位置時使用,255則是系統保留給IP地址擁有者使用。優先級越高,則越有可能成爲Master路由器。當兩臺優先級相同的路由器同時競爭Master時,比較接口IP地址大小,接口地址大者當選爲Master

2.keepalived簡介

Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),但是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。KeepalivedVRRP的完美實現。

3.lvs_dr

直接路由,LVS默認模式,應用最廣泛,通過爲請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變。

工作原理:DR和REAL SERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有REAL SERVER對本身這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算法,找出對應的 REAL SERVER,把目的MAC地址改爲REAL SERVER的MAC併發給這臺REAL SERVER。這時REAL SERVER收到這個數據包,則等於直接從客戶端收到這個數據包無異,處理後直接返回給客戶端。由於DR要對二層包頭進行改換,所以DR和REALSERVER之間必須在一個廣播域,也可以簡單的理解爲在同一臺交換機上。

需要注意的是:

第一:確保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,這就亂套了。

4.拓撲圖


三:keepalived配置

1.安裝keepalived

yum install keepalived -y

2.高可用的ipvs雙主集羣配置

1.節點一的配置:

global_defs {

   notification_email {

        root@localhost

}

   notification_email_from [email protected]

   smtp_server 172.0.0.1

   smtp_connect_timeout 30

   router_id LVS_KEEPALIVED

}

vrrp_instance VI_1 {

    state MASTER

    interface eth1

    virtual_router_id 10

    priority 100

    advert_int 1

#nopreempt

   authentication {

     auth_type PASS

     auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.200

}

}

virtual_server 172.17.250.200 80 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server 172.17.252.78  80 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    real_server 172.17.110.110  80 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

}

vrrp_instance VI_2 {

    state BACKUP

    interface eth1

    virtual_router_id 20

    priority 98

    advert_int 1

   #nopreempt

    authentication {

        auth_type PASS

        auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.250

}

}

virtual_server 172.17.250.250 443 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server 172.17.252.78  443 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    real_server 172.17.110.110 443 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

}

第二步:節點二的配置

global_defs {

   notification_email {

        root@localhost

}

   [email protected]

   smtp_server 172.0.0.1

   smtp_connect_timeout 30

   router_id LVS_KEEPALIVED

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 10

    priority 98

    advert_int 1

 # nopreempt

    authentication {

        auth_type PASS

        auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.200

}

}

virtual_server 172.17.250.200 80 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server172.17.252.78  80 {

        weight 1

            connect_timeout3

            nb_get_retry 3

            delay_before_retry 3

        }

    real_server172.17.110.110  80 {

        weight 1

            connect_timeout3

            nb_get_retry 3

           delay_before_retry 3

        }

}

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 20

    priority 100

    advert_int 1

 #   nopreempt

    authentication {

        auth_type PASS

    auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.250

}

}

virtual_server 172.17.250.250 443 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server172.17.252.78  443 {

        weight 1

            connect_timeout3

            nb_get_retry 3

           delay_before_retry 3

        }

    real_server 172.17.110.110  443 {

        weight 1

            connect_timeout3

            nb_get_retry 3

           delay_before_retry 3

        }

}

四:realserver配置

我的realserv服務器實現的小米電子網站,所以就不過多介紹了,用的是lnmp的架構,80端口和443端口分別代表不同的虛擬ip訪問的不同站點,互爲主備。

1.nginx加密的步驟如下

mkdir /usr/local/nginx/conf -p  --建立一個存放加密文件的目錄

cd /usr/local/nginx/conf/

openssl genrsa -des3 -out server.key 1024  --創建服務器私鑰會讓你輸入一個口令

openssl req -new -key server.key -out server.csr  --創建簽名請求的證書csr

 cp server.keyserver.key.org

openssl rsa -in server.key.org -out server.key  --加載ssl支持nginx的時候使用私鑰除去必須的口令

openssl x509 -req -days 365 -in server.csr -signkey server.key-out server.crt  --標誌證書使用上述私鑰和csr

2.主要修改配置文件如下:

讓站點兼容80端口和443端口

    server {

        listen       80;

        listen     443 ssl;

        server_name  xiaomi.magedu.com;

        root /data/web;

        #charset koi8-r;

        ssl_certificate      /usr/local/nginx/conf/server.crt;

       ssl_certificate_key /usr/local/nginx/conf/server.key;

}

3.修改內核參數:

dr模型中,各主機上均需要配置VIP,解決地址衝突的方式有三種:

(1) 在前端網關做靜態綁定;

(2) 在各RS使用arptables;

(3) 在各RS修改內核參數,來限制arp響應和通告的級別;

限制響應級別:arp_ignore

 0:默認值,表示可使用本地任意接口上配置的任意地址進行響應;

 1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,纔給予響應;

限制通告級別:arp_announce

 0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告;

 1:儘量避免向非直接連接網絡進行通告;

 2:必須避免向非本網絡通告。

#配置本地迴環網卡路由

echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore

#1  只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求

echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce

#2 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

#關閉arp應答

1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應

2:必須避免將接口信息向非本網絡進行通告

4.配置迴環網卡和路由:

ifconfig lo:0 172.17.250.200 broadcast 172.17.250.200 netmask255.255.255.255 up

route add -host 172.17.250.200 lo:0

ifconfig lo:1 172.17.250.250 broadcast 172.17.250.250 netmask255.255.255.255 up

route add -host 172.17.250.250 lo:1

五:測試

1.啓動服務

ip漂移前:

74ead1b0e73826a3f9737f8e9bbbd2ed.png

c4e370fb2626f7180868adb599fde91d.png

ip漂移後:

36461d47333a5a196e368ffb0ec22c33.png

2e35d7ca27f8f9b7ea9d038751ee395d.png

2.模擬一臺keepalived服務器宕機

 service stop keepalived

e927de362baf03a2403723c4a30a36c6.png

829b111d83152feb2527d280728cc7c8.png

3.模擬一臺web服務宕機:

systemctl stop  nginx

0bac8405742123f72f12ff2f84458bda.png

d5c73d79c843b8f1caa4ede792074008.png


4.實驗總結

由此我們發現即使一臺高可用負載均衡器的主機宕機了,我們依然可以通過另外一個虛擬ip進行wab訪問,體現了高可用的實用性,Keepalived檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web 服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。lvs只是能夠負載均衡,爲後端的web服務器分流,降低web負載,加上keepalived就能夠實現高可用負載均衡,而且主主模式也能夠避免主備模式一臺調度器完全被壓榨的狀態,可以爲客戶端提供更高效的服務。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章