一文带你快速了解——keepalived高可用集群

一、高可用集群

1.1 集群类型

  • LB:Load Balance 负载均衡
  • LVS/HAProxy/nginx(http/upstream, stream/upstream)
  • HA:High Availability 高可用集群 数据库、Redis
  • SPoF: Single Point of Failure,解决单点故障
  • HPC:High Performance Computing 高性能集群

1.2 系统可用性

SLA:Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能 等方面所达成的双方共同认可的协议或契约)

A = MTBF / (MTBF+MTTR) 

如:

99.95%:(60*24*30)*(1-0.9995)=21.6分钟 #一般按一个月停机时间统计

指标 :99.9%, 99.99%, 99.999%,99.9999%

1.3 系统故障

硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素

软件故障:设计缺陷 bug

1.4 实现高可用

提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)

解决方案:建立冗余机制

active/passive 主/备

active/active 双主

active --> HEARTBEAT --> passive

active <--> HEARTBEAT <--> activ

1.5.VRRP:Virtual Router Redundancy Protocol

虚拟路由冗余协议,解决静态网关单点风险

物理层:路由器、三层交换机

软件层:keepalive

1.5.1 VRRP 相关术语

虚拟路由器:Virtual Router

虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器

VIP:Virtual IP

VMAC:Virutal MAC (00-00-5e-00-01-VRID)

物理路由器:

master:主设备

backup:备用设备

priority:优先级

1.5.2 VRRP 相关技术

通告:心跳,优先级等;周期性

工作方式:抢占式,非抢占式

安全认证: 无认证 简单字符认证:预共享密钥 MD5

工作模式:

主/备:单虚拟路由器

主/主:主/备(虚拟路由器1),备/主(虚拟路由器2) 

二、Keepalived的部署

2.1、keepalived的简介

功能:

  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

2.2、keepalived的架构

官方文档: https://keepalived.org/doc/

http://keepalived.org/documentation.html

用户空间核心组件:

  • vrrp stack:VIP消息通告
  • checkers:监测real server
  • system call:实现 vrrp 协议状态转换时调用脚本的功能
  • SMTP:邮件组件
  • IPVS wrapper:生成IPVS规则
  • Netlink Reflector:网络接口
  • WatchDog:监控进程

控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

IO复用器:针对网络目的而优化的自己的线程抽象 

内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限 

2.3、环境准备

  •  各节点时间必须同步:ntp, chrony
  • 关闭防火墙及SELinux
  • 各节点之间可通过主机名互相通信:非必须
  • 建议使用/etc/hosts文件实现:非必须
  • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须

需要两个realserver和两个Keepalived服务器

realserver配置如下:

realserver1:

设置ip,如果你有可以不改动
vmset.sh ens33 172.25.254.110 realserver1.timingzpy.org

下载apache

yum install httpd -y

写入文件
echo 172.25.254.110 > /var/www/html/index.html

启动httpd
systemctl enable --now httpd

realserver2:

设置ip,如果你有可以不改动
vmset.sh ens33 172.25.254.120 realserver1.timingzpy.org

下载apache

yum install httpd -y

写入文件
echo 172.25.254.120 > /var/www/html/index.html

启动httpd
systemctl enable --now httpd

2.4 Keepalived 相关文件

可通过这条命令查看

[root@ka1 ~]# rpm -ql keepalived 

  • 软件包名:keepalived
  • 主程序文件:/usr/sbin/keepalived
  • 主配置文件:/etc/keepalived/keepalived.conf
  • 配置文件示例:/usr/share/doc/keepalived/
  • Unit File:/lib/systemd/system/keepalived.service
  • Unit File的环境配置文件:/etc/sysconfig/keepalived

2.5、keepalived的实验环境

2.5.1 配置文件组成部分

配置文件:/etc/keepalived/keepalived.conf

配置文件组成

GLOBAL CONFIGURATION

Global definitions: 定义邮件配置,route_id,vrrp配置,多播地址等

VRRP CONFIGURATION VRRP

instance(s): 定义每个vrrp虚拟路由器

LVS CONFIGURATION

Virtual server group(s)

Virtual server(s): LVS集群的VS和RS

2.5.2、Keepalived配置

KA1:

配置IP
vmset.sh ens33 172.25.254.10 ka1.timingzpy.org

安装keepalived
yum install keepalived -y
 

更改vim编写的tap缩进

vim ~/.vimrc
set ts=4 ai sw=4

更改配置文件,我的网卡名是ens33

vim /etc/keepalived/keepalived.conf

#全局配置
global_defs {
   notification_email {
   2931653102@qq.com
   }
   notification_email_from keepalived@timingzpy.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.timingzpy.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 MASTER
    interface ens33
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens33 label ens33:1
    }
}

systemctl enable --now keepalived.service

为避免麻烦可以直接ka1的文件发送给ka2
scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf

测试
 tcpdump -i ens33 -nn host 224.0.0.18

KA2:

配置IP
vmset.sh ens33 172.25.254.20 ka2.timingzpy.org

安装keepalived
yum install keepalived -y
 

更改vim编写的tap缩进

vim ~/.vimrc
set ts=4 ai sw=4

更改配置文件,我的网卡名是ens33

vim /etc/keepalived/keepalived.conf

#全局配置
global_defs {
   notification_email {
   2931653102@qq.com
   }
   notification_email_from keepalived@timingzpy.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.timingzpy.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 ens33
    virtual_router_id 100
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens33 label ens33:1
    }
}

systemctl enable --now keepalived.service
测试
 tcpdump -i ens33 -nn host 224.0.0.18

2.5.3、 使vip能够通信

如果要使vip可以通信

1、在全局中添加vrrp_iptables

2、在全局中将vrrp_strict注释掉

方法1、                                                                        方法2、 

2.5.4、独立Keepalived日志功能

1、编辑日志级别

vim /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS"-D -s 6"

 2、 指定采集方法

vim /etc/rsyslog.conf

local6.* /var/log/keepalived.log

systemctl resatrt rsyslog.service

systemctl restart keepalived.service

如果重启不了,说明文件没有成功生成,我们可以自己去touch一个Keepalived.log文件

3、查看日志是否生成

ll /var/log/keepalived.log

2.5.5、 实现独立子配置文件 

1、vim /etc/keepalived.keepalived

将虚拟路由器的配置注释掉

后添加

include "/etc/keepalived/conf.d/*.conf"

如果现在重启,就会报找不到这个文件

我们需要创建这个文件

medir /etc/keepalived/conf.d/

并将注释掉的虚拟路由器的配置粘贴过来

vim /etc/keepalived/conf.d/172.25.254.100.conf

后再重启

systemctl restart keepalived.service

查看IP

ifconfig

三、keepalived应用示例

3.1、抢占模式和非抢占模式 

3.1.1、非抢占模式 nopreempt

 

3.1.2、抢占延迟模式 preempt_delay

 

 3.2、VIP单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量 

!!!注意:启用 vrrp_strict 时,不能启用单播 

KA1,KA2都要禁用掉 

 后重启

抓包查看单播效果

ka1:

tcpdump -i ens33 -nn src host 172.25.254.10 and dst 172.25.254.20

ka2:

tcpdump -i ens33 -nn src host 172.25.254.20 and dst 172.25.254.10

Vip在哪个KA服务器上,哪个KA服务器才能发送单播 

 

  3.3、Keepalived 通知脚本配置

 3.3.1、邮件通知配置

所有 keepalived节点都要配置:

yum install mailx -y

vim /etc/mail.rc

        set from=2931653102@qq.com
        set smtp=smtp.qq.com
        set smtp-auth-user=2931653102@qq.com
        set smtp-auth-password=cpcvhjhuqujrdhff
        set smtp-auth=login
        set ssl-verify=ignore

发送测试邮件

echo test message |mail -s test XXXX@qq.com(自己的邮箱地址)

 3.3.2、实现 Keepalived 状态切换的通知脚本

 在所有 keepalived节点配置如下

vim /etc//keepalived/mail.sh

 #!/bin/bash
mail_dst="XXXX@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 | msil -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

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"

测试:
可以关掉现vip所在的服务器,来测试

systemctl stop keepalived.service

关掉后,它会给你的邮箱发送一条消息

3.4、实现 master/master 的 Keepalived 双主架构 

 ka1:

vim /etc/keepalived/keepalived.conf

添加

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 200
    priority 800
    #preempt_delay 5s
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev ens33 label ens33:2
    }
    unicast_src_ip 172.25.254.10
    unicast_peer {
        172.25.254.20
    }

ka2:

 vim /etc/keepalived/keepalived.conf

添加

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 200
    priority 100
    #preempt_delay 5s
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev ens33 label ens33:2
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
}

3.5、实现IPVS的高可用性

3.5.1、虚拟服务器的定义格式

virtual_server IP port #定义虚拟主机IP地址及其端口

virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群 virtual_server group string #使用虚拟服务器组

 3.5.2、虚拟服务器设置

3.5.2.1、 虚拟服务器配置

 virtual_server IP port {         #VIP和PORT

                delay_loop         #检查后端服务器的时间间隔

                lb_algo rr|wrr|lc|wlc|lblc|sh|dh         #定义调度方法

                lb_kind NAT|DR|TUN         #集群的类型,注意要大写

                persistence_timeout         #持久连接时长

                protocol TCP|UDP|SCTP         #指定服务协议,一般为TCP

                sorry_server         #所有RS故障时,备用服务器地址

                real_server {         #RS的IP和PORT

                        weight         #RS权重

                        notify_up         #RS上线通知脚本

                        notify_down        #RS下线通知脚本                                                  HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }                                #定义当前主机健康状 态检测方法

                }

}

#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错

3.5.2.2、 应用层检测:HTTP_GET|SSL_GE

HTTP_GET|SSL_GET {

        url {

                    path         #定义要监控的URL

                    status_code         #判断上述检测机制为健康状态的响应码,一般为 200

                }

        connect_timeout         #客户端请求的超时时长, 相当于haproxy的timeout server         nb_get_retry         #重试次数

        delay_before_retry         #重试之前的延迟时长

        connect_ip         #向当前RS哪个IP地址发起健康状态检测请求

        connect_port         #向当前RS的哪个PORT发起健康状态检测请求

        bindto         #向当前RS发出健康状态检测请求时使用的源地址

        bind_port         #向当前RS发出健康状态检测请求时使用的源端口  

}

3.5.2.3、传输层检测:TCP_CHECK 

 TCP_CHECK {

                connect_ip         #向当前RS的哪个IP地址发起健康状态检测请求

                connect_port         #向当前RS的哪个PORT发起健康状态检测请求

                bindto         #发出健康状态检测请求时使用的源地址

                bind_port         #发出健康状态检测请求时使用的源端口

                connect_timeout         #客户端请求的超时时长

                                                    #等于haproxy的timeout server

}

3.5.3、实例

3.5.3.1、实现单主的 LVS-DR 模式

准备web服务器并使用脚本绑定VIP至web服务器lo网卡 

rs1/2:(都做一下操作)

[root@realserver1 ~]# ip addr add 172.25.254.100/32 dev lo
[root@realserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@realserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@realserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@realserver1 ~]# systemctl restart httpd

配置keepalived 

ka1/2:

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
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.25.254.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

测试

ka1/2:

下载ipvsadm来查看当前的负载均衡配置

 yum install ipvsadm -y

3.6、实现其它应用的高可用性 VRRP Script

 keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先 动态调整,从而实现其它应用的高可用性功能 参考配置文件:/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck

3.6.1、VRRP Script 配置 

1、定义脚本 

  • vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定 义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
  • 通常此脚本用于监控指定应用的状态。
  • 一旦发现应用的状态异常,则触发对MASTER节点的权重减至 低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点 。

vrrp_script name {         #定义一个检测脚本,在global_defs 之外配置

        script         #shell命令或脚本路径 interval #间隔时间,单位为秒,默认1秒

        timeout         #超时时间

        weight             #默认为0,如果设置此值为负数,

                                #当上面脚本返回值为非0时

                                #会将此值与本节点权重相加可以降低本节点权重,即表示fall.

                                #如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重

                                #即表示 rise.通常使用负值

        fall         #执行脚本连续几次都失败,则转换为失败,建议设为2以上

        rise         #执行脚本连续几次都成功,把服务器从失败标记为成功

        user USERNAME [GROUPNAME]         #执行监测脚本的用户或组

        init_fail         #设置默认标记为失败状态,监测成功之后再转换为成功状态

}

2、调用脚本

  • track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的 vrrp_script 

vrrp_instance VI_1 {
    …………
    track_script{
        name
    }
}

3.6.2、利用脚本实现主从角色切换 

 [root@ka1 ~]# vim /etc/keepalived/test.sh
[root@ka1 ~]# sh /etc/keepalived/test.sh
[root@ka1 ~]# echo $?
0
[root@ka1 ~]# touch /mnt/zpy
[root@ka1 ~]# sh /etc/keepalived/test.sh
[root@ka1 ~]# echo $?
1
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
[root@ka1 ~]# cat /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/zpy ]

vrrp_script check_zpy {
    script "/etc/keepalived/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 100
    priority 80
    #preempt_delay 5s
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens33 label ens33:1
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
    track_script{
        check_zpy
    }
}

测试:

它会检测有没有这个文件,没有这个文件,就没问题,vip就会一直在ka1上

一旦检测到这个文件,vip就切换到ka2上。

 3.6.3、实现HAProxy高可用

注:如果做了前文中的LVS-DR模式的话,需要将那些配置删除掉,如虚拟服务器的配置,realserver的内核参数 arp_ignore & arp_announce全部设为0,删除临时的环回路由(ip a d 172.25.254.100/32 dev lo)。或者用之前双主的另一个网卡来做。

ka1/2:

yum install haproxy -y
vim /etc/sysctl.conf
在两个ka1和ka2两个节点启用内核参数
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
vim /ect/haproxy/haproxy.cfg

添加

listen webcluster
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
    server web2 172.25.254.120:80 check inter 3 fall 2 rise 5

通过这个查看一下端口

netstat -antlupe | grep haproxy

这时就可以重启Keepalived和haproxy,测试一下,是否连上了

 

这样就连接上了

编写检测脚本

 vim /etc/keepalived/test.sh

#!/bin/bash

killall -0 haproxy

chmod +x /etc/keepalived/test.sh

ka1/2:

vrrp_script check_haproxy {
    script "/etc/keepalived/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}

虚拟路由器中添加
track_script {
        check_haproxy
    }

这样就算配置好了

测试:
[root@ka1 ~]# systemctl stop haproxy.service
[root@ka1 ~]# systemctl start haproxy.service

ka1的haproxy服务down后,就会使用ka2执行。 

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值