1. 程式人生 > >負載均衡叢集、LVS演算法、搭建NAT模式LVS架構

負載均衡叢集、LVS演算法、搭建NAT模式LVS架構

負載均衡叢集介紹

實現負載均衡叢集的軟體有:LVS、Keepalived、Nginx、haproxy等。其中LVS屬於四層(網路OSI模型);Nginx屬於七層;haproxy既可以認為是四層,也可以當做是七層使用。
LVS、haproxy這種四層負載均衡可以分發除80埠以外的通訊,如MySQL-3306;而Nginx僅僅支援http,https,mail。
相對來說,LVS這種四層的更加穩定,能承受更多的請求,而Nginx這種七層的更加靈活,能實現更多的個性化需求。

LVS介紹

LVS是基於tcp/ip做的路由和轉發,穩定性和效率很高,LVS最新版本是基於Linux核心2.6。LVS常見的模式有三種:NAT、DR、IP Tunnel。LVS架構中有一個核心角色叫分發器(Load Balance),用於分發客戶的各種請求,另外還有諸多伺服器(real server,簡稱rs),用於處理使用者各種請求。

NAT模式


  • 這種模式藉助iptables的nat表來實現
  • 使用者的請求到分發器後,通過預設的iptables規則,把請求的資料包轉發到後端的rs上去
  • rs需要設定閘道器為分發器的內網ip
  • 使用者請求的資料包和返回給使用者的資料包全部經過分發器,所以分發器成為瓶頸
  • 在nat模式中,只需要分發器有公網ip即可,所以比較節省公網ip資源

在該模式中,load balancer是限制該架構處理使用者請求的一個瓶頸,所以該模式比較適合小模式的叢集(伺服器rs在10臺以內);該模式的優勢是節省公網資源。

IP Tunnel模式


  • 這種模式,需要有一個公共的IP配置在分發器和所有rs上,我們把它叫做vip
  • 客戶端請求的目標IP為vip,分發器接收到請求資料包後,會對資料包做一個加工,會把目標IP改為rs的IP,這樣資料包就到了rs上
  • rs接收資料包後,會還原原始資料包,這樣目標IP為vip,因為所有rs上配置了這個vip,所以它會認為是它自己

DR模式


  • 這種模式,也需要有一個公共的IP配置在分發器和所有rs上,也就是vip
  • 和IP Tunnel不同的是,它會把資料包的MAC地址修改為rs的MAC地址
  • rs接收資料包後,會還原原始資料包,這樣目標IP為vip,因為所有rs上配置了這個vip,所以它會認為是它自己

MAC(Media Access Control或者Medium Access Control)地址,意譯為媒體訪問控制,或稱為實體地址、硬體地址,用來定義網路裝置的位置。在OSI模型中,第三層網路層負責 IP地址,第二層資料鏈路層則負責 MAC地址。因此一個主機會有一個MAC地址,而每個網路位置會有一個專屬於它的IP地址。MAC地址是網絡卡決定的,是固定的。

ARP(Address Resolution Protocol)地址解析協議,是根據IP地址獲取實體地址的一個TCP/IP協議。
OSI模型把網路工作分為七層,IP地址在OSI模型的第三層,MAC地址在第二層,彼此不直接打交道。在通過乙太網傳送IP資料包時,需要先封裝第三層(32位IP地址)、第二層(48位MAC地址)的報頭,但由於傳送時只知道目標IP地址,不知道其MAC地址,又不能跨第二、三層,所以需要使用地址解析協議。使用地址解析協議,可根據網路層IP資料包包頭中的IP地址資訊解析出目標硬體地址(MAC地址)資訊,以保證通訊的順利進行。

LVS的排程演算法

  • 輪詢 Round-Robin rr
  • 加權輪詢 Weight Round-Robin wrr
  • 最小連線 Least-Connection lc
  • 加權最小連線 Weight Least-Connection wlc
  • 基於區域性性的最小連線 Locality-Based Least Connections lblc
  • 帶複製的基於區域性性最小連線 Locality-Based Least Connections with Replication lblcr
  • 目標地址雜湊排程 Destination Hashing dh
  • 源地址雜湊排程 Source Hashing sh

常用的是前面四種演算法。

LVS NAT模式搭建

準備工作

網路準備

三臺機器。

  • 分發器(排程器director)
    內網:192.168.8.133 外網:192.168.75.128

  • real server1(real1)
    內網:192.168.8.134 設定閘道器為: 192.168.8.133

  • real server2(real2)
    內網:192.168.8.135 設定閘道器為: 192.168.8.133

防火牆

關閉系統防火牆:
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld

關閉SELinux:
[[email protected] ~]# setenforce 0
[[email protected] ~]# vim /etc/selinux/config
SELINUX=disabled

注: 分別在三臺機器進行上述操作。

以下操作在real1和real2中進行:

安裝iptables服務:
[[email protected] ~]#yum install -y iptables-services 

設定iptables服務:
[[email protected] ~]# iptables -F
[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  確定  ]

說明: 進行該設定的原因是NAT模式是基於防火牆nat表的一種模式,所以會使用iptables規則。

開始搭建

配置director:

安裝ipvsadm工具:  
[[email protected] ~]# yum install -y ipvsadm  

配置ipvsadm指令碼:
[[email protected] ~]# 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
# 注意區分網絡卡名字,adai的兩個網絡卡分別為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.8.0/24  -j MASQUERADE
# director設定ipvsadm規則
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
#-C=clear,清除規則
$IPVSADM -A -t 192.168.75.128:80 -s rr 
#-A:=add,新增規則;-t:=tcp;-s 指定演算法;
#在此可以新增-p:指定超時時間(解決session問題:保證同一請求被分發到同一rs上)
#因為新增-p選項後會影響測試效果,所以在此不加該引數(注:時間不能設定為0)
$IPVSADM -a -t 192.168.75.128:80 -r 192.168.8.134:80 -m -w 1
$IPVSADM -a -t 192.168.75.128:80 -r 192.168.8.135:80 -m -w 1
#-a:=add,增加nat架構中的rs;-r:指定rs的IP;-m:指定LVS模式為NAT(masquerade)
#-w:=weight,指定權重

執行該指令碼:  
[[email protected] ~]# sh /usr/local/sbin/lvs_nat.sh
#注:執行該指令碼時無錯誤輸出說明沒問題。

檢視ipvsadm規則:
[[email protected] ~]# 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.75.128:80 rr
  -> 192.168.8.134:80             Masq    1      1          3         
  -> 192.168.8.135:80             Masq    1      0          4      

配置rs:

在兩臺rs上安裝Nginx,並分別設定其主頁用來區分兩臺機器。

[[email protected] ~]# yum install -y nginx
[[email protected] ~]# systemctl start nginx

編輯rs1主頁:
[[email protected] ~]# vim /usr/share/nginx/html/index.html
This is real server 1. 

編輯rs2主頁:
[[email protected] ~]# vim /usr/share/nginx/html/index.html
This is real server 2.

測試

訪問公網IP:192.168.75.128。

[[email protected] ~]# curl 192.168.75.128
This is real server 2. 
[[email protected] ~]# curl 192.168.75.128
This is real server 1.
[[email protected] ~]# curl 192.168.75.128
This is real server 2. 
[[email protected] ~]# curl 192.168.75.128
This is real server 1.
[[email protected] ~]# curl 192.168.75.128

即,搭建成功!

 擴充套件
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原理相關的