LVS(linux virtual server,linux 虛擬服務器),由如下三部分組成:html
負載均衡層(load balance): 位於整個集羣的最前端,由一臺或多臺負載調度器(Director Server)組成。 其上安裝了 LVS 的核心模塊 IPVS,負責把用戶請求分發給服務器羣組層的應用服務器(Real Server)。 同時還有監控模塊(Ldirectord),用於監測各個 Real Server 服務的健康狀況,當 real server 不可用時, 將其從路由表中剔除,待主機恢復後從新加入。前端
服務器羣組(Server Array): 由一組實際運行應用服務的主機組成。每一個 Real Server 之間經過高速 LAN 相連。linux
數據共享存儲(Shared Storage): 爲全部 Real Server 提供共享存儲空間和內容一致性的存儲區域,通常由磁盤陣列設備組成。nginx
IPVS: 安裝於 Director Server 上,並在 Director Server 上虛擬出一個 VIP(Virtual IP)。 用戶的訪問請求經過 VIP 到達負載調度器,而後由負載調度器從 Real Server 列表中選取一個服務節點響應用戶的請求。web
VS/NAT(Virtual Server via Network Address Translation): 當用戶請求到達調度器時,調度器將請求報文的目標地址和端口地址改寫 成選定的 Real Server 的相應地址和端口,並將請求報文發送給選定的 Real Server。當 Real Server 返回數據時,還須要再次將報文的源地址和端口更改成 VIP 和相應的端口後,再發送給用戶。 由於請求和響應報文都須要通過 Director Server 重寫,因此當高併發時,調度器的處理能力將會成爲瓶頸。算法
VS/TUN (Virtual Server via IP Tunneling): 也就是 IP 隧道技術實現虛擬服務器。調度器採用 IP 隧道技術將用戶請求轉發到某個 Real Server,而這個 Real Server 將直接響應用戶的請求,再也不通過前端調度器,此外,對 Real Server 的地域位置沒有要求,能夠和 Director Server 位於同一個網段,也能夠是獨立的一個網絡。因爲在 TUN 方式中,調度器將只處理用戶的報文請求,集羣系統的吞吐量大大提升。ubuntu
VS/DR(Virtual Server via Direct Routing): 也就是用直接路由技術實現虛擬服務器。VS/DR 經過改寫請求報文的 MAC 地址,將請求發送到 Real Server,而 Real Server 將響應直接返回給客戶,免去了 VS/TUN 中的 IP 隧道開銷。這種方式是三種負載調度機制中性能最高、最好的,可是必需要求 Director Server 與 Real Server 都有一塊網卡連在同一物理網段上。vim
上面咱們談到,負載調度器是根據各個服務器的負載狀況,動態地選擇一臺 Real Server 響應用戶請求,那麼動態選擇是如何實現呢,其實也就是咱們這裏要說的負載調度算法, 根據不一樣的網絡服務需求和服務器配置,IPVS 實現了以下八種負載調度算法,這裏咱們詳細講述最經常使用的四種調度算法,剩餘的四種調度算法請參考其它資料。服務器
輪詢調度(Round Robin)網絡
「輪詢」調度也叫1:1調度,調度器經過「輪詢」調度算法將外部用戶請求按順序1:1的分配到集羣中的每一個 Real Server 上,這種算法平等地對待每一臺 Real Server, 而無論服務器上實際的負載情況和鏈接狀態。
加權輪詢調度(Weighted Round Robin)
「加權輪詢」調度算法是根據 Real Server 的不一樣處理能力來調度訪問請求。能夠對每臺 Real Server 設置不一樣的調度權值,對於性能相對較好的 Real Server 能夠設置較高的權值,而對於處理能力較弱的 Real Server,能夠設置較低的權值,這樣保證了處理能力強的服務器處理更多的訪問流量,充分合理的利用了服務器資源。 同時,調度器還能夠自動查詢 Real Server 的負載狀況,並動態地調整其權值。
最少連接調度(Least Connections)
「最少鏈接」調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用「最小鏈接」調度算法能夠較好地均衡負載。
加權最少連接調度(Weighted Least Connections)
「加權最少連接調度」,每一個服務節點能夠用相應的權值表示其處理能力,而系統管理員能夠動態的設置相應的權值,缺省權值爲1,加權最小鏈接調度在分配新鏈接請求時儘量使服務節點的已創建鏈接數和其權值成正比。
其它四種調度算法分別爲:
VRRP (Virtual Router Redundancy Protocol,虛擬路由器冗餘協議): 在現實的網絡環境中,主機之間的通訊都是經過配置靜態路由(默認網關)完成的, 而主機之間的路由器一旦出現故障,通訊就會失敗,所以,在這種通訊模式中,路由器就成了一個單點瓶頸,爲了解決這個問題,就引入了 VRRP 協議。
VRRP 能夠將兩臺或多臺物理路由器設備虛擬成一個虛擬路由器,每一個虛擬路由器都有一個惟一標識,稱爲 VRID,一個 VRID 與一組 IP 地址構成了一個虛擬路由器。 這個虛擬路由器經過虛擬IP(一個或多個)對外提供服務。而在虛擬路由器內部,同一時間只有一臺物理路由器對外提供服務,這臺物理路由器被稱爲主路由器(處於 MASTER 角色)。 而其餘物理路由器不擁有對外的虛擬 IP,也不提供對外網絡功能,僅僅接收 MASTER 的 VRRP 狀態通告信息,這些路由器被統稱爲備份路由器(處於 BACKUP 角色)。 當主路由器失效時,處於 BACKUP 角色的備份路由器將從新進行選舉,產生一個新的主路由器進入 MASTER 角色繼續提供對外服務,整個切換過程對用戶來講徹底透明。
Keepalived 做爲一個高性能集羣軟件,它還能實現對集羣中服務器運行狀態的監控及故障隔離。下面繼續介紹下 Keepalived 對服務器運行狀態監控和檢測的工做原理。
Keepalived 工做在 TCP/IP 參考模型的第3、第四和第五層,也就是網絡層、傳輸層和應用層。根據 TCP/IP 參考模型各層所能實現的功能,Keepalived運行機制以下:
在網絡層,運行着四個重要的協議:互連網協議 IP、互連網控制報文協議 ICMP、地址轉換協議 ARP 以及反向地址轉換協議 RARP。Keepalived 在網絡層採 用的最多見的工做方式是經過ICMP協議向服務器集羣中的每一個節點發送一個 ICMP 的數據包(相似於 ping 實現的功能),若是某個節點沒有返回響應數據包,那麼 就認爲此節點發生了故障,Keepalived 將報告此節點失效,並從服務器集羣中剔除故障節點。
在傳輸層,提供了兩個主要的協議:傳輸控制協議 TCP 和用戶數據協議 UDP。傳輸控制協議 TCP 能夠提供可靠的數據傳輸服務,IP 地址和端口,表明一個 TCP 鏈接的 一個鏈接端。要得到 TCP 服務,須在發送機的一個端口上和接收機的一個端口上創建鏈接,而 Keepalived 在傳輸層就是利用 TCP 協議的端口鏈接和掃描技術來 判斷集羣節點是否正常的。好比,對於常見的 Web 服務默認的 80 端口、SSH 服務默認的 22 端口等,Keepalived 一旦在傳輸層探測到這些端口沒有響應數據返回, 就認爲這些端口發生異常,而後強制將此端口對應的節點從服務器集羣組中移除。
在應用層,能夠運行 FTP、TELNET、SMTP、DNS 等各類不一樣類型的高層協議,Keepalived 的運行方式也更加全面化和複雜化,用戶能夠經過自定義 Keepalived 的工做方式,例如用戶能夠經過編寫程序來運行 Keepalived,而 Keepalived 將根據用戶的設定檢測各類程序或服務是否容許正常,若是 Keepalived 的檢測結果 與用戶設定不一致時,Keepalived 將把對應的服務從服務器中移除。
環境:
hostname | ip | remark |
---|---|---|
lvs-master | 192.168.12.100 | lvs主機 |
lvs-slave | 192.168.12.101 | lvs備用機 |
web-server1 | 192.168.12.102 | realserver1 |
web-server2 | 192.168.12.103 | realserver2 |
本次安裝教程採用的是DR
轉發方式,上述機器均爲ubuntu16.04
VIP: 192.168.12.200
sudo apt-get install ipvsadm keepalived
查看路由轉發設置
sudo ipvsadm
***** vagrant@vagrant:~ [05:38:21] ***** % sudo ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
修改keepalived
的配置文件,沒有就新建一個
sudo vim /etc/keepalived/keepalived.conf
# 全局配置 global_defs { router_id LVS_DEVEL notification_email { dudashuang1222@gmail.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.12.30 smtp_connect_timeout 30 vrrp_skip_check_adv_addr vrrp_strict } # VRRP 實例配置 vrrp_instance VI_1 { state MASTER #若是使用主/備,另一臺機器須要設置爲BACKUP interface eth1 #檢測網絡端口 virtual_router_id 100 #主備的虛擬機路由ID必須一致 priority 100 #主備的優先級,主優先級要大於備 advert_int 1 #VRRP Multicast廣播週期秒數 authentication { auth_type PASS # VRRP認證方式 auth_pass 123456 # VRRP口令字 } virtual_ipaddress { 192.168.12.200 # 若是有多個VIP,繼續換行填寫 } } # 虛擬服務器配置 virtual_server 192.168.12.200 80 { delay_loop 1 # 每隔1秒查詢realserver狀態 lb_algo wrr # lvs 算法 lb_kind DR # Direct Route protocol TCP # 用TCP協議檢查realserver狀態 persistence_timeout 50 # 會話保持時間,這段時間內,同一ip發起的請求將被轉發到同一個realserver # 第一臺realserver物理環境 real_server 192.168.12.102 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } # 第二臺realserver物理環境 real_server 192.168.12.103 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
interface eth1 在這裏爲外置網卡的端口,能夠執行
ip a
查看192.168.12.100
在哪一個端口,若爲eth0
,則填eth0
lvs-slave的配置和主機同樣,僅須要將
state MASTER --> BACKUP priority 100 --> 90
啓動 keepalived
# 清除路由設置 sudo ipvsadm -C # 重啓 keepalived sudo service keepalived restart
此時查看路由配置
***** vagrant@vagrant:~ [05:38:39] ***** % sudo ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP localhost:http wrr persistent 50 -> localhost:http Route 1 0 0 -> localhost:http Route 1 0 0
配置/etc/rc.local
,添加下列配置,而後重啓機器
ifconfig lo:0 192.168.12.200 broadcast 192.168.12.200 netmask 255.255.255.255 up route add -host 192.168.12.200 dev lo:0 echo "0" > /proc/sys/net/ipv4/ip_forward 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
更新 nginx 首頁
sudo vim /var/www/html/index.nginx-debian.html
# realserver2 換成192.168.12.103 <h2>ip:192.168.12.102</h2>
假設lvs-master宕機
sudo service keepalived stop
假設 realserver1 宕機
sudo service nginx stop