/////////////////////////////目錄///////////////////////////////////////
一、LVS/NAT配置
二、LVS/DR配置
三、LVS/DR+Keepalived配置
(包括了配置Keepalived的BACKUP)
///////////////////////////寫在前面/////////////////////////////////////
常用的負載均衡開源軟件有:nginx,lvs,keepalived,HAproxy
商業的硬件負載設備:F5,Netscale,但是硬件負載設備價格十分昂貴,因此我們通常用軟件實現LB
LB集群是load balance集群的簡寫,即負載均衡集群
LVS是一個實現負載均衡集群的開源軟件項目
LVS架構從邏輯上可以分為調度層,server集群層和共享儲存層
LVS是由內核空間的ipvs和用戶空間的ipvsadm組成,其中前者工作在INPUT鏈上,后者工作在POSTROUTING鏈上。因此如果有請求報文被ipvs事先定義了,就會將該請求報文接取下來並以特定的模型(就是工作方式)修改報文並轉發
LVS可分為三種工作方式:
LVS/NAT模式:
工作流程:請求--> 前端分發器director--> director把請求轉發給real_server--> real_server返回數據給director--> director把數據返回給用戶
條件:director和real_server同處一個網段內,real_server可以不和外網連接,但是director要和外網連接,即同處一個vip網段,但是需要有rip
依賴防火牆實現,而且real_server的網關必須是director
優勢:可以把所有的web server隱藏在后端,可以實現端口映射,修改端口
缺點:director的網絡吞吐量會很大
LVS/DR模式 :
工作流程:請求--> 前端分發器director--> director把請求轉發給real_server--> real_server直接把數據返回給用戶
(director將請求下來的數據包的目標mac地址修改為real_server的mac地址)
條件:director和real_server同處一個網段內,為vip,同時,real_server有自己的對外ip
優勢:減少網絡吞吐量
缺點:會把后端的主機暴露出來
LVS/TUN模式:
工作流程:請求--> 前端分發器director--> director把請求轉發給real_server--(隧道)--> real_server直接把數據返回給用戶
優勢:經過隧道之后數據加密
LVS/FULL模式:
這是一種比較新的工作模式,尚未了解,待補充
LVS的調度算法:輪叫調度(Round Robin)(簡稱rr)
加權輪叫(Weighted Round Robin)(簡稱wrr)
最少鏈接(least connection)(LC)
加權最少連接(Weighted Least Connections)(WLC)
其他算法參考拓展學習鏈接
Keepalived:
Keepalived是一個基於VRRP協議來實現的WEB服務的高可用方案
一個WEB服務至少會有2台服務器運行Keepalived,一台為主服務器(MASTER),一台為備份服務器(BACKUP)
MASTER會定期給BACKUP發送icmp包來確定MASTER是否掛掉,掛掉了就根據優先級頂替為MASTER
VRRP協議(虛擬路由冗余協議):
VRRP協議將局域網的一組路由器(包括一個Master 即活動路由器和若干個Backup 即備份路由器)組織成一個虛擬路由器,稱之為一個備份組,這是一個邏輯概念,本身這個虛擬路由器並不存在。
虛擬路由器的IP地址可以和備份組內某個路由器接口的IP地址相同
局域網內的主機僅僅知道這個虛擬路由器的IP,而並不知道具體的Master路由器的IP以及Backup 的IP
局域網內的主機將自己的缺省路由下一跳地址設置為該虛擬路由器的IP
如果這個MASTER掛掉,那么就會根據選舉策略選出另外一個MASTER
//////////////////////////負載均衡集群//////////////////////////////////
一、LVS/NAT配置
----這個需要依賴防火牆
三台服務器一台作為director,兩台作為real server1
director有一個外網IP(192.168.31.166)和一個內網IP(192.168.21.166),兩個real server上只有內網IP(192.168.21.100)和(192.168.21.101)並且需要把兩個real server的內網網關設置為director的內網IP(192.168.21.166)
兩個real server上都需要安裝http (只是用來作為一個服務而已)
httpd: yum install -y httpd
director上安裝ipvsadm :
yum install -y ipvsadm
director上
vim /usr/local/sbin/lvs_nat.sh //增加如下內容 #!/bin/bash #director服務器上開啟路由轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward #關閉icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects #director設置nat防火牆 iptables -t nat -F iptables -t nat -X(刪除鏈) iptables -t nat -A POSTROUTING -s 192.168.21.0/24 -j MASQUERADE(偽裝) #director 設置ipvsadm IPVSADM='/sbin/ipvsadm' $IPVSADM -C(也就相當於iptables -F) $IPVSADM -A(增加一個Dir) -t 192.168.31.166:80 -s lc -p 300 $IPVSADM -a(增加一個real server) -t 192.168.31.166:80 -r 192.168.21.100:80 -m -w 1 $IPVSADM -a -t 192.168.31.166:80 -r 192.168.21.101:80 -m -w 1 # 參數說明: # -s是算法 # -p是長鏈接 # -w 權重weight # -g 表示DR模式 # -m 表示NAT模式 # -t 表示TUN模式 # rr是輪詢 (最常用) # wrr 加權輪詢算法 (最常用) # wlc 加權最小鏈接 (最常用) # lc是不帶權重的最小鏈接(最常用)
配置完畢后
直接運行這個腳本即可:
/bin/bash /usr/local/sbin/lvs_nat.sh
通過瀏覽器測試兩台機器上的httpd的內容
也可以用curl 192.168.31.166 查看結果
二、LVS/DR配置
---其實DR比TUN好
DR實驗需要三台機器:
director(eth0 192.168.31.166,vip eth0:0 192.168.31.110)
real server1 (eth0 rip :192.168.31.100,vip lo:0: 192.168.31.110)
real server2 (eth0 rip :192.168.31.101,vip lo:0: 192.168.31.110)
Director上:
vim /usr/local/sbin/lvs_dr.sh //增加如下: #!/bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.31.110 rs1=192.168.31.100 rs2=192.168.31.101 ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up #上面的命令作用是創建一塊虛擬網卡 route add -host $vip dev eth0:0 $ipv -C $ipv -A -t $vip:80 -s rr $ipv -a -t $vip:80 -r $rs1:80 -g -w 1 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1
兩台rs上:
vim /usr/local/sbin/lvs_dr_rs.sh #!/bin/bash vip=192.168.31.110 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
配置完畢后,在director和real_server主機上執行腳本:
sh /usr/local/sbin/lvs_dr.sh
sh /usr/local/sbin/lvs_dr_rs.sh
三、LVS/DR+Keepalived配置
問題分析:
前面的lvs雖然已經配置成功了,也實現了負載均衡,但是我們測試的時候發現,當某台real server把httpd進程停掉,那么director照樣會把請求轉發過去,這樣就造成了某些請求不正確
因此需要有一種機制用來檢測real server的狀態,這就是keepalived
他的作用除了可以檢測rs狀態外,還可以檢測備用的director狀態,換而言之keepalived可以實現ha集群的功能,當然了也需要一台備用的director。
備用的director也需要安裝一下keepalived軟件
特別說明:這篇文章的實驗時按順序做下來的,因此雖然我們前面已經配置過一些操作,但是下面我們使用keepalived操作和之前是有些沖突的,所以如果之前配置過DR,請先做如下操作:
在director上執行:
$ipv -C ifconfig eth0:0 down
安裝keepalived
yum install -y keepalived
安裝好后,編輯配置文件:
vim /etc/keepalived/keepalived.conf //加入如下內容: vrrp_instance VI_110{ #可以理解成全局配置 state MASTER #備用服務器上則改為BACKUP interface eth0 virtual_router_id 51 priority 100 #備用服務器上為90 advert_int 1 authentication{#這個是認證相關的 auth_type PASS auth_pass 1111 } virtual_ipaddress{ 192.168.0.110 } } virtual_server 192.168.31.110 80{ #配置這個虛擬路由器 delay_loop 6 #每隔6秒查詢real server狀態 lb_algo wlc #lvs算法 lb_kind DR #Direct Route persistence_timeout 60 #長鏈接,同一個IP的連接超過60秒會被分配到同一台real server上 protocol TCP #使用TCP協議檢查realserver的狀態 real_server 192.168.31.100 80{ weight 100 #權重 TCP_CHECK{ connect_timeout 10 #10秒無響應超時 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.31.101 80{ weight 100 #權重 TCP_CHECK{ connect_timeout 10 #10秒無響應超時 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
以上為MASTER的director的配置文件,
這個如果配置BACKUP的director
在director2里面安裝keepalived
BACKUP的director的配置文件只需要修改
state MASTER -> state BACKUP
priority 100 -> priority 90
配置完keepalived后,需要開啟端口轉發功能(主從都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward
然后,在兩個rs上執行/usr/local/sbin/lvs_dr_rs.sh腳本
最后,兩個director上啟動keepalived服務(先主后從):
/etc/init.d/keepalived start
另外,需要注意的是,啟動keepalived服務會自動生成vip和ipvsadm規則,不需要再去執行上面提到的/usr/local/sbin/lvs_dr.sh腳本
拓展學習:
如果要實現Keepalived的互為主從,可以參考:
http://anyisalin.blog.51cto.com/10917514/1762030
dr模式參考這篇文章:
http://os.51cto.com/art/201105/264303.htm
這篇文章介紹的還是挺詳細的:
http://www.it165.net/admin/html/201401/2248.html
LVS的八種算法詳解:
http://www.aminglinux.com/bbs/thread-7407-1-1.html
關於arp_ignore和arp_announce,參考:
http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
haproxy+keepalived實現高可用負載均衡(里面有講到keepalived原理)
http://blog.csdn.net/xrt95050/article/details/40926255
nginx, lvs, keepalived比較 :
http://www.csdn.net/article/2014-07-24/2820837
http://www.my.oschina.net/hncsowc/blog/158746
www.linuxidc.com/Linux/2012-08/69383.htm