18.6 負載均衡集羣介紹
18.7 LVS介紹
18.8 LVS調度算法
18.9/18.10 LVS NAT模式搭建html
18.6 負載均衡集羣介紹linux
主流開源軟件LVS、keepalived、haproxy、nginx等nginx
其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既能夠認爲是4層,也能夠當作7層使用web
keepalived的負載均衡功能其實就是lvs,lvs是keepalived內置的算法
lvs這種4層的負載均衡是能夠分發TCP協議,web服務是80端口,除了分發80端口,還有其餘的端口通訊的,好比MySQL的負載均衡,就能夠用LVS實現,而nginx僅僅支持http,https,mail,haproxy;haproxy也支持MySQL這種TCP負載均衡的apache
7層有限制,不過有些更高級的功能,nginx能夠經過站點目錄,去區分網站服務器以前,LVS4層的就不支持vim
相比較來講,LVS這種4層的更穩定,能承受更多的請求,承載的併發量更高,而nginx這種7層的更加靈活,能實現更多的個性化需求後端
18.7 LVS介紹瀏覽器
LVS是由國人章文嵩開發bash
流行度不亞於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,因此它會認爲是它本身
18.8 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
18.9/18.10 LVS NAT模式搭建
LVS NAT模式搭建
NAT模式搭建 – 準備工做
內網:133.133,設置網關爲133.130
內網:133.132,設置網關爲133.130
內網:133.130,外網:147.144(vmware僅主機模式)
三臺機器
分發器,也叫調度器(簡寫爲dir)
rs1
rs2
三臺機器上都執行執行
systemctl stop firewalld; systemc disable firewalld
systemctl start iptables-services; iptables -F; service iptables save
NAT模式搭建
在dir上安裝ipvsadm
yum install -y ipvsdam
在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_redirectsecho 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 wlc -p 3 $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
NAT模式效果測試
兩臺rs上都安裝nginx
設置兩臺rs的主頁,作一個區分,也就是說直接curl兩臺rs的ip時,獲得不一樣的結果
瀏覽器裏訪問192.168.142.147,多訪問幾回看結果差別
NAT模式是經過iptables實現的,因此必須配置一些iptables規則
1.在配置前準備三臺機器,一臺做爲分發器,也叫作調度器,簡稱 dir,另外兩臺就是real server,用來處理用戶請求的服務器,rs一、rs2(克隆虛擬機步驟)
安裝ifconfig命令 yum install -y net-tools
A機器IP爲192.168.74.12九、B機器IP爲192.168.74.130,C機器IP爲192.168.74.133
PS:網關最後設置,不然包沒法下載
B機器和C機器的網關必須設置成分發器(即A機器)的內網IP,若不設置成它的網關,是無法通訊的
網卡配置文件中更改(即本機器) vi /etc/sysconfig/network-scripts/ifcfg-eno16777736 更改完以後重啓網絡服務 systemctl restart network [root@hf-02 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.74.129 0.0.0.0 UG 1024 0 0 eno16777736 192.168.74.0 0.0.0.0 255.255.255.0 U 0 0 0 eno16777736 [root@hf-02 ~]#
關閉firewalld服務 systemctl stop firewalld 使firewalld服務再也不開機啓動 systemctl disable firewalld
yum install -y iptables-services
[root@hf-01 ~]# cd /etc/yum.repos.d/ [root@hf-01 yum.repos.d]# ls CentOS7-Base-163.repo CentOS-Sources.repo epel.repo CentOS-Debuginfo.repo CentOS-Vault.repo epel-testing.repo [root@hf-01 yum.repos.d]# mv epel.repo epel.repo.1 [root@hf-01 yum.repos.d]#
機器B [root@hf-02 ~]# systemctl start iptables [root@hf-02 ~]# 機器C [root@hf-03 ~]# systemctl start iptables [root@hf-03 ~]#
機器B [root@hf-02 ~]# systemctl start iptables [root@hf-02 ~]# systemctl enable iptables ln -s '/usr/lib/systemd/system/iptables.service' '/etc/systemd/system/basic.target.wants/iptables.service' [root@hf-02 ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 71 5076 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 1 124 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 48 packets, 4680 bytes) pkts bytes target prot opt in out source destination [root@hf-02 ~]# iptables -F //清空表的規則,以便後續實驗 [root@hf-02 ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 肯定 ] [root@hf-02 ~]# 機器C同上
[root@hf-01 ~]# iptables -nvL Chain INPUT (policy ACCEPT 19 packets, 1296 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 11 packets, 1108 bytes) pkts bytes target prot opt in out source destination [root@hf-01 ~]#
setenforce 0 //臨時關閉selinux getenforce //查看selinux是否關閉 爲了保險起見,在配置文件中永久關閉selinux vi /etc/selinux/config SELINUX=enforcing更改成SELINUX=disabled
NAT模式搭建
[root@hf-01 ~]# yum install -y ipvsadm
[root@hf-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/eno16777736/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens36/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 //MASQUERADE實現同網段的機器去上網,路由器使用的就是這個功能 # director設置ipvsadm IPVSADM='/usr/sbin/ipvsadm' //設置一個變量,方便下面命令引用 $IPVSADM -C //清空規則 $IPVSADM -A -t 192.168.204.1:80 -s lc -p 3 //用來定義lvs 的模式;wlc,爲算法,能夠按需求選擇 lvs 裏面適合的算法 $IPVSADM -a -t 192.168.204.1:80 -r 192.168.74.131:80 -m -w 1 //小規則,-r 指定dir機器IP,-m 指定nat模式,-w指定rs權重 $IPVSADM -a -t 192.168.204.1:80 -r 192.168.74.133:80 -m -w 1 //小規則,-r 指定dir機器IP,-m 指定nat模式,-w指定rs權重
[root@hf-01 ~]# sh /usr/local/sbin/lvs_nat.sh [root@hf-01 ~]#
B機器 [root@hf-02 ~]# ps aux |grep nginx root 1102 0.0 0.0 20996 624 ? Ss 05:29 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 1107 0.0 0.3 23440 3208 ? S 05:29 0:00 nginx: worker process nobody 1108 0.0 0.3 23440 3208 ? S 05:29 0:00 nginx: worker process root 3580 0.0 0.0 112676 984 pts/1 R+ 08:30 0:00 grep --color=auto nginx [root@hf-02 ~]# C機器 [root@hf-03 ~]# ps aux |grep nginx root 821 0.0 0.0 20996 628 ? Ss 08:00 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 825 0.0 0.3 23440 3212 ? S 08:00 0:00 nginx: worker process nobody 826 0.0 0.3 23440 3212 ? S 08:00 0:00 nginx: worker process root 1851 0.0 0.0 112676 984 pts/0 R+ 08:30 0:00 grep --color=auto nginx [root@hf-03 ~]#
[root@hf-02 ~]# vim /usr/share/nginx/html/index.html [root@hf-02 ~]# curl localhost hanfeng-02
[root@hf-03 ~]# vim /usr/share/nginx/html/index.html [root@hf-03 ~]# curl localhost hanfeng-03
[root@hf-01 ~]# curl 192.168.204.1 hanfeng-02 [root@hf-01 ~]# curl 192.168.204.1 hanfeng-03
[root@hf-01 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 108 packets, 5472 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 108 packets, 5472 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 Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * * 192.168.74.0/24 0.0.0.0/0 [root@hf-01 ~]#
[root@hf-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.204.1:80 wlc persistent 3 -> 192.168.74.131:80 Masq 1 0 0 -> 192.168.74.133:80 Masq 1 0 0 [root@hf-01 ~]#
友情連接:http://www.apelearn.com阿銘linux