高可用集群
集群类型
集群类型主要分为负载均衡集群(LB)、高可用集群(HA)和高性能计算集群(HPC)三大类。每种集群类型都有其特定的应用场景和优势。
1. 负载均衡集群(LB)
负载均衡集群主要用于提高系统的性能、响应效率和可靠性,通过将访问请求分散到多个服务器上,以减少单个服务器的负载压力,从而提高整体的处理能力和访问速度。在负载均衡集群中,LVS(Linux Virtual Server)和haproxy是两种常用的软件解决方案。
- LVS(Linux Virtual Server):
- LVS是一个开源的负载均衡器,它工作在OSI模型的第四层(传输层),通过IP负载均衡技术实现高效的请求分发。
- LVS支持多种工作模式,包括NAT(网络地址转换)、DR(直接路由)和TUN(IP隧道)等,每种模式都有其特定的应用场景和优缺点。
- LVS通过IPVS(IP Virtual Server)模块实现负载均衡,IPVS是LVS集群系统的核心软件,负责将客户端的请求转发到后端的真实服务器上。
- haproxy:
- haproxy是一个高性能的TCP/HTTP反向代理服务器和负载均衡器,支持大量的并发连接和高可用性。
- haproxy提供了灵活的负载均衡算法,如轮询、最少连接数、源地址哈希等,可以根据实际需求进行配置。
- haproxy还支持SSL卸载、HTTP压缩、会话保持等高级功能,可以进一步提升系统的性能和安全性。
2. 高可用集群(HA)
高可用集群主要用于提高系统的可靠性和可用性,确保在部分服务器出现故障时,整个系统仍然能够持续提供服务。在高可用集群中,keepalived是一款常用的开源软件。
- keepalived:
- keepalived通过虚拟路由冗余协议(VRRP)实现高可用性,它可以在主服务器出现故障时,自动将虚拟IP地址和服务切换到备份服务器上,从而确保服务的连续性。
- keepalived还提供了多种健康检查机制,如ICMP Ping、TCP端口检测和HTTP GET等,用于监测后端服务器的运行状态。
- keepalived的配置相对简单,易于管理和维护,是构建高可用集群的常用选择之一。
3. 高性能计算集群(HPC)
高性能计算集群主要用于处理大规模的计算任务,如科学计算、数据分析、工程仿真等。HPC集群通过将多个高性能计算机连接在一起,利用并行计算和分布式计算技术,提高整体的计算能力和处理速度。
- HPC集群的特点:
- 高性能:HPC集群采用高性能的计算机和存储设备,能够提供卓越的计算能力和存储性能。
- 可扩展性:HPC集群可以根据实际需求进行扩展,增加更多的计算节点和存储设备,以满足更大规模的计算任务。
- 灵活性:HPC集群支持多种操作系统和应用程序,可以灵活配置和部署,以适应不同的计算需求。
实现高可用
提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
解决方案:建立冗余机制
主备、主主
active/passive 主/备
active/active 双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active
VRRP虚拟路由冗余协议
解决单点故障
VIP
VMAC
工作方式:抢占、非抢占、延时抢占
keepalived部署
简介
vrrp协议的软件实现,设计目的是为了高可用ipvs服务
负载均衡是一种在真实集群之间分配 IP 流量的方法 服务器,提供一个或多个高可用性虚拟服务。在设计负载均衡拓扑时,必须考虑负载均衡器本身以及后面的真实服务器的可用性。
Keepalived 为负载均衡和高可用性提供了框架。 负载均衡框架依赖于众所周知且广泛使用的 Linux 虚拟服务器 (IPVS) 内核模块,提供第 4 层负载均衡。 Keepalived 实现了一组健康检查器,以动态和自适应的方式 根据服务器池的运行状况维护和管理负载均衡的服务器池。 高可用性是通过虚拟冗余路由协议实现的 (VRRP)。VRRP是路由器故障切换的基础砖块。keepalived也 实现了一组到 VRRP 有限状态机的钩子 提供低级和高速协议交互。每个Keepalived 框架可以单独使用,也可以一起使用,以提供弹性基础设施。
简而言之,Keepalived 提供了两个主要功能:
- LVS系统的健康检查
- 实施 VRRPv2 堆栈以处理负载均衡器故障切换
架构
用户空间核心组件:
vrrp stack:VIP消息通告
checkers:监测real server
system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
IO复用器:针对网络目的而优化的自己的线程抽象
内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
特点
- 部署简单,只需要配置一个配置文件即可
- 加入了虚拟路由冗余协议,可以保证业务或网络不间断稳定运行
核心功能
- 健康检查
1、采用tcp三次握手,icmp请求,http请求,udp 、
2、echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
- 故障切换
1、主要应用在配置了主备的服务器上,使用虚拟路由冗余协议维持主备之间的心跳
2、当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性
环境部署
四台主机 vip:100
realserver1:110
realserver2:120
KA1:10
KA2:20
关闭selinux、防火墙
[root@realserver1 ~]# getenforce
Disabled
[root@realserver1 ~]# systemctl status firewalld
realserver1/2中安装httpd
[root@realserver1 ~]# yum install httpd -y
[root@realserver1 ~]# echo 192.168.86.110 > /var/www/html/index.html
[root@realserver1 ~]# systemctl enable --now httpd
[root@realserver2 ~]# echo 192.168.86.120 > /var/www/html/index.html
安装配置服务
KA1/2中
[root@Ka1 ~]# yum install keepalived -y
配置文件都是以块(block)的形式组成,每一个块的内容都包含在{ }中
主配置文件
[root@Ka1 ~]# vim /etc/keepalived/keepalived.conf
修改全局配置
! Configuration File for keepalived
global_defs {
notification_email {
594233887@qq.com #keepalived
timiniglee-zln@163.com
}
notification_email_from keepalived@KA1.timinglee.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.timinglee.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_gna_interval 0 后面有0
vrrp_route_id--必须唯一
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.86.100/24 dev eth0 label eth0:1
}
}
修改后重启
[root@Ka1 ~]# systemctl enable --now keepalived.service
把配置复制到另一台
[root@Ka1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.86.20:/etc/keepalived/keepalived.conf
修改优先级、state
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
测试效果--抓包命令
[root@Ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18
解决VIP不能通信
global_defs {
notification_email {
1540509690@qq.com
}
notification_email_from keepalived@timinglee.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.timinglee.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
vrrp_iptables
}
日志
生成日志
[root@ka1 ~]# vim /etc/sysconfig/keepalived
指定0-7
KEEPALIVED_OPTIONS="-D -S 6"
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# vim /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.* /var/log/boot.log
local6.* /var/log/keepalived.log
查看是否生成
[root@ka1 ~]# systemctl restart rsyslog.service
[root@ka1 ~]# systemctl restart keepalived.service
测试
[root@ka1 ~]# ll /var/log/keepalived.log
-rw------- 1 root root 8168 Aug 11 21:11 /var/log/keepalived.log
独立配置子文件
创建子配置目录
[root@Ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@Ka1 ~]# vim /etc/keepalived/conf.d/192.168.86.100.conf
修改主配置文件
[root@Ka1 ~]# vim /etc/keepalived/keepalived.conf
#vrrp_instance VI_1 {
# state MASTER
# interface eth0
# virtual_router_id 100
# priority 100
# advert_int 1
# authentication {
# auth_type PASS
# auth_pass 1111
# }
# virtual_ipaddress {
# 192.168.86.100/24 dev eth0 label eth0:1
# }
#}
include "/etc/keepalived/conf.d/*.conf"
注释掉上面的加入指向子配置文件路径
include "/etc/keepalived/conf.d/*.conf"
在子配置文件写配置
[root@Ka1 ~]# cat /etc/keepalived/conf.d/192.168.86.100.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.86.100/24 dev eth0 label eth0:1
}
}
[root@Ka1 ~]#
然后重启服务
[root@Ka1 ~]# systemctl restart keepalived.service
[root@Ka1 ~]# systemctl restart rsyslog.service
Keepalived企业应用示例
抢占模式和非抢占模式
默认为抢占模式,推荐使用非抢占模式
[root@Ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
advert_int 1
nopreempt #设置非抢占模式
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.86.100/24 dev eth0 label eth0:1
}
}
#include "/etc/keepalived/conf.d/*.conf"
重启keepalived
延时抢占
[root@Ka1 ~]# vim /etc/keepalived/keepalived.conf
preempt_delay 5s #设置延迟5s抢占
VIP单播配置
[root@Ka1 ~]# vim /etc/keepalived/keepalived.conf
禁用vrrp_strict
10:
unicast_src_ip 192.168.86.10
unicast_peer {
192.168.86.20
}
20:
unicast_src_ip 192.168.86.20
unicast_peer {
192.168.86.10
}
效果:
[root@Ka1 ~]# tcpdump -i eth0 -nn src host 192.168.86.10 and dst 192.168.86.20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:46:13.904625 IP 192.168.86.10 > 192.168.86.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
邮件通知
[root@ka1 ~]# yum install mailx -y
[root@ka1 ~]# vim /etc/mail.rc
[root@ka1 ~]# echo hello world | mail -s test 2584896723@qq.com
set from=2584896723@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2584896723@qq.com
set smtp-auth-password=rbdnzxqskffidjjj
set smtp-auth=login
set ssl-verify=ignore
QQ邮箱-->账号与安全-->安全设置
[root@ka1 ~]# vim /etc/keepalived/mail.sh
#! /bin/bash
mail_dst="2584896723@qq.com"
send_message()
{
mail_sub="$HOSTNAME to be $1 vip move"
mail_msg="`date +%F\ %T`:vrrp move $HOSTNAME chage $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
[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
#按如下添加的配置
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
实现master/master的keepalived双主架构
ka1第二个
ka2第二个
实现IPVS的高可用性(LVS+keepalived)
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
[root@realserver2 ~]# sysctl -p
[root@realserver2 ~]# sysctl --system
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 192.168.86.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR.
#persistence_timeout 50
protocol TCP
real_server 192.168.86.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
real_server 192.168.86.110 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
###############################################################
real_server 192.168.86.120 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 192.168.86.100 80{
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.86.110 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
##################################################################
real_server 192.168.86.120 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
[root@ka2 ~]# curl 172.25.254.110
172.25.254.110
[root@ka2 ~]# systemctl restart keepalived.service
实现其他应用的高可用性 VRRP Script(keepalived+haproxy)
利用脚本实现主从角色切换
[root@ka1 ~]# vim /etc/keepalived/test.sh
#! /bin/bash
[ ! -f /mnt/lee ]
[root@ka1 ~]# sh /etc/keepalived/test.sh
[root@ka1 ~]# echo $?
0
[root@ka1 ~]# touch /mnt/lee
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
[root@ka1 ~]# sh /etc/keepalived/test.sh
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_file {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
...
track_script {
check_file
}
...
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# ls /mnt/lee
/mnt/lee
keepalived+haproxy实现高可用
[root@ka1 ~]# yum install haproxy -y
两台主机都做
[root@ka1 ~]# vim /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_nonlocal_bind=1
[root@ka1 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@ka1 ~]# systemctl enable --now haproxy.service
listen webcluster
bind 192.168.86.100:80
mode http
balance roundrobin
server web1 192.168.86.110:80 check inter 3 fall 2 rise 5
server web2 192.168.86.120:80 check inter 3 fall 2 rise 5
[root@ka1 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
检测HAproxy状态
[root@ka2 ~]# killall -0 haproxy
[root@ka2 ~]# echo $?
0
[root@ka2 ~]#
检测脚本
[root@ka1 ~]# vim /etc/keepalived/test.sh
[root@ka1 ~]# cat /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@ka1 ~]#