18.6 負載均衡集羣介紹html
18.7 LVS介紹mysql
18.8 LVS調度算法(面試會被問到)linux
18.9/18.10 LVS NAT模式搭建nginx
擴展web
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.htmlsql
lvs原理相關的 http://blog.csdn.net/pi9nc/article/details/23380589shell
18.6 負載均衡集羣介紹:apache
~1.主流開源軟件LVS、keepalived、haproxy、nginx等
~2.其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既能夠認爲是4層,也能夠當作7層使用
因此LVS與nginx之間有本質的區別。haproxy比較特殊
~3.keepalived的負載均衡功能其實就是lvs
lvs是keepalived內置的
~4.lvs這種4層的負載均衡是能夠分發除80外的其餘端口通訊的(tcp),好比MySQL的,而nginx僅僅支持http,https,mail,haproxy也支持MySQL這種
四層和七層有一個本質的區別。好比LVS這種四層能夠分發tcp/ip的協議,好比web服務是80端口,他除了分發80端口以外,還能夠分發其餘的端口。好比作一個mysql的負載均衡,也是能夠用LVS實現的。而nginx就不支持,他僅僅支持http,https,mail。而haproxy也是支持mysql負載均衡的
~5.相比較來講,LVS這種4層的更穩定,能承受更多的請求,承載的併發量會很高。而nginx這種7層的更加靈活,能實現更多的個性化需求
七層的話仍是有限制的,可是有更高級的功能。好比nginx能夠根據目錄,一個網站咱們能夠去訪問下面的二級目錄或三級目錄,能夠根據目錄的名字,去區分後端的真正的服務器,固然nginx能夠作到,LVS作不到。LVS沒這麼智能,他僅僅是一個四層,四層其實也就是一個tcp/ip數據包的轉發。可是對於包裏面有什麼樣的域名,什麼樣的主機頭之類的,他不關心
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.7 LVS介紹:
~1.LVS是由國人章文嵩開發
~2.流行度不亞於apache的httpd,基於TCP/IP作的路由和轉發,穩定性和效率很高
~3.LVS最新版本基於Linux內核2.6,有好多年不更新了
~4.LVS有三種常見的模式:NAT、DR、IP Tunnel
~5.LVS架構中有一個核心角色叫作分發器(Load balance),它用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server,簡稱rs)
~~LVS NAT模式(就是iptables轉發):
~1.這種模式藉助iptables的nat表來實現
~2.用戶的請求到分發器後(load balancer),經過預設的iptables規則,把請求的數據包轉發到後端的rs上去
~3.rs須要設定網關爲分發器的內網ip
~4.用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器成爲瓶頸
因此使用NAT模式,規模不能太大,通常十幾臺。
~5.在nat模式中,只須要分發器有公網ip便可,因此比較節省公網ip資源
NAT模式,用戶過來,分發器分發出去以後,這些請求還要回來。那也就意味着load balancer與real server他們只須要用內網通訊就能夠了。那麼咱們只須要有一個公網IP配置在load balancer上就能夠了。這是NAT模式的一個優點
~~LVS IP Tunnel模式(就是把目標IP作了更改:
~1.這種模式,須要有一個公共的IP(VIP)配置在分發器和全部rs上,咱們把它叫作vip
~2.客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包作一個加工,會把目標IP改成rs的IP,這樣數據包就到了rs上
每次把目標IP改成rs的IP都不同,會傳到不一樣的rs上
~2.rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身
再有rs將數據直接返還給用戶,因此load balancer不存在瓶頸
~~LVS DR模式:
~1.這種模式,也須要有一個公共的IP配置在分發器和全部rs上,也就是vip
~2.和IP Tunnel不一樣的是,它會把數據包的MAC地址修改成rs的MAC地址
可理解爲,內網在通訊是須要MAC地址
~3.rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身
由於全部的機器都配備了VIP,rs直接返還給用戶。這樣load salancer也沒有瓶頸
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.8 LVS調度算法:
~1.輪詢 Round-Robin 簡稱rr
用戶的請求過來,他均衡的把這些請求分發到rs上,沒有任何的優劣之分,誰也不容許多分和少分
~2.加權輪詢 Weight Round-Robin 簡稱wrr
好比,其中一個rs想多分點(由於配置高),能夠給他設置很高的權重。好比他的是80,其餘的60。這樣80的機器分配的請求數會多一些
~3.最小鏈接 Least-Connection 簡稱lc
好比這個服務器鏈接數少。那麼就會把新的請求分發到這個請求數少的上去。請求數少說明他比較閒、可能他處理速度快
~4.加權最小鏈接 Weight Least-Connection 簡稱wlc
一樣的,與~3.相比就是加了權重
後面四種用的很少,簡單瞭解:
~5.基於局部性的最小鏈接 Locality-Based Least Connections lblc
~6.帶複製的基於局部性最小鏈接 Locality-Based Least Connections with Replication lblcr
~7.目標地址散列調度 Destination Hashing dh
~8.源地址散列調度 Source Hashing sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.9/18.10 LVS NAT模式搭建:
NAT模式搭建 – 準備工做
NAT是經過iptables實現的,那因此這個上面必需要配置iptables規則。在這以前先準備三臺機器:
~1.三臺機器
~2.分發器,也叫調度器(簡寫爲dir)
三臺機器的其中一臺做爲分發器
內網:208.128,外網:44.0(vmware僅主機模式)
~3.rs1
另外兩臺做爲用戶請求的機器
內網:208.130 設置網關爲208.128
~4.rs2
內網:208.133 設置網關爲208.128
~5.三臺機器上都執行執行
systemctl stop firewalld; systemc disable firewalld
systemctl start iptables-services; iptables -F; service iptables save
NAT模式搭建
~1.在dir上安裝ipvsadm
分發器上安裝ipvsadm,這是實現LVS的重要工具。這個工具很iptables有點像
yum install -y ipvsdam
~2.在dir上編寫腳本,vim /usr/local/sbin/lvs_nat.sh//內容以下
#! /bin/bash
# director 服務器上開啓路由轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward #意思是把1寫入到了內核參數裏。就是把內核作了一個調整,實現路由轉發。你不開啓路由轉發,這個數據包沒有辦法轉發到後面的rs上去
# 關閉icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects #實際上作了一個假裝。要不沒辦法把數據包轉發到rs上去。rs還要把數據轉發回來
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.208.0/24 -j MASQUERADE
#作了規則。能夠實現將同網段的內網上網。像咱們的路由器就是這個功能
# director設置ipvsadm(lvs的規則)
IPVSADM='/usr/sbin/ipvsadm' #設置了變量,下面要引用他
$IPVSADM -C #清空規則
$IPVSADM -A -t 192.168.44.147:80 -s wlc -p 3 #公網ip要注意爲比配置的ip 。wlc爲算法,能夠改爲其餘的算法。下面實例中咱們即改爲了rr,由於比較均衡,以便測試
#增長一個規則。是NAt模式仍是DR模式或者iptunnel。這裏寫的是分發器的ip(公網ip)。就是數據包到了公網ip的80端口,而後作一些操做,首先是算法,-p爲超時時間(好比3秒以內登陸一致分發到一臺機器上去)。下面實例中咱們刪掉了,以便測試
$IPVSADM -a -t 192.168.44.147:80 -r 192.168.208.130:80 -m -w 1
#-r指定rs是誰.-m是NAT的模式。-w權重
$IPVSADM -a -t 192.168.44.147:80 -r 192.168.208.133:80 -m -w 1
NAT模式效果測試:
~1.兩臺rs上都安裝nginx
~2.設置兩臺rs的主頁,作一個區分,也就是說直接curl兩臺rs的ip時,獲得不一樣的結果
~3.瀏覽器裏訪問192.168.44.147,多訪問幾回看結果差別
1 網絡架構搞清楚: dir一個內網,一個外網, rs只有一個內網, rs須要配置網關爲dir的內網ip。
2 仔細檢查腳本內容,是否和個人一致。注意,並非連IP都照搬,須要和你的網絡匹配。
3 你的windows電腦是否能夠ping通這個「外網」地址?
實例:
NAT模式搭建 – 準備工做:
須要克隆一臺出來,並修改他的IP。遠程鏈接他
[root@axinlinux-01 ~]# hostnamectl set-hostname axinlinux-03 #由於是克隆的01,要改一下主機名
小插曲:由於克隆的01,那麼01機器要先關閉,再vi03,否則重啓不了網絡服務
[root@axinlinux-01 ~]# bash #進入一個子shell就變了
[root@axinlinux-03 ~]#
在01 上改成僅主機:
而後看一下01 的網段是什麼:
[root@axinlinux-01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37 #修改ens37的網段爲44
[root@axinlinux-01 ~]# ifup ens37 #開啓ens 37這個網卡
[root@axinlinux-01 ~]# ifconfig #看一下有沒設置成功
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.44.147 netmask 255.255.255.0 broadcast 192.168.44.255
inet6 fe80::20c:29ff:fe87:422e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:87:42:2e txqueuelen 1000 (Ethernet)
RX packets 51 bytes 6662 (6.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 77 bytes 10594 (10.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
而後在cmd,ping一下是否通訊
這樣三臺機器就都設置好了
而後三臺機器都關閉防火牆
[root@axinlinux-02 ~]# 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@axinlinux-02 ~]# yum install -y iptables-services #讓他使用centos6 的iptabls
小知識點:若是yum的時候,epel很慢的時候,/etc/yum.repos.d/epel.repo這個文件先關掉。改個名字就好
[root@axinlinux-02 ~]# systemctl enable iptables #開啓啓動
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@axinlinux-02 ~]# systemctl start iptables #開啓iptables
[root@axinlinux-02 ~]# iptables -F #清空規則
[root@axinlinux-02 ~]# service iptables save #保存這個空規則。是爲了讓他保存一個空規則。不會讓他默認的規則影響到咱們的實驗
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 肯定 ]
三臺機器上都要清空規則和保存空規則
最後三臺機器還要關閉selinux
兩臺rs機器網關設置成208.130
root@axinlinux-03 ~]# systemctl restart network #重啓網絡服務
[root@axinlinux-03 ~]# route -n #這個命令檢查網關
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.208.130 0.0.0.0 UG 100 0 0 ens33
以上準備工做已所有完成
NAT模式搭建:
[root@axinlinux-01 ~]# yum install -y ipvsadm 分發器上安裝ipvsadm
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_nat.sh
輸入-2.的內容
[root@axinlinux-01 ~]# sh /usr/local/sbin/lvs_nat.sh #執行一下。沒有輸出就表明沒有錯誤
NAT模式效果測試:
由於已經安裝了nginx,就不須要了,開啓就能夠了。而後來設置兩臺rs主頁
[root@axinlinux-02 ~]# curl localhost #先看一下
[root@axinlinux-02 ~]# vi /usr/share/nginx/html/index.html
#由於以前是yum安裝的。因此主頁路徑在這個下。設置成axinlinux-02
[root@axinlinux-03 ~]# vim /usr/local/nginx/conf/vhost/aaa.com.conf #能夠看一下默認主機root路徑在哪。
[root@axinlinux-03 ~]# vim /data/wwwroot/default/index.html #由於是編譯的,因此在這
#設置成axinlinux-03
接下來能夠作測試了。直接在瀏覽器上,訪問公網IP192.168.44.147:
結果是分發到了03上。咱們把以前設置的-p 3改成0,以便咱們測試
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_nat.sh
[root@axinlinux-01 ~]# sh !$ #結果有報錯。是由於咱們有些操做有重複
sh /usr/local/sbin/lvs_nat.sh
invalid timeout value `0' specified
Memory allocation problem
Memory allocation problem
[root@axinlinux-01 ~]# iptables -t nat -nvL #首先檢查一下nat表的規則,是有規則的,沒問題
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2 174 MASQUERADE all -- * * 192.168.208.0/24 0.0.0.0/0
[root@axinlinux-01 ~]# ipvsadm -ln #看一下ipvsadm的規則,結果有問題
IP Virtual Server version 1.2.1 (size=4096) #正常是有數據的,如今看來是沒有,是有問題的
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@axinlinux-01 ~]# !sh #再來執行。結果是-p 後面不能跟0。那麼直接去掉-p把
sh /usr/local/sbin/lvs_nat.sh
invalid timeout value `0' specified
Memory allocation problem
Memory allocation problem
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_nat.sh #刪掉-p
[root@axinlinux-01 ~]# !sh #再來執行。能夠了
sh /usr/local/sbin/lvs_nat.sh
[root@axinlinux-01 ~]# ipvsadm -ln #咱們再來看ipvsadm,一如下是正常的,是有數據的
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.44.147:80 wlc
-> 192.168.208.130:80 Masq 1 0 0 #這就是具體的規則
-> 192.168.208.133:80 Masq 1 0 0
那麼修改好了-p的問題。咱們再回到瀏覽器上,刷新看看
仍是一直是03。咱們把算法改成rr吧,由於比較均衡,以便測試。
艹,仍是03(估計跟瀏覽器的緩存有關係)。咱們回到linux上,用curl測試吧,記住必定要測試外網
[root@axinlinux-01 ~]# curl 192.168.44.147 #結果正常,可看出比較均衡
axinlinux-02
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-03
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-02
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-03
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-02
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-03