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!!!!!!!!!!!!!!