基于Linux CentOS7.9 LVS+keepalived双机热备
一、关于keepalived
1.1.keepalived功能作用
keepalived起初是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换和健康检查的功能,用来判断LVS负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集。
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
1.2.keepalived的热备方式
keepalived采用vrrp(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现Linux服务器的多级热备功能。vrrp是针对路由器的一种备份解决方案,由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供提供服务,每个热备组内同一时刻只有一台主路由器提供服务,其他路由器处于冗余状态,若主路由器失效,则从其他路由器会自动接替虚拟IP,继续提供服务,虚拟IP被称之为漂移地址
1.3三大框架
基于VRRP的高可用
基于LVS/IPVS的负载均衡
健康检查
二、部署基于Linux CentOS7.9 LVS+keepalived双机热备
实验环境
实验环境下,关闭所有防火墙和selinux
默认配置阿里云和epel的镜像源
编译安装 Keepalived
安装依赖
yum -y install gcc openssl-devel
安装ipvsadm
yum -y install ipvsadm
编译安装 Keepalived
./configure --prefix=/usr/local/keepalived; echo $?
make -j `nproc` && make install ; echo $?
cd /usr/local/keepalived/
启动前基础设置
keepalived 文件分为 4 种,
- 启动脚本文件:服务脚本文件,放在/etc/init.d 目录可通过 service 命令管理keepalived
- 启动参数文件:启动 keepalived 时命令后面跟的参数,因基本参数较多所以使用参数文件方式保存
- keepalived.conf 文件:主配置文件,热备,健康检查等功能配置
- 主程序文件:主要支行程序文件,可执行程序
他们的执行关系是:启动脚本文件 -> 找到启动参数文件 -> 启动参数文件里描述了keepalived.conf 的路径和日志等指令 -> 然后交给主程序文件执行(真实启动)。
启动脚本文件
#从源码包中cp启动脚本Centos 7.x
cp -av /usr/local/src/keepalived-2.0.20/keepalived/keepalived.service /usr/lib/systemd/system/
启动参数文件
#从编译安装后的目录cp启动参数文件
cp -av /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
keepalived.conf文件
#在系统配置文件目录创建keepalived目录
mkdir -pv /etc/keepalived
把配置文件移到文件夹中
cp -av /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
主程序文件
#把主程序文件移动到/usr/sbin/ 或创建软链接
cp -av /usr/local/keepalived/sbin/keepalived /usr/sbin/
#适用(Centos 7.x)
systemctl daemon-reload
systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived
若发现服务未启动成功,需要执行以下操作
vim /etc/keepalived/keepalived.conf
在里面全局查找eth0,改为你实际的物理网卡名称,也就是你ip a看到的网卡名称,之后保存退出,重启服务即可
keepalived 双机热备应用案例
三、案例说明
| 角色 | IP | 服务 |
|---|---|---|
| VIP-漂移地址 | 19.16.2.170 | 虚拟IP |
| 主服务器 | 19.16.2.169 | keepalived主服务器 |
| 备服务器 | 19.16.2.164 | keepalived备服务器 |
| nginx服务器 | 19.16.2.165 | web服务 |
主 Keepalived 配置
IP 地址和网卡接口名称
ens33 物理网卡名称
19.16.2.169 网口绑定的物理网络地址
keepalived 的主配置文件 keepalived.conf
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived - LVS MASTER
! 全局定义模块
global_defs {
router_id LVS_DEVEL_MASTER # 全局唯一标识,备节点必须不同
script_user root
enable_script_security
enable_traps
}
# 健康检查脚本:检测IPVS规则是否正常,异常则自动降级
vrrp_script chk_ipvs {
script "/usr/sbin/ipvsadm -Ln >/dev/null 2>&1"
interval 2 # 检查间隔,单位秒
timeout 1 # 超时时间
fall 2 # 连续失败2次判定故障
rise 1 # 成功1次判定恢复
weight -20 # 故障时优先级减20
}
vrrp_instance VI_1 {
state BACKUP # 非抢占模式下双节点都设BACKUP,靠优先级选举
interface ens33 # 绑定VIP的物理网卡
virtual_router_id 51 # 主备必须完全一致,范围0-255
priority 150 # 优先级,主节点高于备节点
advert_int 1 # VRRP心跳间隔
nopreempt # 非抢占模式:主节点恢复后不抢回VIP,减少抖动
# 单播模式:企业级推荐,替代组播,避免广播风暴与安全风险
unicast_src_ip 19.16.2.169 # 本机物理IP
unicast_peer {
19.16.2.164 # 对端备节点物理IP
}
# 认证配置,主备必须完全一致
authentication {
auth_type PASS
auth_pass fzc@0228
}
# 漂移VIP配置
virtual_ipaddress {
19.16.2.170/24 dev ens33 label ens33:vip
}
# 关联健康检查脚本
track_script {
chk_ipvs
}
# 状态切换通知脚本(对接监控告警,可选)
notify_master "/usr/local/bin/notify.sh master"
notify_backup "/usr/local/bin/notify.sh backup"
notify_fault "/usr/local/bin/notify.sh fault"
}
# ========== LVS虚拟服务配置(DR模式) ==========
# 80端口Web服务
virtual_server 19.16.2.170 80 {
delay_loop 6
lb_algo wrr # 加权轮询调度
lb_kind DR # DR直接路由模式
nat_mask 255.255.255.0
persistence_timeout 0 # 会话保持,测试轮询设为0
protocol TCP
real_server 19.16.2.165 80 {
weight 100
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
# 81端口Web服务
virtual_server 19.16.2.170 81 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 19.16.2.165 81 {
weight 100
TCP_CHECK {
connect_port 81
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
# 82端口Web服务
virtual_server 19.16.2.170 82 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 19.16.2.165 82 {
weight 100
TCP_CHECK {
connect_port 82
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
从 Keepalived 配置
IP 地址和网卡接口名称

keepalived 的从配置文件 keepalived.conf
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived - LVS BACKUP
! 全局定义模块
global_defs {
router_id LVS_DEVEL_BACKUP # 节点唯一标识,与主节点不同
script_user root
enable_script_security
enable_traps
}
# 健康检查脚本:与主节点完全一致
vrrp_script chk_ipvs {
script "/usr/sbin/ipvsadm -Ln >/dev/null 2>&1"
interval 2
timeout 1
fall 2
rise 1
weight -20
}
vrrp_instance VI_1 {
state BACKUP # 非抢占模式下统一设BACKUP
interface ens33
virtual_router_id 51 # 与主节点完全一致
priority 100 # 优先级低于主节点
advert_int 1
nopreempt # 非抢占模式
# 单播配置:源IP为本机,对端为主节点IP
unicast_src_ip 19.16.2.164
unicast_peer {
19.16.2.169
}
authentication {
auth_type PASS
auth_pass fzc@0228
}
virtual_ipaddress {
19.16.2.170/24 dev ens33 label ens33:vip
}
track_script {
chk_ipvs
}
notify_master "/usr/local/bin/notify.sh master"
notify_backup "/usr/local/bin/notify.sh backup"
notify_fault "/usr/local/bin/notify.sh fault"
}
# ========== LVS虚拟服务配置:与主节点完全一致 ==========
virtual_server 19.16.2.170 80 {
delay_loop 6
lb_algo wrr # 加权轮询调度
lb_kind DR # DR直接路由模式
nat_mask 255.255.255.0
persistence_timeout 0 # 会话保持,测试轮询设为0
protocol TCP
real_server 19.16.2.165 80 {
weight 100
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
# 81端口Web服务
virtual_server 19.16.2.170 81 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 19.16.2.165 81 {
weight 100
TCP_CHECK {
connect_port 81
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
# 82端口Web服务
virtual_server 19.16.2.170 82 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 19.16.2.165 82 {
weight 100
TCP_CHECK {
connect_port 82
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
RS 的配置
安装 Nginx
yum -y install nginx
配置基于 IP 的虚拟主机
基于 Nginx,配置 IP+Port 的虚拟主机。IP 地址和端口规划如下。
19.16.2.165:80
19.16.2.165:81
19.16.2.165:82
主 Nginx 配置虚拟主机
grep -Ev "^$|#" /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name 19.16.2.165;
root /usr/share/nginx/html/;
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 81;
server_name 19.16.2.165;
root /usr/share/nginx/html/ng1.com;
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 82;
server_name 19.16.2.165;
root /usr/share/nginx/html/ng2.com;
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
不同的 server {}代码块,对应的 ip 虚拟主机配置段。
一段配置,代表一个虚拟主机。
配置虚拟主机的网站资源,默认首页
80端口的虚拟主机资源配置【默认网站首页 index.html】
cat /usr/share/nginx/html/index.html
<h1> ng0.com -> 19.16.2.165:80 </h1>
81端口的虚拟主机资源配置【默认网站首页 index.html】
mkdir -pv /usr/share/nginx/html/ng1.com/
cat /usr/share/nginx/html/ng1.com/index.html
<h1> ng1.com -> 19.16.2.165:81 </h1>
82端口的虚拟主机资源配置【默认网站首页 index.html】
mkdir -pv /usr/share/nginx/html/ng2.com/
cat /usr/share/nginx/html/ng2.com/index.html
<h1> ng2.com -> 19.16.2.165:82 </h1>
配置抑制 ARP 广播请求
lo:0 回环地址配置如下。
cat /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=19.16.2.170
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback-vip
启动 lo 虚拟回环地址
ifup lo:0
查看虚拟 IP 地址
ip addr
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)