14.LVS服务

LVS概念

负载均衡

硬件:f5(big-ip),citrix,a10,redware

软件:lvs(传输层,理论上无上限,和服务器性能挂钩)、nginx(应用层)、haproxy(传输层或应用层,支持3w个并发)、perlbal(应用层),httpd(应用层)

LVS负载均衡

Linux Virtual Server,Linux虚拟服务,相当于Linux的四层集群系统,根据源目IP进行目标转发,本身不产生流量,只做请求转发

LVS负载调度

1.负载调度器(director):将用户请求分发到真实服务器进行处理

2.真实服务器池:需要转发流量的服务(web、邮件服务等)在后端部署的一模一样的服务器集群

3.共享存储:当服务器支持写操作时才使用,使得每个用户访问的资源都是一样

keepalived:lvs集群高可用,但是如果其中节点发生故障,其lvs无法感知,keepalived用于监控和检查兼容性问题,如果有一个节点挂了,keepalived就会将此节点从列表里踢出

术语解释

VS:virtual server,虚拟服务器,也叫director,客户来访问的服务器

RS:real server,真实服务器,服务器集群中的节点

CIP:client IP,客户端IP

VIP:virtual IP,director向外提供的服务IP

RIP:real server的IP

DIP:director和RS通信的IP

用户访问的流程

1.用户访问从CIP到VIP

2.负载均衡器DIP到达交换/路由器

3.最后到达真实服务器的RIP

image

LVS是四层/七层的负载均衡工具

四层负载均衡:IPVS,集成在内核中的框架,真实实现调度的代码,利用用户的空间程序调度或管理器进行管理

七层内容分发负载均衡:KTCPVS

LVS集群支持的模式

LVS-NAT:网络地址转换,硬件(F5等)使用该方法

1.客户发送请求到director
2.director根据负载均衡算法改写目标的地址,改写为后端的RIP,并且进行转发,和NAT一样
3.当后端主机RS处理完后,移送给director
4.director修改源地址为VIP地址后发给客户端

RIP和DIP处在同一个私有网段的,而且RS的网关需要指向DIP,RS可以是任何系统,但VS必须是了Linux系统

优点:NAT配置简单,网络架构灵活

缺点:输入输出流量需要经过LVS,LVS压力大,容易到达瓶颈,如部分请求很小但是响应很大的服务器(图片)

LVS-DR:直接路由

1.客户端发送请求到director
2.director将请求报文重新封装mac地址为RS自己的mac地址(所以DIP和RIP需要在相同的物理网络才能实现ARP通信),源目IP地址不变
3.RS发现目标地址是自己的mac地址,会把RS本地的环回口的地址配置为VIP的地址,响应报文会从环回口伪装成VIP发送给客户的出口网卡(响应报文头部是:CIP--mac|loopbackIP--mac)

优点:可以直接由路由转发,通过修改mac地址进行转发,效率提高,不需要NAT模式进行转换

缺点:LVS调度器必须和服务器在同一个网段

3.LVS-TUN:IP隧道

1.客户端把请求发送给director,请求报文源地址CIP,目标为VIP
2.负载均衡器收到后会再封装一层IP报文,源地址DIP,目标为RIP,然后发送给RS
3.RS收到请求报文后,拆包,发现里面还有一个IP头部,目标为自己环回口的VIP,所以会再次处理请求报文,并且把响应报文通过环回口伪装成VIP发送给客户网卡然后直接发送给客户端(需要设置环回口伪装为VIP,并且不能在公网上)

注意点1:director的IP、VIP、RIP都是公网IP,不能出现内网,并且RS的网关不能指向director的IP,并且请求的报文不经由director,是RS直接回给用户,所以不知道端口映射,而且RS的系统需要支持隧道功能
注意点2:RS不在公网但是直接发送给客户,通过路由宣告的技术实现

优点:将TCP/IP重新请求封装后发送给后端服务器,后端服务器直接通过IP进行转发,服务器可以存在不同的网段

缺点:需要使用很多IP,需要租用很多公网IP,后端服务器越多租用的公网IP越多

4.LVS-FULLNAT:完全NAT

1.客户端对于VIP发起请求
2.director接受请求,发现请求的是后端集群,对请求报文进行FULL NAT,将源IP改成DIP,目标IP转换为任意地址RIP,发送给后端
3.RS收到请求,进行响应,源IP是后端服务器的RIP,目标IP为DIP,直接内部发给director
4.director收到报文之后,进行FULL NAT,源地址改为VIP,目标地址改为CIP

VIP是公网地址,RIP和DIP是私网地址,RS收到请求后的报文地址是DIP,都是依靠director进行后端响应,所有的报文都经过director,支持端口映射的功能

LVS的NAT实验

网络拓扑

image

服务器配置

director(LVS)

1.安装ipvsadm

yum -y install ipvsadm

2.打开路由转发功能

echo 1 >> /proc/sys/net/ipv4/ip_forward

3.转发配置nat

iptables -t nat F
iptables -t nat -A POSTROUTING -s 172.16.214.0/24 -j MASQUERADE

查看转发配置情况:iptables -nvL -t nat

4.配置ipvsadm策略

ipvsadm -A -t 192.168.1.153:80 -s wrr   # 此IP的80端口访问使用wrr策略
ipvsadm -a -t 192.168.1.153:80 -r 172.16.214.136:80 -m -w 1  # 转发到RS1上,权重为1
ipvsadm -a -t 192.168.1.153:80 -r 172.16.214.137:80 -m -w 1  # 转发到RS2上,权重为1

查看ipvsadm配置:ipvsadm -ln

RS1

设置网关,将网关地址指向director

route add -net 0.0.0.0 gw 172.16.214.134

查看配置:route -n

RS2

设置网关,将网关地址指向director

route add -net 0.0.0.0 gw 172.16.214.134

效果

通过curl访问会负载均衡到RS1和RS2

image

keepalived实验

keepalived位置

image

介绍

keepalived和vrrp协议的关系

keepalived配合LVS实现vrrp协议(虚拟冗余路由协议),可以工作在多个LVS主机,主要负责接收的活动节点为master,其他备用节点backup,如果backup收不到master的心跳包,则根据提前设置的热备份协议,backup替代,keepalived可以监控和转移LVS资源而不需要直接使用ipvsadm的命令,因为他本身就是可以调用的,即现在的模型是LVS+keepalived的模型,或者说keepalived是vrrp协议的实现

master和backup节点的切换

vrrp需要提供VIP(虚拟IP),可以用来设定路由器的活动节点进行故障切换,VIP如果故障会移动到新的设备上,但是内网是通过mac地址进行寻址,所以VMAC(虚拟mac地址)也是vrrp申请的,都可以使用

假设服务器1为master,其他服务器为backup,所有的数据都会从master走,他们通过优先级选出来,master设备会间歇性的发送vrrp报文公布配置信息、优先级和工作状态,如果master设备故障,路由器会优先选择其他权重较高的设备,其他backup会升级为master

vrrp使用md5加密认证

配置keepalived

设备1信息:外网IP:192.168.1.61,内网IP:172.16.214.136

设备2信息:外网IP:192.168.1.248,内网IP:172.16.214.137

关闭SELinux防火墙

setenforce 0
systemctl stop firewalld

开启时间同步服务

systemctl start chronyd

保持iptables中为MULTICAST

安装keepalived

yum -y install keepalived

配置文件位置:/etc/keeplived/keepalived.conf

配置文件参数信息

global_defs {    # 全局配置
   notification_email {   # 邮件通知信息
     acassen@firewall.loc   # 自定义收件人
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc   # 自定义发件人
   smtp_server 192.168.200.1   # smtp服务器
   smtp_connect_timeout 30   # smtp的timeout时间
   router_id LVS_DEVEL     # 路由表示,可以写主机名字
   vrrp_skip_check_adv_addr   
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {    # 定义vrrp实例
    state MASTER   # 初始状态
    interface eth0   # 通告接口
    virtual_router_id 51   # 设备虚拟id,一般取mac地址后面0-255
    priority 100   # 权重,越高越优先
    advert_int 1   # 通告频率,1s一次
    authentication {   # 密码认证
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    # 配置在哪个网卡
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {    # lvs集群
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {   
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc 
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

修改设备1配置文件参数信息

global_defs {    
   notification_email {   
     acassen@firewall.loc
   }
	 notification_email_from Alexandre.Cassen@firewall.loc   
   smtp_server 127.0.0.1
   smtp_connect_timeout 30  
   router_id ser1
}

vrrp_instance VI_1 {    
    state MASTER   # 第一台设备作为master
    interface ens33  # 网卡名字
    virtual_router_id 51   
    priority 100   
    advert_int 1   
    authentication {   
        auth_type PASS
        auth_pass 1111   # 密码为1111
    }
    virtual_ipaddress {    
        192.168.1.111/24 brd 192.168.1.111 dev ens33 label ens33:0
    }
	  preempt delay 60
}

修改设备2配置文件参数信息

global_defs {    
   notification_email {   
     acassen@firewall.loc
   }
	 notification_email_from Alexandre.Cassen@firewall.loc   
   smtp_server 127.0.0.1
   smtp_connect_timeout 30  
   router_id ser2
}

vrrp_instance VI_1 {    
    state BACKUP   # 第二台设备作为backup  
    interface ens33
    virtual_router_id 51   
    priority 90   # 第一台设备为master,第二台作为backup需要降低权重  
    advert_int 1   
    authentication {   
        auth_type PASS
        auth_pass 1111   # 密码为1111
    }
    virtual_ipaddress {    
        192.168.1.111/24 brd 192.168.1.111 dev ens33 label ens33:0
    }
	  preempt delay 60
}

设备1和2都开启keepalived服务

systemctl start keepalived

重新ifconfig检查,看到ens33:0出现虚拟IP

image

查看设备1和2各自状态

systemctl status keepalived

image

image

查看节点日志,可以看到ser1进去master状态

cat /var/log/messages

停止设备1(master节点)后,使用ifconfig查看设备2(backup节点)

systemctl stop keepalived

image

重启master节点后,master节点恢复ens33:0,backup节点ens33:0消失

posted @ 2022-08-22 11:26  icui4cu  阅读(98)  评论(0编辑  收藏  举报