lvs負載均衡

lvs工做在內核中,當接收客戶端請求,並無將接收到的請求
送到用戶程序空間,而是直接在內核進行轉發到了後端服務器
 
lvs根據目標請求報文的目標ip和port將其轉發至後端主機集羣中的某一個
根據調度算法來分發至後端的某個主機,響應客戶端請求
 
tcp協議應用在內核中,lvs不須要監聽在套接字上面,文件數就沒有限制
nginx和haproxy都要監聽在套接字,有文件套接字限制
 
lvs支持tcp、udp、AH、EST、AH_EST、SCTP等諸多協議
 
實現lvs的NAT模型:
經過修改請求報文的的目標ip地址(同時可能會修改目標端口)至挑選
出RS的RIP地址實現轉發
一、 RS應該和DIP使用私網(內網)地址,且RS的網關要指向DIP
二、請求和響應報文都要經由director轉發,極高的負載環境中,director
可能會成爲性能瓶頸
三、 支持端口映射      RS能夠定義爲8080
四、RS可使用任意OS
五、 RS的RIP和director的DIP必須在同一ip網絡中(同一網段)
director:
  VIP:客戶端請求的IP(公網提供訪問)172.16.118.249,eth0
  DIP:使用內網與RS一塊兒,192.168.23.2,eth1
具體配置:

[root@wadeson ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:4D:19:A6
TYPE=Ethernet
UUID=e00a22ce-9c20-4495-896f-7323b984425e
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=172.16.118.249
GATEWAY=172.16.118.254
NETMASK=255.255.255.0html

[root@wadeson ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
UUID=e00a22ce-9c20-4495-896f-7323b984425e
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.23.2
NETMASK=255.255.255.0nginx

因爲須要在此主機上配置負載集羣服務,須要安裝ipvsadm:web

yum -y install ipvsadm算法

 

後端RS配置:後端

  RS1:192.168.23.4,eth0緩存

  RS2:192.168.23.5,eth1服務器

具體配置:網絡

到這裏,全部關於ip網絡的配置已經完成了,確保RS後端服務器的web服務已經能夠正常訪問了:session

[root@wadeson ~]# curl http://192.168.23.4
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://192.168.23.5
<h1>test 192.168.23.5 html</h1>負載均衡

而後開始在director上建立集羣服務

[root@wadeson ~]# ipvsadm -A -t 172.16.118.249:80 -s rr

  ipvsadm -A|E -t|u|f service-address [-s scheduler]

而後添加RS到集羣中:

[root@wadeson ~]# ipvsadm -a -t 172.16.118.249:80 -r 192.168.23.4 -m   這裏RS默認的端口爲80,由於

支持端口映射,因此這裏能夠修改成8080

  ipvsadm -a|e -t|u|f service-address -r server-address

  [-g|i|m] [-w weight] [-x upper] [-y lower]      -m爲指定爲NAT模式

查看列表信息:

[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 rr  

-> 192.168.23.4:80 Masq 1 0 0

再次添加一個RS:

[root@wadeson ~]# ipvsadm -a -t 172.16.118.249:80 -r 192.168.23.5 -m
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 rr
-> 192.168.23.4:80 Masq 1 0 0
-> 192.168.23.5:80 Masq 1 0 0

集羣服務,RS配置已經完成,而後進行訪問:

[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.5 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.5 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.5 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 rr
-> 192.168.23.4:80 Masq 1 0 5
-> 192.168.23.5:80 Masq 1 0 5

負載均衡調度算法:

靜態方法:僅根據算法自己進行調度
  RR:round robin輪詢(起點公平,一人一個)
  WRR:weight RR加權的RR,能者多勞(根據權重分配)
   SH:source hash源地址hash,實現session保持
    未來自於同一ip的請求始終調度至同一RS
   DH:destination hash目標地址hash(相似去緩存拿數據)
    將對同一個目標的請求始終發往同一個RS
動態方法:根據算法及後端(RS)的當前負載狀態進行調度
  Overhand=負載,較小,就被挑選
  LC:least connection(RS的鏈接最小就被調度到該臺RS)
    Overhand=Active*256+Inactive
   WLC:weight least connection
    Overhand=(Active*256+Inactive)/權重
  SED:shortest expect delay最短時間望延遲,算法WLC的改進
    Overhand=(Active+1)*256/weight
  NQ:never queue,SED的改進
  LBLC:locality-based LC,即爲動態的DH算法(若是請求的是
    歷來沒有緩存過的數據,那麼就發往RS負載較小的機子)
    正向代理情形下的cache server調度
LBLCR:能夠複製的LBLC

修改調度算法,將rr輪詢算法改成sh:

[root@wadeson ~]# ipvsadm -E -t 172.16.118.249:80 -s sh
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 sh
-> 192.168.23.4:80 Masq 1 0 0
-> 192.168.23.5:80 Masq 1 0 0

而後觀察效果:

[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 sh
-> 192.168.23.4:80 Masq 1 0 6      只有這一臺響應
-> 192.168.23.5:80 Masq 1 0 0

將規則保存下來:

  ipvsadm -S > /etc/sysconfig/ipvsadm

清空規則:

  ipvsadm -C

刪除定義的集羣服務:
   [root@wadeson ~]# ipvsadm -D -t 172.16.118.249:80

  [root@wadeson ~]# ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn

ipvsadm -L:
-n:基於數據格式顯示地址和端口
-c:顯示connection狀態
--states:顯示統計的數據
--rate:顯示速率
--sort:排序
--exact:顯示精確值,不作單位換算
相關文章
相關標籤/搜索