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