負載均衡集羣介紹 LVS介紹 LVS調度算法 LVS NAT模式搭建

擴展
lvs 三種模式詳解 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
lvs原理相關的 http://blog.csdn.net/pi9nc/article/details/23380589

負載均衡集羣介紹

  • 主流開源軟件LVS、keepalived、haproxy、nginx等
    • 其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既能夠認爲是4層,也能夠當作7層使用
    • keepalived的負載均衡功能其實就是lvs,lvs是keepalived內置的
    • lvs這種4層的負載均衡是能夠分發TCP協議,web服務是80端口,除了分發80端口,還有其餘的端口通訊的,好比MySQL的負載均衡,就能夠用LVS實現,而nginx僅僅支持http,https,mail,haproxy;haproxy也支持MySQL這種TCP負載均衡的
    • 7層有限制,不過有些更高級的功能,nginx能夠經過站點目錄,去區分網站服務器以前,LVS4層的就不支持
  • 相比較來講,LVS這種4層的更穩定,能承受更多的請求,承載的併發量更高,而nginx這種7層的更加靈活,能實現更多的個性化需求

LVS介紹

  • LVS是由國人章文嵩開發
  • 流行度不亞於apache的httpd,基於TCP/IP作的路由和轉發,穩定性和效率很高
  • LVS最新版本基於Linux內核2.6,有好多年不更新了
  • LVS有三種常見的模式:NAT、DR、IP Tunnel
  • LVS架構中有一個核心角色叫作分發器(Load balance),它用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server,簡稱rs)
  • LVS NAT模式,藉助iptables的nat表來實現
  • 用戶的請求到分發器後,經過預設的iptables規則,把請求的數據包轉發到後端的rs上去
  • rs須要設定網關爲分發器的內網ip
  • 用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器成爲瓶頸
  • 在nat模式中,只須要分發器有公網ip便可,因此比較節省公網ip資源

輸入圖片說明

  • 原理圖解釋:
    • Load Balancer,就是一個分發器;把用戶的請求,分發給後端的Real Server ,Real Server這些服務器接收到請求之後,處理好用戶請求之後,就從新丟回給Load Balancer;最後Load Balancer再返回給用戶;
    • 這個模式的弊端,當訪問量、請求量、反饋量大的時候,Load Balancer的壓力很大
    • LVS規模,通常規模最多支持10來臺服務器,超過10臺的話就會有力不從心;
    • nat模式這個結構,只須要有一個公網IP,其餘real server服務器所有在內網就能夠實現。優勢,節省不少的資源
  • LVS IP Tunnel模式,須要有一個公共的IP配置在分發器和全部rs上,咱們把它叫作vip
  • 客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包作一個加工,會把目標IP改成rs的IP,這樣數據包就到了rs上
  • rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身

輸入圖片說明

  • 原理圖解釋:
    • 在load balancer與real server之間創建了虛擬通道,叫作 ip tunnel ;其實是更改了數據包 目的IP;請求過來經過load balancer,經過在real server上配置的VIP;用戶請求的時候,數據包裏面包好的目的IP,當數據包到達load balancer的時候,load balancer會進行一個數據包目的IP的更改,而後發送到具體的real server上,經過lvs的本身的算法,進行實現到底傳輸到那個real server上;而後real server再解包處理,再經過一個VIP直接返回到用戶,這就省略數據回到load balancer分發器的過程,這樣就load balancer就沒有瓶頸
  • LVS DR模式,也須要有一個公共的IP配置在分發器和全部rs上,也就是vip
    • 和IP Tunnel不一樣的是,它會把數據包的MAC地址修改成rs的MAC地址
    • rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身

輸入圖片說明

LVS調度算法

  • 輪詢 Round-Robin 簡稱:rr 最簡單的也是最容易理解
    • 用戶請求過來,均衡的分發到rs上
  • 加權輪詢 Weight Round-Robin 簡稱:wrr
    • 帶權重的輪詢,能夠對機器單獨設置權重,對高權重的機器發送的請求會多一些
  • 最小鏈接 Least-Connection 簡稱: lc
    • 把請求發送到請求數量小的rs上
  • 加權最小鏈接 Weight Least-Connection 簡稱: wlc
    • 對請求數量小的rs,加上一個權重,使他優先
  • 基於局部性的最小鏈接 Locality-Based Least Connections 簡稱: lblc
  • 帶複製的基於局部性最小鏈接 Locality-Based Least Connections with Replication 簡稱: lblcr
  • 目標地址散列調度 Destination Hashing 簡稱:dh
  • 源地址散列調度 Source Hashing 簡稱: sh

LVS NAT模式搭建

  • NAT模式搭建 – 準備工做
    • 三臺機器
    • 分發器,也叫調度器(簡寫爲dir)
      • 內網:180.134,外網:142.144(vmware僅主機模式)
    • rs1
      • 內網:180.135,設置網關爲180.134
    • rs2
      • 內網:180.138,設置網關爲180.134
    • 三臺機器上都執行執行
    • systemctl stop firewalld; systemc disable firewalld
    • systemctl start iptables-services; iptables -F; service iptables save
  • NAT模式搭建
    • 在dir上安裝ipvsadm
    • yum install -y ipvsadm
    • 在dir上編寫腳本,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
# 注意區分網卡名字,阿銘的兩個網卡分別爲ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 設置nat防火牆
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.180.0/24  -j MASQUERADE
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.142.144:80 -s wlc -p 3
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.135:80 -m -w 1
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.138:80 -m -w 1
  • NAT模式效果測試
    • 兩臺rs上都安裝nginx
    • 設置兩臺rs的主頁,作一個區分,也就是說直接curl兩臺rs的ip時,獲得不一樣的結果
    • 瀏覽器裏訪問192.168.142.144,多訪問幾回看結果差別

LVS NAT模式搭建

NAT模式搭建-準備工做

  • NAT模式是經過iptables實現的,因此必須配置一些iptables規則
  • 在配置前準備三臺機器,一臺做爲分發器,也叫作調度器,簡稱 dir,另外兩臺就是real server,用來處理用戶請求的服務器,rs一、rs2(克隆虛擬機步驟
  • 克隆虛擬機的注意點
  • A機器IP爲192.168.180.13四、B機器IP爲192.168.180.135,C機器IP爲192.168.180.138html

    • A機器增長一塊網卡,並啓動查看網段爲192.168.142(根據本身機器來設置),設置新的網卡IP爲192.168.142.144,並在物理機訪問這個IP地址,看是否正常通訊

  • PS:網關最後設置,不然包沒法下載linux

  • B機器和C機器的網關必須設置成分發器(即A機器)的內網IP,若不設置成它的網關,是無法通訊的nginx

    • 這時B、C機器就沒法上網了
網卡配置文件中更改(即本機器)
vi /etc/sysconfig/network-scripts/ifcfg-ens33

更改完以後重啓網絡服務
systemctl restart network

[root@yong-02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.180.134 0.0.0.0         UG    100    0        0 ens33
192.168.180.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
  • 三臺機器設置完成後,關閉三臺機器的防火牆
關閉firewalld服務
systemctl stop firewalld

使firewalld服務再也不開機啓動
systemctl disable firewalld
  • 機器B、機器C 下載安裝iptables-services 包
yum install -y iptables-services
  • 有時下載包的時候特別慢,就是epel.repo源的緣由致使的,這裏能夠臨時關閉,就是直接更更名字便可(由於epel.repo源是國外的資源,因此很慢)
  • 機器B、機器C 啓動iptables服務
  • systemctl start iptables
機器B
[root@yong-02 ~]# systemctl start iptables

機器C
[root@yong-03 ~]# systemctl start iptables
  • 機器B、機器C 設置開機啓動
  • systemctl enable iptables
  • iptables -F
  • service iptables save
機器B
[root@yong-02 ~]# systemctl start iptables
[root@yong-02 ~]# systemctl enable iptables
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@yong-02 ~]# iptables -F
[root@yong-02 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  肯定  ]
[root@yong-02 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 74 packets, 4884 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 42 packets, 3952 bytes)
 pkts bytes target     prot opt in     out     source               destination  

機器C同上
  • 清空並查看機器A的規則
[root@yong-01 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 27 packets, 1888 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 20 packets, 1968 bytes)
 pkts bytes target     prot opt in     out     source               destination
  • 關閉機器機器A,機器B,機器C,三臺機器的selinux
setenforce 0    //臨時關閉selinux

getenforce    //查看selinux是否關閉


爲了保險起見,在配置文件中永久關閉selinux
vi /etc/selinux/config
SELINUX=enforcing更改成SELINUX=disabled

準備工做結束

NAT模式搭建web

  • 首先在分發器dir上(即A機器),安裝ipvsadm ,這個是實現 lvs 的一個重要的工具,缺乏這個工具,將沒有辦法實現 lvs 的功能
[root@yong-01 ~]# yum install -y ipvsadm
  • 在分發器(A機器)上編寫一個腳本(LVS全都是以腳本的方式去執行的,這樣比較方便進行維護不用一條命令一條命令的進行操做)
[root@yong-01 ~]# 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  //假裝操做,否則不能轉發rs的數據
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects //假裝操做,否則不能轉發rs的數據
# 注意區分網卡名字,dir機器的兩塊網卡分別爲ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects  
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 設置nat防火牆
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.180.0/24  -j MASQUERADE  //MASQUERADE實現同網段的機器去上網,路由器使用的就是這個功能
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm' //設置一個變量,方便下面命令引用
$IPVSADM -C //清空規則
$IPVSADM -A -t 192.168.142.144:80 -s lc -p 3   //用來定義lvs 的模式;wlc,爲算法,能夠按需求選擇 lvs 裏面適合的算法
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.135:80 -m -w 1     //小規則,-r 指定dir機器IP,-m 指定nat模式,-w指定rs權重 
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.138:80 -m -w 1    //小規則,-r 指定dir機器IP,-m 指定nat模式,-w指定rs權重
  • IPVSADM -A -t 192.168.142.144:80 -s lc -p 3 : -A增長一個規則,-t 制定lvs 模式,以後IP 就是dir的IP,-s 指定算法;-p 指定超時時間,(數據包轉發超時時間)
  • 超時時間解釋:
    • 用戶1訪問的是a機器,-p 的意思就是在同一個時間,一直在同一臺機器上進行請求
  • 執行腳本,如果沒輸出,表示腳本沒有錯誤
[root@yong-01 ~]# sh /usr/local/sbin/lvs_nat.sh

NAT模式效果測試

  • NAT模式效果測試
    • 兩臺rs上都安裝nginx
    • 設置兩臺rs的主頁,作一個區分,也就是說直接curl兩臺rs的ip時,獲得不一樣的結果
    • 瀏覽器裏訪問192.168.142.144,多訪問幾回看結果差別
  1. 首先查看B機器和C機器上的nginx服務是否開啓 啓動nginx
  2. 設置兩臺rs的主頁,作一個區分,也就是說直接curl兩臺rs的ip時,獲得不一樣的結果
  • 編輯B機器的索引頁
[root@yong-02 ~]# vim /usr/share/nginx/html/index.html
[root@yong-02 ~]# curl localhost
yongge02.
  • 編輯c機器的索引頁
[root@yong-03 ~]# vim /usr/local/nginx/html/index.html
[root@yong-03 ~]# curl localhost
yongge03.
  • 這時瀏覽器訪問模擬的公網IP,即192.168.142.144,如果瀏覽器訪問不成功,可用curl測試
[root@yong-01 ~]# curl 192.168.142.144
yongge02.
[root@yong-01 ~]# curl 192.168.142.144
yongge03.
  1. 查看A機器上的nat規則
[root@yong-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 29 packets, 5245 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 25 packets, 1610 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    76 MASQUERADE  all  --  *      *       192.168.180.0/24     0.0.0.0/0
  • 查看 ipvsadm 規則
[root@yong-01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.142.144:80 rr
  -> 192.168.180.135:80           Masq    1      0          6         
  -> 192.168.180.138:80           Masq    1      0          6
相關文章
相關標籤/搜索