LVS簡介
LVS(Linux Virtual Server)即Linux虛擬服務器,是由章文嵩博士主導的開源負載均衡項目,目前LVS已經被集成到Linux內核模塊中。該項目在Linux內核中實現了基於IP的數據請求負載均衡調度方案,其體系結構如圖1所示,終端互聯網用戶從外部訪問公司的外部負載均衡服務器,終端用戶的Web請求會發送給LVS調度器,調度器根據自己預設的算法決定將該請求發送給後端的某臺Web服務器,比如,輪詢算法可以將外部的請求平均分發給後端的所有服務器,終端用戶訪問LVS調度器雖然會被轉發到後端真實的服務器,但如果真實服務器連接的是相同的存儲,提供的服務也是相同的服務,最終用戶不管是訪問哪臺真實服務器,得到的服務內容都是一樣的,整個集羣對用戶而言都是透明的。最後根據LVS工作模式的不同,真實服務器會選擇不同的方式將用戶需要的數據發送到終端用戶,LVS工作模式分爲NAT模式、TUN模式、以及DR模式。
瞭解負載均衡羣集的原理
羣集的含義
**Cluster,集羣,羣集**
由多臺主機構成,但對外只表現爲一個整體
在互聯網應用中,隨着站點對硬件性能,響應速度,服務穩定性,數據可靠性等要求越來越高,單臺服務器力不從心
** 解決方法**
使用價格昂貴的小型機,大型機
使用普通服務器構建服務羣集
羣集的分類
根據羣集所針對的目標差異,可分爲三種類型
負載均衡羣集
高性能運算羣集
**負載均衡羣集(Load,Balance Cluster)**
以提高應用系統的響應能力,儘可能處理更多的訪問請求,減少延遲爲目標,獲得高併發,高負載LB的整體性能
LB的負載分配依賴主節點的分流算法
**高可用羣集**
以提高應用系統的可靠性,儘可能地減少中斷時間爲目標,確保服務的連續性達到高可用
HA的容錯效果
HA的工作方式包括雙工和主從模式
**高性能運算羣集**
以提高應用系統的CPU運算速度,擴展硬件資源和分析能力爲目標,獲得相當於大型,超級計算機的高性能運算HPC能力
高性能運算羣集的高性能依賴於分佈式運算,並行計算,通過專用硬件和軟件將多個服務器的CPU,內存等資源整合在一起,實現只有,大型,超級計算機才具備的計算能力
負載均衡羣集工作模式分析和工作模式
負載均衡羣集是目前企業用的最多的羣集類型
羣集的負載調度技術有三種工作模式
**地址轉換**
**IP隧道**
**直接路由**
NAT模式 (Network Address Translation)
**簡稱NAT模式**,類似於防火牆的私有網絡結構,負載調度器作爲所有服務器節點的網關,即作爲客戶機的訪問入口,也是各節點回應客戶機的訪問出口
服務器節點使用私有IP地址,與負載調度器位於銅一個物理網絡,安全性要優於其他兩種方式
TUN模式(IP Tunnel)
**簡稱TUM模式**,採用開放式的網絡結構,負載調度器僅作爲客戶機的訪問入口,各節點通過各自的網絡連接直接回應客戶機,而不再經過負載調度器
服務器節點分散在互聯網中的不同位置,具有獨立的公網IP地址,通過專用IP隧道與負載調度器相互通信。所有環境都是公網環境
DR模式 (Direct Routing)
直接路由
**簡稱DR模式**,採用半開放式的網絡結構,與TUN模式的結構類似,但各節點並不是分散在各地,而是與調度器位於同一個物理網絡
負載調度器與各節點服務器通過本地網絡連接,不需要建立專用的IP隧道
在局域網中
LVS的負載調度算法
**輪詢 (Round Robin)**
將收到的訪問請求安裝順序輪流分配給羣集中的個節點(真實服務器),均等地對待每一臺服務器,而不管服務器實際的連接數和系統負載
**加權輪詢 (Weighted Round Robin**)
根據真實服務器的處理能力輪流分配收到的訪問請求,調度器可以自動查詢各節點的負載情況,並動態調整其權重
保證處理能力強的服務器承擔更多的訪問流量
**最少連接 (Least Connections)**
根據真實服務器已建立的連接輸進行分配,將收到的訪問請求優先分配給連接數最少的節點
**加權最少連接 (Weighted Least Connections)**
在服務器節點的性能差異較大情況下,可以爲真實服務器自動調整
權重
權重較高的節點將承擔更大比例活動連接負載
下面我們來做實驗
實驗結構:
我們需要五臺虛擬機
1 作爲負載均衡調度器 外網地址:12.0.0.1 內網:192.168.200.1
4 網站服務器apache 節點:192.168.200.110
5 網站服務器 節點: 192.168.200.120
6 nfs共享存儲 節點:192.168.200.130
7 客戶端 12.0.0.12
先到6安裝ngs和遠程調用包
[root@localhost ~]# yum install nfs-utils rpcbind -y
4,5安裝web服務
[root@localhost ~]# yum install httpd -y
1安裝LVS負載均衡調度器
[root@localhost ~]# yum install ipvsadm -y
配置6nfs服務器
僅主機模式我們服務器都要在一個局域網
配置固定IP
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 #配置ens33網卡
BOOTPROTO=static #靜態
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=66a1e3d6-5c57-42ab-9996-b942b049ef85
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.130 #IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.200.1 #網關
開啓服務
[root@localhost ~]# systemctl stop firewalld.service
s[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start nfs.service
[root@localhost ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since 二 2019-11-26 1
[root@localhost ~]# systemctl start rpcbind.service
[root@localhost ~]# systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service
配置共享目錄,給777權限
[root@localhost ~]# vim /etc/exports
/usr/share *(ro,sync) #只讀,同步 所有服務器都可以去訪問
/opt/accp 192.168.200.0/24(rw,sync) #共享給200段可以訪問,可讀,可寫,同步
/opt/benet 192.168.200.0/24(rw,sync)
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir benet accp
[root@localhost opt]# chmod 777 accp/ benet/ #給可讀可寫可執行
[root@localhost opt]# ls -l
總用量 0
drwxrwxrwx. 2 root root 6 11月 26 17:13 accp
drwxrwxrwx. 2 root root 6 11月 26 17:13 benet
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
發佈共享
[root@localhost opt]# exportfs -rv
exporting 192.168.200.0/24:/opt/benet
exporting 192.168.200.0/24:/opt/accp
exporting *:/usr/share
4,web服務器僅主機模式,配置固定IP
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=c3f0a196-6819-4702-9b54-7cad18402591
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.110
NETMASK=255.255.255.0
GATEWAY=192.168.200.1
開啓服務,去測試能不能與6nfs服務器聯通
[root@localhost ~]# systemctl restart network
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -ntap | grep 80
tcp6 0 0 :::80 :::* LISTEN 100863/httpd
[root@localhost ~]# ping 192.168.200.130
PING 192.168.200.130 (192.168.200.130) 56(84) bytes of data.
64 bytes from 192.168.200.130: icmp_seq=1 ttl=64 time=0.724 ms
64 bytes from 192.168.200.130: icmp_seq=2 ttl=64 time=0.356 ms
掛載,寫一個文件在web4,測試6nfs服務器有沒有存儲這個文件
[root@localhost ~]# showmount -e 192.168.200.130 #測試6服務器的共享目錄
Export list for 192.168.200.130:
/usr/share *
/opt/benet 192.168.200.0/24
/opt/accp 192.168.200.0/24
[root@localhost ~]# mount.nfs 192.168.200.130:/opt/accp /var/www/html/ #掛載
[root@localhost ~]# df -h
問件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root 20G 3.4G 17G 17% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.6M 903M 2% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 6.0G 179M 5.9G 3% /boot
/dev/mapper/centos-home 10G 37M 10G 1% /home
tmpfs 183M 40K 183M 1% /run/user/0
tmpfs 183M 4.0K 183M 1% /run/user/42
192.168.200.130:/opt/accp 20G 3.8G 17G 19% /var/www/html
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo "THII IS ACCP WEB" > index.html
#6服務器去測試
[root@localhost opt]# cd accp/
[root@localhost accp]# ls
index.html
5web服務器也是同樣的操作,僅主機模式,綁定固定IP
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=a6cf69fe-eb42-4a99-9239-0da4cdeae0c7
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.120
NATMASK=255.255.255.0
GATEWAT=192.168.200.1
[root@localhost ~]# systemctl restart network
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
掛載,寫一個文件在web4,測試6nfs服務器有沒有存儲這個文件
[root@localhost ~]# mount.nfs 192.168.200.130:/opt/benet /var/www/html/
[root@localhost ~]# df -h
問件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root 20G 4.3G 16G 22% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.5M 903M 2% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 6.0G 179M 5.9G 3% /boot
/dev/mapper/centos-home 10G 36M 10G 1% /home
tmpfs 183M 44K 183M 1% /run/user/0
192.168.200.130:/opt/benet 20G 3.8G 17G 19% /var/www/html
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo "this is benet web" > index.html
[root@localhost html]# systemctl start httpd.service
#6去測試
[root@localhost accp]# cd ../
[root@localhost opt]# cd benet/
[root@localhost benet]# ls
index.html
1負載均衡調度器僅主機模式,綁定兩塊網卡,配置網卡
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36
DEVICE=ens36
ONBOOT=yes
IPADDR=12.0.0.1
NETMASK=255.255.255.0
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=849aa04e-1874-490f-8cb0-b2fde4b9a6f8
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.1
NETMASK=255.255.255.0
[root@localhost ~]# systemctl restart network #重啓網絡服務
開啓路由轉發,NAT轉換
vim /etc/sysctl.conf #修改配置文件
net.ipv4.ip_forward=1 #加一條
[root@localhost ~]# sysctl -p #生效路由轉發
net.ipv4.ip_forward = 1
[root@localhost ~]# iptables -t nat -F #清除NAT表
[root@localhost ~]# iptables -F #清除轉發表
[root@localhost ~]# iptables -t nat -A POSTROUTING -o ens36 -s 192.168.200.0/24 -j SNAT --to-source 12.0.0.1
#在nat表中-A在POSTROUTING列中-o指定出口-s指定源地址 -j做nat 轉換成12.0.0.1
去7客戶端綁定IP
去4web服務器去測試能不能與客戶端聯通
[root@localhost html]# ping 12.0.0.12
PING 12.0.0.12 (12.0.0.12) 56(84) bytes of data.
64 bytes from 12.0.0.12: icmp_seq=1 ttl=127 time=0.815 ms
64 bytes from 12.0.0.12: icmp_seq=2 ttl=127 time=0.752 ms
64 bytes from 12.0.0.12: icmp_seq=3 ttl=127 time=0.727 ms
64 bytes from 12.0.0.12: icmp_seq=4 ttl=127 time=0.712 ms
加載LVS內核模塊
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# cat /proc/net/ip_vs #查看LVS內核版本
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
開啓LVS內核
先保存
[root@localhost ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm.service
[root@localhost ~]# systemctl status ipvsadm.service
● ipvsadm.service - Initialise the Linux Virtual Server
Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; vendor preset: disabled)
Active: active (exited) since 二 2019-11-26 17:59:41 CST; 9s ago
寫LVS虛擬服務器腳本,啓動腳本
[root@localhost ~]# cd /opt/
[root@localhost opt]# vim nat.sh
#!/bin/bash
ipvsadm -C #清除緩存
ipvsadm -A -t 12.0.0.1:80 -s rr #添加虛擬服務器,-A -t指定端口 -s指定算法輪詢
ipvsadm -a -t 12.0.0.1:80 -r 192.168.200.110:80 -m #-a -t指定端口 -r指定真實節點服務器 -m指定NAT
ipvsadm -a -t 12.0.0.1:80 -r 192.168.200.120:80 -m
ipvsadm
[root@localhost opt]# source nat.sh #啓動腳本
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.200.110:http Masq 1 0 0
-> 192.168.200.120:http Masq 1 0 0
NAT地址轉換
[root@localhost opt]# iptables -F #清除轉發表
[root@localhost opt]# iptables -t nat -F #清除轉發表
[root@localhost opt]# iptables -t nat -A POSTROUTING -o ens36 -s 192.168.200.0/24 -j SNAT --to-source 12.0.0.1
#在nat表中-A在POSTROUTING列中-o指定出口-s指定源地址 -j做nat 轉換成12.0.0.1