高并发解决方法-LVS、LVS-NAT、LVS-DR
前言:
集群功能分类:
1.LB Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为根本着重点。LVS
2.HA High Availability 高可用集群(增加服务可用性),是以提升服务的始终在线能力为着重点,不会因为宕机而导致服务不可用。Keepalived
大型网站高并发解决方案LVS
负载均衡
(Load Balance)负载均衡,当然这是一个简单的概括,比如,我有10台机器都提供web服务,那么我如何均衡的利用这10台机器呢,让这10台机器保证高性能、高可用、高并发就是负载均衡要考虑和要做的事情。
实现负载均衡一般可以使用顺序、比重、流量、服务类别等进行分配,负载均衡的部署方式也分为路由和服务直接返回模式
负载均衡的主要方式
1.http重定向
2.DNS负载均衡
优点:
将负载均衡的工作交给了DNS,省却了网站管理维护负载均衡服务器的麻烦,同时许多DNS还支持基于地理位置的域名解析,将域名解析成距离用户地理最近的一个服务器地址,加快访问速度吗,改善性能。
缺点:
目前的DNS解析是多级解析,每一级DNS都可能化缓存记录A,当某一服务器下线后,该服务器对应的DNS记录A可能仍然存在,导致分配到该服务器的用户访问失败。
DNS负载均衡的控制权在域名服务商手里,网站可能无法做出过多的改善和管理。
不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。
可能会造成额外的网络问题。为了使本DNS服务器和其他DNs服务器及时交互,保证DNSs数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。3.反向代理负载均衡
4.ip负载均衡
优点:在响应请求时速度较反向服务器负载均衡要快。
缺点。如法处理更高级的请求5.数据链路层负载均衡
优点:不需要负载均衡服务器进行IP地址的转换。数据响应时,不需要经过负载均衡服务器。
缺点:负载均衡服务器的网卡带宽要求较高。
四层负载和七层负载
所谓四层就是基于IP+端口的负载均衡,主要代表有lvs。
七层负载也称内容交换,就是基于URL等应用层信息.的负载均衡,主要代表有nginx。
关于代理
正向代理
反向代理
LVS概述
LVS是Linux Virtual Server 也就是Linux虚拟服务器
LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机),从而实现集群环境中的负载均衡。
LVS工作模式:
NAT转发模式
1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端lP),后面统称为CIP,目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标IP地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
R.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
4.然后LVS将此报文的源地址修改为本机并发送给客户端。
优点:
网络隔离安全,节约IP地址
还有DR直接路由模式、TUN-IP隧道模式、FULL-NAT等…
LVS-NAT实战案例
准备:
client: VMNET0 192.168.31.86
LVS: VMNET0 192.168.31.143
VMNET2 192.168.198.128
web1: VMNET 2 192.168.198.129
web2: VMNET 2 192.168.198.130
关闭防护墙 关闭selinux
步骤:
1.web1配置网站和路由
yum install -y httpd //先使用NAT网络连接 安装好httpd
systemctl start httpd
systemctl enable httpd //完成后切换为vmnet2仅主机网络
echo "web1" > /var/www/html/index.html
route add default gw 192.168.198.128 //配置真实服务器的网络出口 -net外部网络 gw网关
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
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="ens33"
UUID="2a55dccb-7784-4b4e-a5e2-4004033803fa"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.129
NETMASK=255.255.255.0
GATEWAY=192.168.198.128 //只允许LVS的vmnet2通过
DNS1=114.114.114.114
2.web2配置网站和路由
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "web2" > /var/www/html/index.html
route add default gw 192.168.198.128 //配置真实服务器的网络出口 -net外部网络 gw网关
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
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="ens33"
UUID="2a55dccb-7784-4b4e-a5e2-4004033803fa"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.130
NETMASK=255.255.255.0
GATEWAY=192.168.198.128
DNS1=114.114.114.114
3.LVS-NAT配置路由功能和负载策略
[root@localhost ~]# vim /etc/sysctl.conf //启动路由转发功能
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p //查询路由转发功能是否开启
yum install -y ipvsadm //安装LVS
ipvsadm -A -t 192.168.31.32:80 -s rr //-A 对外提供地址 -t tcp协议 -s rr 使用rr策列轮询策略
ipvsadm -a -t 192.168.31.32:80 -r 192.168.192.129:80 -m //-a对内真实服务器 -r真实服务器地址
ipvsadm -a -t 192.168.31.32:80 -r 192.168.192.130:80 -m
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.198.128
NETMASK=255.255.255.0
4.client测试
[root@localhost ~]# curl 192.168.198.129 //测试 直接curl realserver内网 是不行的 如果可以说明realserver并不在内网
curl: (7) Failed to connect to 192.168.198.129: 网络不可达
[root@localhost ~]# curl 192.168.198.130
curl: (7) Failed to connect to 192.168.198.130: 网络不可达
[root@localhost ~]# curl 192.168.31.143 //测试 curl LVSserver 正确是把请求通过DIP转发到realserver
web22222
[root@localhost ~]# curl 192.168.31.143
web111111
DR转发模式
Director Server作为群集的访问入口,但不作为网关使用,后端服务器池中的Real Server与Director Server在同一个物理网络中,发送给客户机的数据包不需要经过Director Server。为了响应对整个群集的访问,DS(前端负载均衡节点服务器)与RS(后端真实服务器)都需要配置有VIP地址
每个Real Server上都有两个IP:VIP(负载均衡对外提供访问的 IP 地址)和RIP(负载均衡后端的真实服务器 IP 地址),但是VIP是隐藏的,就是不能提供解析等功能,只是用来做请求回复的源IP的,Director上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP(负载均衡与后端服务器通信的 IP 地址),在DIR接收到客户端的请求后,DIR根据负载算法选择一台rs sever的网卡mac作为客户端请求包中的目标mac,通过arp转交给后端RS serve处理,后端再通过自己的路由网关回复给客户端
特点:
1.Director Server 和 Real Server 必须在同一个物理网络中
2.Real Server 可以使用私有地址,也可以使用公网地址,如果使用公网地址,可以通过互联网对 RIP 进行直接访问
3.Director Server作为群集的访问入口,但不作为网关使用
4.所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server
5.Real Server 的网关不允许指向 Director Server IP,即Real Server发送的数据包不允许经过 Director Server
6.Real Server 上的 lo 接口配置 VIP 的 IP 地址
优点:
负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为 超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。
LVS-DR模式实战
准备:
四台统一网段的ip 关闭selinux 关闭防火墙
client:192.168.70.132
LVS:192.168.70.130
web1:192.168.70.133
web1:192.168.70.134
步骤:
1.LVS增加VIP
ifconfig //查看网卡
ifconfig ens33:0 192.168.70.131 broadcast 192.168.70.255 netmask 255.255.255.0 up //添加新ip
route add -host 192.168.70.131 //添加路由
2.LVS开启路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 // 开启路由转发功能
net.ipv4.conf.all.send_redirects = 0 //禁止转发重定向报文
net.ipv4.conf.ens33.send_redirects = 0 //禁止ens33转发重定向报文
net.ipv4.conf.default.send_redirects = 0 //禁止转发默认重定向报文
3.LVS设置路由转发规则/规则(设置ipvsadm)
yum install ipvsadm -y
ipvsadm -C //清除ipvs规则
ipvsadm -A -t 192.168.70.131:80 -s rr //添加vip规则
ipvsadm -a -t 192.168.70.131:80 -r 192.168.70.133:80 -g
ipvsadm -a -t 192.168.70.131:80 -r 192.168.70.134:80 -g
ipvsadm -ln //检查
ipvsadm-save > /etc/sysconfig/ipvsadm //让配置的规则永久生效
systemctl enable ipvsadm
4.配置web集群
设置子网掩码32(两台web都一样如下配置)
yum install -y httpd
echo web1 > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
ifconfig lo:0 192.168.70.131/32 //在本地回环接口(lo)上添加一个逻辑IP地址 /32表示这个地址的掩码为255.255.255.255,即单IP.因为在LVS-DR模式下,需要在每台真实服务器上都设置一个虚拟IP(VIP),但是两一样ip会冲突,这样当负载均衡器下线时,真实服务器可以接管VIP,继续提供服务。
设置内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore //忽略arp响应,只有当当目标IP与本机接口地址匹配时,才响应ARP请求。
这样可以防止接口收到发往其他IP的ARP请求时也错误响应。
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce //接口会主动对所有接收到的ARP请求进行回应,即使目标IP不是本地IP。
5.client测试
curl 192.168.70.131
可以在LVS看详细状态
ipvsadm -Lnc
对以上两种模式的补充:
我们在配置ipvsadm时 rr表示虚拟服务算法的选择
静态调服方法:
1.rr 轮询算法 均等的对待每一台服务器,不管服务器上实际的连接数量和系统负载
2.wrr 加权轮询 根据真实服务器的不同处理能力,动态地调整其权限,来调度访问请求
动态调服方法
3.lr 最少连接 调度器通过”最少连接“调度算法动态地将网络请求调度到已建立的链接数最少的服务器上
4.wlc 加权最少连接 调度器可以自动问询真实服务器的负载情况,并动态地调整其权限
命令补充:
管理虚拟服务
ipvsadm -E -t 192.168.70.131:80 -s wrr //修改算法
ipvsadm -D -t 192.168.70.131:80 //删除指定虚拟服务
ipvsadm -C //全部清空
管理真实服务
ipvsadm -a -t 192.168.70.131:80 -r 192.168.70.133 -g -w 5 //增加真实服务器的权重
ipvsadm -e -t 192.168.70.131:80 -r 192.168.70.133 -g -w 2 //修改真是服务器的权重
ipvsadm -d -t 192.168.70.131:80 -r 192.168.70.133 //删除真实服务器