集群LVS代理服務器
集群
????????????? 將很多機器組織到一起,作為一個整體對外提供服務
????????????? 集群在擴展性、性能方面都可以做到很靈活
????????????? 集群分類:
–??????????? 負載均衡集群:Load Balance
–??????????? 高用可用集群:High Availability
–??????????? 高性能計算:High Performance Computing
LVS
????????????? LVS:Linux Virtual Server,Linux虛擬服務器
????????????? 實現(xiàn)負載均衡集群
????????????? 作者:章文嵩。國防科技大學讀博士期間編寫
????????????? LVS的工作模式:
–??????????? NAT:網(wǎng)絡地址轉(zhuǎn)換
–??????????? DR:路由模式
–??????????? TUN:隧道模式
????????????? 術語:
–??????????? 調(diào)度器:LVS服務器
–??????????? 真實服務器Real Server:提供服務的服務器
–??????????? VIP:虛擬地址,提供給用戶訪問的地址
–??????????? DIP:指定地址,LVS服務器上與真實服務器通信的地址
–??????????? RIP:真實地址,真實服務器的地址
????????????? 常見的調(diào)度算法,共10個,常用的有4個:
–??????????? 輪詢rr:Real Server輪流提供服務
–??????????? 加權輪詢wrr:根據(jù)服務器性能設置權重,權重大的得到的請求更多
–??????????? 最少連接lc:根據(jù)Real Server的連接數(shù)分配請求
–??????????? 加權最少連接wlc:類似于wrr,根據(jù)權重分配請求
配置LVS NAT模式
?
????????????? 環(huán)境準備
–??????????? client1:eth0->192.168.4.10,網(wǎng)關192.168.4.5
–??????????? lvs1: eth0 -> 192.168.4.5;eth1->192.168.2.5
–??????????? web1:eth1->192.168.2.100;網(wǎng)關192.168.2.5
–??????????? web2:eth1->192.168.2.200;網(wǎng)關192.168.2.5
# 創(chuàng)建4臺虛擬機
[root@zzgrhel8 ~]# clone-vm7
Enter VM number: 1??? # 此處填的數(shù)字,是虛擬機編號
[root@zzgrhel8 ~]# clone-vm7
Enter VM number: 2
[root@zzgrhel8 ~]# clone-vm7
Enter VM number: 3
[root@zzgrhel8 ~]# clone-vm7
Enter VM number: 4
# 查看虛擬機
[root@zzgrhel8 ~]# virsh list --all
?Id?? 名稱????????? 狀態(tài)
--------------------------
?-??? tedu_node01?? 關閉
?-??? tedu_node02?? 關閉
?-??? tedu_node03?? 關閉
?-??? tedu_node04?? 關閉
# 啟動虛擬機
[root@zzgrhel8 ~]# for i in {1..4}
> do
> virsh start tedu_node0$i
> done
# 初始化虛擬機
[root@zzgrhel8 ~]# virsh console tedu_node01? # 連接tedu_node01控制臺
localhost login: root
Password: 123456
# 登陸之后,將以下內(nèi)容粘貼到終端
hostnamectl set-hostname client1
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.10/24
nmcli connection down eth0
nmcli connection up eth0
echo a | passwd --stdin root
nmcli connection modify eth0 ipv4.gateway 192.168.4.5
nmcli connection down eth0
nmcli connection up eth0
# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真機
# 真機通過ssh連接client1
[root@zzgrhel8 ~]# rm -f ~/.ssh/known_hosts
[root@zzgrhel8 ~]# ssh 192.168.4.10
# 配置第2臺機器作為lvs1
[root@zzgrhel8 ~]# virsh console tedu_node02
Kernel 3.10.0-862.el7.x86_64 on an x86_64
localhost login: root
Password: 123456
# 登陸之后,將以下內(nèi)容復制到命令行
hostnamectl set-hostname lvs1
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.5/24
nmcli connection down eth0
nmcli connection up eth0
nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.5/24
nmcli connection down eth1
nmcli connection up eth1
echo a | passwd --stdin root
# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真機
# 真機通過ssh連接lvs1
[root@zzgrhel8 ~]# ssh 192.168.4.5
# 配置第3臺機器作為web1
[root@zzgrhel8 ~]# virsh console tedu_node03
localhost login: root
Password: 123456
# 登陸之后,將以下內(nèi)容復制到命令行
hostnamectl set-hostname web1
nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.100/24
nmcli connection down eth1
nmcli connection up eth1
nmcli connection modify eth1 ipv4.gateway 192.168.2.5
nmcli connection down eth1
nmcli connection up eth1
echo a | passwd --stdin root
# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真機
# 真機通過ssh連接web1
[root@zzgrhel8 ~]# ssh 192.168.2.100
# 配置第4臺機器作為web2
[root@zzgrhel8 ~]# virsh console tedu_node04
localhost login: root
Password: 123456
# 登陸之后,將以下內(nèi)容復制到命令行
hostnamectl set-hostname web2
nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.200/24
nmcli connection down eth1
nmcli connection up eth1
nmcli connection modify eth1 ipv4.gateway 192.168.2.5
nmcli connection down eth1
nmcli connection up eth1
echo a | passwd --stdin root
# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真機
# 真機通過ssh連接web2
[root@zzgrhel8 ~]# ssh 192.168.2.200
????????????? 通過clone-vm7創(chuàng)建出來的虛擬機器,如果有192.168.4.0網(wǎng)段的地址,yum已經(jīng)配置了。虛擬機已關閉selinux和防火墻 。
配置LVS NAT模式步驟
????????????? 配置2臺web服務器
[root@web1 ~]# vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl=ftp://192.168.2.254/centos-1804
enabled=1
gpgcheck=0
[root@web2 ~]# vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl=ftp://192.168.2.254/centos-1804
enabled=1
gpgcheck=0
[root@web1 ~]# yum install -y httpd
[root@web2 ~]# yum install -y httpd
# 創(chuàng)建測試頁面
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html
[root@web2 ~]# echo "apache web server2" > /var/www/html/index.html
[root@web1 ~]# systemctl enable httpd --now
[root@web2 ~]# systemctl enable httpd --now
# 在lvs1上測試到web服務器的訪問
[root@lvs1 ~]# curl http://192.168.2.100/
192.168.2.100
[root@lvs1 ~]# ^100^200?? # 將上一條命令中的100換成200,執(zhí)行
curl http://192.168.2.200/
apache web server2
????????????? 確保lvs1的ip轉(zhuǎn)發(fā)功能已經(jīng)打開。該功能需要改變內(nèi)核參數(shù)
# 查看ip轉(zhuǎn)發(fā)功能的內(nèi)核參數(shù)
[root@lvs1 ~]# sysctl -a??? # 查看所有的內(nèi)核參數(shù)
[root@lvs1 ~]# sysctl -a | grep ip_forward? # 查看ip_foward參數(shù)
net.ipv4.ip_forward = 1?? # 1表示打開轉(zhuǎn)發(fā),0表示關閉轉(zhuǎn)發(fā)
# 永久設置打開ip_forward功能
[root@lvs1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@lvs1 ~]# sysctl -p
# 測試從客戶端到服務器的訪問
[root@client1 ~]# curl http://192.168.2.100/
192.168.2.100
[root@client1 ~]# curl http://192.168.2.200/
apache web server2
????????????? 安裝LVS
[root@lvs1 ~]# yum install -y ipvsadm
????????????? ipvsadm使用說明
[root@lvs1 ~]# ipvsadm
-A: 添加虛擬服務器
-E: 編輯虛擬服務器
-D: 刪除虛擬服務器
-t: 添加tcp服務器
-u: 添加udp服務器
-s: 指定調(diào)度算法。如輪詢rr/加權輪詢wrr/最少連接lc/加權最少連接wlc
-a: 添加虛擬服務器后,向虛擬服務器中加入真實服務器
-r: 指定真實服務器
-w: 設置權重
-m: 指定工作模式為NAT
-g: 指定工作模式為DR
????????????? 配置LVS
# 為web服務器創(chuàng)建虛擬服務器,使用rr調(diào)度算法
[root@lvs1 ~]# ipvsadm -A -t 192.168.4.5:80 -s rr
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln? # L是列出,n是使用數(shù)字,而不是名字
# 向虛擬服務器中添加RIP
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 1 -m
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -w 2 -m
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln
# 驗證
[root@client1 ~]# for i in {1..4}
> do
> curl http://192.168.4.5/
> done
apache web server2
192.168.2.100
apache web server2
192.168.2.100
# 刪除配置。(如果配置有錯,用以下命令刪除重配置)
[root@lvs1 ~]# ipvsadm -D -t 192.168.4.5:80
# 修改調(diào)度模式為加權輪詢
[root@lvs1 ~]# ipvsadm -E -t 192.168.4.5:80 -s wrr
# 驗證配置
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.5/; done
apache web server2
apache web server2
192.168.2.100
apache web server2
apache web server2
192.168.2.100
LVS DR模式
?
????????????? LVS DR模式,LVS主機和web服務器都是單網(wǎng)卡。它們連在同一網(wǎng)絡中
????????????? 修改實驗環(huán)境
–??????????? client1:eth0-> 192.168.4.10
–??????????? lvs1:eth0->192.168.4.5,刪除eth1的IP
–??????????? web1:eth0->192.168.4.100,刪除eth1的IP
–??????????? web2:eth0->192.168.4.200,刪除eth1的IP
# 刪除lvs虛擬服務器配置
[root@lvs1 ~]# ipvsadm -D -t 192.168.4.5:80
[root@lvs1 ~]# ipvsadm -Ln
# 刪除lvs1上eth1的配置
[root@lvs1 ~]# nmcli connection modify eth1 ipv4.method disabled ipv4.addresses ''
[root@lvs1 ~]# ifdown eth1
# 修改web1的配置:停掉eth1的地址。配置eth0的地址為192.168.4.100
# 進入網(wǎng)卡配置文件目錄
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
# eth0網(wǎng)卡的配置文件叫ifcfg-eth0
[root@web1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0? ifcfg-eth1?? ifcfg-eth2? ifcfg-eth3
# 配置eth0地址
[root@web1 network-scripts]# vim ifcfg-eth0
TYPE=Ethernet???????????? # 網(wǎng)絡類型為以太網(wǎng)
BOOTPROTO=none??????????? # IP地址是靜態(tài)配置的,也可以用static
NAME=eth0???????????????? # 為設備重命名
DEVICE=eth0?????????????? # 網(wǎng)卡設備名
ONBOOT=yes??????????????? # 開機激活網(wǎng)卡
IPADDR=192.168.4.100????? # IP地址
NETMASK=255.255.255.0???? # 子網(wǎng)掩碼
GATEWAY=192.168.4.254???? # 網(wǎng)關
[root@web1 network-scripts]# ifdown eth0; ifup eth0? # 禁用激活網(wǎng)卡
# 在web1上停掉eth1
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web1 ~]# ifdown eth1
# 修改web2的網(wǎng)絡
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.200
NETMASK=255.255.255.0
GATEWAY=192.168.4.254
[root@web2 ~]# ifdown eth0; ifup eth0
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web2 ~]# ifdown eth1?? # 終端卡住,關掉它,在新終端重新連
配置LVS DR模式
1.????????? 在lvs1的eth0上配置vip 192.168.4.15。通過為eth0創(chuàng)建邏輯端口的方式配置vip,為邏輯端口起名為eth0:0
[root@lvs1 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@lvs1 network-scripts]# vim ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15
PREFIX=24
[root@lvs1 network-scripts]# ifup eth0:0
# 查看新的地址
[root@lvs1 network-scripts]# ifconfig
1.????????? 在2臺web服務器的lo上配置vip 192.168.4.15
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
NETWORK=192.168.4.15
BROADCAST=192.168.4.15
ONBOOT=yes
NAME=lo:0
[root@web1 network-scripts]# ifup lo:0
[root@web1 network-scripts]# ifconfig
# 把web1的配置拷貝到web2上
[root@web1 network-scripts]# scp ./ifcfg-lo:0 192.168.4.200:/etc/sysconfig/network-scripts/
[root@web2 ~]# ifup lo:0
[root@web2 ~]# ifconfig
1.????????? 在2臺web服務器上配置內(nèi)核參數(shù),使得它們不響應對192.168.4.15的請求
[root@web1 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 0
[root@web1 ~]# sysctl -a | grep arp_announce
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 0
[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# sysctl -p
[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web2 ~]# sysctl -p
1.????????? 在lvs1上配置虛擬服務器
# 創(chuàng)建虛擬服務器
[root@lvs1 ~]# ipvsadm -A -t 192.168.4.15:80 -s wlc
# 向虛擬服務器中加真實服務器
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -w 1 -g
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -w 2 -g
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln
# 客戶驗證
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.15/; done
apache web server2
192.168.2.100
apache web server2
apache web server2
192.168.2.100
apache web server2
1.????????? lvs本身沒有應用服務器監(jiān)控功能,如果web服務器出現(xiàn)問題,需要手工從規(guī)則中刪掉
[root@web1 ~]# systemctl stop httpd
# 客戶端訪問時,轉(zhuǎn)發(fā)到web1上的請求,將會拒絕連接
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.15/; done
apache web server2
curl: (7) Failed connect to 192.168.4.15:80; 拒絕連接
apache web server2
apache web server2
curl: (7) Failed connect to 192.168.4.15:80; 拒絕連接
apache web server2
# 的規(guī)則中刪除web1
[root@lvs1 ~]# ipvsadm -d -t 192.168.4.15:80 -r 192.168.4.100
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.15/; done
apache web server2
apache web server2
apache web server2
apache web server2
apache web server2
apache web server2
附:出錯時,排錯步驟:
# 在lvs上可以訪問到web服務器
[root@lvs1 ~]# curl http://192.168.4.100/
192.168.2.100
[root@lvs1 ~]# curl http://192.168.4.200/
apache web server2
# 查看vip
[root@lvs1 ~]# ifconfig eth0:0
eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>? mtu 1500
??????? inet 192.168.4.15? netmask 255.255.255.0? broadcast 192.168.4.255
??????? ether 52:54:00:0d:fb:79? txqueuelen 1000? (Ethernet)
[root@web1 ~]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>? mtu 65536
??????? inet 192.168.4.15? netmask 255.255.255.255
??????? loop? txqueuelen 1000? (Local Loopback)
# 查看內(nèi)核參數(shù)
[root@web1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
# 查看規(guī)則
[root@lvs1 ~]# 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.4.15:80 wlc
? -> 192.168.4.100:80???????????? Route?? 1????? 0????????? 0????????
? -> 192.168.4.200:80???????????? Route?? 2????? 0????????? 0?