一、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。