目录
1.5、VRRP:Virtual Router Redundancy Protocol
3.1、实现master/slave的 Keepalived 单主架构
3.5、实现 master/master 的 Keepalived 双主架构
引言
在当今的互联网时代,服务的高可用性是企业关注的焦点。Keepalived 作为一个强大的高可用解决方案,通过 VRRP(Virtual Router Redundancy Protocol)协议,确保了网络服务的连续性和稳定性。本文将详细介绍 Keepalived 的基本概念、部署方法以及企业应用示例。
一.高可用集群
1.1、高可用集群类型
- LB(Load Balance):负载均衡,使用 LVS/HAProxy/nginx 等工具。
- HA(High Availability):高可用集群,常用于数据库、Redis 等。
- SPoF(Single Point of Failure):解决单点故障问题。
- HPC(High Performance Computing):高性能计算集群。
1.2、系统可用性
- SLA(Service-Level Agreement):服务等级协议,定义服务的品质、水平、性能等。
- 可用性指标:99.9%, 99.99%, 99.999%, 99.9999%。
1.3、系统故障
- 硬件故障:可能由设计缺陷、损耗或不可抗力因素引起。
- 软件故障:通常由设计缺陷或 bug 引起。
1.4、实现高可用
- 降低 MTTR(Mean Time To Repair,平均故障恢复时间)。
- 建立冗余机制,如 active/passive 主备模式或 active/active 双主模式。
1.5、VRRP:Virtual Router Redundancy Protocol
VRRP,即虚拟路由器冗余协议(Virtual Router Redundancy Protocol),是一种在网络中提供高可用性解决方案的协议。它允许多个路由器共同拥有一个或多个虚拟IP地址,并且在这些路由器之间实现主备切换,以确保网络服务的连续性。以下是关于VRRP的一些关键点:
1.5.1、基本概念
- 虚拟路由器:一组路由器共同拥有一个虚拟的IP地址,对外表现为单一的逻辑路由器。
- VIP(Virtual IP):虚拟路由器对外的IP地址,客户端使用这个IP地址进行通信。
- VMAC(Virtual MAC):虚拟路由器的MAC地址,格式通常为
00-00-5e-00-01-{VRID}
。
1.5.2、工作机制
- 主设备(Master):在一组路由器中,被选举为主设备的路由器负责处理通过VIP的所有流量。
- 备份设备(Backup):其他路由器作为备份,监控主设备的健康状况。
- 选举机制:通过优先级(Priority)和认证信息等参数来选举主设备。
1.5.3、故障转移
- 当主设备出现故障时,备份设备中的一个将被选举为新的主设备,接管VIP,继续提供服务。
- 故障转移通常是快速且透明的,对终端用户没有影响。
1.5.4、配置要点
- VRID(Virtual Router ID):用于区分不同的虚拟路由器组,每个虚拟路由器组内的所有设备必须使用相同的VRID。
- 优先级(Priority):决定选举主设备时的权重,优先级高的设备更有可能成为主设备。
- 认证方法:包括无认证、简单字符认证和MD5认证,用于增强通信的安全性。
1.5.6、工作模式
- 抢占式(Preempt):高优先级的备份设备在恢复时会抢占低优先级的主设备。
- 非抢占式(Nopreempt):高优先级的备份设备在恢复后不会抢占主设备,除非主设备再次出现故障。
1.5.7、工具支持
- Keepalived:广泛使用的VRRP协议实现,支持Linux操作系统。
VRRP 是一种有效的网络高可用性解决方案,它通过简化路由器的冗余配置,减少了单点故障的风险,并提高了网络的稳定性和可靠性。
二、 Keepalived 部署
2.1、keepalived 简介
Keepalived 是一款强大的开源软件,用于实现 Linux 系统上的高可用性。它主要通过 VRRP(Virtual Router Redundancy Protocol)协议来确保网络中的虚拟路由器在主节点故障时能够无缝切换到备份节点,从而保证网络服务的连续性和稳定性。以下是 Keepalived 的几个关键概述点:
2.1.1、功能特点
- VRRP 支持:Keepalived 实现了 VRRP 协议,能够在多个路由器之间共享虚拟 IP 地址,实现故障切换。
- 健康检查:提供对后端服务(如 HTTP 服务器、数据库等)的健康检查功能,确保流量只会被路由到健康的服务上。
- 负载均衡:虽然 Keepalived 主要用于高可用性,但它也可以用于简单的负载均衡场景。
2.1.2、架构组成
- vrrp stack:处理 VRRP 协议的栈。
- checkers:用于监测真实服务器状态的组件。
- system call:在 VRRP 协议状态转换时调用脚本的功能。
- SMTP:邮件组件,用于在发生故障切换时发送通知邮件。
- IPVS wrapper:用于生成 IPVS(IP Virtual Server)规则的组件。
- Netlink Reflector:网络接口组件。
- WatchDog:监控进程,确保 Keepalived 本身的稳定性。
2.1。3、部署场景
- 主备切换:在主服务器故障时,自动将服务切换到备份服务器。
- 负载均衡:在多个服务器之间分配网络流量,提高资源利用率。
- 故障检测与恢复:定期检查服务状态,快速响应故障并进行恢复。
2.1.4、配置要点
- VRRP 实例:定义 VRRP 配置的实例,包括状态、接口、虚拟路由器 ID、优先级等。
- 虚拟 IP 地址:配置一个或多个虚拟 IP 地址,这些 IP 将在主节点和备份节点之间共享。
- 认证方法:设置认证方法以增强 VRRP 通信的安全性。
- 通知脚本:定义在状态变化时执行的脚本,如发送邮件通知。
2.1.5、企业应用
- 数据库高可用:确保数据库服务的高可用性,减少系统停机时间。
- Web 服务负载均衡:为 Web 应用提供负载均衡,提高访问速度和系统稳定性。
- 多数据中心容灾:在多个数据中心部署 Keepalived,实现跨地域的高可用性。
Keepalived 是构建高可用网络基础设施的重要工具,适用于需要高可靠性和故障恢复能力的企业和组织。通过合理配置和使用 Keepalived,可以显著提高服务的稳定性和用户满意度。
2.2、Keepalived 环境准备
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
2.3、Keepalived 安装与配置
安装 keepalived
[root@ka1 ~]# yum install keepalived -y
[root@ka1 ~]# systemctl start keepalived
[root@ka2 ~]# yum install keepalived -y
[root@ka2 ~]# systemctl start keepalived
全局配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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
}
配置虚拟路由器
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100 #将ka2中的优先级设置为80
advert_int 1
#nopreempt
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
#设置VIP
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
# }
}
测试;
2.4、启用keepalived日志功能
[root@ka1 ~]# vim /etc/sysconfig/keepalived
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# vim /etc/rsyslog.conf
[root@ka1 ~]# systemctl restart rsyslog.service
测试
2.5、实现独立子配置文件
- 当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理
- 将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件
#vrrp_instance VI_1 {[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
#注销vrrp,写入conf.d文件
# state MASTER
# interface eth0
# virtual_router_id 100
# priority 100
# advert_int 1
# authentication {
# auth_type PASS
# auth_pass 1111
# }
# virtual_ipaddress {
# 172.25.254.100/24 dev eth0 label eth0:1
# }
#}
include "/etc/keepalived/conf.d/*.conf"
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.10.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 {
172.25.254.100/24 dev eth0 label eth0:1
}
}
[root@ka1 ~]# systemctl restart keepalived.service
测试
vip依旧存在
三、Keepalived 企业应用示例
3.1、实现master/slave的 Keepalived 单主架构
- Master 配置:设置
state MASTER
,高优先级。 - Slave 配置:设置
state BACKUP
,低优先级。
# MASTER配置
[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 {
172.25.254.100/24 dev eth0 label eth0:1
}
}
[root@ka1 ~]# systemctl restart keepalived.service
# BACKUP配置
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
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
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试
3.2、抢占模式和非抢占模式
3.2.1、非抢占模式 nopreempt
- 默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色, 这样会使vip在KA主机中来回漂移,造成网络抖动
- 建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色 非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机
要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100 #优先级高
nopreempt #非抢占模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80 #优先级低
nopreempt #非抢占模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试
使用tcpdump查看vrrp
将ka1的keepalived服务停止,这个时候VIP就到ka2上了
启动ka1的keepalived服务发现优先级高的ka1并没有抢占VIP
3.2.2、抢占延迟模式 preempt_delay
- 抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回 VIP
需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100 #优先级高
#nopreempt
preempt_delay 5s #抢占延迟5S
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80 #优先级低
#nopreempt
preempt_delay 5s #抢占延迟5S
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试
使用tcpdump查看vrrp
将ka1的keepalived服务停止,这个时候VIP就到ka2上了
启动ka1的keepalived服务并等待5秒,ka1抢占ka2vip
3.3、VIP单播配置
- 默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
启用 vrrp_strict 时,不能启用单播
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.timinglee.org
vrrp_skip_check_adv_addr
#vrrp_strict #注释此参数,与vip单播模式冲突
vrrp_garp_interval 0
vrrp_gna_interval 0
#vrrp_mcast_group4 224.0.0.18 #注释组播
#vrrp_iptables
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
#nopreempt
#preempt_delay 5s
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.10
unicast_peer {
172.25.254.20
}
}
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.timinglee.org
vrrp_skip_check_adv_addr
#vrrp_strict #注释此参数,与vip单播模式冲突
vrrp_garp_interval 0
vrrp_gna_interval 0
#vrrp_mcast_group4 224.0.0.18 #注释组播
#vrrp_iptables
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
#nopreempt
#preempt_delay 5s
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
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试
停止ka1 之后 ka2才能发送单播,因为ka1的优先度更高
3.4、Keepalived 通知脚本配置
- 当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户 默认以用户
- keepalived_script身份执行脚本
- 如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份
QQ邮箱设置
[root@ka1 ~]# vim /etc/mail.rc
set bsdcompat
set from=3165995339@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=3165995339@qq.com
set smtp-auth-password=xgbwaxstuuhadhdh #授权码需要用自己的邮箱获取
set smtp-auth=login
set ssl-verify=ignore
[root@ka2 ~]# vim /etc/mail.rc
set bsdcompat
set from=3165995339@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=3165995339@qq.com
set smtp-auth-password=xgbwaxstuuhadhdh #授权码需要用自己的邮箱获取
set smtp-auth=login
set ssl-verify=ignore
获取授权码
测试
[root@ka1 ~]# echo hello world | mail -s hahaha 3165995339@qq.com
脚本的调用方法
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
state BACKUP
interface eth0
virtual_router_id 100
priority 100
#nopreempt
#preempt_delay 5s
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.10
unicast_peer {
172.25.254.20
}
}
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
state BACKUP
interface eth0
virtual_router_id 100
priority 100
#nopreempt
#preempt_delay 5s
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.10
unicast_peer {
172.25.254.20
}
}
创建通知脚本
[root@ka1 ~]# vim /etc/mail.rc
#!/bin/bash
dest='3165995339@qq.com'
function mail_send(){
mail_sub="$HOSTNAME to be $1 vip move"
mail_mess="`date +%F\ %T`: vrrp move $HOSTNAME change $1"
echo "$mail_mess" | mail -s "$mail_sub" $dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/mail.rc
#!/bin/bash
dest='3165995339@qq.com'
function mail_send(){
mail_sub="$HOSTNAME to be $1 vip move"
mail_mess="`date +%F\ %T`: vrrp move $HOSTNAME change $1"
echo "$mail_mess" | mail -s "$mail_sub" $dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
[root@ka2 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka2 ~]# systemctl restart keepalived.service
测试
模拟master出故障
[root@ka1 ~]# systemctl stop keepalived.service
重启master主机
3.5、实现 master/master 的 Keepalived 双主架构
- master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
- master/master 的双主架构: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高 服务器资源利用率
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
#notify_master "/etc/keepalived/mail.sh master"
#notify_backup "/etc/keepalived/mail.sh backup"
#notify_fault "/etc/keepalived/mail.sh fault"
state MASTER
interface eth0
virtual_router_id 100 #主
priority 100
#nopreempt
#preempt_delay 5s
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.10
unicast_peer {
172.25.254.20
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 200 #从
priority 80
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.10
unicast_peer {
172.25.254.20
}
}
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
#notify_master "/etc/keepalived/mail.sh master"
#notify_backup "/etc/keepalived/mail.sh backup"
#notify_fault "/etc/keepalived/mail.sh fault"
state BACKUP
interface eth0
virtual_router_id 100 #从
priority 80
#nopreempt
#preempt_delay 5s
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
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试
同一时间两台主机keepalived服务都可以用
3.6、实现IPVS的高可用
3.6.1、实现单主的 LVS-DR 模式
准备web服务器并绑定VIP至web服务器lo网卡
[root@realserver1 ~]# yum install httpd -y
[root@realserver1 ~]# ip a a 172.25.254.100/32 dev lo
[root@realserver2 ~]# yum install httpd -y
[root@realserver2 ~]# ip a a 172.25.254.100/32 dev lo
在真实服务器上抑制ARP包的发送
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
[root@realserver1 ~]# sysctl --system
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
[root@realserver2 ~]# sysctl --system
在keepalived服务器中安装ipvsadm
[root@ka1 ~]# yum install ipvsadm -y
[root@ka2 ~]# yum install ipvsadm -y
在ka1-ka2分别编辑keepalived文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.110 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
real_server 172.25.254.120 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.110 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
real_server 172.25.254.120 80 {
weight 1
SSL_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
[root@ka2 ~]# systemctl restart keepalived.service
查看策略
3.6.2、双主的 LVS-DR 模式
对比单主模式,双主DR模式无非就是多增加一个实例,并且在每台keepalived上多增加一个VIP管理真实服务器集群----使用简单话来说就是双实例双集群一共两个VIP 172.25.254.100 | 172.25.254.200,增加一个virtual_server 172.25.254.200
实验逻辑与双层架构相同,这里就不多赘叙。
3.7、实现HAProxy高可用
安装haproxy
[root@ka1 ~]# yum install haproxy -y
[root@ka2 ~]# yum install haproxy -y
打开内核参数
net.ipv4.ip_nonlocal_bind:这个参数控制着应用程序是否可以绑定到非本地地址。默认情况下,Linux系统只允许应用程序绑定到分配给本机的IP地址。如果设置为1,则允许应用程序绑定到任何IP地址,即使这些地址没有分配给本机。允许远程地址监听
[root@ka1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
[root@ka2 ~]# sysctl -p
[root@ka2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
[root@ka2 ~]# sysctl -p
在两个ka1和ka2先实现haproxy的配置
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.101:80 check inter 3 fall 2 rise 5
server web2 172.25.254.102:80 check inter 3 fall 2 rise 5
[root@ka1 ~]# systemctl restart haproxy.service
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.101:80 check inter 3 fall 2 rise 5
server web2 172.25.254.102:80 check inter 3 fall 2 rise 5
[root@ka1 ~]# systemctl restart haproxy.service
关闭ARP 抑制,并删除在真实服务器上的VIP
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
[root@realserver1 ~]# sysctl --system
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
[root@realserver2 ~]# sysctl --system
将keepalived原本的注释,ka1和ka2都要注释
编写脚本
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
[root@ka2 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@ka2 ~]# chmod +x /etc/keepalived/test.sh
在keepalived中编写检测脚本
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
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.10
unicast_peer {
172.25.254.20
}
track_script {
check_haproxy
}
}
[root@ka2 ~]# systemctl restart keepalived.service
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
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
}
track_script {
check_haproxy
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试
[root@ka1 ~]# systemctl stop haproxy.service
停止ka1的haproxy之后,ka2获得vip