美文网首页
LVS调度器

LVS调度器

作者: Liang_JC | 来源:发表于2020-04-27 15:14 被阅读0次

四种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=(activeconns
256+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

相关文章

网友评论

      本文标题:LVS调度器

      本文链接:https://www.haomeiwen.com/subject/gtoywhtx.html