负载均衡、高可用

负载均衡

负载均衡(Load Balance):可以利用多个计算机和组合进行海量请求处理,从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。通过负载均衡使请求可以在计算机集群中尽可能平均地分摊处理。每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。

分类

负载均衡根据所采用的设备对象(软/硬件负载均衡 )、应用的OSI网络层次(网络层次上的负载均衡)等来分类。

在实际应用中,比较常见的就是四层负载及七层负载。

四层负载均衡(基于IP+端口的负载均衡)

四层负载均衡,主要通过报文中的目标地址和端口,以及负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

Matlab 复制代码
以常见的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)优势
Matlab 复制代码
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负载均衡工作模式

Matlab 复制代码
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 是一种高效的负载均衡实现方式,尤其适用于需要高性能且服务器位于同一物理网段的场景。然而,它对于网络拓扑有一定的要求,这可能限制了其适用范围。

Matlab 复制代码
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 具备一定的配置和技术支持。

Matlab 复制代码
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的区别
Matlab 复制代码
lvs-nat:请求和响应报文都经由Director负载均衡器
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
5、LVS ipvsadm 命令
1、LVS-server安装lvs管理软件
Matlab 复制代码
yum -y install ipvsadm
2、命令选项
Matlab 复制代码
-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管理软件
Matlab 复制代码
[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

Matlab 复制代码
[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
Matlab 复制代码
[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分发策略
Matlab 复制代码
-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为例)

Matlab 复制代码
~]# 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?同一个网段内子网掩码最长的

测试

Matlab 复制代码
# yum install -y elinks
# elinks -dump http://192.168.246.160  #--dump:非交互式模式
# elinks -dump http://192.168.246.160  #交互式

5、Linux内核模块

Matlab 复制代码
查看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)

Matlab 复制代码
[root@real-server1 ~]# yum install -y nginx
[root@real-server1 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
两台机器都安装,按顺序添加不同的主机名以示区分

LVS/NAT模式实施

1、准备工作

(集群中所有主机)[可选]每台机器都需要做

Matlab 复制代码
[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

Matlab 复制代码
 ~]# route add default gw 192.168.246.166  dev ens33

最好是将real-server的ip设置成静态ip。网关设置为Directory的Dip。

3、Director分发器配置

先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,做为VIP。

Matlab 复制代码
[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的分发策略

Matlab 复制代码
[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简介

Matlab 复制代码
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配置详解

Matlab 复制代码
# 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负载均衡配置状态参数

Matlab 复制代码
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails 可以和 fail_timeout一起使用。
Matlab 复制代码
配置安装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
调度到不同组后端服务器
网站分区进行调度
复制代码
=================================================================================
​
拓扑结构
Matlab 复制代码
​                            [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.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.html  index.html     index.html      index.html   index.html
复制代码
一、实施过程 
Matlab 复制代码
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.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;
       }       
[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
Matlab 复制代码
注:主/备调度器均能够实现正常调度
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
    }
}
​
[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                    #设置为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(主备均启动)
[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 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
[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 stop
    systemctl 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 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四层负载

Matlab 复制代码
KeepAlived在该项目中的功能:
1. 管理IPVS的路由表(包括对RealServer做健康检查)
2. 实现调度器的HA(High Availability高可用性)
http://www.keepalived.org
Keepalived所执行的外部脚本命令建议使用绝对路径
复制代码
实施步骤:
Matlab 复制代码
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 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
            }
        }
}
​
[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 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(主备均启动)
[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
Matlab 复制代码
[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
Matlab 复制代码
安装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
Matlab 复制代码
mysql> show slave status\G

两台机器安装keepalived

Matlab 复制代码
[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 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机器
[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 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
[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 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
测试:
[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 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
测试登录
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16

四、Haproxy 基础

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。

Matlab 复制代码
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 实现七层负载高可用

Matlab 复制代码
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
Matlab 复制代码
一、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 设施上,级别为 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
    contimeout  5000
    # 客户端数据接收超时时间
    clitimeout  50000
    # 后端服务器响应超时时间
    srvtimeout  50000

# 监听配置 - 管理界面
listen stats
    bind        *:81       # 绑定到所有 IP 的 81 号端口
    stats       enable     # 启用统计信息页面
    stats uri   /haproxy   # 访问统计信息页面的 URI
    stats auth  qianfeng: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服务器
[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 次失败认为服务器不可用

测试主/备(浏览器访问)

主:

备:

Matlab 复制代码
页面主要参数解释
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests     //最大的队列请求数量
Limit:           //队列限制数量
​
Errors
Req:request errors             //错误请求
Conn:connection errors          //错误的连接
​
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk:    持续检查后端服务器的时间
Wght: (weight) : 权重
Matlab 复制代码
2.测试访问
通过访问haparoxy的ip地址访问到后端服务器
# curl http://192.168.246.169
如果出现bind失败的报错,执行下列命令
setsebool -P haproxy_connect_any=1

2、Keepalived实现调度器HA

注:主/备调度器均能够实现正常调度

Matlab 复制代码
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 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
    }
}
​
[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 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(主备均启动)
[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 stop
        systemctl 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 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
    }
}
[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 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
    }
}
[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

Matlab 复制代码
准备两台机器,关闭防火墙和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
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 1  check inter 1s rise 2 fall 2
    server 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.制作高可用---作业

练习

Matlab 复制代码
1.lvs的优势有哪些?
2.keepalived基于什么协议实现?工作原理是什么?
3.lvs有几种工作模式分别是什么?
4.haproxy的优点有哪些?
5.列出你知道的负载均衡软件有哪些?
6.keepalived是一款什么软件?
相关推荐
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦2 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj2 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei2 天前
linux 系统目录详解
linux·运维·服务器