高可用集群keepalived的应用以及部署

1.高可用集群

1.1.集群类型

  • LB:Load Balance 负载均衡

    LVS/haproxy/nginx(http/upstream,stream/upstream)

  • HA : High Point of Failure 高可用集群

    数据库、Redis

  • SPoF:single point Of failure 解决单点故障

    HPC:High performmance computing 高性能集群

1.2.系统可用性

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

A = MTBF / (MTBF+MTTR)

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

1.3.系统故障

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

软件故障:设计缺陷 bug

1.4.实现高可用

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

  • active/passive 主/备

  • active/active 双主

  • active --> HEARTBEAT --> passive

  • active <--> HEARTBEAT <--> active

1.5.VRRP:Virtual Router Redundancy Protocol

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

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

  • 软件层:keepalived

1.5.1VRRP相关术语

  • 虚拟路由器:Virtual Router

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

  • VIP:Virtual IP

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

  • 物理路由器:

    • master:主设备

    • backup:备用设备

    • priority:优先级

1.5.2VRRP相关技术

通告:心跳,优先级等;周期性 工作方式:抢占式,非抢占式 安全认证:

  • 无认证

  • 简单字符认证:预共享密钥

  • MD5

工作模式

  • 主/备:单虚拟路由器

  • 主/主:主/备(虚拟路由器1)、备/注(虚拟路由器2),他们互为主备

2.keepalived部署

2.1keepalived简介及功能

简介

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

功能:

基于vrrp协议完成地址流动

为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

为ipvs集群的各RS做健康状态检测

基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

2.2keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

2.3keepalived架构

用户空间核心组件:

vrrp stack:VIP消息通告

checkers:监测real server

system call:实现 vrrp 协议状态转换时调用脚本的功能

SMTP:邮件组件

IPVS wrapper:生成IPVS规则

Netlink Reflector:网络接口

WatchDog:监控进程

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

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

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

2.4keepalived相关文件

  • 软件包名:keepalived

  • 主程序文件:/usr/sbin/keepalived

  • 主配置件:/etc/keepalived/keepalived.conf

  • 配置文件示例:/usr/share/doc/keepalived/

  • UnitFile:/lib/systemd/system/keepalived.service

  • Unit File的环境配置文件:/etc/sysconfig/keepalived

2.6环境

我们基于rhel7

克隆四台rhel7的虚机,分别是

realserver1:172.252.50.110

realserver2:172.25.250.120

KA1:172.252.50.10

KA2:172.25.250.20

VIP:172.25.250.100

关闭防火墙和SElinux

realserver1、realserver2主机都下载Apache

[root@realserver1 ~]# yum install httpd -y

[root@realserver1 ~]# systemctl enable --now httpd

[root@realserver1 ~]# echo realserver1 - 172.25.250.110 > /var/www/html/index.html

[root@realserver2 ~]# yum install httpd -y

[root@realserver2 ~]# systemctl enable --now httpd

[root@realserver2 ~]# echo realserver2 - 172.25.250.120 > /var/www/html/index.html

2.7keepalived虚拟路由管理

2.7.1 ka1主机

###KA1和KA2主机下载keepalived

[root@ka1 ~]# yum install keepalived -y

[root@ka2 ~]# yum install keepalived -y



[root@ka1 ~]# rpm -ql | grep keepalived    //查看文件

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf     //keepalived主配置文件

[root@ka1 ~]# systemctl enable --now keepalived.service

[root@ka1 ~]# ifconfig

2.7.2ka2主机

[root@ka1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.250.20:/etc/keepalived/keepalived.conf   //将KA1里面

/etc/keepalived/keepalived.conf 文件内容复制到KA2的/etc/keepalived/keepalived.conf

##然后我们去KA2主机打开/etc/keepalived/keepalived.conf
[root@ka2 ~]# systemctl enable --now keepalived.service

[root@ka2 ~]# ifconfig

然后我们关闭KA1主机的keepalived,再去KA2主机查看

[root@ka1 ~]# systemctl stop keepalived.service

2.8 虚拟路由的通信设定

最开始ka1主机或ka2主机是ping不通VIP的

因为默认情况会把VIP访问功能禁掉

iptables -nL

如果想要实现通信

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

2.9日志分离

[root@ka1 ~]# vim /etc/sysconfig/keepalived

[root@ka1 ~]# vim /etc/rsyslog.conf

[root@ka1 ~]# systemctl restart keepalived.service 
[root@ka1 ~]# systemctl restart rsyslog.service 
[root@ka1 ~]# ll /var/log/keepalived.log 
-rw-------. 1 root root 2121218 Aug 12 20:56 /var/log/keepalived.log

2.10独立子配置文件

当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理

将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含 子配置文件

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

然后创建目录

3.keepalived企业应用示例

3.1抢占模式和非抢占模式

3.1.1非抢占模式 nopreempt

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,

这样会使vip在KA主机中来回漂移,造成网络抖动,

建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色

非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机

注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP

ka1主机

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

ka2主机

[root@ka2 ~]# vim /etc/keepalived/keepalived.conf

然后测试结果就是当ka1关闭keepalived时,VIP就会到ka2主机,然后ka1再次开启keepalived时,VIP不会回到ka1主机,而是继续在ka2主机

3.1.2延时抢占模式

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回 VIP

preempt_delay # #指定抢占延迟时间为#s,默认延迟300s

注意:需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict

ka1主机配置
vrrp_instance VI_1 {
   state BACKUP
   interface eth0
   virtual_router_id 20
   priority 100 #优先级高
   preempt_delay 10s #抢占延迟10s
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.25.250.100/24 dev eth0 label eth0:1
   }
}
   
#KA2主机配置
vrrp_instance VI_1 {
   state BACKUP
   interface eth0
   virtual_router_id 20
   priority 80 #优先级低
   advert_int 1
   preempt_delay 10s #抢占延迟10S
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
     172.25.250.100/24 dev eth0 label eth0:1
   }
}

然后我们做完延时抢占模式实验后建议把延时注释掉,不然会影响后面实验

3.2VIP单播配置

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

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

#在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使 用业务网络

unicast_src_ip <IPADDR> #指定发送单播的源IP

unicast_peer {

<IPADDR>#指定接收单播的对方目标主机IP

......

}

#启用 vrrp_strict 时,不能启用单播,否则服务无法启动,并在messages文件中记录下面信息

ka1主机

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

ka2主机

[root@ka2 ~]# vim /etc/keepalived/keepalived.conf

然后我们关掉ka1主机的keepalived

[root@ka1 ~]# systemctl stop keepalived.service

3.3通知脚本配置

ka1和ka2主机都下载mailx

yum install mailx -y

qq邮箱通知

[root@ka2 ~]# vim /etc/mail.rc

写脚本

[root@ka1 ~]# vim /etc/keepalived/mail.sh 
#!/bin/bash

mail_dst=".....@qq.com"   //你自己的qq邮箱
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

然后

/etc/keepalived/mail.sh fualt //你就会收到邮件

[root@ka1 ~]# systemctl stop keepalived.service

[root@ka1 ~]# systemctl restart keepalived.service

你也会收到对应的邮件

ka2主机上一样的操作

3.4双主机

ka1主机

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
        unicast_src_ip 172.25.250.10
        unicast_peer {
                172.25.250.20
        }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 200
    priority 80
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.200/24 dev eth0 label eth0:2
    }
        unicast_src_ip 172.25.250.10
        unicast_peer {
                172.25.250.20
        }
}

ka2主机

[root@ka2 ~]# vim /etc/keepalived/keepalived.conf 

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    advert_int 1
   # preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
        unicast_src_ip 172.25.250.20
        unicast_peer {
                172.25.250.10
        }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 100
    advert_int 1
   # preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.200/24 dev eth0 label eth0:2
    }
        unicast_src_ip 172.25.250.20
        unicast_peer {
                172.25.250.10
        }

}

测试

3.5实现ipvs的高可用性

3.5.1实现单主机lvs-DR模式

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

##rs1主机和rs2主机
[root@realserver1 ~]# yum install httpd -y
[root@realserver2 ~]# yum install httpd -y
[root@realserver1 ~]# echo realserver1 - 172.25.250.110 > /var/www/html/index.html
[root@realserver2 ~]# echo realserver2 - 172.25.250.120 > /var/www/html/index.html

#rs1主机
[root@realserver1 ~]# ip a a 172.25.250.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 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

#rs2主机
[root@realserver2 ~]# ip a a 172.25.250.100/32 dev lo
[root@realserver2 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@realserver2 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@realserver2 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@realserver2 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

配置keepalived

#ka1主机
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
virtual_server 172.25.250.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP

    real_server 172.25.250.110 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }

     real_server 172.25.250.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }

}

#ka2主机
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf 
virtual_server 172.25.250.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP

    real_server 172.25.250.110 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }

    real_server 172.25.250.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }

}

#测试结果
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.250.100:80 wrr
  -> 172.25.250.110:80            Route   1      0          0         
  -> 172.25.250.120:80            Route   1      0          0         
TCP  10.10.10.2:1358 rr persistent 50
  -> 192.168.200.200:1358         Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50

模拟rs1故障

[root@realserver1 ~]# systemctl stop httpd

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

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先 动态调整,从而实现其它应用的高可用性功能

3.6.1VRRP script配置

分两步实现

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定 义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。

通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至 低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点

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

[root@ka1 ~]# cat /mnt/check_file.sh   //脚本随便写在那个路径,唯一要注意的就是在配置文件里面的路径要与这里一致
#!/bin/bash
[ ! -f "/mnt/file" ]
[root@ka1 ~]# chmod +x /mnt/check_file.sh   //给脚本执行权限


###################
[root@ka1 ~]# sh /etc/keepalived/test.sh 
[root@ka1 ~]# echo $?
0                         //如果没有/mnt/file这个文件,那么返回0,不会做任何改变
[root@ka1 ~]# touch /mnt/file
[root@ka1 ~]# sh /etc/keepalived/test.sh 
[root@ka1 ~]# echo $?
1                         //如果有/mnt/file这个文件,返回为1,那么就会触发降低权重
#####################
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 

vrrp_script check_file {
   script "/mnt/check_lee.sh"   #此脚本返回值为非0时,会触发下面OPTIONS执行
   interval 1
   weight -30
   fall 2
   rise 2
   timeout 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
    teack_script {
        check_file
        }
        unicast_src_ip 172.25.250.10
        unicast_peer {
                172.25.250.20
        }
}

3.7.3实现haproxy与keepalived的高可用

#在ka1和ka2主机安装haproxy
[root@ka1 ~]# yum install haproxy -y
[root@ka2 ~]# yum install haproxy -y
#在ka1和ka2主机实现haproxy的配置
#ka1主机
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver
    bind 172.25.250.100:80
    server web1 172.25.250.110:80 check
    server web2 172.25.250.120:80 check
#ka2主机
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver
    bind 172.25.250.100:80
    server web1 172.25.250.110:80 check
    server web2 172.25.250.120:80 check

#在两个ka1和ka2先实现haproxy的配置
backend webcluster
    bind 172.25.250.100:80
    mode http
    balance roundrobin
    server realserver1 172.25.250.110:80 check inter 3 fall 2 rise 5
    server realserver2 172.25.250.120:80 check inter 3 fall 2 rise 5
#在两个ka1和ka2两个节点启用内核参数
[root@ka1 ~]# cat /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         //这条参数     


#在ka1中编写检测脚本
[root@ka1 ~]# vim /etc/keepalived/scripts/haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
[root@ka1 ~]# chmod +X /etc/keepalived/scripts/haproxy.sh


#在ka1中配置keepalived
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
   script "/etc/keepalived/scripts/haproxy.sh"
   interval 1
   weight -30
   fall 2
   rise 2
   timeout 2
}
vrrp_instance web {
   state MASTER
   interface eth0
   virtual_router_id 100
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.25.250.100 dev eth0 label eth0:1
   }
   track_script {
       check_haproxy
   }
}

测试

我们把ka1主机的haproxy关掉,可以看到VIP飘到ka2主机上

然后客户机一直访问172.25.250.100 ,会发现访问不会断

这就是haproxy和keepalived联用实现高可用,利用keepalived检测haproxy是否存活,如果存活则不会有任何操作,如果不存活则会把VIP飘到另外一台haproxy存活的主机上,然后客户端主机访问不受影响

相关推荐
sinat_384241092 小时前
使用 npm 安装 Electron 作为开发依赖
服务器
朝九晚五ฺ3 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream3 小时前
Linux的桌面
linux
xiaozhiwise3 小时前
Makefile 之 自动化变量
linux
Kkooe4 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒4 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
意疏5 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
虚拟网络工程师5 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
BLEACH-heiqiyihu6 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器