l 負載均衡能夠採用硬件設備(例如經常聽見的 F5),也能夠採用軟件負載html
l 商用硬件負載設備成本一般較高(一臺幾十萬甚至上百萬),因此通常 狀況下會採用軟件負載前端
l 軟件負載解決的兩個核心問題是:選誰、轉發,其中最著名的是 lvs node
l 英文全稱是 Linux Virtual Server,即 Linux 虛擬服務器linux
l 由 章 文 嵩 博 士 發 起 的 自 由 軟 件 項 目 , 它 的 官 方 站 點 是 www.linuxvirtualserver.orgnginx
l Linux2.4 內核之後,LVS 已是 Linux 標準內核的一部分web
l 能夠將請求分發給後端真實服務器處理算法
l 有許多比較著名網站和組織都在使用 LVS 架設的集羣系統,例如:Linux 的門 戶網站(www.linux.com)、向 RealPlayer 提供音頻視頻服務而聞 名的 Real 公 司(www.real.com )、全球最大的開源網站 (sourceforge.net)等數據庫
l 提供了多種調度算法vim
1) 輪詢調度(Round-Robin Scheduling)RR算法後端
2) 加權輪詢調度(Weighted Round-Robin Scheduling)WRR算法
3) 最小鏈接調度(Least-Connection Scheduling)LC算法
4) 加權最小鏈接調度(Weighted Least-Connection Scheduling)WLC算法
5) 基於局部性的最少連接(Locality-Based Least Connections Scheduling)LBLC算法
6) 帶 復 制 的 基 於 局 部 性 最 少 鏈 接 ( Locality-Based Least Connections with Replication Scheduling)LBLCR算法
7) 目標地址散列調度(Destination Hashing Scheduling)DH算法
8) 源地址散列調度(Source Hashing Scheduling)SH算法
9) 最短預期延時調度(Shortest Expected Delay Scheduling)SED算法
10) 不 排 隊 調 度 ( Never Queue Scheduling )NQ算法
l 有三種轉發規則
1) NAT:簡單理解,就是數據進出都經過 LVS,性能不是很好。
2) TUNL:簡單理解:隧道
3) DR:最高效的負載均衡規則
l 最前端的負載均衡層,用 Load Balancer 表示
l 中間的服務器集羣層,用 Server Array 表示
l 最底端的數據共享存儲層,用 Shared Storage 表示
l 在用戶看來,全部的內部應用都是透明的,用戶只是在使用一個虛擬服 務器提供的高性能服務
l 抗負載能力強,由於 lvs 工做方式的邏輯是很是之簡單,並且工做在網絡 4 層僅作請求分發之用,沒有流量,因此在效率上基本不須要太過考慮。
l 有完整的雙機熱備方案,當節點出現故障時,lvs 會自動判別,因此係統總體是很是穩定的。
l 使用集羣技術和Linux操做系統實現一個高性能、高可用的服務器.
l 很好的可伸縮性(Scalability)
l 很好的可靠性(Reliability)
l 很好的可管理性(Manageability)
l 基本上能支持全部應用,由於 lvs 工做在 4 層,因此它能夠對幾乎全部應用作負載均衡,包括 http、數據庫、聊天室等等。
l lvs 是四層負載均衡,也就是說創建在 OSI 模型的第四層——傳輸層之 上
l 傳輸層上有 TCP/UDP,lvs 支持 TCP/UDP 的負載均衡
l 由於 LVS 是四層負載均衡,所以它相對於其它高層負載均衡的解決辦法, 好比 DNS 域名輪流解析、應用層負載的調度、客戶端的調度等,它的效 率是很是高的
l lvs 的轉發能夠經過修改 IP 地址實現(NAT 模式)
l lvs 的轉發還能夠經過修改直接路由實現(DR 模式)
l 負載度 lvs 優於 nginx
l 穩定度 lvs 優於 nginx
l 服務器性能要求 lvs 優於 nginx
l 網絡層數的效率 lvs 優於 nginx ² 網絡七層:應用層、會話層、表示層、傳輸層、網絡層、鏈路層、 物理層
l 功能多少 nginx 優於 lvs
keepalived是一個相似於layer3, 4 & 5交換機制的軟件,也就是咱們平時說
第3層、第4層和第5層交換。Keepalived是自動完成,不需人工干涉
Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工
出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時
用其餘服務器代替該服務器的工做,當服務器工做正常後Keepalived自動將
務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人
作的只是修復故障的服務器
Layer3,4,5工做在IP/TCP協議棧的IP層,TCP層,及應用層,原理分別以下:
l Layer3:Keepalived使用Layer3的方式工做式時,Keepalived會按期向服務器羣中的服務器發送一個ICMP的數據包(既咱們平時用的Ping程序),若是發現某臺服務的IP地址沒有激活,Keepalived便報告這臺服務器失效,並將它從服務器羣中剔除,這種狀況的典型例子是某臺服務器被非法關機。Layer3的方式是以服務器的IP地址是否有效做爲服務器工做正常與否的標準。
l Layer4:若是您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的狀態來決定服務器工做正常與否。如web server的服務端口通常是80,若是Keepalived檢測到80端口沒有啓動,則Keepalived將把這臺服務器從服務器羣中剔除。
l Layer5:Layer5對指定的URL執行HTTP GET。而後使用MD5算法對HTTP GET結果進行求和。若是這個總數與預期值不符,那麼測試是錯誤的,服務器將從服務器池中移除。該模塊對同一服務實施多URL獲取檢查。若是您使用承載多個應用程序服務器的服務器,則此功能頗有用。此功能使您可以檢查應用程序服務器是否正常工做。MD5摘要是使用genhash實用程序(包含在keepalived軟件包中)生成的。
l SSL_GET與HTTP_GET相同,但使用SSL鏈接到遠程Web服務器。
l MISC_CHECK:此檢查容許用戶定義的腳本做爲運行情況檢查程序運行。結果必須是0或1.該腳本在導演盒上運行,這是測試內部應用程序的理想方式。可使用完整路徑(即/path_to_script/script.sh)調用能夠不帶參數運行的腳本。那些須要參數的須要用雙引號括起來(即「/path_to_script/script.sh arg 1 … arg n」)
主要用做RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間 failover的實現
當咱們的服務器意外掛了以後,咱們要怎麼作?
固然是找一臺新的機器,替代現有的機器,而後作新的環境部署,端口映射, 域名解析等等一系列的工做,再將服務從新啓動;可是若是這一系列的操做都 是手動完成的,那麼等你把這些工做搞好,可能服務已經中止個把小時了,這 會兒估計運營早就提着菜刀架在你脖子上了;
可是若是使用了KeepAlived以後,而後提早將備用機準備好,當主的機器掛掉 以後,自動將VIP給你切換到備用機,而且以郵件的形式告訴你說主服務已經 掛了,你得趕忙恢復起來;這時候你就能夠慢慢的去找主服務的問題,這時候 並不會影響到你的正常業務運行。
兩臺webserver
Centos7.6 lvs keepalived 主 192.168.25.31 master
Centos7.6 lvs keepalived 備 192.168.25.32 slave
VIP地址 192.168.25.50
25.31:master
25.32:slave
兩臺都須要的配置
[root@master ~]# yum -y install httpd
[root@master ~]# systemctl enable httpd.service
[root@master ~]# systemctl list-unit-files |grep httpd
httpd.service enabled
[root@master ~]# systemctl start httpd.service
Master:
[root@master ~]# vim /var/www/html/index.html
[root@master ~]# cat /var/www/html/index.html
node01 service
Slave:
[root@slave ~]# vim /var/www/html/index.html
[root@slave ~]# cat /var/www/html/index.html
node02 service
在centos7裏面須要先執行安裝net_tools否則執行腳本時會報錯
[root@slave ~]# yum -y install net-tools
[root@master ~]# vim /etc/init.d/realserver
\#!bin/bash
SNS_VIP=192.168.25.100 #定義一個VIP變量,必須跟真實服務在一個網段
source /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start lvs of realserver"
/sbin/ifconfig lo:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 up #增長一個本地路由 lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/prco/sys/net/ipv4/conf/all/arp_anounce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
[root@master ~]# chmod 777 /etc/init.d/realserver
[root@master init.d]# service realserver start
Starting realserver (via systemctl): [ 肯定 ]
[root@master ~]# ifconfig
![](http://static.javashuo.com/static/loading.gif)
Master:
[root@master init.d]# scp realserver root@192.168.25.32:/etc/init.d/
Slave:
[root@slave init.d]# chmod 777 realserver
[root@slave init.d]# service realserver start
Reloading systemd: [ 肯定 ]
Starting realserver (via systemctl): [ 肯定 ]
[root@slave init.d]# ifconfig
![](http://static.javashuo.com/static/loading.gif)
Master:
[root@master ~]# uname -a Linux master 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Slave:
[root@slave ~]# uname -a Linux slave 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@master ~]# yum -y install keepalived
[root@master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@master ~]# vim /etc/keepalived/keepalived.conf global_defs { # notification_email { # } # smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER #指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器 interface ens160 #指定HA監測網絡的接口 virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 100 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是 authentication { #設置驗證類型和密碼 auth_type PASS #設置驗證類型,主要有PASS和AH兩種 auth_pass 1111 #設置驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊 } virtual_ipaddress { 192.168.25.100 #設置虛擬IP地址,能夠設置多個虛擬IP地址,每行一個 } } virtual_server 192.168.25.100 80 { #設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開 delay_loop 6 #設置運行狀況檢查時間,單位是秒 lb_algo wrr #設置負載調度算法,這裏設置爲wrr,即加權輪詢調度 lb_kind DR #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選這裏使用LVSDR模式 nat_mask 255.255.255.0 persistence_timeout 0 #會話保持時間,單位是秒。這個選項對動態網頁是很是有用的,爲集羣系統中的session共享提供了一個很好的解決方案。 #有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。 #須要注意的是,這個會話保持時間是最大無響應超時時間,也就是說,用戶在操做動態頁面時,若是50秒內沒有執行任何操做 #那麼接下來的操做會被分發到另外的節點,可是若是用戶一直在操做動態頁面,則不受50秒的時間限制 protocol TCP #指定轉發協議類型,有TCP和UDP兩種 real_server 192.168.25.31 80 { #配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開 weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小能夠爲不一樣性能的服務器 #分配不一樣的負載,能夠爲性能高的服務器設置較高的權值,而爲性能較低的服務器設置相對較低的權值,這樣才能合理地利用和分配系統資源 TCP_CHECK { #realserver的狀態檢測設置部分,單位是秒 connect_timeout 10 #表示10秒無響應超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 80 } } real_server 192.168.25.32 80 { weight 2 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
[root@master ~]# systemctl start keepalived.service
[root@slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@slave ~]# vim /etc/keepalived/keepalived.conf (在slave上只須要修改state MASTER 爲state backup和優先級低於master就行) global_defs { # notification_email { # } # smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface ens160 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.25.100 } } virtual_server 192.168.25.100 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.25.31 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.25.32 80 { weight 2 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
[root@slave ~]# systemctl start keepalived.service
[root@master ~]# systemctl stop httpd.service
[root@master ~]# systemctl start httpd.service