四种LVS工作模型,十种调度算法
四种工作模型:
1、lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
请求报文:CIP-->路由器-->LVS-->RIP
回应报文:RIP-->LVS-->路由器-->CIP
2、lvs-dr(直接路由):操纵封装新的MAC地址
发送报文
①CIP-->VIP:SRC=CIP/CIPMAC,DST=VIP/VIPMAC
②DIP-->RIP:SRC=CIP/DIPMAC,DST=VIP/LVSMAC
③LVS-->RS:SRC=CIP/LVSMAC,DST=VIP/RS1MAC
回应报文
④RS-->DIP:SRC=VIP/RS1MAC,DST=CIP/DIPMAC
⑤VIP-->CIP:SRC=VIP/VIPMAC,DST=CIP/CIPMAC
3、lvs-tun(隧道):在原请求IP报文之外新加一个IP首部
请求报文通过LVS服务器,但响应却直接回应给客户端,不通过LVS,可以跨路由
4、lvs-fullnat:修改请求报文的源和目标IP
①CIP-->VIP
②DIP-->RIP
③RIP-->DIP
④VIP-->CIP
默认kernel不支持
十种调度算法:
静态方法:仅根据算法本身进行调度
1、 RR:roundrobin,轮询
2、 WRR:Weighted RR,加权轮询
3、 SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、 DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、 LC:least connections 适用于长连接应用
Overhead=activeconns256+inactiveconns
2、 WLC:Weighted LC,默认调度方法
Overhead=(activeconns256+inactiveconns)/weight
3、 SED:Shortest Expection Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
4、 NQ:Never Queue,第一轮均匀分配,后续SED
5、 LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、 LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
基于NAT模型的LVS
#环境:5台机器 client:172.16.0.6 LVS:172.16.0.7、192.168.37.7 RS1:192.168.37.17 RS2:192.168.37.27 mysql:192.168.37.17
#网卡:A与B桥接,B与C、D、E是NAT
#mysql
nmcli connection modify eth0 ipv4.addresses 192.168.37.37/24 ipv4.gateway 192.168.37.7 ipv4.method manual
nmcli connection up eth0
yum install mariadb-server
systemctl start mariadb
mysql -e "create database wordpress;grant all on wordpress.* to wordpress@'192.168.37.%' identified by 'centos'"
mysql -e "flush privileges;"
#RS1
nmcli connection modify eth0 ipv4.addresses 192.168.37.17/24 ipv4.gateway 192.168.37.7 ipv4.method manual
nmcli connection up eth0
yum install httpd mod_ssl php-fpm php-mysql -y
echo RS1 > /var/www/html/index.html
vim /etc/httpd/conf.d/fcgi.conf
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
vim /etc/httpd/conf/httpd.conf
DirectoryIndex index.php index.html
tar -xf wordpress-5.1.1-zh_CN.tar.gz -C /var/www/html/
cd /var/www/html/wordpress/
cp wp-config-sample.php wp-config.php
vim wp-config.php
/** WordPress数据库的名称 */
define( 'DB_NAME', 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER', 'wordpress' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD', 'centos' );
/** MySQL主机 */
define( 'DB_HOST', '192.168.37.37' );
[root@rs1 ~]# systemctl start httpd php-fpm
#此时使用浏览器访问http://192.168.37.17/wordpress,进行安装
[root@rs1 wordpress]# cd ..
[root@rs1 html]# scp -r wordpress/ 192.168.37.27:/var/www/html
[root@rs1 html]# scp /etc/httpd/conf/httpd.conf 192.168.37.27:/etc/httpd/conf/
[root@rs1 html]# scp /etc/httpd/conf.d/fcgi.conf 192.168.37.27:/etc/httpd/conf.d/
#RS2
nmcli connection modify eth0 ipv4.addresses 192.168.37.27/24 ipv4.gateway 192.168.37.7 ipv4.method manual
nmcli connection up eth0
yum install httpd mod_ssl php-fpm php-mysql -y
echo RS2 > /var/www/html/index.html
systemctl start httpd php-fpm
#LVS,初始化关闭防火墙、selinux、时间同步
vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.37.7
PREFIX=24
NAME=eth0
DEVICE=eth0
ONBOOT=yes
vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
IPADDR=172.16.0.7
PREFIX=24
NAME=eth1
DEVICE=eth1
ONBOOT=yes
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
yum install ipvsadm
ipvsadm -A -t 172.16.0.7:80 -s rr #-s 调度轮询,-p 持续连接(默认360s)
ipvsadm -a -t 172.16.0.7:80 -r 192.168.37.17 -m #-m nat模型
ipvsadm -a -t 172.16.0.7:80 -r 192.168.37.27 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.7:80 rr
-> 192.168.37.17:80 Masq 1 0 0
-> 192.168.37.27:80 Masq 1 0 0
ipvsadm -A -t 172.16.0.7:443 -s rr
ipvsadm -a -t 172.16.0.7:443 -r 192.168.37.27 -m
ipvsadm -a -t 172.16.0.7:443 -r 192.168.37.17 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.7:80 rr
-> 192.168.37.17:80 Masq 1 0 0
-> 192.168.37.27:80 Masq 1 0 0
TCP 172.16.0.7:443 rr
-> 192.168.37.17:443 Masq 1 0 0
-> 192.168.37.27:443 Masq 1 0 0
#client
vim /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
NAME="eth2"
IPADDR=172.16.0.6
PREFIX=24
[root@centos6 ~]$ while true;do curl 172.16.0.7;sleep 0.5;done
[root@centos6 ~]$ while true;do curl -k https://172.16.0.7;sleep 0.5;done
[root@centos6 ~]$ http://172.16.0.7/wordpress
使用firewall mark实现统一集群调度http,https
#LVS
ipvsadm -C #清除所有
iptables -t mangle -A PREROUTING -d 172.16.0.7 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 10
ipvsadm -A -f 10 -s rr
ipvsadm -a -f 10 -r 192.168.37.17 -m
ipvsadm -a -f 10 -r 192.168.37.27 -m
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr
-> 192.168.37.17:0 Masq 1 0 0
-> 192.168.37.27:0 Masq 1 0 0
#client
[root@centos6 ~]$ while true;do curl 172.16.0.7;sleep 0.5;done
[root@centos6 ~]$ while true;do curl -k https://172.16.0.7;sleep 0.5;done
[root@centos6 ~]$ http://172.16.0.7/wordpress
基于DR模型的LVS
#跨网段LVS-DR
#环境:5台机器,Client:172.16.0.6 Router:172.16.0.7、192.168.37.7、10.0.0.200 RS1:192.168.37.17、10.0.0.100 RS2:192.168.37.27、10.0.0.100 LVS:192.168.37.37、10.0.0.100
#router 2块网卡,桥接与nat模式,基本配置跟nat模型一样
#原LVS当路由,router
yum remove ipvsadm
iptables -t mangle -F
nmcli connection modify eth0 +ipv4.addresses 10.0.0.200/8
nmcli connection up eth0
#RS1、RS2
ip address add 10.0.0.100/32 dev lo label lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#原mysql当LVS
ip address add 10.0.0.100/24 dev eth0 label eth0:0
yum install ipvsadm
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 10
ipvsadm -A -f 10 -s wrr
ipvsadm -a -f 10 -r 192.168.37.17 -g -w 1
ipvsadm -a -f 10 -r 192.168.37.27 -g -w 1
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wrr
-> 192.168.37.17:0 Route 1 0 0
-> 192.168.37.27:0 Route 1 0 0
#client
[root@centos6 ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
NAME="eth2"
IPADDR=172.16.0.6
PREFIX=24
GATEWAY=172.16.0.7
[root@centos6 ~]$ service network restart
[root@centos6 ~]$ while true; do curl http://10.0.0.100/index.html;sleep 0.5;done
监控LVS
#ldirectord基本被keepalived替代了
#环境跟上面一样
#LVS
ipvsadm -C
yum install http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
vim /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=no #down时yes权重为0,no为删除
virtual=10.0.0.100:80 #指定VS的FWM 或 IP:PORT
real=192.168.37.17:80 gate #DR模型
real=192.168.37.27:80 gate
fallback=127.0.0.1:80 gate #sorry server
service=http
scheduler=wrr
#persistent=600 #持续连接
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
#receive="Test Page"
#virtualhost=www.x.y.z
yum install httpd
echo "Error Server" > /var/www/html/index.html
systemctl start httpd ldirectord
#RS1、RS2
ip address add 10.0.0.100/32 dev lo label lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#client
while true; do curl http://10.0.0.100/index.html;sleep 0.5;done
#RS1、RS2停掉服务,客户端查看情况
systemctl stop httpd
网友评论