负载均衡
负载均衡(Load Balance):可以利用多个计算机和组合进行海量请求处理,从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。通过负载均衡使请求可以在计算机集群中尽可能平均地分摊处理。每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。
分类
负载均衡根据所采用的设备对象(软/硬件负载均衡)、应用的OSI网络层次(网络层次上的负载均衡)等来分类。
在实际应用中,比较常见的就是四层负载及七层负载。
四层负载均衡(基于IP+端口的负载均衡)
四层负载均衡,主要通过报文中的目标地址和端口,以及负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的
服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连
接建立,即三次握手的建立是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。
实现四层负载均衡的软件有:
- F5:硬件负载均衡器,功能很好,但是成本很高。
- lvs:重量级的四层负载软件
- nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
- haproxy:模拟四层转发,较灵活
七层的负载均衡(基于虚拟的URL或主机IP的负载均衡)
在四层负载均衡的基础上,再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别来决定是否要进行负载均衡。
以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理的服务器和客
户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的
特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这
种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。
实现七层负载均衡的软件
- haproxy:天生负载均衡技能,全面支持七层代理,会话保持,访问控制;
- nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
- apache:功能较差
- Mysql proxy:功能尚可。
四层负载与七层负载的区别(lvs和nginx的区别)
四层负载均衡(layer 4) | 七层负载均衡(layer 7) | |
---|---|---|
基于 | 基于IP和Port(TCP协议) | 基于虚拟的URL或主机IP(HTTP协议) |
类似于 | 路由器 | 代理服务器 |
握手次数 | 1次 | 2次 |
复杂度 | 低 | 高 |
性能 | 高;无需解析内容 | 中;需要算法识别 URL,Cookie 和 HTTP head 等信息 |
安全性 | 低,无法识别 DDoS等攻击 | 高,可以抵御SYN洪水攻击 |
额外功能 | 无 | 会话保持,图片压缩,防盗链等 |
四层负载与七层负载最大的区别是效率与功能的区别。
四层架构简单,无需解析消息内容,在网络吞吐量及处理性能上高于七层。
七层负载均衡优势在于功能多,控制灵活强大
LVS 实现四层负载均衡项目实战
1、LVS 介绍
LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,因此性能较高。
LVS 优势与不足
(1)优势
1.高并发稳定性强:LVS基于内核工作,有超强的承载能力和并发处理能力,而且工作在网络4层之上仅
作分发之用,这个特点也决定了它的性能最强,稳定性最好,对内存和cpu资源消耗极低。单台LVS负载
均衡器,可支持上万并发连接。
2.成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,
性价比极高。
3.配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
4.支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
5.支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
(2)不足
工作在4层,不支持7层规则修改,不适合小规模应用。
2、LVS 核心组件和专业术语
(1)核心组件
LVS的管理工具和内核模块 ipvsadm/ipvs
ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;
(2)专业术语
VS:Virtual Server #虚拟服务器
Director, Balancer #负载均衡器、分发器
RS:Real Server #后端请求处理服务器
CIP: Client IP #客户端IP
VIP:Director Virtual IP #负载均衡器虚拟IP(接收请求的公网IP)
DIP:Director IP #负载均衡器IP
RIP:Real Server IP #后端请求处理服务器IP
(3)具体图解
3、LVS负载均衡工作模式
LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,修改目标主机的IP地址) --利用三层功能
LVS/DR :直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,修改目标主机的mac地址)--利用二层功能mac地址
LVS/TUN: 隧道模式,只有进站的数据流量经过分发器
FULL-NAT模式(了解)
LVS 四种工作模式原理、以及优缺点比较
1、NAT模式(VS-NAT)
原理: (1)客户端访问集群的VIP,请求WEB资源(请求报文:源地址为CIP,目标地址为VIP); (2)Director(负载均衡器)收到请求后,修改请求报文的目标地址为web服务器IP(RIP),并且将请求根据相应的调度算法送往后端WEB服务器(请求报文:源地址CIP,目标地址为RIP); (3)WEB服务器收到请求,检查报文是访问自己的而自己也提供WEB服务,就会响应这个请求报文,并发送给Director(响应报文:源地址RIP,目标地址CIP); (4)Director收到WEB服务器的响应报文,根据内部追踪机制确定该响应是针对哪个客户端的VIP请求,此时会修改源地址为VIP并响应客户端请求(响应报文:源地址VIP,目标地址CIP)。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址(公网IP),减少了 IP 地址的需求。缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器,速度就会变慢!一般要求10-20台节点
2、直接路由(Direct routing)模式(VS-DR)
VS-DR 是一种高效的负载均衡实现方式,尤其适用于需要高性能且服务器位于同一物理网段的场景。然而,它对于网络拓扑有一定的要求,这可能限制了其适用范围。
1. 原理
(1)数据包转发
负载均衡器 (Director) 和实际服务器 (Real Server, RS) 共享同一个虚拟IP地址 (VIP)。
客户端向VIP发送请求时,负载均衡器对VIP的ARP请求作出响应,而所有RS对VIP的 ARP 请求保持静默。
负载均衡器接收到请求后,根据调度算法确定转发给哪个RS,并修改数据包的目标MAC地址为选定RS的MAC地址。
(2)应答包返回
RS处理完请求后,直接使用VIP作为源IP地址将应答包发送回客户端,因为VIP与RS的真实IP地址相同。
2. 优点
(1)高效的数据包转发:无需额外的封装和解封装过程,提高了数据包转发效率。
(2)灵活的操作系统支持:大多数现代操作系统均能支持 VS-DR 模式。
(3)避免隧道开销:不需要使用隧道技术,降低了网络通信的复杂度和开销。
3. 不足
(1)物理位置限制:负载均衡器和实际服务器必须位于同一物理网段内。
(2)配置复杂性:需要确保所有RS都不响应VIP的ARP请求,可能增加额外配置步骤。
(3)维护难度:添加或移除实际服务器时可能需要重新配置网络设置。
4. 使用场景
(1)适合高性能负载均衡:适用于需要直接路由应答包回客户端的情况。
(2)对延迟敏感的应用程序和服务:例如游戏服务器、实时交易系统等。
3、IP隧道(Tunnel)模式(VS-TUN)
VS-TUN 模式适用于需要处理大量数据流量且 RS 分布在不同地理位置的场景。它通过减少负载均衡器的数据处理负担来提高整体性能,并允许 RS 直接向客户端发送应答,从而实现高效的服务提供。然而,它也要求 RS 具备一定的配置和技术支持。
1. 原理
(1)数据包封装
客户端向虚拟 IP (VIP) 发送请求时,负载均衡器接收请求并选择一个实际服务器 (RS)。负载均衡器将
原始数据包封装在一个新的IP包中,新包的头部包含实际服务器的IP地址作为目的IP,负载均衡器的 IP 地址作为源 IP。
(2)数据包解封装与应答
RS 收到封装的数据包后,解封装得到原始请求数据包。RS处理请求后,直接将应答包发回客户端,无需再经过负载均衡器。
2. 优点
(1)减少负载均衡器负担
负载均衡器只处理请求包,应答包由 RS 直接发送给客户端,减少了负载均衡器的数据流,使其不再是系统瓶颈。
(2)地理分布:通过互联网传输数据包,可以实现跨地域的负载均衡。
(3)高可扩展性:一台负载均衡器能为大量 RS 进行分发,适合处理巨大请求量。
3. 缺点
(1)IP资源需求:每个 RS 都需要一个合法的 IP 地址。
(2)操作系统兼容性:RS 必须支持 IP Tunneling 协议,这意味着需要运行特定版本的 Linux 或其他支持此功能的操作系统。
(3)额外配置:RS 上需要配置隧道功能,增加了管理复杂性。
4. 使用场景
(1)跨地域负载均衡:适用于需要在全球范围内提供服务的场景。
(2)高流量应用:适合处理大量请求和大体积应答数据的应用。
(3)高性能要求:适用于需要高性能负载均衡且服务器分布广泛的情况。
4、LVS三种模式NAT、DR和TUN的区别
lvs-nat:请求和响应报文都经由Director负载均衡器
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
5、LVS ipvsadm 命令
1、LVS-server安装lvs管理软件
yum -y install ipvsadm
2、命令选项
-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-a --add-server #在服务器表中添加一条新的真实主机记录
-t --tcp-service #说明虚拟服务器提供tcp服务
-u --udp-service #说明虚拟服务器提供udp服务
-r --real-server #真实服务器地址
-m --masquerading #指定LVS工作模式为NAT模式
-w --weight #真实服务器的权值
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-s --scheduler #使用的调度算法,默认调度算法是 wlc
固定调度算法:rr,wrr,dh,sh 即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
动态调度算法:wlc,lc,sed,nq,lblc,lblcr调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。
#常用的算法是:rr、wrr、wlc、lc
-C -clear #清除内核虚拟服务器表中的所有记录。
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list #显示内核虚拟服务器表
-n --numeric, :#以数字形式输出地址和端口号
4、LVS-DR模式负载均衡集群实战
1. 环境准备
(1)准备虚拟机
准备 3 台纯净的虚拟机,两台 web 服务器
(2)LVS-server 安装lvs管理软件
[root@lvs-server ~]# yum -y install ipvsadm
程序包:ipvsadm(LVS管理工具)
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file
配置文件:/etc/sysconfig/ipvsadm-config
(3)LVS/DR 模式
DR模式的组网要求LVS和Real server在同一网段二层互通。因为LVS DR模式在负载均衡转发报文时,只修改目的mac为real server的mac,lvs要能将报文转发给real server,就必须满足LVS和real server是同网段二层互通。
实验说明:1.网络使用NAT模式2.DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域
所有节点网关均指定真实网关
2. LVS/DR模式实施
准备工作(集群中所有主机)关闭防火墙和selinux
[root@lvs-server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.246.166 lvs-server
192.168.246.161 real-server1
192.168.246.162 real-server2
Director分发器配置
配置VIP
[root@lvs-server ~]# ip addr add dev ens33 192.168.246.160/32 #设置VIP
[root@lvs-server ~]# yum install -y ipvsadm #RHEL确保LoadBalancer仓库可用
[root@lvs-server ~]# service ipvsadm start #启动(RHCL6)
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件
[root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
为什么RS上lo配置的VIP掩码为32位
这是由于lo设备的特殊性导致, 如果lo绑定VIP/24,则该设备会响应该网段所有IP(192.168.246.0-254)的请求,而不是只响应192.168.246.160这一个地址。,就算是不设置为32也是可以的,只不过会影响访问
定义LVS分发策略
-A:添加VIP
-t:用的是tcp协议
-a:添加的是lo的vip地址
-r:转发到real-serve rip
-s:算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr:轮询算法
如果添加ip错了,删除命令如下:
# ip addr del 192.168.246.193 dev ens33[root@lvs-server ~]# ipvsadm -C #清除内核虚拟服务器表中的所有记录。
[root@lvs-server ~]# ipvsadm -A -t 192.168.246.160:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.161 -g
[root@lvs-server ~]# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.162 -g
[root@lvs-server ~]# service ipvsadm save #保存方式一,版本7已不支持
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm #保存方式二,保存到一个文件中
[root@lvs-server ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.246.160:80 rr-> 192.168.246.161:80 Route 1 0 0 -> 192.168.246.162:80 Route 1 0 0
[root@lvs-server ~]# ipvsadm -L -n
所有RS配置
配置好网站服务器,测试所有RS #为了测试效果,提供不同的页面(两台real-server都操作,以下以real-server1为例)
~]# yum install -y nginx
~]# echo "real-server1" >> /usr/share/nginx/html/index.html
两台机器都安装,按顺序添加不同的主机名以示区分
~]# ip addr add dev lo 192.168.246.160/32 #在lo接口上绑定VIP
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
~]# systemctl start nginx
~]# systemctl enable nginx
=============================================================================
因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送
arp广播需找vip时需要让realServer不接受响应.
解决:
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,
就不做出响应(这个ip在lo上,lo不是接收设备的进口)
echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的
测试
# yum install -y elinks
# elinks -dump http://192.168.246.160 #--dump:非交互式模式
# elinks -dump http://192.168.246.160 #交互式
5、Linux内核模块
查看linux已加载的内核模块
[root@sql-review ~]# lsmod
加载与卸载内核模块
[root@sql-review ~]# modprobe ip_vs #动态加载ip_vs 模块,这个命令只是临时生效,需要添加到开机启动项目里面
[root@sql-review ~]# lsmod | grep ip_vs #过滤模块是否加载成功!
[root@sql-review ~]# modprobe -r ip_vs #动态卸载ip_vs模块
查看内核模块信息
[root@sql-review ~]# modinfo ip_vs
设置开机启动项
[root@sql-review ~]# echo "modprobe ip_vs" >> /etc/rc.local
[root@sql-review ~]# chmod +x /etc/rc.local 切记添加执行权限
添加到开机启动项里面如果不需要这个模块的时候只需要将etc/rc.local里面对应的命令删除掉。但是这样需要重新启动服务器。 可以通过下面的命令立即生效。
6、LVS-NAT模式实战
LVS-NAT网络拓扑
建议:先在Real Server安装如nginx(两台机器real-server)
[root@real-server1 ~]# yum install -y nginx
[root@real-server1 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
两台机器都安装,按顺序添加不同的主机名以示区分
LVS/NAT模式实施
1、准备工作
(集群中所有主机)[可选]每台机器都需要做
[root@lvs-server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.246.166 lvs-server
192.168.246.161 real-server1
192.168.246.162 real-server2
2、RS配置
real-server所有服务器---默认网关均指向Directory的DIP
~]# route add default gw 192.168.246.166 dev ens33
最好是将real-server的ip设置成静态ip。网关设置为Directory的Dip。
3、Director分发器配置
先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,做为VIP。
[root@lvs-server ~]# ip addr add dev ens37 192.168.50.128/24 #设置VIP
[root@lvs-server ~]# vim /etc/sysctl.conf #开启路由转发
net.ipv4.ip_forward = 1
[root@lvs-server ~]#sysctl -p #让路由转发生效
#NAT模式是把请求报文的目标VIP修改为RIP,然后转发给real server。所以整个director的
功能有点像路由器。centos默认是不开启转发功能,所以需要激活ip转发功能。
定义LVS的分发策略
[root@lvs-server ~]# yum install -y ipvsadm #RHEL确保LoadBalancer仓库可用
[root@lvs-server ~]# service ipvsadm start #启动
[root@lvs-server ~]# ipvsadm -A -t 192.168.50.128:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.161 -m
[root@lvs-server ~]# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.162 -m
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm #保存方式一
[root@lvs-server ~]# service ipvsadm save #保存方式二,使用上面的保存方式
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.50.128:80 rr-> 192.168.246.161:80 Masq 1 1 3 -> 192.168.246.162:80 Masq 1 1 3
4、测试
7、LVS的调度算法
LVS的调度算法分为静态与动态两类。
1、静态算法(4种)
只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况
①RR:轮询调度(Round Robin)(轮叫)
将客户端请求平均分发到每台Real Server
②WRR:加权轮叫(Weight RR)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
③DH:目标地址散列调度(Destination Hash )
将同样的请求发送给同一个server,一般用于缓存服务器.即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。
④SH:源地址 hash(Source Hash)
源地址散列”调度算法根据请求的源IP地址, 简单的说就是有将同一客户端的请求发给同一个real server,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。
2、动态算法(6种)
前端的调度器会根据后端真实服务器的实际连接情况来分配请求
① LC:最少链接(Least Connections)
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
② WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
根据Real Server 权重值,选择连接数最少的服务器。
③ SED:最短期望延迟调度(Shortest Expected Delay )
不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。
④ NQ:永不排队/最少队列调度(Never Queue Scheduling NQ)
无需队列。如果有台realserver的连接数=0就直接分配过去,保证不会有一个主机很空间。
⑤ LBLC:基于局部性的最少链接(locality-Based Least Connections)
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
⑥ LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
keepalived 高可用
1. Keepalived简介
1.keepalivedkeepalived是一款基于VRRP协议实现高可用性的工具,确保服务在主节点故障时无缝切换到
备用节点。VRRP通过竞选机制选举Master和Backup,主节点通过发送心跳包保持服务状态,当主节
点失效,Backup接管服务。
2.VRRP
VRRP(Virtual Router Redundancy Protocol):虚拟路由冗余协议,解决静态网关单点故障风险,
它能够保证当个别节点宕机时,整个网络可以不间断地运行。
3.工作过程
(1)虚拟路由器中的路由器根据优先级选举出Master,Master通过发送ARP报文,将自己的虚拟MAC
地址发送给其它设备和主机
(2)Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状态
(3)如果Master路由器出现故障, 虚拟路由器的backup路由器根据优先级重新选举新的Master
(4)虚拟路由器状态切换时,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和IP
地下信息的ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息,网络中的主机感知不到Master的切换
(5)backup路由器优先级高于master路由器时,由backup路由的工作方式(抢占或非抢占方式)决定
是否重新选举Master
VRRP优先级的取值范围为0-255(数值越大优先级越高),可配置的范围为1到254,优先级0为系统保留
给路由器放弃master位置时使用,255则是系统保留给IP地址拥有者使用,当路由器为IP地址拥有者时,
其优先级始终为255,当虚拟路由器拥有虚拟IP地址时,只要其工作正常,则为Master路由器。
4.工作模块
keepalived三个主要模块:core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块实现VRRP协议的。5.脑裂:
Keepalived的BACKUP主机在收到不MASTER主机报文后会切换成为master,如果是它们之间的通信线
路出现问题,无法接收到彼此的组播通知,但两个节点实际都处于正常工作状态,这时两个节点均为master
强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
原因
网络故障:网络中断、路由器故障等导致集群的一部分节点无法与其他节点通信。
网络延迟:极端的网络延迟也可能导致节点之间的通信超时,从而被误认为是节点宕机或网络分区。
解决方式
a. 添加更多的检测手段,通过其他网络路径(如物理网卡、额外的网络接口)来互相ping对方,或通过
其他协议(如TCP连接)来进行检测,以减少脑裂的发生概率。(指标不治本,只是提高了检测到的概率);
b. 爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信keepalived两种模式:抢占式(默认)和非抢占式
抢占模式下,master节点恢复后会重新接管服务,而非抢占模式则保持故障转移后的状态,master节
点恢复后变为backup。
keepalived默认工作在抢占模式preemp。在抢占模式中,主节点的state设为MASTER,备节点的
state设为BACKUP,主节点的优先级要比备节点的优先级要高。
非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP,一个节点的优先级要比另一个节
点的优先级要高,同时高优先级的节点设置nopreempt参数,该参数表示不抢占vip。
keepalived配置详解
# cat /etc/keepalived/keepalive.conf
global_defs { #全局定义块router_id MySQL-HA-1 #用户标识本节点的名称,主备节点要不一致
}
vrrp_script check_mysql { #应用状态检查script "/etc/keepalived/check_mysql.sh" #mysql数据库状态检查脚本
interval 30 #检查间隔时间
}
vrrp_instance VI_1 { #定义一个vrrp_install实例,名称为VI_1state BACKUP #表示该实例的角色状态,有MASTER和BACKUP两种主备状态。interface ens192 #对外提供服务的网络接口,如eth0,ens33,ens192virtual_router_id 101 #虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致,否则将出现脑裂问题。priority 120 #priority表示实例优先级。数字越大,优先级越高。
advert_int 1 #advert_int为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。
nopreempt #nopreempt允许一个priority比较低的节点作为master,即使有priority更高的节点启动。authentication { #权限认证配置,下方2行参数。auth_type PASSauth_pass 1111}virtual_ipaddress { #虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中需要和域名绑定的ip,即可配置的高可用服务监听的ip保持一致。10.0.0.101 dev ens33 }track_script { #可以在keepalived.conf文件中定义的脚本,用以实现某个检测功能;check_mysql #此处调用check_mysql中的脚本。}
}
MySQL检查脚本:查运行在 3306 端口上的 MySQL 服务器进程是否正在运行
cat /etc/keepalived/check_mysql.sh
#!/bin/bash
mysql_proc_3306=`ps aux | grep -v grep | grep "bin/mysqld" | grep -c "port=3306"`
if [[ $mysql_proc_3306 -eq 1 ]]
thenexit 0
elseexit 1
2. Nginx+keepalived实现七层的负载均衡(同类服务)
Nginx通过Upstream模块实现七层负载均衡,通过stream模块实现四层负载均衡
(1)upstream 支持的负载均衡算法
轮询(默认):可以通过weight指定轮询的权重,权重越大,被调度的次数越多 ip_hash:可以实现会话保持,将同一客户的IP调度到同一样后端服务器,可以解决session的问题,不能使用weight fair:可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块 url_hash:按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的url_hash模块
(2)nginx负载均衡配置状态参数
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails 可以和 fail_timeout一起使用。
配置安装nginx 所有的机器,关闭防火墙和selinux
[root@nginx-proxy ~]# cd /etc/yum.repos.d/
[root@nginx-proxy yum.repos.d]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@nginx-proxy yum.repos.d]# yum install yum-utils -y
[root@nginx-proxy yum.repos.d]# yum install nginx -y
调度到不同组后端服务器
网站分区进行调度
================================================================================= 拓扑结构
[vip: 20.20.20.20]
[LB1 Nginx] [LB2 Nginx]192.168.1.2 192.168.1.3
[index] [milis] [videos] [images] [news]1.11 1.21 1.31 1.41 1.511.12 1.22 1.32 1.42 1.521.13 1.23 1.33 1.43 1.53... ... ... ... .../web /web/milis /web/videos /web/images /web/newsindex.html index.html index.html index.html index.html
一、实施过程
1、选择两台nginx服务器作为代理服务器。
2、给两台代理服务器安装keepalived制作高可用生成VIP
3、配置nginx的负载均衡
以上两台nginx服务器配置文件一致
根据站点分区进行调度
配置upstream文件
[root@nginx-proxy ~]# cd /etc/nginx/conf.d/
[root@nginx-proxy conf.d]# cp default.conf proxy.conf
[root@nginx-proxy conf.d]# mv default.conf default.conf.bak
[root@nginx-proxy conf.d]# vim upstream.confupstream index {server 192.168.246.162:80 weight=1 max_fails=2 fail_timeout=2;server 192.168.246.163:80 weight=2 max_fails=2 fail_timeout=2;}
[root@nginx-proxy conf.d]# vim proxy.conf
server {listen 80;server_name localhost;access_log /var/log/nginx/host.access.log main;location / {proxy_pass http://index;proxy_redirect default;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
将nginx的配置文件拷贝到另一台代理服务器中:
[root@nginx-proxy conf.d]# scp proxy.conf 192.168.246.161:/etc/nginx/conf.d/
[root@nginx-proxy conf.d]# scp upstream.conf 192.168.246.161:/etc/nginx/conf.d/
二、Keepalived实现调度器HA
注:主/备调度器均能够实现正常调度
1. 主/备调度器安装软件
~]# yum install -y keepalived
~]# yum install -y keepalived
~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id directory1 #辅助改为directory2
}
vrrp_instance VI_1 {state MASTER #定义主还是备interface ens33 #VIP绑定接口virtual_router_id 80 #整个集群的调度器一致priority 100 #back改为50advert_int 1 #检查间隔,默认为1snopreempt #非抢占模式,默认为抢占式preemptauthentication {auth_type PASS #主从服务器验证方式auth_pass 1111}virtual_ipaddress {192.168.246.16/24 #可以写多个公网ip}
}
[root@nginx-porxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id directory2
}
vrrp_instance VI_1 {state BACKUP #设置为backupinterface ens33virtual_router_id 80priority 50 #辅助改为50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.16/24}
}
3. 启动KeepAlived(主备均启动)
[root@nginx-proxy-master ~]# chkconfig keepalived on #设置自动启动
[root@nginx-proxy-master ~]# service keepalived start
[root@nginx-proxy-master ~]# ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:48:07:7d brd ff:ff:ff:ff:ff:ffinet 192.168.246.169/24 brd 192.168.246.255 scope global dynamic ens33valid_lft 1726sec preferred_lft 1726secinet 192.168.246.16/24 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::23e9:de18:1e67:f152/64 scope link valid_lft forever preferred_lft forever
到此:
可以解决心跳故障keepalived
不能解决Nginx服务故障
4. 扩展对调度器Nginx健康检查,两台都设置(非抢占式,抢占只需master设置)
思路:
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
(1) script
[root@nginx-proxy-master ~]# vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stopsystemctl stop keepalived
fi
[root@nginx-proxy-master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh
(2). keepalived使用script
! Configuration File for keepalived
global_defs {router_id director1
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx_status.sh"interval 5 #调用脚本之间的间隔,默认为1秒# weight -20 #失败一次,将自己的优先级 -2
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.16/24}track_script {check_nginx}
}
注:必须先启动nginx,再启动keepalived
测试访问:
3. KeepAlived实现LVS-DR四层负载
KeepAlived在该项目中的功能:
1. 管理IPVS的路由表(包括对RealServer做健康检查)
2. 实现调度器的HA(High Availability高可用性)
http://www.keepalived.org
Keepalived所执行的外部脚本命令建议使用绝对路径
实施步骤:
1. 主/备调度器安装软件
[root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived
[root@lvs-keepalived-slave ~]# yum -y install ipvsadm keepalived
2. Keepalived
lvs-master
[root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id lvs-keepalived-master #辅助改为lvs-backup
}
vrrp_instance VI_1 {state MASTERinterface ens33 #VIP绑定接口virtual_router_id 80 #VRID 同一组集群,主备一致 priority 100 #本节点优先级,辅助改为50advert_int 1 #检查间隔,默认为1sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.110/32}
}
virtual_server 192.168.246.110 80 { #LVS配置delay_loop 6 #健康检查rs时间间隔lb_algo rr #LVS调度算法lb_kind DR #LVS集群模式(路由模式)protocol TCP #健康检查使用的协议real_server 192.168.246.162 80 {weight 1inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除TCP_CHECK { #健康检查connect_port 80 #检查的端口connect_timeout 3 #连接超时的时间}}real_server 192.168.246.163 80 {weight 1inhibit_on_failureTCP_CHECK {connect_timeout 3connect_port 80}}
}
[root@lvs-keepalived-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id lvs-keepalived-slave
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.110/24}
}
virtual_server 192.168.246.110 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.246.162 80 {weight 1inhibit_on_failureTCP_CHECK {connect_port 80connect_timeout 3}}real_server 192.168.246.163 80 {weight 1inhibit_on_failureTCP_CHECK {connect_timeout 3connect_port 80}}
}
3. 启动KeepAlived(主备均启动)
[root@lvs-keepalived-master ~]# systemctl start keepalived
[root@lvs-keepalived-master ~]# systemctl enable keepalived
[root@lvs-keepalived-master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.246.110:80 rr persistent 20-> 192.168.246.162:80 Route 1 0 0 -> 192.168.246.163:80 Route 0 0 0
4. 所有RS配置(nginx1,nginx2)
配置好网站服务器,测试所有RS
[root@test-nginx1 ~]# yum install -y nginx
[root@test-nginx2 ~]# yum install -y nginx
[root@test-nginx1 ~]# ip addr add dev lo 192.168.246.110/32 #添加环回接口上的 IP 地址
[root@test-nginx1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf# arp_ignore 参数控制内核是否忽略对本地 IP 地址的 ARP 请求 ,1为忽视
[root@test-nginx1 ~]# sysctl -p #内核参数配置加载生效
[root@test-nginx1 ~]# echo "web1..." >> /usr/share/nginx/html/index.html
[root@test-nginx1 ~]# systemctl start nginx
4、数据库高可用
1.两台机器安装mysql
[root@mysql-keep-master ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
[root@mysql-keep-master ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm
[root@mysql-keep-master ~]# yum -y install yum-utils #安装yum工具包
[root@mysql-keep-master ~]# vim /etc/yum.repos.d/mysql-community.repo
安装mysql
[root@mysql-keep-master ~]# yum install -y mysql-community-server
[root@mysql-keep-master ~]# systemctl start mysqld
[root@mysql-keep-master ~]# systemctl enable mysqld
修改密码
[root@mysql-keep-master ~]# grep pass /var/log/mysqld.log
2020-02-18T13:54:25.706635Z 1 [Note] A temporary password is generated for root@localhost: %baWi=4!NsT)
[root@mysql-keep-master ~]# mysqladmin -uroot -p'%baWi=4!NsT)' password 'QianFeng@123!'
制作互为主从:
[root@mysql-keep-master ~]# vim /etc/my.cnf #编辑配置文件开启gtid
log-bin=m1.log
server-id=1
gtid_mode = ON #开启gtid
enforce_gtid_consistency=1 #强制gtid移植性
[root@mysql-keep-master ~]# systemctl restart mysqld
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123!' #登录数据库
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123'; #创建远程登录用户
mysql> flush privileges;
mysql> grant replication slave,reload,super on *.* to 'slave'@'%' identified by 'QianFeng@123'; ---创建主从授权用户
mysql> flush privileges; #刷新授权
mysql> \e #指定主服务器信息
CHANGE MASTER TO
MASTER_HOST='192.168.58.136', #指定主服务器的ip或者主机名
MASTER_USER='slave', #授权用户
MASTER_PASSWORD='QianFeng@123', #授权用户密码
master_auto_position=1
-> ;
启动slave
mysql> start slave;
[root@mysql-keep-backup ~]# vim /etc/my.cnf
log-bin=m2.log
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
[root@mysql-keep-backup ~]# systemctl restart mysqld
[root@mysql-keep-backup ~]# mysql -uroot -p'QianFeng@123!'
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';
mysql> flush privileges;
mysql> grant replication slave,reload,super on *.* to 'slave'@'%' identified by 'QianFeng@123';
mysql> flush privileges;
指定主服务器信息
mysql> \e
CHANGE MASTER TO
MASTER_HOST='192.168.58.135',
MASTER_USER='slave',
MASTER_PASSWORD='QianFeng@123',
master_auto_position=1
-> ;
启动slave
mysql> start slave;
两台机器验证是否为yes
mysql> show slave status\G
两台机器安装keepalived
[root@mysql-keep-master ~]# yum -y install keepalived
[root@mysql-keep-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@mysql-keep-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id master1
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.58.16/24}
}
将配置文件拷贝到backup机器
[root@mysql-keep-backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@mysql-keep-master ~]# scp /etc/keepalived/keepalived.conf 192.168.58.136:/etc/keepalived/
[root@mysql-keep-backup ~]# vim /etc/keepalived/keepalived.conf #修改如下
! Configuration File for keepalived
global_defs {router_id backup1
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.58.16/24}
}
两台机器启动keepalived
[root@mysql-keep-master ~]# systemctl start keepalived
[root@mysql-keep-backup ~]# systemctl start keepalived
[root@mysql-keep-master ~]# ip a #vip在master上面
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:92:0a:64 brd ff:ff:ff:ff:ff:ffinet 192.168.58.135/24 brd 192.168.58.255 scope global dynamic ens33valid_lft 1729sec preferred_lft 1729secinet 192.168.58.16/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::86f4:1d74:ad05:c61c/64 scope link valid_lft forever preferred_lft forever
测试:
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16 #登录vip
mysql> create database test1;
Query OK, 1 row affected (0.07 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.08 sec)
验证
[root@mysql-keep-backup ~]# mysql -uroot -p'QianFeng@123!'
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.12 sec)
[root@mysql-keep-master ~]# systemctl stop keepalived #关闭master
[root@mysql-keep-backup ~]# ip a #vip切换backup机器
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:a2:0f:5c brd ff:ff:ff:ff:ff:ffinet 192.168.58.136/24 brd 192.168.58.255 scope global dynamic ens33valid_lft 1547sec preferred_lft 1547secinet 192.168.58.16/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::af6e:2eff:e2d1:99cb/64 scope link valid_lft forever preferred_lft forever
测试登录
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16
四、Haproxy 基础
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。
haproxy---主要是做负载均衡的7层,也可以做4层负载均衡
apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。
7层负载均衡:用的7层http协议,
4层负载均衡:用的是tcp协议加端口号做的负载均衡
ha-proxy概述
ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与
nginx比起来在负载均衡这件事情上做更好,更专业。
ha-proxy负载均衡软件的优点:
1.双层协议支持:支持第 4 层 (TCP) 和第 7 层 (HTTP) 负载均衡。
2.支持8种左右的负载均衡算法:支持多种算法,如轮询、最少连接数、源地址散列等,并支持会话保持。
3.高性能单进程设计保证了出色的性能表现。
4.直观的监控界面提供详细的实时统计页面。
5.灵活的访问控制强大的 ACL 支持,便于定制规则。
6.SSL/TLS 加密支持支持客户端和服务端的 SSL/TLS 加密。
7.多用途应用可用于 Web、数据库、邮件和其他服务的负载均衡。
8.虚拟主机支持根据 Host 头字段进行路由,支持多个网站共存。haproxy算法:
1.Round Robin (轮询)动态分配请求到后端服务器,依据权重进行循环调度。后端服务器的权重可以动态调整,每台服务器最多处理 4128 个连接。
2.Static Round Robin (静态轮询)静态方式分配请求。基于权重进行循环调度,运行时调整权重无效,对后端服务器的连接数无限制。
3.Least Connections (最少连接)新请求分发给连接数最少的服务器,确保最轻负载的服务器优先接收新连接。
1、Haproxy 实现七层负载高可用
Keepalived + Haproxy
=================================================================================
/etc/haproxy/haproxy.cfg
global # 关于进程的全局参数log 127.0.0.1 local2 info #日志服务器pidfile /var/run/haproxy.pid #pid文件maxconn 4000 #最大连接数user haproxy #用户group haproxy #组daemon #守护进程方式后台运行nbproc 1 #工作进程数量 cpu内核是几就写几
defaults 段用于为其它配置段提供默认参数
listen是frontend和backend的结合体
frontend 虚拟服务VIrtual Server
backend 真实服务器Real Server
Keepalived + Haproxy
=================================================================================
拓扑结构
[vip: 192.168.246.17]
[LB1 Haproxy] [LB2 Haproxy]192.168.246.169 192.168.246.161
[httpd] [httpd] 192.168.246.162 192.168.246.163
一、Haproxy实施步骤
1. 准备工作(集群中所有主机)
[root@ha-proxy-master ~]# cat /etc/hosts
127.0.0.1 localhost
192.168.246.169 ha-proxy-master
192.168.246.161 ha-proxy-slave
192.168.246.162 test-nginx1
192.168.246.163 test-nginx2
2. RS配置
配置好网站服务器,测试所有RS,所有机器安装nginx
[root@test-nginx1 ~]# yum install -y nginx
[root@test-nginx1 ~]# systemctl start nginx
[root@test-nginx1 ~]# echo "test-nginx1" >> /usr/share/nginx/html/index.html
# 所有nginx服务器按顺序输入编号,方便区分。
3. 调度器配置Haproxy(主/备)都执行
~]# yum -y install haproxy
~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #移除空白字符、注释和空行
~]# vim /etc/haproxy/haproxy.cfg
# 全局设置
global# 日志配置,发送到本地主机的 local2 设施上,级别为 infolog 127.0.0.1 local2 info# 进程 ID 文件的位置pidfile /var/run/haproxy.pid# 最大连接数(优先级低),当有更高优先级的 maxconn 设置时,该设置会被覆盖maxconn 4000# 运行 HAProxy 的用户user haproxy# 运行 HAProxy 的组group haproxy# 使 HAProxy 以后台方式运行daemon# 设置工作进程的数量,通常建议与 CPU 核心数相同nbproc 1# 默认设置
defaults# 工作模式 HTTP,TCP在4层mode http# 使用全局日志配置log global# 健康检查,3 次连接失败就认为服务器不可用retries 3# 服务不可用后重定向到其他健康的服务器option redispatch# 最大连接数(优先级中)maxconn 4000# HAProxy 与后端服务器连接超时时间,单位毫秒 mscontimeout 5000# 客户端数据接收超时时间clitimeout 50000# 后端服务器响应超时时间srvtimeout 50000# 监听配置 - 管理界面
listen statsbind *:81 # 绑定到所有 IP 的 81 号端口stats enable # 启用统计信息页面stats uri /haproxy # 访问统计信息页面的 URIstats auth qianfeng:123 # 设置访问统计信息页面所需的用户名和密码# 前端监听配置 - web
frontend webmode http # 工作模式 HTTPbind *:80 # 监听所有 IP 的 80 号端口option httplog # 开启 HTTP 日志记录# 创建一个 ACL,匹配 URL 结尾为 .html 的请求acl html url_reg -i \.html$# 如果请求匹配 .html,则使用后端服务器组 httpserversuse_backend httpservers if html# 默认使用后端服务器组 httpserversdefault_backend httpservers# 后端服务器组配置 - httpservers
backend httpserversbalance roundrobin # 使用轮询算法分配请求# 定义第一个服务器,地址为 192.168.246.162:80,最大连接数为 2000,权重为 1,并启用健康检查server http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2# 定义第二个服务器,地址为 192.168.246.163:80,最大连接数为 2000,权重为 1,并启用健康检查server http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
将配置文件拷贝到slave服务器
[root@ha-proxy-master ~]# scp /etc/haproxy/haproxy.cfg 192.168.246.161:/etc/haproxy/
两台机器启动设置开机启动
[root@ha-proxy-master ~]# systemctl start haproxy
[root@ha-proxy-master ~]# systemctl enable haproxy
#check inter 2000 检测心跳频率单位
#rise 2 2 次正确认为服务器可用
#fall 2 2 次失败认为服务器不可用
测试主/备(浏览器访问)
主:
备:
页面主要参数解释
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests //最大的队列请求数量
Limit: //队列限制数量
Errors
Req:request errors //错误请求
Conn:connection errors //错误的连接
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk: 持续检查后端服务器的时间
Wght: (weight) : 权重
2.测试访问
通过访问haparoxy的ip地址访问到后端服务器
# curl http://192.168.246.169
如果出现bind失败的报错,执行下列命令
setsebool -P haproxy_connect_any=1
2、Keepalived实现调度器HA
注:主/备调度器均能够实现正常调度
1. 主/备调度器安装软件
[root@ha-proxy-master ~]# yum install -y keepalived
[root@ha-proxy-slave ~]# yum install -y keepalived
[root@ha-proxy-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id director1
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}
}
[root@ha-proxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id directory2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}
}
3. 启动KeepAlived(主备均启动)
[root@ha-proxy-master ~]# chkconfig keepalived on
[root@ha-proxy-master ~]# service keepalived start
[root@ha-proxy-master ~]# ip a
4. 扩展对调度器Haproxy健康检查(可选)
思路:一台机器做
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
a. script
[root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh
#!/bin/bash /usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stopsystemctl stop keepalived
fi
[root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh
b. keepalived使用script
[root@ha-proxy-master keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {router_id director1
}
vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy_status.sh"interval 5
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}track_script {check_haproxy}
}
[root@ha-proxy-slave keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {router_id directory2
}
vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy_status.sh"interval 5
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}track_script {check_haproxy}
}
[root@ha-proxy-master keepalived]# systemctl restart keepalived
[root@ha-proxy-slave keepalived]# systemctl restart keepalived
注:必须先启动haproxy,再启动keepalived
两台机器都配置haproxy的日志:需要打开注释并添加
[root@ha-proxy-master ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
#由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
$ModLoad imudp
$UDPServerRun 514
找到 #### RULES #### 下面添加
local2.info /var/log/haproxy.log
[root@ha-proxy-master ~]# systemctl restart rsyslog
[root@ha-proxy-master ~]# systemctl restart haproxy
[root@ha-proxy-master ~]# tail -f /var/log/haproxy.log
2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56866 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56867 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56889 to 192.168.246.17:80 (stats/HTTP)
2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56890 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56895 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56896 to 192.168.246.17:80 (stats/HTTP)
3、四层代理mysql
准备两台机器,关闭防火墙和selinux。
1.两台机器部署mysql并制作互为主从----略
2.安装haproxy制作代理
[root@haproxy-server ~]# yum -y install haproxy
[root@haproxy-server ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@haproxy-server ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
[root@haproxy-server ~]# vim /etc/haproxy/haproxy.cfg
globallog 127.0.0.1 local2pidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonnbproc 1
defaultsmode httplog globaloption redispatchretries 3maxconn 3000contimeout 5000clitimeout 50000srvtimeout 50000
listen statsbind *:81stats enablestats uri /haproxystats auth qianfeng:123
listen mysqlbind *:3307mode tcpbalance roundrobinserver mysql1 192.168.198.149:3306 weight 1 check inter 1s rise 2 fall 2server mysql2 192.168.198.150:3306 weight 1 check inter 1s rise 2 fall 2
[root@haproxy-server ~]# systemctl start haproxy
[root@haproxy-server ~]# netstat -lntp | grep 3307
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 11866/haproxy
3.验证:
[root@haproxy-server ~]# mysql -uroot -p'QianFeng@123!' -P 3307
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.31-log MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
4.制作高可用---作业
练习
1.lvs的优势有哪些?
2.keepalived基于什么协议实现?工作原理是什么?
3.lvs有几种工作模式分别是什么?
4.haproxy的优点有哪些?
5.列出你知道的负载均衡软件有哪些?
6.keepalived是一款什么软件?