linux virtual server簡稱LVS,Internet的快速增加使多媒體網絡服務器面對的訪問數量快速增長,服務器須要具有提供大量併發訪問服務的能力,所以對於大負載的服務器來說, CPU、I/O處理能力很快會成爲瓶頸。因爲單臺服務器的性能老是有限的,簡單的提升硬件性能並不能真正解決這個問題。爲此,必須採用多服務器和負載均衡技術才能知足大量併發訪問的須要。Linux 虛擬服務器(Linux Virtual Servers,LVS) 使用負載均衡技術將多臺服務器組成一個虛擬服務器。它爲適應快速增加的網絡訪問需求提供了一個負載能力易於擴展,而價格低廉的解決方案。lvs的負載能力特別強,優化空間特別大,lvs的變種DPVS聽說是lvs性能的幾倍,由愛奇藝開發,並普遍用於愛奇藝IDC。其餘負載均衡服務器還有nginx,haproxy,F5,Netscale。html
LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。前端
在路由器上明顯說明vip對應的地址必定是Director上的MAC,只要綁定,之後再跟vip通訊也不用再請求了,這個綁定是靜態的,因此它也不會失效,也不會再次發起請求,可是有個前提,咱們的路由設備必須有操做權限可以綁定MAC地址,萬一這個路由器是運行商操做的,咱們無法操做怎麼辦?第一種方式當然很簡便,但未必可行。linux
在給別主機上(例如:紅帽)它們引進的有一種程序arptables,它有點相似於iptables,它確定是基於arp或基於MAC作訪問控制的,很顯然咱們只須要在每個real server上定義arptables規則,若是用戶arp廣播請求的目標地址是本機的vip則不予相應,或者說相應的報文不讓出去,很顯然網關(gateway)是接受不到的,也就是director相應的報文才能到達gateway,這個也行。第二種方式咱們能夠基於arptables。nginx
在相對較新的版本中新增了兩個內核參數(kernelparameter),第一個是arp_ignore定義接受到ARP請求時的相應級別;第二個是arp_announce定義將本身地址向外通告時的通告級別。【提示:很顯然咱們如今的系統通常在內核中都是支持這些參數的,咱們用參數的方式進行調整更具備樸實性,它還不依賴於額外的條件,像arptables,也不依賴外在路由配置的設置,反而一般咱們使用的是第三種配置】算法
0: 只要本地配置的有相應地址,就給予響應。(默認)後端
1: 僅迴應目標IP地址是本地的入網地址的arp請求。centos
2: 僅迴應目標IP地址是本地的入網地址,並且源IP和目標IP在同一個子網的arp請 求。緩存
3: 不迴應該網絡界面的arp請求,而只對設置的惟一和鏈接地址作出迴應bash
4-7:保留未使用服務器
8: 不迴應全部的arp請求。
0: 將本地任何接口上的任何地址向外通告
1: 試圖僅向目標網絡通告與其網絡匹配的地址
2: 僅向與本地接口上地址匹配的網絡進行通告
補充:特色1的解決方法
固定調度算法:rr,wrr,dh,sh
動態調度算法:wlc,lc,lblc,lblcr
固定調度算法:即調度器不會去判斷後端服務器的繁忙與否,一如既往得將請求派發下去。
動態調度算法:調度器會去判斷後端服務器的繁忙程度,而後依據調度算法動態得派發請求。
這種算法是最簡單的,就是按依次循環的方式將請求調度到不一樣的服務器上,該算法最大的特色就是簡單。輪詢算法假設全部的服務器處理請求的能力都是同樣的,調度器會將全部的請求平均分配給每一個真實服務器,無論後端 RS 配置和處理能力,很是均衡地分發下去。這個調度的缺點是,無論後端服務器的繁忙程度是怎樣的,調度器都會講請求依次發下去。若是A服務器上的請求很快請求完了,而B服務器的請求一直持續着,將會致使B服務器一直很忙,而A很閒,這樣便沒起到均衡的左右。
這種算法比 rr 的算法多了一個權重的概念,能夠給 RS 設置權重,權重越高,那麼分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每臺服務器的性能,並給每臺服務器添加要給權值,若是服務器A的權值爲1,服務器B的權值爲2,則調度到服務器B的請求會是服務器A的2倍。權值越高的服務器,處理的請求越多。
簡單的說,即將同一類型的請求分配給同一個後端服務器,例如將以 .jgp、.png等結尾的請求轉發到同一個節點。這種算法其實不是爲了真正意義的負載均衡,而是爲了資源的分類管理。這種調度算法主要應用在使用了緩存節點的系統中,提升緩存的命中率。
即未來自同一個ip的請求發給後端的同一個服務器,若是後端服務器工做正常沒有超負荷的話。這能夠解決session共享的問題,可是這裏有個問題,不少企業、社區、學校都是共用的一個IP,這將致使請求分配的不均衡。
這個算法會根據後端 RS 的鏈接數來決定把請求分發給誰,好比 RS1 鏈接數比 RS2 鏈接數少,那麼請求就優先發給 RS1。這裏問題是沒法作到會話保持,即session共享。
這個比最少鏈接數多了一個加權的概念,即在最少鏈接數的基礎上加一個權重值,當鏈接數相近,權重值越大,越優先被分派請求。
未來自同一目的地址的請求分配給同一臺RS若是這臺服務器還沒有滿負荷,不然分配給鏈接數最小的RS,並以它爲下一次分配的首先考慮。
這個用得少,能夠略過。
ipvsadm是ipvs的管理器,須要yum安裝。
基本用法:
ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]
ipvsadm COMMAND [protocol] service-address server-address [packet-forwarding-method] [weight options]
第一條命令用於向LVS系統中添加一個用於負載均衡的virtual server(VS);第二條命令用來修改已經存在的VS的配置,service address用來指定涉及的虛擬服務即虛擬地址,server-address指定涉及的真實地址。
命令參數:
-A, --add-service: 爲ipvs虛擬服務器添加一個虛擬服務,即添加一個須要被負載均衡的虛擬地址。虛擬地址須要是ip地址,端口號,協議的形式。
-E, --edit-service: 修改一個虛擬服務。
-D, --delete-service: 刪除一個虛擬服務。
-C, --clear: 清除全部虛擬服務。
-R, --restore: 從標準輸入獲取ipvsadm命令。通常結合下邊的-S使用。
-S, --save: 從標準輸出輸出虛擬服務器的規則。能夠將虛擬服務器的規則保存,在之後經過-R直接讀入,以實現自動化配置。
-a, --add-server: 爲虛擬服務添加一個real server(RS)
-e, --edit-server: 修改RS
-d, --delete-server: 刪除
-L, -l, --list: 列出虛擬服務表中的全部虛擬服務。能夠指定地址。添加-c顯示鏈接表。
-Z, --zero: 將全部數據相關的記錄清零。這些記錄通常用於調度策略。
--set tcp tcpfin udp:修改協議的超時時間。
--start-daemon state:設置虛擬服務器的備服務器,用來實現主備服務器冗餘。(注:該功能只支持ipv4)
--stop-daemon: 中止備服務器。
-h, --help: 幫助。
參數:如下參數能夠接在上邊的命令後邊。
-t, --tcp-service service-address:
指定虛擬服務爲tcp服務。service-address要是host[:port]的形式。端口是0表示任意端口。若是須要將端口設置爲0,還須要加上-p選項(持久鏈接)。
-u, --udp-service service-address:
使用udp服務,其餘同上。
-f, --fwmark-service integer:
用firewall mark取代虛擬地址來指定要被負載均衡的數據包,能夠經過這個命令實現把不一樣址、端口的虛擬地址整合成一個虛擬服務,可讓虛擬服務器同時截獲處理去往多個不一樣地址的數據包。fwmark能夠經過iptables命令指定。若是用在ipv6須要加上-6。
-s, --scheduler scheduling-method:
指定調度算法。調度算法能夠指定如下8種:rr(輪詢),wrr(權重),lc(最後鏈接),wlc(權重),lblc(本地最後鏈接),lblcr(帶複製的本地最後鏈接),dh(目的地址哈希),sh(源地址哈希),sed(最小指望延遲),nq(永不排隊)
-p, --persistent [timeout]:
設置持久鏈接,這個模式可使來自客戶的多個請求被送到同一個真實服務器,一般用於ftp或者ssl中。
-M, --netmask netmask:
指定客戶地址的子網掩碼。用於將同屬一個子網的客戶的請求轉發到相同服務器。
-r, --real-server server-address:
爲虛擬服務指定數據能夠轉發到的真實服務器的地址。能夠添加端口號。若是沒有指定端口號,則等效於使用虛擬地址的端口號。
[packet-forwarding-method]:
此選項指定某個真實服務器所使用的數據轉發模式。須要對每一個真實服務器分別指定模式。
-g, --gatewaying: 使用網關(即直接路由),此模式是默認模式。
-i, --ipip: 使用ipip隧道模式。
-m, --masquerading: 使用NAT模式。
-w, --weight weight:
設置權重。權重是0~65535的整數。若是將某個真實服務器的權重設置爲0,那麼它不會收到新的鏈接,可是已有鏈接還會繼續維持(這點和直接把某個真實服務器刪除時不一樣的)。
-x, --u-threshold uthreshold:
設置一個服務器能夠維持的鏈接上限。0~65535。設置爲0表示沒有上限。
-y, --l-threshold lthreshold:
設置一個服務器的鏈接下限。當服務器的鏈接數低於此值的時候服務器才能夠從新接收鏈接。若是此值未設置,則當服務器的鏈接數連續三次低於uthreshold時服務器才能夠接收到新的鏈接。(PS:筆者覺得此設定多是爲了防止服務器在可否接收鏈接這兩個狀態上頻繁變換)
--mcast-interface interface:
指定使用備服務器時候的廣播接口。
--syncid syncid:
指定syncid,一樣用於主備服務器的同步。
如下選項用於list命令:
-c, --connection:
列出當前的IPVS鏈接。
--timeout:
列出超時
--daemon:
--stats:
狀態信息
--rate:
傳輸速率
--thresholds:
列出閾值
--persistent-conn:
堅持鏈接
--sor:
把列表排序。
--nosort:
不排序
-n, --numeric:
不對ip地址進行dns查詢
--exact:
單位
-6:
若是fwmark用的是ipv6地址須要指定此選項。
其餘注意事項:
Director: centos 6.8 VIP:192.168.1.111
DIP:192.168.229.133
RealServer1: centos6.8 RIP:192.168.229.132
RealServer2: centos6.8 RIP:192.168.229.134
安裝ipvsadm:
[root@ShiYanLou LVS]# yum install ipvsadm –y
編輯腳本:/LVS/install.sh
#director設置 nat 防火牆 iptables -t nat -F #!/bin/bash VIP=192.168.1.111 DIP=192.168.229.133 RIP1=192.168.229.132 RIP2=192.168.229.134 # 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設置 ipvsadm IPVSADM='/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t $VIP:80 -s rr $IPVSADM -a -t $VIP:80 -r $RIP1:80 -m $IPVSADM -a -t $VIP:80 -r $RIP2:80 -m
vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR=00:0C:29:46:3B:8C TYPE=Ethernet UUID=e2fa0e51-7240-4ef9-8572-bf82ef8bb6a8 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.229.132 NETMASK=255.255.255.0 GATEWAY=192.168.229.133 #配置網關爲DIP
yum –y install httpd 標記網頁: RealServer1:echo 」I am RealServer1 192.168.229.132」>/var/www/html/index.html RealServer2:echo 「I am RealServer2 192.168.229.134」>/var/www/html/index.html
會輪詢獲得「I am RealServer1 192.168.229.132」「I am RealServer2 192.168.229.134」
注意:關閉Director的防火牆iptables,否則訪問不成功。
Director: centos 6.8 VIP:eth0:0:192.168.229.111
DIP:eth0:192.168.229.133
RealServer1: centos6.8 RIP:eth0:192.168.229.132
VIP:lo:0:192.168.229.111
RealServer2: centos6.8 RIP:eth0:192.168.229.134
VIP:lo:0:192.168.229.111
腳本以下:
#! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.229.111 rs1=192.168.229.132 rs2=192.168.229.134 ifconfig eth0:0 down ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 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 $ipv -a -t $vip:80 -r $rs2:80 –g
腳本以下:
#!/bin/bash vip=192.168.229.111 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/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
會輪詢獲得「I am RealServer1 192.168.229.132」 「I am RealServer2 192.168.229.134」
注意:關閉Director的防火牆iptables,否則訪問不成功。
Director: centos 6.8 VIP:eth0:0:192.168.299.111
DIP:eth0:192.168.229.133
RealServer1: centos6.8 RIP:eth0:192.168.229.132
VIP:tunl0:192.168.229.111
RealServer2: centos6.8 RIP:eth0:192.168.229.134
VIP:tunl0:192.168.229.111
腳本以下:
#! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.229.111 rs1=192.168.229.132 rs2=192.168.229.134 ifconfig eth0:0 down ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up route add -host $vip dev eth0:0 iptables -t nat -F setenforce 0 $ipv -C $ipv -A -t $vip:80 -s rr $ipv -a -t $vip:80 -r $rs1:80 -i $ipv -a -t $vip:80 -r $rs2:80 -i
a、加載ipip模塊
[root@ulife3test LVS]# modprobe ipip
b、配置VIP:
[root@ulife3test LVS]# cd /etc/sysconfig/network-scripts/ [root@ulife3test network-scripts]# cp ifcfg-lo ifcfg-tunl0 [root@ulife3test network-scripts]# vi ifcfg-tunl0 DEVICE=tunl0 IPADDR=192.168.229.111 NETMASK=255.255.255.0 ONBOOT=yes NAME=tunl0 [root@ulife3test network-scripts]# service network restart
c、關閉arp轉發:
[root@ulife3test network-scripts]# echo '0'>/proc/sys/net/ipv4/ip_forward [root@ulife3test network-scripts]# vi /etc/sysctl.conf #加入如下行 net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 [root@ulife3test network-scripts]# sysctl -p #永久生效 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0
d、關閉selinux
setenforce 0或者修改/etc/selinux/config 配置文件中SELINUX=disabled而後重啓系統。
會輪詢獲得「I am RealServer1 192.168.229.132」「I am RealServer2 192.168.229.134」
注意:關閉Director的防火牆iptables,否則訪問不成功。