負載均衡集羣:簡單地說就是讓多臺服務器均衡地去承載壓力。html
實現負載均衡的開源軟件有:LVS,keepalived,haproxy,nginx等mysql
其中相對於(網絡OSI七層模型),LVS屬於四層,Nginx屬於七層,haproxy既能夠認爲四層,也能夠認爲是七層。linux
keepalived的負載均衡功能其實就是lvsnginx
lvs這種4層的負載均衡是能夠分發出80外的其餘端口通訊的,好比Mysql,而七層nginx僅僅支持http.https,mail,haproxy也支持mysql這種。算法
相比較來講,LVS這種4層的更穩定,能承受更多的情趣,而Nginx這種7層的更加靈活,能實現更多的個性化需求。sql
LVS由國人章文嵩開發,流行度不亞於httpd,基於TCP/IP作的路由和轉發,穩定性和效率很高vim
LVS有三種常見的模式:NAT,DR,IP Tunnel後端
LVS架構中有一個核心角色叫作分發器(Load Balancer),它用來分發用戶的請求,還有諸多處理用戶請求的服務器(RealServer,簡稱rs)bash
這種模式藉助iptables的nat表來實現,用戶的請求到分發器後,經過預設的iptables規則,把請求的數據包轉發到後端的rs上去。服務器
rs須要設定網關爲分發器的內網ip,用戶請求的數據包和返回的用戶的數據包所有通過分發器,因此分發器成爲瓶頸。
優勢:在NAT模式中,只須要分發器有公網Ip,分發器和rs之間能夠用內網通訊,因此比較節省公網ip資源
缺點:分發器成爲瓶頸,請求量不能太大。規模保持在10臺左右。
咱們能夠想象分發器和每一個rs之間創建了一個虛擬通道。這種模式,須要有一個公共的IP配置在分發器和全部rs上,咱們把它叫作vip,
原理是客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包作一個交工,會把目標IP由vip更改成rs的IP,這樣數據包就到了rs上。
rs接受數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部的rs上配置了這樣一個vip,因此它會認爲是它本身。
這種模式也須要一個公共的ip配置在分發器和全部rs上,也就是vip,
和IP Tunnel不一樣的是,它會把全部的MAC地址修改成rs的MAC,
rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認識是它本身。
經常使用的4種
輪詢:Round-Robin rr (任務均衡的分發到rs上)
加權輪詢:Weight Round-Robin wrr (帶權重的輪詢,例如一個rs的配置好,你能夠將它權重設置高一點)
最小鏈接:Least-Connection lc (把新的任務發送到請求數少的rs上)
加權最小鏈接:Weight Least-Connection wlc (帶權重的最小鏈接)
不經常使用的4種
基於局部性的最小鏈接:Locality-Based Least Connections lblc
帶複製的基於局部性最小連接:Locality-Based Least Connections with Replication lblcr
目標地址散列調度:Destination Hashing dh
源地址散列調度:Source Hashing sh
準備3臺機器
A機器爲分發器,也叫調度器(簡寫爲dir)
A機器 192.168.64.128 外網地址爲192.168.64.128 (主機模式的網卡)
B機器 192.168.64.100
C機器 192.168.64.200
B機器和C機器的網關須要設置爲192.168.209.132 (設置爲和A機器的網卡IP如出一轍)
A主機配置:
配置一下ens37主機模式的IP不須要設置網關
配置完成之後重啓一下網卡
Windows上面能夠成功ping通說明網絡正常
而後接下來須要關閉三臺機器的防火牆。(順便都給三臺機器裝上 yum install -y iptables-services)
[root@aming-01 ~]# systemctl stop firewalld #中止防火牆服務 [root@aming-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@aming-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
防火牆關閉完之後再關閉三臺機器的selinux。
[root@aming-01 ~]# setenforce 0 #暫時關閉selinux [root@aming-01 ~]# vi /etc/selinux/config #保險起見修改配置文件永久關閉selinux
還須要把B和C機器的網關設置成A機器的IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33 =配置IP
[root@aminglinux-03 ~]# route -n #檢測網關 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.209.132 0.0.0.0 UG 100 0 0 ens33 192.168.209.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
分發器上安裝ipvsdam
[root@aming-01 sbin]# yum install -y ipvsadm #在A(dir)機器只須要安裝在A機器
而後在A機器上面編輯一個腳本
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.133.0/24 -j MASQUERADE # director設置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.147.144:80 -s rr #表示算法上面有具體講解 $IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.132:80 -m -w 1 $IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.133:80 -m -w 1
而後運行一下腳本,沒有輸出通常說明沒問題
[root@aming-01 ~]# sh /usr/local/sbin/lvs_nat.sh
B和C機器上面都須要安裝nginx服務
netstat -lntp 查看80端口是不是nginx 若是不是那麼啓動nginx服務
/etc/init.d/nginx start = 啓動nginx服務
B機器
C機器
測試: 以下說明搭建Ok
[root@aming-01 ~]# curl 192.168.64.128 aminglinx03 [root@aming-01 ~]# curl 192.168.64.128 aminglinux02
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