美丽的神话 发表于 2024-8-13 13:19:46

负载平衡、高可用

负载平衡

负载平衡(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)详细图解

https://i-blog.csdnimg.cn/direct/b4e4ed6555044f4391a8bf7d09ad3ede.png
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台节点https://i-blog.csdnimg.cn/direct/526db465811f4351a7d4090c3c776425.png
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)高性能要求:适用于需要高性能负载均衡且服务器分布广泛的情况。 https://i-blog.csdnimg.cn/direct/2bffa1a84b0b4249ad88270b136c7fa1.png
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管理软件

# 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必须在同一个网段及广播域
所有节点网关均指定真实网关
https://i-blog.csdnimg.cn/direct/42c4edd08ec344dcb40c6b981f30114e.png
2. LVS/DR模式实施

预备工作(集群中所有主机)关闭防火墙和selinux
# 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

# ip addr add dev ens33 192.168.246.160/32 #设置VIP
# yum install -y ipvsadm   #RHEL确保LoadBalancer仓库可用
# service ipvsadm start#启动(RHCL6)
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件
# 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

# ipvsadm -C#清除内核虚拟服务器表中的所有记录。
# ipvsadm -A -t 192.168.246.160:80 -s rr
# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.161 -g
# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.162 -g
# service ipvsadm save #保存方式一,版本7已不支持
# ipvsadm -S > /etc/sysconfig/ipvsadm#保存方式二,保存到一个文件中
# 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        
# 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 enablenginx
=============================================================================
因为: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已加载的内核模块
# lsmod
加载与卸载内核模块
# modprobe ip_vs    
    #动态加载ip_vs 模块,这个命令只是临时生效,需要添加到开机启动项目里面
# lsmod | grep ip_vs     #过滤模块是否加载成功!
# modprobe -r ip_vs    #动态卸载ip_vs模块
查看内核模块信息
# modinfo ip_vs
设置开机启动项
# echo "modprobe ip_vs" >> /etc/rc.local
# chmod +x /etc/rc.local     切记添加执行权限
添加到开机启动项里面如果不需要这个模块的时候只需要将etc/rc.local里面对应的命令删除掉。但是这样需要重新启动服务器。 可以通过下面的命令立即生效。 6、LVS-NAT模式实战

LVS-NAT网络拓扑

https://i-blog.csdnimg.cn/direct/829dc9266096445ebbd86ea676e4d7f8.png 建议:先在Real Server安装如nginx(两台机器real-server)
# yum install -y nginx
# echo "real-server1" >> /usr/share/nginx/html/index.html
两台机器都安装,按顺序添加不同的主机名以示区分 LVS/NAT模式实施

1、预备工作

(集群中所有主机)[可选]每台机器都需要做
# 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.166dev ens33 最好是将real-server的ip设置成静态ip。网关设置为Directory的Dip。
3、Director分发器配置

先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,做为VIP。
# ip addr add dev ens37 192.168.50.128/24   #设置VIP
# vim /etc/sysctl.conf #开启路由转发
net.ipv4.ip_forward = 1
#sysctl -p #让路由转发生效
#NAT模式是把请求报文的目标VIP修改为RIP,然后转发给real server。所以整个director的
功能有点像路由器。centos默认是不开启转发功能,所以需要激活ip转发功能。 界说LVS的分发计谋
# yum install -y ipvsadm#RHEL确保LoadBalancer仓库可用
# service ipvsadm start#启动
# ipvsadm -A -t 192.168.50.128:80 -s rr
# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.161 -m  
# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.162 -m  
# ipvsadm -S > /etc/sysconfig/ipvsadm#保存方式一
# service ipvsadm save #保存方式二,使用上面的保存方式
# 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.keepalived
    keepalived是一款基于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_1
    state BACKUP            #表示该实例的角色状态,有MASTER和BACKUP两种主备状态。
    interface ens192          #对外提供服务的网络接口,如eth0,ens33,ens192
    virtual_router_id 101   #虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致,否则将出现脑裂问题。
    priority 120            #priority表示实例优先级。数字越大,优先级越高。
advert_int 1                  #advert_int为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。
nopreempt   #nopreempt允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
    authentication {    #权限认证配置,下方2行参数。
      auth_type PASS
      auth_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 ]]
then
    exit 0
else
    exit 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
# cd /etc/yum.repos.d/
# vim nginx.repo

name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
# yum install yum-utils -y
# yum install nginx -y
调度到不同组后端服务器
网站分区进行调度 =================================================================================

拓扑结构
​                           

                           
                        192.168.1.2   192.168.1.3

                           
         1.11      1.21        1.31           1.41         1.51
         1.12      1.22        1.32           1.42         1.52
         1.13      1.23        1.33           1.43         1.53
         ...         ...          ...         ...       ...
         /web     /web/milis  /web/videos     /web/images   /web/news
      index.htmlindex.html     index.html    index.html   index.html 一、实施过程
1、选择两台nginx服务器作为代理服务器。
2、给两台代理服务器安装keepalived制作高可用生成VIP
3、配置nginx的负载均衡
以上两台nginx服务器配置文件一致
根据站点分区进行调度
配置upstream文件
# cd /etc/nginx/conf.d/
# cp default.conf proxy.conf
# mv default.conf default.conf.bak
# vim upstream.conf
 upstream 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;
      }      
# vim proxy.conf
server {
     listen 80;
     server_name     localhost;
     access_log/var/log/nginx/host.access.logmain;
       
     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的配置文件拷贝到另一台代理服务器中:
# scp proxy.conf 192.168.246.161:/etc/nginx/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改为50
 advert_int 1                  #检查间隔,默认为1s
    nopreempt                     #非抢占模式,默认为抢占式preempt
 authentication {
     auth_type PASS            #主从服务器验证方式
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.16/24 #可以写多个公网ip
 }
}

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
  router_id directory2
}

vrrp_instance VI_1 {
 state BACKUP                    #设置为backup
 interface ens33
 virtual_router_id 80
 priority 50                 #辅助改为50
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.16/24
 }
}
3. 启动KeepAlived(主备均启动)
# chkconfig keepalived on#设置自动启动
# service keepalived start
# ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
 inet6 ::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 1000
 link/ether 00:0c:29:48:07:7d brd ff:ff:ff:ff:ff:ff
 inet 192.168.246.169/24 brd 192.168.246.255 scope global dynamic ens33
      valid_lft 1726sec preferred_lft 1726sec
 inet 192.168.246.16/24 scope global ens33
      valid_lft forever preferred_lft forever
 inet6 fe80::23e9:de18:1e67:f152/64 scope link
      valid_lft forever preferred_lft forever
到此:
可以解决心跳故障keepalived
不能解决Nginx服务故障
4. 扩展对调度器Nginx健康检查,两台都设置(非抢占式,抢占只需master设置)
思路:
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
(1) script
# 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 stop
    systemctl stop keepalived
fi                                                                    
# 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 MASTER
 interface ens33
 virtual_router_id 80
 priority 100
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.16/24
 }
 track_script {
     check_nginx
 }
}
注:必须先启动nginx,再启动keepalived

测试访问: 3. KeepAlived实现LVS-DR四层负载

https://i-blog.csdnimg.cn/direct/d9abe43959784475a2a768e3d04ffcd2.png
KeepAlived在该项目中的功能:
1. 管理IPVS的路由表(包括对RealServer做健康检查)
2. 实现调度器的HA(High Availability高可用性)
http://www.keepalived.org
Keepalived所执行的外部脚本命令建议使用绝对路径 实施步骤:
1. 主/备调度器安装软件
# yum -y install ipvsadm keepalived
# yum -y install ipvsadm keepalived
2. Keepalived
lvs-master
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
  router_id lvs-keepalived-master    #辅助改为lvs-backup
}

vrrp_instance VI_1 {
 state MASTER
 interface ens33                #VIP绑定接口
 virtual_router_id 80         #VRID 同一组集群,主备一致          
 priority 100            #本节点优先级,辅助改为50
 advert_int 1            #检查间隔,默认为1s
 authentication {
     auth_type PASS
     auth_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 1
      inhibit_on_failure   #当该节点失败时,把权重设置为0,而不是从IPVS中删除
      TCP_CHECK {          #健康检查
            connect_port 80   #检查的端口
            connect_timeout 3  #连接超时的时间
            }
      }
    real_server 192.168.246.163 80 {
      weight 1
      inhibit_on_failure
      TCP_CHECK {
            connect_timeout 3
            connect_port 80
            }
      }
}

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

global_defs {
  router_id lvs-keepalived-slave
}

vrrp_instance VI_1 {
 state BACKUP
 interface ens33
 virtual_router_id 80
 priority 50
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.110/24
 }
}
virtual_server 192.168.246.110 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    real_server 192.168.246.162 80 {
      weight 1
      inhibit_on_failure
      TCP_CHECK {
            connect_port 80
            connect_timeout 3
            }
      }
    real_server 192.168.246.163 80 {
      weight 1
      inhibit_on_failure
      TCP_CHECK {
            connect_timeout 3
            connect_port 80
            }
      }
}
3. 启动KeepAlived(主备均启动)
# systemctl start keepalived
# systemctl enable keepalived

# 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
# yum install -y nginx
# yum install -y nginx
# ip addr add dev lo 192.168.246.110/32 #添加环回接口上的 IP 地址
# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
            # arp_ignore 参数控制内核是否忽略对本地 IP 地址的 ARP 请求 ,1为忽视
# sysctl -p   #内核参数配置加载生效
# echo "web1..." >> /usr/share/nginx/html/index.html
# systemctl start nginx 4、数据库高可用

1.两台机器安装mysql
# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# rpm -ivh mysql80-community-release-el7-3.noarch.rpm
# yum -y install yum-utils #安装yum工具包
# vim /etc/yum.repos.d/mysql-community.repo https://i-blog.csdnimg.cn/direct/5feba41a51624f42b7f2c1202246c656.png
安装mysql
# yum install -y mysql-community-server
# systemctl start mysqld
# systemctl enable mysqld
修改密码
# grep pass /var/log/mysqld.log
2020-02-18T13:54:25.706635Z 1 A temporary password is generated for root@localhost: %baWi=4!NsT)
# mysqladmin -uroot -p'%baWi=4!NsT)' password 'QianFeng@123!'
制作互为主从:
# vim /etc/my.cnf   #编辑配置文件开启gtid
log-bin=m1.log  
server-id=1
gtid_mode = ON    #开启gtid
enforce_gtid_consistency=1  #强制gtid移植性
# systemctl restart mysqld
# mysql -uroot -p'QianFeng@123!'#登录数据库
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';  #创建远程登录用户
mysql> flush privileges;
mysql> grant replicationslave,reload,superon *.*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;
# vim /etc/my.cnf
log-bin=m2.log
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
# systemctl restart mysqld
# mysql -uroot -p'QianFeng@123!'
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';
mysql> flush privileges;
mysql> grant replicationslave,reload,superon *.*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
# yum -y install keepalived
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
  router_id master1
}

vrrp_instance VI_1 {
 state MASTER
 interface ens33
 virtual_router_id 80
 priority 100
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.58.16/24
 }
}
将配置文件拷贝到backup机器
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# scp /etc/keepalived/keepalived.conf 192.168.58.136:/etc/keepalived/
# vim /etc/keepalived/keepalived.conf#修改如下
! Configuration File for keepalived

global_defs {
  router_id backup1
}

vrrp_instance VI_1 {
 state BACKUP
 interface ens33
 virtual_router_id 80
 priority 50
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.58.16/24
 }
}
两台机器启动keepalived
# systemctl start keepalived
# systemctl start keepalived
# ip a   #vip在master上面
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
 inet6 ::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 1000
 link/ether 00:0c:29:92:0a:64 brd ff:ff:ff:ff:ff:ff
 inet 192.168.58.135/24 brd 192.168.58.255 scope global dynamic ens33
      valid_lft 1729sec preferred_lft 1729sec
 inet 192.168.58.16/24 scope global secondary ens33
      valid_lft forever preferred_lft forever
 inet6 fe80::86f4:1d74:ad05:c61c/64 scope link
      valid_lft forever preferred_lft forever
测试:
# 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)
验证
# mysql -uroot -p'QianFeng@123!'
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql            |
| performance_schema |
| sys              |
| test1            |
+--------------------+
5 rows in set (0.12 sec)
# systemctl stop keepalived #关闭master
# ip a#vip切换backup机器
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
 inet6 ::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 1000
 link/ether 00:0c:29:a2:0f:5c brd ff:ff:ff:ff:ff:ff
 inet 192.168.58.136/24 brd 192.168.58.255 scope global dynamic ens33
      valid_lft 1547sec preferred_lft 1547sec
 inet 192.168.58.16/24 scope global secondary ens33
      valid_lft forever preferred_lft forever
 inet6 fe80::af6e:2eff:e2d1:99cb/64 scope link
      valid_lft forever preferred_lft forever
测试登录
# mysql -uroot -p'QianFeng@123' -h 192.168.58.16 四、Haproxy 基础

HAProxy提供高可用性、负载平衡以及基于TCP和HTTP的应用署理,支持假造主机,它是免费、快速并且可靠的一种负载平衡解决方案。适合处理高负载站点的七层数据哀求。类似的署理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。
https://i-blog.csdnimg.cn/direct/9f27951453854991b0cf1282528fb259.png
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                 #用户
 grouphaproxy              #组
 daemon          #守护进程方式后台运行
 nbproc 1      #工作进程数量cpu内核是几就写几
defaults 段用于为其它配置段提供默认参数
listen是frontend和backend的结合体

frontend      虚拟服务VIrtual Server
backend      真实服务器Real Server
Keepalived + Haproxy
=================================================================================
拓扑结构

                           

                              
                        192.168.246.169   192.168.246.161

                                       
                  192.168.246.162              192.168.246.163 一、Haproxy实施步骤               
1. 准备工作(集群中所有主机)
# 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
# yum install -y nginx
# systemctl start nginx
# 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 设施上,级别为 info
    log         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 与后端服务器连接超时时间,单位毫秒 ms
    contimeout5000
    # 客户端数据接收超时时间
    clitimeout50000
    # 后端服务器响应超时时间
    srvtimeout50000

# 监听配置 - 管理界面
listen stats
    bind      *:81       # 绑定到所有 IP 的 81 号端口
    stats       enable   # 启用统计信息页面
    stats uri   /haproxy   # 访问统计信息页面的 URI
    stats authqianfeng:123   # 设置访问统计信息页面所需的用户名和密码

# 前端监听配置 - web
frontend web
    mode      http         # 工作模式 HTTP
    bind      *:80         # 监听所有 IP 的 80 号端口
    option      httplog      # 开启 HTTP 日志记录
    # 创建一个 ACL,匹配 URL 结尾为 .html 的请求
    acl         html url_reg -i \.html$
    # 如果请求匹配 .html,则使用后端服务器组 httpservers
    use_backend httpservers if html
    # 默认使用后端服务器组 httpservers
    default_backend httpservers

# 后端服务器组配置 - httpservers
backend httpservers
    balance   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服务器
# scp/etc/haproxy/haproxy.cfg 192.168.246.161:/etc/haproxy/
两台机器启动设置开机启动
# systemctl start haproxy
# systemctl enable haproxy
#check inter 2000        检测心跳频率单位
#rise 2     2 次正确认为服务器可用
#fall 2    2 次失败认为服务器不可用  测试主/备(浏览器访问)
主:
https://i-blog.csdnimg.cn/direct/d1a86a676b254136a2138f9f29dcc4a4.png
备:
https://i-blog.csdnimg.cn/direct/be60b0ece92545608f424c9939f07dba.png
页面主要参数解释
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. 主/备调度器安装软件
# 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 director1
}
vrrp_instance VI_1 {
 state MASTER
 interface ens33
 virtual_router_id 80
 priority 100
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.17/24
 }
}

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
  router_id directory2
}
vrrp_instance VI_1 {
 state BACKUP
 interface ens33
 virtual_router_id 80
 priority 50
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.17/24
 }
}
3. 启动KeepAlived(主备均启动)
# chkconfig keepalived on
# service keepalived start
# ip a

4. 扩展对调度器Haproxy健康检查(可选)
思路:一台机器做
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
a. script
# 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 stop
     systemctl stop keepalived
fi                                                                    
# chmod a+x /etc/keepalived/check_haproxy_status.sh
b. keepalived使用script
# 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 MASTER
 interface ens33
 virtual_router_id 80
 priority 100
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.17/24
 }
 track_script {
     check_haproxy
 }
}
# 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 BACKUP
 interface ens33
 virtual_router_id 80
 priority 50
 advert_int 1
 authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
       192.168.246.17/24
 }
 track_script {
     check_haproxy
 }
}
# systemctl restart keepalived
# systemctl restart keepalived
注:必须先启动haproxy,再启动keepalived
两台机器都配置haproxy的日志:需要打开注释并添加
# vim /etc/rsyslog.conf
# Provides UDP syslog reception
#由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
$ModLoad imudp
$UDPServerRun 514
找到  #### RULES ####   下面添加
local2.info                       /var/log/haproxy.log
# systemctl restart rsyslog
# systemctl restart haproxy
# tail -f /var/log/haproxy.log
2019-07-13T23:11:35+08:00 localhost haproxy: Connect from 192.168.246.1:56866 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:11:35+08:00 localhost haproxy: Connect from 192.168.246.1:56867 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:13:39+08:00 localhost haproxy: Connect from 192.168.246.1:56889 to 192.168.246.17:80 (stats/HTTP)
2019-07-13T23:13:39+08:00 localhost haproxy: Connect from 192.168.246.1:56890 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:14:07+08:00 localhost haproxy: Connect from 192.168.246.1:56895 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:14:07+08:00 localhost haproxy: Connect from 192.168.246.1:56896 to 192.168.246.17:80 (stats/HTTP) 3、四层署理mysql

准备两台机器,关闭防火墙和selinux。
1.两台机器部署mysql并制作互为主从----略
2.安装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
 log         127.0.0.1 local2
 pidfile     /var/run/haproxy.pid
 maxconn     4000
 user      haproxy
 group       haproxy
 daemon
 nbproc 1
defaults
 mode                  http
 log                     global
 option                redispatch
 retries                 3
 maxconn                 3000
 contimeout            5000
 clitimeout            50000
 srvtimeout            50000
listen stats
 bind            *:81
 stats                     enable
 stats uri               /haproxy
 stats auth              qianfeng:123
listen mysql
 bind *:3307
 mode tcp
 balance roundrobin
 server mysql1 192.168.198.149:3306 weight 1check inter 1s rise 2 fall 2
 server mysql2 192.168.198.150:3306 weight 1check inter 1s rise 2 fall 2
# systemctl start haproxy
# netstat -lntp | grep 3307
tcp      0    0 0.0.0.0:3307          0.0.0.0:*               LISTEN    11866/haproxy

3.验证:
# mysql -uroot -p'QianFeng@123!' -P 3307
mysql: 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是一款什么软件?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 负载平衡、高可用