一、高可用集群
1、类型
- LB:Load Balance 负载均衡 --- LVS/HAProxy/nginx(http/upstream, stream/upstream)
- LVS(Linux Virtual Server)是基于 Linux 内核实现的四层负载均衡技术,具有高性能和高可靠性。它通过修改 IP 数据包的目的地址和端口来实现负载分发。
- HAProxy 是一款提供高可用性、负载均衡和基于 TCP 和 HTTP 应用的代理软件。它支持七层负载均衡,可以根据 HTTP 请求的内容进行更精细的流量分发。
- Nginx 不仅是一个优秀的 Web 服务器,也具备强大的负载均衡功能。在 http/upstream 中可以配置基于 HTTP 协议的负载均衡,而 stream/upstream 用于配置基于 TCP 协议的负载均衡。
- HA:High Availability 高可用集群 --- 数据库、Redis
- 数据库:通过主从复制、数据备份与恢复、故障自动切换等技术来保障数据的可用性和业务的连续性。例如 MySQL 的主从架构,当主库出现故障,从库可以迅速切换为主库继续提供服务。
- Redis 也可以通过集群模式、主从复制等方式实现高可用性。比如 Redis Sentinel 可以监控 Redis 主从节点的状态,实现自动故障切换。
- SPoF: Single Point of Failure,解决单点故障
单点故障是指系统中某个组件的故障会导致整个系统无法正常工作。解决单点故障就是通过冗余、备份、故障转移等策略消除这种风险。
- HPC:High Performance Computing 高性能集群
将多个计算机通过高速网络连接起来,协同完成大规模计算任务。
通常用于科学计算、工程模拟、大数据分析等需要强大计算能力的领域。比如气象预测模型的计算、基因序列的分析等。通过并行计算、分布式存储等技术,高性能集群能够大幅提高计算效率,缩短计算时间。
2、系统可用性
3、系统故障
4、实现高可用
- active/passive 主/备
- active/active 双主
- active --> HEARTBEAT --> passive
- active <--> HEARTBEAT <--> active
5、VRRP(Virtual Router Redundancy Protocol)
- 物理层:路由器、三层交换机
- 软件层:keepalived
(1)作用
出口网关的备份,保证出口网关的高可用性。
(2)相关术语
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
(3)相关技术
二、keepalived
1、简介
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
2、架构
说明:
3、配置虚拟路由器
ka1
下载keepalived
yum install -y keepalived
systemctl restart keepalived
打开keepalived主配值文件
vim /etc/keepalived/keepalived.conf
按照如图编辑
systemctl restart keepalived.service
ka2
下载keepalived
yum install -y keepalived
systemctl restart keepalived
打开keepalived主配值文件
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived.service
测试一下
4、 启用日志
ka1
编辑keepalived文件
vim /etc/sysconfig/keepalived
编辑rsyslog.conf文件,定义日志级别和日志文件
vim /etc/rsyslog.conf
systemctl restart keepalived.service
systemctl restart rsyslog
查看一下日志是否存在
ll /var/log/keepalived.service
ka2操作同ka1
5、子配置文件
include /path/file
ka1
vim /etc/keepalived/keepalived.conf
将虚拟路由器配置全部注释,在复制到子配置文件中
mkdir -p /etc/keepalived/conf.d
编写子配置文件
vim /etc/keepalived/keepalived.conf/172.25.254.100.conf
systemctl restart keepalived.service
ka2操作同上
测试
tcpdump -i eth0 -nn host 224.0.0.18
6、抢占式和非抢占式
- 抢占模式preempt(默认),即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,这样会使vip在KA主机中来回漂移,造成网络抖动。
- 非抢占模块,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机。
- 建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的maste角色
(1)默认抢占模式
tcpdump -i eth0 -nn host 224.0.0.10
开启ka1
(2)非抢占模式
ka1
vim /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
关闭ka1服务后在开启
(3)延迟抢占
ka1
7、VIP单播配置
(1)配置
ka1
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived.service
ka2
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived.service
(3)抓包查看单播效果
tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20
8、邮件
dnf install mailx -y
ka1
vim /etc/keepalived/keepalived.conf
vim /etc/mail.rc
在末尾添加以下内容
set from=3499017131@qq.com //你的QQ邮箱set smtp=smtp.qq.comset smtp-auth-user=3499017131@qq.comset smtp-auth-password=**************set smtp-auth=loginset ssl-verify=ignore
smtp-auth-password获取:
- 登录QQ邮箱
- 点击“账号与安全”
- 点击“安全设置”
- 生成授权码
- 复制授权码,粘贴到“smtp-auth-password=”
vim /etc/keepalived/mail.sh
给脚本添加可执行权限#!/bin/bash
mail_dst=3041609716@qq.com
send_message()
{
mail_sub="$HOME to be $1 vip move"
mail_msg="`date +%F\ %T`:vrrp move $HOSTNAME change $1"
echo $mail_msg | mail -s "$mail_sub" $mail_dst
}
case $1 in
master)
send_message master
;;
backup)
send_message backup
;;
fault)
send_message fault
;;
*)
;;
esac
chmod +x /etc/keepalived/mail.sh
重启服务
systemctl restart keepalived.service
测试
echo hello | mail -s test 3499017131@qq.com
QQ邮箱就会收到邮件
调用脚本
/etc/keepalived/mail.sh master
/etc/keepalived/mail.sh default
/etc/keepalived/mail.sh backup
当VIP跳转时就会自动发送邮件
9、实现 master/master 的 Keepalived 双主架构
- master/slave的单主架构:同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
- master/master 的双主架构: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率
ka1
vim /etc/keepalived/keepalived.conf
修改以下部分
global_defs {
notification_email {
11111111@qq.com
}
notification_email_from keepalived@lm.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.lm.org
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 200
priority 80
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
systemctl restart keepalived
ka2
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
11111111@qq.com
}
notification_email_from keepalived@lm.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka2.lm.org
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 200
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
systemctl restart keepalived
三、实现IPVS的高可用性
1、虚拟服务器配置结构
virtual_server IP port {
...
real_server {
...
}
real_server {
...
}
…
}
2、virtual server (虚拟服务器)的定义格式
virtual_server IP port # 定义虚拟主机 IP 地址及其端口virtual_server fwmark int #ipvs 的防火墙打标,实现基于防火墙的负载均衡集群virtual_server group string # 使用虚拟服务器组
3、虚拟服务器配置
virtual_server IP port { #VIP 和 PORTdelay_loop <INT> # 检查后端服务器的时间间隔lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法lb_kind NAT|DR|TUN # 集群的类型 , 注意要大写persistence_timeout <INT> # 持久连接时长protocol TCP|UDP|SCTP # 指定服务协议 , 一般为 TCPsorry_server <IPADDR> <PORT> # 所有 RS 故障时,备用服务器地址real_server <IPADDR> <PORT> { #RS 的 IP 和 PORTweight <INT> #RS 权重notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状态检测方法}}
4、应用层监测(HTTP_GET|SSL_GET )
HTTP_GET|SSL_GET {url {path <URL_PATH> # 定义要监控的 URLstatus_code <INT> # 判断上述检测机制为健康状态的响应码,一般为 200}connect_timeout <INTEGER> # 客户端请求的超时时长 , 相当于 haproxy 的 timeout servernb_get_retry <INT> # 重试次数delay_before_retry <INT> # 重试之前的延迟时长connect_ip <IP ADDRESS> # 向当前 RS 哪个 IP 地址发起健康状态检测请求connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求bindto <IP ADDRESS> # 向当前 RS 发出健康状态检测请求时使用的源地址bind_port <PORT> # 向当前 RS 发出健康状态检测请求时使用的源端口}
5、TCP监测
传输层监测:TCP_CHECK
TCP_CHECK {connect_ip <IP ADDRESS> # 向当前 RS 的哪个 IP 地址发起健康状态检测请求connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址bind_port <PORT> # 发出健康状态检测请求时使用的源端口connect_timeout <INTEGER> # 客户端请求的超时时长# 等于 haproxy 的 timeout server}
四、实现其它应用的高可用性 VRRP Script
1、VRRP Script 配置
(1)定义脚本
vrrp_script :自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,
定义在vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对 MASTER 节点的权
重减至低于SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点。
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> # 此脚本返回值为非 0 时,会触发下面 OPTIONS 执行OPTIONS}
(2)调用脚本
track_script {SCRIPT_NAME_1SCRIPT_NAME_2}
2、定义VRRP script
vrrp_script <SCRIPT_NAME> { # 定义一个检测脚本,在 global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell 命令或脚本路径
interval <INTEGER> # 间隔时间,单位为秒,默认 1 秒
timeout <INTEGER> # 超时时间
weight <INTEGER:-254..254> # 默认为 0, 如果设置此值为负数,
# 当上面脚本返回值为非 0 时
# 会将此值与本节点权重相加可以降低本节点权重,
# 即表示 fall.
# 如果是正数,当脚本返回值为 0 ,
# 会将此值与本节点权重相加可以提高本节点权重
# 即表示 rise. 通常使用负值
fall <INTEGER> # 执行脚本连续几次都失败 , 则转换为失败,建议设为 2 以上
rise <INTEGER> # 执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] # 执行监测脚本的用户或组
init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
3、调用 VRRP script
vrrp_instance test {... ...track_script {check_down}}
五、实现Keepalived-HAProxy
实验环境:纯净状态下
reslserver1 | realserver2 | ka1 | ka2 |
ip:172.25.254.110 | ip:172.25.254.120 | ip:172.25.254.10 | ip:172.25.254.20 |
realserver1
1、修改IP
nmcli connection modify eth0 ipv4.address 172.25.254.110/24
nmcli connection up eth0
yum install -y httpd
3、启动服务
systemctl restart httpd
4、重定向web服务内容
echo realserver1 -172.25.254.110 > /var/www/html/index.html
5、重启服务
systemctl restart httpd
realserver2
1、修改IP
nmcli connection modify eth0 ipv4.address 172.25.254.120/24
nmcli connection up eth0
yum install -y httpd
3、启动服务
systemctl restart httpd
4、重定向web服务内容
echo realserver1 -172.25.254.120 > /var/www/html/index.html
5、重启服务
systemctl restart httpd
ka1
1、下载keepalived
yum install -y keepalived
2、启动keepalived
systemctl restart keepalived.service
3、修改配置
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
sysctl -p
net.ipv4.ip_nonlocal_bind = 1
4、编写创建判断haproxy的脚本
vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
chmod +x /etc/keepalived/test.sh
6、修改keepalived主配置文件
vim /etc/keepalived/test.sh
global_defs {
notification_email {
11111111@qq.com
}
notification_email_from keepalived@lm.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.lm.org
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
inerval 1
weight -30
fall 2
rise 2
timout 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
track_script {
check_haproxy
}
}
systemctl restart keepalived
8、下载haproxy
yum install -y haproxy
9、配置haproxy主配置文件
vim /etc/haproxy/haproxy.cfg
添加以下内容
listen webcluster
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.110:80 check inter 2 fall 3 rise 5
server web1 172.25.254.120:80 check inter 2 fall 3 rise 5
重启服务
systemctl restart haproxy
ka2
1、下载keepalived
yum install -y keepalived
2、启动keepalived
systemctl restart keepalived.service
3、修改配置
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
sysctl -p
net.ipv4.ip_nonlocal_bind = 1
4、编写创建判断haproxy的脚本
vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
chmod +x /etc/keepalived/test.sh
6、修改keepalived主配置文件
vim /etc/keepalived/test.sh
global_defs {
notification_email {
11111111@qq.com
}
notification_email_from keepalived@lm.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.lm.org
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
inerval 1
weight -30
fall 2
rise 2
timout 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.10
}
track_script {
check_haproxy
}
}
systemctl restart keepalived
8、下载haproxy
yum install -y haproxy
9、配置haproxy主配置文件
vim /etc/haproxy/haproxy.cfg
添加以下内容
listen webcluster
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.110:80 check inter 2 fall 3 rise 5
server web1 172.25.254.120:80 check inter 2 fall 3 rise 5
重启服务
systemctl restart haproxy
测试
在ka1上,停止haproxy服务,分别查看ka1,ka2的ifconfig,查看VIP是否飘动
systemctl restart haproxy.service