LVS NAT模式搭建

一 負載均衡集羣介紹

  • 主流開源軟件LVS、keepalived、haproxy、nginx等
  • 其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既能夠認爲是4層,也能夠當作7層使用
  • keepalived的負載均衡功能其實就是lvs
    lvs是keepalived內置的功能
  • lvs這種4層的負載均衡是能夠分發除80外的其餘端口通訊的,好比MySQL的,而nginx僅僅支持http,https,mail,haproxy也支持MySQL這種TCP的負載均衡
    nginx能夠根據網站目錄來區分後端真正提供服務的服務器;而4層的只是提供數據包的分發、轉發,不會關心包裏面的數據
  • 相比較來講,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模式

LVS NAT模式工做原理

  • 這種模式藉助iptables的nat表來實現
  • 用戶的請求到分發器後,經過預設的iptables規則,把請求的數據包轉發到後端的rs上去
  • rs須要設定網關爲分發器的內網ip
  • 用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器成爲瓶頸
  • 在nat模式中,只須要分發器有公網ip便可,因此比較節省公網ip資源

LVS IP Tunnel模式

輸入圖片說明

  • 這種模式,須要有一個公共的IP配置在分發器和全部rs上,咱們把它叫作vip
  • 客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包作一個加工,會把目標IP改成rs的IP,這樣數據包就到了rs上
  • rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身

LVS DR模式

輸入圖片說明

  • 這種模式,也須要有一個公共的IP配置在分發器和全部rs上,也就是vip
  • 和IP Tunnel不一樣的是,它會把數據包的MAC地址修改成rs的MAC地址
  • rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身

三 LVS調度算法

  1. 輪詢 Round-Robin rr
  2. 加權輪詢 Weight Round-Robin wrr
  3. 最小鏈接 Least-Connection lc
  4. 加權最小鏈接 Weight Least-Connection wlc
  5. 基於局部性的最小鏈接 Locality-Based Least Connections lblc
  6. 帶複製的基於局部性最小鏈接 Locality-Based Least Connections with Replication lblcr
  7. 目標地址散列調度 Destination Hashing dh
  8. 源地址散列調度 Source Hashing sh

四 LVS NAT模式搭建

1)準備工做

三臺機器html

  1. 分發器,也叫調度器(簡寫爲dir)
    內網:75.136,外網:95.144(vmware僅主機模式) 這裏須要兩個網卡,我使用的是ens33 和ens37,內網使用ens33網卡,外網使用ens37網卡,並設置爲僅主機模式,設置界面以下: 輸入圖片說明 設置完畢後,咱們能夠查看到這個新的網卡所在的子網爲95.0 輸入圖片說明 下面咱們來將ens37的IP設置爲95.144,修改的地方是IPADDR,並刪除UUID,不須要設置網關
[root@lijie-01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens37
HWADDR=00:0C:29:21:5E:CA
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.95.144
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV4_DNS_PRIORITY=100
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
IPV6_DNS_PRIORITY=100
NAME=ens37
DEVICE=ens37
ONBOOT=no
ZONE=block
[root@lijie-01 ~]# ifup ens37
鏈接已成功激活(D-Bus 活動路徑:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@lijie-01 ~]#

隨後咱們從windows中ping一下新建的這個網卡linux

C:\Users\mixuyulv>ping 192.168.75.136       
正在 Ping 192.168.75.136 具備 32 字節的數據:     
來自 192.168.75.136 的回覆: 字節=32 時間<1ms TTL=64    
來自 192.168.75.136 的回覆: 字節=32 時間<1ms TTL=64  
來自 192.168.75.136 的回覆: 字節=32 時間<1ms TTL=64   
來自 192.168.75.136 的回覆: 字節=32 時間<1ms TTL=64   
192.168.75.136 的 Ping 統計信息:  

    數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),  
往返行程的估計時間(以毫秒爲單位):    

    最短 = 0ms,最長 = 0ms,平均 = 0ms   
C:\Users\mixuyulv>
  1. rs1
    內網:75.134,設置網關爲75.136
[root@lijie-02 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
iPROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.75.134
NETMASK=255.255.255.0
GATEWAY=192.168.75.136
DNS1=119.29.29.29

咱們還須要重啓網絡服務,重啓後這臺機器就不能上網了,nginx

[root@lijie-02 ~]# systemctl restart network.service
[root@lijie-02 ~]# ping www.qq.com
ping: www.qq.com: 未知的名稱或服務
[root@lijie-02 ~]#

咱們如今再來查看網關就變成了75.136算法

[root@lijie-02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.75.136  0.0.0.0         UG    100    0        0 ens33
192.168.75.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@lijie-02 ~]#
  1. rs2
    內網:75.130,設置網關爲75.136
[root@lijie-03 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=087b59ca-7e9f-4b76-a456-ada0fa5a7af4
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.75.130
NETMASK=255.255.255.0
GATEWAY=192.168.75.136
DNS1=119.29.29.29

咱們還須要重啓網絡服務,重啓後這臺機器就不能上網了,apache

[root@lijie-03 ~]# systemctl restart network.service
[root@lijie-03 ~]# ping www.qq.com
ping: www.qq.com: 未知的名稱或服務
[root@lijie-02 ~]#

咱們如今再來查看網關就變成了75.136vim

[root@lijie-03 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.75.136  0.0.0.0         UG    100    0        0 ens33
192.168.75.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
[root@lijie-03 ~]#
  1. 三臺機器上都執行執行
[root@lijie-01 ~]# systemctl stop firewalld     
[root@lijie-01 ~]# systemctl disable firewalld   
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.   
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.   
[root@lijie-01 ~]# iptables -nvL    
Chain INPUT (policy ACCEPT 0 packets, 0 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 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@lijie-01 ~]#

這裏建議使用centos6裏面的iptables的方式,須要安裝iptables-servicewindows

[root@lijie-01 ~]# yum install -y iptables-services

隨後啓動iptables-service服務後端

[root@lijie-01 ~]# systemctl start iptables-services
Failed to start iptables-services.service: Unit not found.
[root@lijie-01 ~]#

咱們可使用下面命令查看iptables-services 這個服務是否成功安裝centos

[root@lijie-01 ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init
[root@lijie-01 ~]#

從上圖咱們發現使用的命令有誤,開啓iptables服務應使用如下命令瀏覽器

[root@lijie-01 ~]# systemctl start iptables
[root@lijie-01 ~]#

隨後使iptables有效

[root@lijie-01 ~]# systemctl enable iptables
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@lijie-01 ~]#

上面咱們開啓iptables的目的是爲了清空規則,以便後面調用空規則

[root@lijie-01 ~]# iptables -F
[root@lijie-01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  肯定  ]
[root@lijie-01 ~]#

還須要關閉selinux

[root@lijie-01 ~]# setenforce 0
[root@lijie-01 ~]#

保險起見,最好仍是修改配置文件/etc/selinux/config中selinux值從enforcing變爲disabled來關閉selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

至此,準備工做完畢

2)搭建工做

  1. 在dir上安裝ipvsadm
[root@lijie-01 ~]# yum install -y ipvsdam
  1. 在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.75.0/24  -j MASQUERADE
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
#這裏的wlc是算法,算法還有如rr、lc
$IPVSADM -A -t 192.168.95.144:80 -s wlc -p 3
$IPVSADM -a -t 192.168.95.144:80 -r 192.168.75.134:80 -m -w 1
$IPVSADM -a -t 192.168.95.144:80 -r 192.168.75.130:80 -m -w 1

咱們來執行下這個腳本,沒有任何輸出,說明腳本沒有語法錯誤

[root@lijie-01 ~]# sh /usr/local/sbin/lvs_nat.sh
[root@lijie-01 ~]#

3)NAT模式效果測試

  1. 兩臺rs上都安裝nginx
  2. 設置兩臺rs的主頁,作一個區分,也就是說直接curl兩臺rs的ip時,獲得不一樣的結果
  3. 瀏覽器裏訪問192.168.95.144,多訪問幾回看結果差別

擴展:
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 三種模式詳解 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

相關文章
相關標籤/搜索