一、关于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 种,

  1. 启动脚本文件:服务脚本文件,放在/etc/init.d 目录可通过 service 命令管理keepalived
  2. 启动参数文件:启动 keepalived 时命令后面跟的参数,因基本参数较多所以使用参数文件方式保存
  3. keepalived.conf 文件:主配置文件,热备,健康检查等功能配置
  4. 主程序文件:主要支行程序文件,可执行程序
    他们的执行关系是:启动脚本文件 -> 找到启动参数文件 -> 启动参数文件里描述了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
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐