lvs是什么

lvs是什么:

linux virtual server

张文嵩发起的开源项目,阿里,linux的内核层面实现负载均衡的软件.

主要作用:将多个后端服务器组成一个高可用,高性能的服务器集群,通过负载均衡的算法将客户端的请求分发到后端的服务器上,来实现高可用和负载均衡

适用场景

小集群不需要适用lvs,nginx可以满足

大集群可以用lvs

lvs集群中的术语

VS virtual server lvs服务的逻辑名称,也就是我们外部访问lvs集群时使用的ip地址和端口

DS driector server lvs集群中的主服务器,也就是调度器,相当于nginx的代理服务器,调度器是集群的核心,调度器就是用来接收客户端的请求转发到后端的服务器

RS Real server lvs集群中的真实服务器,也可以理解后端服务器,用来接收DS转发过来的请求,并且响应结果.

CIP Client ip 客户端的ip地址,也就是发起请求的客户端地址

VIP Virtual IP lvs集群使用的ip地址,对外提供集群访问的虚拟ip地址

DIP Director IP 调度器在集群当中的地址,用于和RS通信.

RIP REAL IP 后端服务器在集群当中的ip地址

lvs的工作方式

NAT模式

由调度器响应给客户端(小集群)

NAT模式的特点:地址转换,是lvs集群最常用的模式之一

在NAT模式之下,lvs会将来自客户端的请求报文的目标ip地址和端口,修改为lvs内部的ip地址和端口,然后把请求转发到后端服务器

响应结果返回给客户端的过程中,响应报文经过lvs的处理,把目标ip和端口修改成客户端的ip地址和端口

优点:对于客户端来说,请求的目标地址始终不变.客户端的配置不需要特殊修改,只是调度器在对ip和端口进行转换,后台的服务器也不需要改任何配置

缺点:性能损失,请求和响应都需要调度器做地址转换,会影响性能,NAT模式只能有一个调度器,如果它故障了,整个集群就不能正常工作

地址转换

内网--外网 转换的源ip地址 snat

外网--内网 转换的目的ip dnat

1.客户端发起请求,访问vip地址,到达调度器

2.调度器接收到请求后,根据负载均衡算法,选一个后端服务器

3.请求的地址,转成可以直接和内部RS通信的ip地址

4.后端服务器处理请求

5.目的地址转换,转换vip地址

6.调度器的vip响应给客户端

lvs的工具

ipvsadm工具,用来配置和管理lvs集群的工具

-A 添加虚拟服务器vip

-D 删除虚拟服务器地址

-s 指定负载均衡的调度算法,

​ rr 默认轮询

​ wrr 加权轮询

​ lc 最少连接

​ wlc 加权最小连接

-a 添加真实服务器

-d 删除真实服务器

-t 指定vip地址和端口

-r 指定真实服务器的地址和端口

-m 使用模式为nat模式

-g 使用DR模式

-i 使用隧道模式

-w 设置权重

-p 60 设置长连接的保持时间60秒

-l 列表查看

-n 数字化展示

示例

test1 真实客户端

#关闭防火墙
#重启nginx
vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=12.0.0.10
NETMASK=255.255.255.0
GATEWAY=12.0.0.20
DNS1=218.2.135.1
DNS2=112.4.0.55
systemctl restart network
#此时xshell会断开,去虚拟机实验curl 12.0.0.20

test2 调度器 ens33 192.168.118.20,ens36 12.0.0.20

#关闭防火墙
#重启nginx
#添加网卡
ifconfig
ipvsadm -v
yum -y install ipvsadm.x86_64
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens36

vim ifcfg-ens33
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.118.20
NETMASK=255.255.255.0
#GATEWAY=192.168.118.2
#DNS1=218.2.135.1
#DNS2=112.4.0.55
:wq

vim ifcfg-ens36
TYPE=Ethernet
DEVICE=ens36
ONBOOT=yes
BOOTPROTO=static
IPADDR=12.0.0.20
NETMASK=255.255.255.0
#GATEWAY=192.168.118.2
#DNS1=218.2.135.1
#DNS2=112.4.0.55
:wq

systemctl restart network
iptables -t nat -vnL
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.118.0/24 -o ens36 -j SNAT --to 12.0.0.20
iptables -t nat -vnL
ipvsadm -C
ipvsadm -A -t 12.0.0.20:80 -s rr
#加权轮询ipvsadm -A -t 12.0.0.20:80 -s wrr

ipvsadm -a -t 12.0.0.20:80 -r 192.168.118.30:80 -m
#加权重ipvsadm -a -t 12.0.0.20:80 -r 192.168.118.30:80 -m -w 2

ipvsadm -a -t 12.0.0.20:80 -r 192.168.118.40:80 -m
#加权重ipvsadm -a -t 12.0.0.20:80 -r 192.168.118.40:80 -m -w 3

ipvsadm -Ln

ipvsadm-save >/etc/sysconfig/ipvsadm
#保存策略

systemctl restart ipvsadm
#重启服务

ipvsadm -D -t 192.168.118.20:80
#删除策略,重新添加	
#删除节点服务器ipvsadm -d -r 192.168.118.30:80 -t 12.0.0.20:80

ipvsadm -Ln

vim /etc/sysctl.conf 
net.ipv4.ip_forward=1
:wq
sysctl -p
curl 12.0.0.20

nginx1 RS1 192.168.118.30

#关闭防火墙
#重启nginx
cd /etc/sysconfig/network-scripts/
vim ifcfg-ens33
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.118.30
NETMASK=255.255.255.0
GATEWAY=192.168.118.20
DNS1=218.2.135.1
DNS2=112.4.0.55
systemctl restart network

vim /usr/local/nginx/html/index.html
this is nginx1
systemctl restart nginx.service
curl 192.168.118.30

nginx2 RS2 192.168.118.40

#关闭防火墙
#重启nginx
cd /etc/sysconfig/network-scripts/
vim ifcfg-ens33
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.118.40
NETMASK=255.255.255.0
GATEWAY=192.168.118.20
DNS1=218.2.135.1
DNS2=112.4.0.55
:wq

systemctl restart network
vim /usr/local/nginx/html/index.html
this is nginx2
systemctl restart nginx.service
curl 192.168.118.40
DR模式

直接路由模式,由真实服务器直接响应给客户端(大集群)

DR模式的特点:调度器在整个lvs集群当中是最重要的,在nat模式下,负责接受请求,同时根据负载均衡算法转发流量,响应给客户端.

DR模式下,调度器依然负责接受请求,同时也根据负载均衡算法转发流量到RS,响应直接由RS响应给客户端

Direct Routing 直接路由,是一种二层转发模式,二层转发的是数据帧,根据源mac地址和目的mac地址进行转发,不会修改数据包源ip和目的ip,根据数据包mac地址进行转发.

DR模式下,lvs也是维护一个虚拟的ip地址,所有的请求都是发送到这个vip,既然是走二层转发,当客户端的请求到达调度之后,根据负载均衡的算法选择一个RS,修改vip服务器的目的mac变成RS的mac地址,RS处理完请求之后,根据报文当中客户端的源mac地址直接把响应发送到客户端即可,不需要走调度器,因此调度器的压力较小

注意

1.调度器的ip地址和RS的ip地址必须在同一网段,数据才能进行二层转发

2.如果RS是一个公网地址(极大概率不是),互联网可以直接访问RS

3.DR模式是走内核转发,内核来判断数据包的地址,根据RS的地址把数据包重新封装,修改的是mac地址

4.调度器的ip地址只可以作为集群访问的入口,不能做为网关

5.所有的RS上的lo(本地回环地址)都要配置vip地址.

由以上带来的问题

1.调度器配置了vip,RS上也配置了vip地址,到底是哪个ip地址来响应这个请求呢?

vip地址冲突,因为调度器和RS都在同一网段,就会造成ARP通信的紊乱,因为是整个局域网广播,所有的设备都收到了,怎么把lo这个回环的响应把它屏蔽掉,只有本机的物理ip地址进行响应

通过修改内核参数来达成

arp_ignore=1

系统的物理ip地址才会响应请求,lo就不会响应ARP请求

2.返回报文时,vip地址还在,怎么样能让客户端来接收响应

arp_announce=2

系统不使用ip数据包的原地址来响应ARP请求,直接发送物理接口的ip地址

节点服务器的配置:

DR模式的实现

test1调度器 192.168.118.10

test2客户端 192.168.118.20

nginx1 RS1 192.168.118.30

nginx2 RS2 192.168.118.40

vip 192.168.118.100

实验

test1调度器

systemctl stop firewalld
setenforce 0
[root@test1 ~]# modprobe ip_vs
[root@test1 ~]# yum -y install ipvsadm.x86_64 
[root@test1 ~]# cd /etc/sysconfig/network-scripts/
[root@test1 ~]# vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.118.100
NETMASK=255.255.255.0
:wq
[root@test1 network-scripts]# ifup ens33:0
[root@test1 network-scripts]#
[root@test1 network-scripts]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=0
#关闭数据包转发功能
net.ipv4.conf.all.send_redirects=0
#禁止系统发送icmp重定向的消息
net.ipv4.conf.default.send_redirects=0
#禁止默认网络接口发送icmp重定向的消息
net.ipv4.conf.ens33.send_redirects=0
#针对ens33设备,禁止发送icmp重定向消息
:wq
[root@test1 network-scripts]# sysctl -p
[root@test1 opt]# cd /opt
[root@test1 opt]# ipvsadm -C
[root@test1 opt]# ipvsadm -ln
[root@test1 opt]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@test1 opt]# ipvsadm -A -t 192.168.118.100:80 -s rr
[root@test1 opt]# ipvsadm -a -t 192.168.118.100:80 -r 192.168.118.30:80 -g
[root@test1 opt]# ipvsadm -a -t 192.168.118.100:80 -r 192.168.118.40:80 -g
[root@test1 opt]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@test1 opt]# systemctl restart ipvsadm.service
[root@test1 opt]# ipvsadm -D -t 192.168.118.10:80
[root@test1 opt]# ipvsadm -A -t 192.168.118.100:80 -s rr
[root@test1 opt]# ipvsadm -a -t 192.168.118.100:80 -r 192.168.118.30:80 -g
[root@test1 opt]# ipvsadm -a -t 192.168.118.100:80 -r 192.168.118.40:80 -g

nginx1 RS1

[root@test3 ~]# systemctl stop firewalld
[root@test3 ~]# setenforce 0
[root@test3 ~]# vim /usr/local/nginx/html/index.html
this is nginx1
:wq
[root@test3 ~]# systemctl restart nginx.service
[root@test3 ~]# curl 192.168.118.30
[root@test3 ~]# cd /etc/sysconfig/network-scripts/
[root@test3 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@test3 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.118.100
NETMASK=255.255.255.0
:wq
ifup lo:0
[root@test3 network-scripts]# route add -host 192.168.118.100 dev lo:0
[root@test3 network-scripts]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
#设置回环接口忽略来自任何接口的arp请求
net.ipv4.conf.lo.arp_announce=2
#设置回环地址仅仅公告本地的ip地址,但是不响应arp请求
net.ipv4.conf.all.arp_ignore=1
#设置所有接口忽略来自任何接口的arp请求
net.ipv4.conf.all.arp_announce=2
#设置所有接口仅仅公告本地的ip地址,但是不响应arp请求

nginx2 RS2

[root@test4 ~]# systemctl stop firewalld
[root@test4 ~]# setenforce 0
[root@test4 ~]# vim /usr/local/nginx/html/index.html
this is nginx2
:wq
[root@test4 ~]# systemctl restart nginx.service
[root@test4 ~]# curl 192.168.118.40
[root@test4 ~]# cd /etc/sysconfig/network-scripts/
[root@test4 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@test4 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.118.100
NETMASK=255.255.255.0
:wq
ifup lo:0
[root@test4 network-scripts]# route add -host 192.168.118.100 dev lo:0
[root@test4 network-scripts]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
#设置回环接口忽略来自任何接口的arp请求
net.ipv4.conf.lo.arp_announce=2
#设置回环地址仅仅公告本地的ip地址,但是不响应arp请求
net.ipv4.conf.all.arp_ignore=1
#设置所有接口忽略来自任何接口的arp请求
net.ipv4.conf.all.arp_announce=2
#设置所有接口仅仅公告本地的ip地址,但是不响应arp请求

test2客户端

systemctl stop firewalld
setenforce 0
curl 192.168.118.100
TUN隧道模式

需要专门开启一个vpn隧道翻墙

常用的模式

就是NAT和DR

slb是什么

阿里的SLB

server loab balance lvs+keepalive实现的

集群和分布式

系统的拓展方式

垂直拓展

向上拓展,增强,针对性能更强的计算机,瓶颈,计算机本身设备的限制.硬件本身的性能瓶颈

水平拓展

向外拓展,增加设备.并行的运行多个服务,依靠网络解决内部通讯的问题,cluster集群

集群

为了解决某个特定的问题将多台计算机组合起来形成的单个系统

集群的类型

LB load balance 负责均衡集群,多个主机组成,每个主机只承担一部分的访问请求

HA high availiablity 高可用,在设计系统时,采取一定的措施,确保系统当中某一组件或者两个出现故障,整个系统依然能够正常的运行

为了维护系统的可用性,可靠性,容错性

HPC high-performance computing 高性能,对响应时间,处理能力要求更高

系统可靠性指标

MTBF Mean time Between Failure 平均无故障时间

MTTR Mean time Restoration repair 平均故障恢复时间

A=MTBF+MTTR A的值要在0-1之间,A指标就是系统的可用性的度量,越接近0表示系统越不可用,越接近1表示系统越可用 99.99%,都是以小时为单位

90 (1-90%)*365=36.5天

停机时间:

计划内时间,可以忽略不计,但是现在也算在内

计划外时间,就是故障时间,从故障发生到故障解决的总时间,尤其是运维,计划外时间是我们必须关注的一个指标

当天事必须当天解决,没有解决之前,人是不可以离开的,解决完之后必须生成报告,备案

日报,周报,月报,年报

运维精神...7*24小时待命(及时响应,及时处理,及时总结.)

面试题

简述lvs的三种模式,和他们的区别

lvs的三种工作模式总结 NAT DR TUN
优点 地址转换,配置简单 性能最好 WAN的形式远距离的数据包传送
缺点 性能瓶颈 不支持跨网段 需求专用通道,vpn花钱
RS的要求 无限制,10-20个 禁止非物理的接口的arp响应,100台 需要支持隧道模式,100台

面试题

练习

lvs和nginx做负载均衡的区别

lvs是层转发,内核态,ip+端口,四层代理

nginx 四层代理 也可以七层代理

lvs(DR模式)+nginx+tomcat

lvs实现四层转发+nginx实现7层转发(动态)

访问lvs的vip地址可以实现动静分离

实现

在上个实验的基础上,新增tomcat1和tomcat2服务器

tomcat1

vim /usr/local/tomcat/conf/server.xml 
 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
:wq

vim /usr/local/nginx/html/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("this is tomcat1,http://www.test1.com");%>
</body>
</html>
:wq
./startup.sh
./shutdown.sh
./startup.sh

然后去nginx1服务器

vim /usr/local/nginx/conf/nginx.conf
 upstream tomcat {
        server 192.168.118.50:8080 weight=1;
        server 192.168.118.60:8080 weight=1;
    }
 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ .*\.jsp$ {
            proxy_pass http://tomcat;
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

tomcat2

vim /usr/local/tomcat/conf/server.xml 
 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
:wq

vim /usr/local/nginx/html/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("this is tomcat2,http://www.test2.com");%>
</body>
</html>
:wq
./startup.sh
./shutdown.sh
./startup.sh

nginx2服务器

vim /usr/local/nginx/conf/nginx.conf
 upstream tomcat {
        server 192.168.118.50:8080 weight=1;
        server 192.168.118.60:8080 weight=1;
    }
 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ .*\.jsp$ {
            proxy_pass http://tomcat;
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

keepalive脑裂是什么

是HA高可用架构中的一个特殊现象,只要使用vip地址代理的冗余模式的高可用,都有可能出现脑裂的问题.

主和备同时都有vip地址,主和备无法确定各自的身份,同时出现了vip地址,两边都起来了,但是两边都无法使用

大概就是以下这些原因:

1.keepalive配置文件写错了

2.心跳线(网线),断了,老化

3.硬件问题(网卡出了问题),ip地址配置冲突

4.防火墙的策略,iptables的策略.屏蔽了组播的地址广播,屏蔽了vrrp协议的报文

5.两台服务器的事件不同步也可能导致问题

6.其他的服务配置对心跳线的检测造成了干扰

keppalive的脑裂怎么解决

lvs集群当中的高可用架构,只是针对调度器的高可用(基于vrrp来实现调度器的主和备),高可用的HA架构.

主调度器和备调度器(多台)

在主调度器正常工作的时候,备完全处于冗余状态(待命),不参与集群的运转,只有当主调度器出现故障时,备才会承担主调度器的工作,主调度器恢复功能之后,主又会成为主,继续做为集群的入口,备继续冗余待命(取决优先级)

keepalive基于vrrp协议来实现lvs高可用的方案.

1.组播地址 224.0.0.18根据组播地址来进行通信,主和备之间发送报文,确定对方是否存活

2.根据优先级来判定主和备的位置

3.故障切换,主故障了,备来继续工作,主恢复了,备继续等待

4.vip地址的切换,主和备之间的切换是vip的切换

keepalive是专门为了lvs而出现的,但不是lvs专用的

keepalive模块

core模块 keepalived的核心模块,负责主进程的启动,维护以及全局配置文件的加载

vrpp模块 实现vrrp协议的模块,也就是主功能模块

check模块 负责健康检查,也可以检查后台真实服务器的情况

主调度器

[root@test1 ~]# cd /etc/sysconfig/network-scripts/
[root@test1 network-scripts]# rm -rf ifcfg-ens33:0
[root@test1 ~]# yum -y install keepalived.x86_64 
[root@testzhu ~]# cd /etc/keepalived/
[root@testzhu keepalived]# ls
[root@testzhu keepalived]# vim keepalived.conf 
#只需要改global,vrrp,virtual_server
smtp_server 127.0.0.1
#第9行notification_email_from Alexandre.Cassen@firewall.loc的下面修改

router_id lvs_01
#第12行,备调度器改成02

vrrp_strict
#第14行如果有注释,要取消注释

interface ens33
#第21行

virtual_router_id 51
#22行的id号,主备都要一样

priority 120
#23行,优先度要高,备优先度要低

 virtual_ipaddress {
         192.168.118.100
 }
 #29行的代码块里,留一个vip地址

virtual_server 192.168.118.100 80 {
#34行,改成vip地址

lb_kind DR 
#37行,改成dr模式

persistence_timeout 0
#39行,timeout改成0

#59行之后的都不要了

real_server 192.168.118.30 80 {
	   		 weight 1
             TCP_CHECK{
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 4
          }
        }
real_server 192.168.118.40 80 {
	   		 weight 1
             TCP_CHECK{
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 4
          }
        }
      }
#42行里的代码块改成这样的
:wq
systemctl restart keepalived.service 

副调度器

[root@testbei ~]# yum -y install keepalived.x86_64
[root@testbei ~]# cd /etc/keepalived/
[root@testbei keepalived]# rm -rf keepalived.conf 

总结:keepalive是调度器的高可用,vip地址主备之间的切换,主在工作时,vip地址只在主上,主停止工作,vip漂移到备服务器.

在主备的优先级不变的情况下,主恢复工作,vip会飘回到主服务器上.

1.配优先级

2.配置vip和真是服务器

3.主备id要一致

4.主备的id要区分

keepalive是专门为lvs打造的,但是不是为lvs专门服务的

keepalive也可以使用nginx,haproxy

keepalive+nginx实现高可用

nginx1

systemctl stop firewalld
setenforce 0
yum -y install keepalive
vim check_nginx.sh
/usr/bin/curl -I http://localhost &> /dev/null
if [[ $? -ne 0  ]]
then
 systemctl stop keepalived
fi
:wq

chmod 777 check_nginx.sh

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_iptables
}
   vrrp_script check_nginx {
        script "/root/check_nginx.sh"
        interval 5
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.118.100
    }

    track_script {
        check_nginx
 }
}
:wq
systemctl stop nginx
systemctl status keeplived 

nginx2

systemctl stop firewalld
setenforce 0
yum -y install keepalive
scp root@192.168.118.30:/etc/keepalived/keepalived.conf /etc/keepalived/
vim /etc/keeplived/keepalived.conf
#把主vip的一些东西改成副的
:wq
systemct restart keepalived
vim /usr/local/nginx/html/index.html
this is nginx1
:wq
systemctl restart nginx

Haproxy负载均衡器:

nginx 四层转发,七层代理

lvs 四层转发

Haproxy 四层转发,七层转发

Haproxy的作用和使用场景

1.场景,用于高并发的web'场景,可以支持一万个以上的并发请求,高性能的tcp和http负载均衡器

工作原理:提高一个代理地址,访问集群

2.作用:1.进行四层和七层转发,2.支持https,3.haproxy本身不自带缓存功能,请求当中添加cookie,使用缓存,4.支持主备切换(keepalive)

3.特点

可靠性高(版本稳定),可以同时维护4万个到五万个并发,单位时间(指定时间)内可以处理最大请求数20000个

支持负载均衡算法,虽然不带缓存,但是可以支持会话保存

rr

wrr

leastconn

实验一下

nginx1

nginx2

test

yum -y install -y pcre-devel bzip2-devel gcc-c++ make
cd /opt
#把haproxy包扔进opt目录下
tar -xf haproxy-1.5.19.tar.gz 
cd haproxy-1.5.19/
uname -r
make TARGET=linux2628 ARCH=x86_64
#target使用的linux版本要大于linux2.60以上的版本
make install
mkdir /etc/haproxy
cd examples/
cp -a haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
        log /dev/log    local0 info
        log /dev/log    local1 notice
        #log loghost    local0 info
        maxconn 4096
        #最大连接数,推荐10240
        #chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        nbproc 4
        #haproxy的并发线程数,设置的数量应该是cpu的两倍或者和cpu保持一致
        #debug
        #quiet

defaults
#这里的是默认参数配置,包涵了连接配置,监听配置,以及代理配置
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        #检查节点服务器3次,连续3次失败,就认为节点服务器不可用
        redispatch
        #服务器负载很高时,自动结束当前队列中处理比较久的连接
        maxconn 2000
        #最大连接数,这个数值可以和global中一致,也可以比他小,但是不能超过,一般设置成一致
        #contimeout     5000
        #clitimeout     50000
        #srvtimeout     50000
        timeout http-request 10s
        #http请求的默认超时时间
        timeout queue 1m
        #在队里当中请求的超时时间
        timeout connect 10s
        #链接超时时间
        timeout client 1m
        #客户端超时时间
        timeout server 1m
        #服务端的超时时间
        timeout http-keep-alive 10s
        #默认长连接的超时时间
        timeout check 10s
        #检查后端服务器的超时时间

#转发请求的设置,既可以是四层,也可以是七层
#七层配置:
listen  xy102 0.0.0.0:80
        option httpchk GET /index.html
        #设置转发请求的内容
        balance static-rr
        #轮询算法
        server  rs01 192.168.118.30 check inter 2000 fall 3 weight 2
        server  rs02 192.168.118.40 check inter 2000 fall 3 weight 3
        #server指定真实服务器,rs01自定义后台服务器名称check inter 2000 启动对后台服务器进行检查,间隔是2000毫秒,fall 3连续三次检测不到任务失败

:wq
cd /opt/haproxy-1.5.19/examples/
cp -a haproxy.init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy 
chkconfig --add /etc/init.d/haproxy 
ln -s /usr/local/sbin/haproxy /usr/sbin/
systemctl restart haproxy.service 
curl 192.168.118.50
#本机ip地址

四层

在完成了七层的基础上做的修改

#转发请求的设置,既可以是四层,也可以是七层
#七层配置:
#listen xy102 0.0.0.0:80
#       option httpchk GET /index.html
#       #设置转发请求的内容
#       balance static-rr
#       #轮询算法
#       server  rs01 192.168.118.30 check inter 2000 fall 3 weight 2
#       server  rs02 192.168.118.40 check inter 2000 fall 3 weight 3
        #server指定真实服务器,rs01自定义后台服务器名称check inter 2000 启动对后台服务器进行检查,>间隔是2000毫秒,fall 3连续三次检测不到任务失败
#四层转发:
frontend test
bind *:80
mode tcp
default_backend test

backend test
mode tcp
balance roundrobin
server server1 192.168.118.30:80 check inter 2000 fall 3 weight 2
server server2 192.168.118.40:80 check inter 2000 fall 3 weight 3
:wq
systemctl restart haproxy.service 
curl 192.168.118.50

练习2

keepalive+haproxy

在已完成的haproxy对nginx1,nginx2轮询的基础上,再加一个haproxy,最后由客户机curl

怎么再加一个haproxy?克隆带有haproxy的虚拟机就行,然后给两台haproxy再配置keepalive

yum -y install keepalived.x86_64 
cd /etc/keepalived/
ls
vim keepalived.conf 
#只需要改global,vrrp,virtual_server
smtp_server 127.0.0.1
#第10行修改成邮件地址

router_id lvs_01
#第12行,备调度器改成02

vrrp_strict
#第14行如果有注释,要取消注释

interface ens33
#第21行

virtual_router_id 51
#22行的id号,主备都要一样

priority 120
#23行,优先度要高,备优先度要低

 virtual_ipaddress {
         192.168.118.100
 }
 #29行的代码块里,留一个vip地址

virtual_server 192.168.118.100 80 {
#34行,改成vip地址

lb_kind DR 
#37行,改成dr模式

persistence_timeout 0
#39行,timeout改成0

#59行之后的都不要了

real_server 192.168.118.30 80 {
	   		 weight 1
             TCP_CHECK{
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 4
          }
        }
real_server 192.168.118.40 80 {
	   		 weight 1
             TCP_CHECK{
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 4
          }
        }
      }
#42行里的代码块改成这样的

#最后回到第16行的下一行添加vrrp_iptables
:wq

vim check_haproxy.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &> /dev/null
if [[ $? -ne 0  ]]
then
 systemctl stop keepalived
fi
:wq

chmod 777 check_haproxy.sh

vim /etc/keepalived/keepalived.conf 

vrrp_script check_haproxy {
        script "/opt/check_haproxy.sh"
        interval 5
}

track_script {
        check_haproxy
 }

完事之后,运行就ok了
以及,一定一定要记得,关闭防火墙和setenfoce 0!!!!!!!!!!!!!!
相关推荐
_.Switch38 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_8504108339 分钟前
文件系统和日志管理
linux·运维·服务器
JokerSZ.43 分钟前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
XMYX-01 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
芯盾时代1 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方2 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘2 小时前
NFS服务器
运维·服务器
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰3 小时前
[linux]docker基础
linux·运维·docker
Jason-河山4 小时前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化