lvs+keepalived實現高可用負載均衡

一、lvs


1.名詞解釋
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。
2.lvs的技術簡介
以下引用自百度百科
【1】技術簡介
LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。
【2】集羣採用三層結構
一般來說,LVS集羣採用三層結構,其主要組成部分爲:
A、負載調度器(load balancer),它是整個集羣對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址(我們可稱之爲虛擬IP地址)上的。
B、服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有WEB、MAIL、FTP和DNS等。
C、共享存儲(shared storage),它爲服務器池提供一個共享的存儲區。
3.三種 IP 負載均衡技術
這裏寫圖片描述
在已有的IP負載均衡技術中,主要有通過網絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的、高可用的虛擬服務器,我們稱之爲VS/NAT技術(Virtual Server via Network Address Translation)。在分析VS/NAT的缺點和網絡服務的非對稱性的基礎上,我們提出了通過IP隧道實現虛擬服務器的方法VS/TUN (Virtual Server via IP Tunneling),和通過直接路由實現虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統的伸縮性。VS/NAT、VS/TUN和VS/DR技術是LVS集羣中實現的三種IP負載均衡技術。

二、keepalived


1.作用
主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。

**三、LVS(IP負載均衡)+Keepalived的部署**

這裏我們採用VS/DR
實驗環境: rhel6
server1: 172.25.70.1
server2: 172.25.70.2
server3: 172.25.70.3
server4: 172.25.70.4

server1爲調度服務器(vs),server2和server3爲rs(真實的後端服務器),server4爲keepalived備機
1.利用ipvsadm
利用ipvsadm內核功能,(不需要開啓,用戶層面需要控制這個服務,調用腳本來保存)策略)

  • 所需軟件:ipvsadm-1.26-2.el6.x86_64 (配置yum源) 添加如下:
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.70.250/rhel6.5/HighAvailability
gpgcheck=0


[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.70.250/rhel6.5/ResilientStorage
gpgcheck=0


[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.70.250/rhel6.5/ScalableFileSystem
gpgcheck=0


[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.70.250/rhel6.5/LoadBalancer
gpgcheck=0
  • 安裝
[root@server1 ~]# yum install ipvsadm -y
  • 調度服務器(vs)做如下配置(server1)
[root@server1 ~]# ip addr add 172.25.70.100/24 dev eth0   #添加一個vip
[root@server1 ~]# ipvsadm -A -t 172.25.70.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.3:80 -g

添加一個vip(調度服務器的虛擬ip)以及爲該vip綁定兩個rs(真實的後端服務器)的ip,他們的監聽端口都爲80

  • 在rs上做下面配置(server2&&server3)
    我們在真實的服務器上自然也需要添加vip,但是需要安裝arptables_jf插件,然後在該插件上做一些策略,使得ip地址爲vip的數據包,在進入rs的時候被丟棄,並且rs的數據包在出去的時候廣播的是自己真實的ip而不是vip
[root@server2 ~]# yum install arptables_jf -y

[root@server2 ~]# arptables -A IN -d 172.25.70.100 -j DROP
[root@server2 ~]# arptables -A OUT -s  172.25.70.100 -j mangle --mangle-ip-s 172.25.70.2
[root@server2 ~]# ip addr add 172.25.70.100/24 dev eth0
server3同理
  • 在server2&&serer3的apache的默認發佈目錄下分別編輯這樣的頁面
[root@server2 ~]# vim /var/www/html/index.html 
<h1>the page from server2</h1>

[root@server3 ~]# vim /var/www/html/index.html 
<h1>the page from server3</h1>
  • 測試,通過訪問vip看是否能在rs鍵實現輪循
[root@foundation70 kiosk]# curl 172.25.70.100
<h1>the page from server3</h1>

[root@foundation70 kiosk]# curl 172.25.70.100
<h1>the page from server2</h1>

測試成功,同時我們可以查看該vip的訪問對應哪一臺服務器的mac地址

[root@foundation70 kiosk]# arp -an | grep 100
? (172.25.70.100) at 52:54:00:ff:a3:61 [ether] on br0
You have new mail in /var/spool/mail/kiosk

這裏寫圖片描述
如你所料,對應的是vs的mac地址,具體原理可以參見這篇博客(我感覺不可能有人家寫的具體詳細~~)

2.keepalived的安裝和部署

  • 安裝keepalived
    需要的材料:keepalived-1.3.6.tar.gz libnfnetlink-devel-1.0.0-1.el6.x86_64.rp
[root@server1 ~]# tar -zxf keepalived-1.3.6.tar.gz
[root@server1 ~]# yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm openssl-devel libnl-devel iptables-devel -y
[root@server1 ~]# cd keepalived-1.3.6
[root@server1 keepalived-1.3.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV        #編譯檢查
[root@server1 keepalived-1.3.6]# make
[root@server1 keepalived-1.3.6]# make install
  • 做4個軟連接,方便後續操作
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ 
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 keepalived-1.3.6]# chmod +x /etc/init.d/keepalived  #爲啓動腳本加上可執行權限
  • 由於我們接下來修改的keepalived的配置文件,會給我們自動添上vip,所以我們先把之前做實驗的vip刪除
[root@server1 keepalived-1.3.6]# ip addr del 172.25.70.100/24 dev eth0
  • 檢查一下server1的iptables的策略,如果出現下圖策略,則刪除
    這裏寫圖片描述
  • 更改keepalived的配置文件
[root@server1 keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        2721671190@qq.com    #接收警報的 email 地址,可以添加多個
   }
   notification_email_from  keepalived@server1.example.com #設置郵件的發送地址
   smtp_server 127.0.0.1     #設置 smtp server 地址
   smtp_connect_timeout 30   #設置連接 smtp 服務器超時時間
   router_id LVS_DEVEL       #load balancer 的標識 ID,用於 email 警報
}

vrrp_instance VI_1 {
    state MASTER             #該服務器的狀態爲master
    interface eth0           #高可用監測的網絡接口
    virtual_router_id 51     #主、備機的 virtual_router_id 必須相同,取值 0-255
    priority 100             #主機的優先級,備份機改爲 50,主機優先級一定要大於備機
    advert_int 1             #主備之間的通告間隔秒數
    authentication {         #主備切換時的驗證
        auth_type PASS       #設置驗證類型,主要有 PASS 和 AH 兩種
        auth_pass 1111       #設置驗證密碼,在一個 vrrp_instance 下,MASTER 與 BACKUP 必須使用相同的密碼才能正常通信
    }
virtual_ipaddress {          #設置虛擬 IP 地址,可以設置多個虛擬 IP 地址,每行一個
        172.25.70.100
    }
}

virtual_server 172.25.70.100 80 {     #定義虛擬服務器
    delay_loop 6                      #每隔 6 秒查詢 realserver 狀態
    lb_algo rr                        #lvs 調度算法,這裏使用輪叫
    lb_kind DR                        #LVS 是用 DR 模式
    #persistence_timeout 50
    protocol TCP                      #指定轉發協議類型,有 tcp 和 udp 兩種

    real_server 172.25.70.2 80 {      #realserve 的狀態檢測設置部分,單位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒無響應超時
                nb_get_retry 3        #重試次數
                delay_before_retry 3  #重試間隔
        }
    }
real_server 172.25.70.3 80 {          #realserve 的狀態檢測設置部分,單位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒無響應超時
                nb_get_retry 3        #重試次數
                delay_before_retry 3  #重試間隔
        }
    }
}

注意:persistence_timeout 表示會話保持時間,單位是秒,這個選項對於動態網頁是非常有用的,爲集羣系統中 session 共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話保持時間。需要注意的是,這個會話保持時間,是最大無響應超時時間,也就是說用戶在操作動態頁面時,如果在 50 秒內沒有執行任何操作,那麼接下來的操作會被分發到另外節點,但是如果一直在操作動態頁面,則不受 50 秒的時間限制。

[root@server1 keepalived]# /etc/init.d/keepalived restart   #重啓服務

我們說keepalived可以自動添加vip,並具有安全檢查的功能,即後端的服務器掛掉,可以檢測出來,來測試一下
成功添加上vip
這裏寫圖片描述
自動安全檢查

[root@server2 ~]# /etc/init.d/httpd stop  #down掉後端一臺服務器
[root@server1 keepalived]# ipvsadm -Ln    #在活躍的rs中沒有server2的ip
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.70.100:80 rr
  -> 172.25.70.3:80               Route   1      0          0         

這樣我們在測試機上就只能訪問到server3的apache網頁信息

[root@foundation70 keepalived]# curl 172.25.70.100
<h1>the page from server3</h1>

[root@foundation70 keepalived]# curl 172.25.70.100
<h1>the page from server3</h1>

而如果沒有keepalived,後端一臺服務器掛掉結果

[root@server1 keepalived]# /etc/init.d/keepalived  stop
[root@server2 ~]# /etc/init.d/httpd stop
[root@foundation70 keepalived]# curl 172.25.70.100   #結果是都不能訪問
curl: (7) Failed connect to 172.25.70.100:80; No route to host
You have new mail in /var/spool/mail/kiosk

3.高可用
我們假設這麼一種情況,如果部署keepalived的服務器(即本實驗的server1掛掉)那麼很顯然,我們後端的服務器將都不能訪問,爲了解決這種問題,下面實驗我們要做主備模式的keepalived,實現高可用。

  • 在server4上安裝keepalived,直接拷貝server1上的keepalived
[root@server1 local]# scp -r keepalived/ server4:/usr/local/
  • 爲server4做四個軟連接並加上啓動腳本的執行權限
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# chmod +x /etc/init.d/keepalived 
  • 更改配置文件,只需要更改state和priorit
[root@server4 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
        2721671190@qq.com    #接收警報的 email 地址,可以添加多個
   }
   notification_email_from  keepalived@server1.example.com #設置郵件的發送地址
   smtp_server 127.0.0.1     #設置 smtp server 地址
   smtp_connect_timeout 30   #設置連接 smtp 服務器超時時間
   router_id LVS_DEVEL       #load balancer 的標識 ID,用於 email 警報
}

vrrp_instance VI_1 {
    state ABCKUP             #該服務器的狀態爲master
    interface eth0           #高可用監測的網絡接口
    virtual_router_id 51     #主、備機的 virtual_router_id 必須相同,取值 0-255
    priority 50              #主機的優先級,備份機改爲 50,主機優先級一定要大於備機
    advert_int 1             #主備之間的通告間隔秒數
    authentication {         #主備切換時的驗證
        auth_type PASS       #設置驗證類型,主要有 PASS 和 AH 兩種
        auth_pass 1111       #設置驗證密碼,在一個 vrrp_instance 下,MASTER 與 BACKUP 必須使用相同的密碼才能正常通信
    }
virtual_ipaddress {          #設置虛擬 IP 地址,可以設置多個虛擬 IP 地址,每行一個
        172.25.70.100
    }
}

virtual_server 172.25.70.100 80 {     #定義虛擬服務器
    delay_loop 6                      #每隔 6 秒查詢 realserver 狀態
    lb_algo rr                        #lvs 調度算法,這裏使用輪叫
    lb_kind DR                        #LVS 是用 DR 模式
    #persistence_timeout 50
    protocol TCP                      #指定轉發協議類型,有 tcp 和 udp 兩種

    real_server 172.25.70.2 80 {      #realserve 的狀態檢測設置部分,單位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒無響應超時
                nb_get_retry 3        #重試次數
                delay_before_retry 3  #重試間隔
        }
    }
real_server 172.25.70.3 80 {          #realserve 的狀態檢測設置部分,單位是秒
        weight 1
        TCP_CHECK {
                connect_timeout 3     #10 秒無響應超時
                nb_get_retry 3        #重試次數
                delay_before_retry 3  #重試間隔
        }
    }
}
[root@server4 ~]# /etc/init.d/keepalived  start
Starting keepalived:                                       [  OK  ]
  • 爲servre4上安裝ipvsadm,同server1
[root@server4 ~]# yum install ipvsadm -y
  • 測試
[root@server4 ~]# ipvsadm -Ln     #策略因爲配置文件自動添加
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.70.100:80 rr
  -> 172.25.70.2:80               Route   1      0          0         
  -> 172.25.70.3:80               Route   1      0          0         
[root@server1 local]# /etc/init.d/keepalived stop  #掛掉server1的keepalived
[root@foundation70 keepalived]# curl 172.25.70.100  #成功訪問server2&&server3,並且是輪叫模式
<h1>the page from server3</h1>

[root@foundation70 keepalived]# curl 172.25.70.100
<h1>the page from server2</h1>
[root@foundation70 keepalived]# arp -an | grep 100   #查看該vip處於的mac地址
? (172.25.70.100) at 52:54:00:5f:de:54 [ether] on br0
You have new mail in /var/spool/mail/kiosk

和server4的mac地址一致。證明server4的keepalived生效
這裏寫圖片描述

打開master的keepalived服務

[root@server1 local]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]

再次訪問server2&&server3,並查看mac地址,發現mac地址改變
這裏寫圖片描述
來驗證一下是否爲serevr1的mac地址
這裏寫圖片描述
證明主備模式的作用,當master恢復的時候,由於權值比較大的關係,所以是通過master的作用將數據包傳遞給後端的rs。

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