Keepalived 高可用解决方案

庆云2年前技术文章657

Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入 VRRP 的功能,VRRP 是 Virtual Router Redundancy protocol (虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由器出现的单点故障问题,它能偶保证网络的不间断、稳定的运行。所有,keepalived 一方面具有 LVS cluster nodes healthchecks(集群节点健康检查)功能,另一方面也具有 LVS directors faiover(负载均衡器故障转移)功能。


1、Keepalived  用途

Keepalived 服务两大用途:healthcheck & failover(健康检查和故障转移)

1.1 LVS directors failover 功能

failover 功能,用于实现 LB Master 主机和 Backup 主机之间故障转移和自动切换。这是针对有两个负载均衡器 Director 同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作;一旦主负载均衡器(MASTER)故障修复,MASTER 又会接管回它原来处理的工作,而备份负载均衡管理器(BACKUP)会释放 MASTER 失效时它接管的工作,此时两者将恢复到最初各自的角色状态。

1.2 LVS cluster nodes healthchecks 功能

RS healthcheck 功能,负载均衡定期检查 RS 的可用性决定是否非其分发请求。当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的服务器从转发队列中清除出去,从而保证用户的访问不受影响;当故障的服务器被修复以后,系统又会自动地把他们加入转发队列,分发请求提供正常服务。


2、Keepalived 原理

Keepalived dirctors 之间的故障切换转移,是通过 VRRP 协议来实现的。在 keepalived directors 正常工作时,主 Directors 节点会不断的向备节点组播心跳信息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的 IP 资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的自身的备用角色。


3、Keepalived 特点

  1. Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived 部署比其他类似工具更简洁的原因,尤其是相对于 Heartbeat 而言,Heartbeat 作为 HA 软件,其复杂的配置流程让许多人望而生畏。

  2. 通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。

  3. 负载均衡器之间的失败切换,是通过 VRRP(Virtual Router Redundancy Protocol)stack 实现的,VRRP 当初被设计出来就是为了解决静态路由器的单点故障问题。

  4. 通过实际的线上项目,我们可以得知,iptables 的启用是不会影响 Keepalived 的运行的。 但为了更好的性能,我们通常会将整套系统内所有主机的 iptables 都停用。

  5. Keepalived 产生的 VIP 就是整个系统对外的 IP,如果最外端的防火墙采用的是路由模式,那就映射此内网 IP 为公网 IP。


4、Keepalived  实践

4.1 环境准备

节点信息:

  • 192.168.100.10,master web 节点

  • 192.168.100.20,backup web 节点


软件信息:

  • Nginx,用于提供业务访问

  • Keepalived,用于提供业务访问的统一入口(VIP)

$ yum install nginx keepalived -y

# master node
$ vim /etc/nginx/nginx.conf
server {
   listen 80;
   root /www/site1;
}
$ mkdir -p /www/site1
$ echo web-server1 > /www/site1/index.html
$ systemctl start nginx && systemctl enable nginx

# backup node
$ vim /etc/nginx/nginx.conf
server {
   listen 80;
   root /www/site1;
}
$ mkdir -p /www/site1
$ echo web-server2 > /www/site1/index.html
$ systemctl start nginx && systemctl restart nginx

4.2 Keepalived 配置

# master node
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1                            # 设备在高可用组中的标识,不一样即可
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state MASTER                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.10        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 100                       # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }
}
$ systemctl start keepalived && systemctl enable keepalived
# backup node
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 2                            # 设备在高可用组中的标识,不一样即可
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state BACKUP                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.20        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 99                        # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }
}
$ systemctl start keepalived && systemctl enable keepalived

4.3 浏览器访问测试

keepalived-vip.png

断开网卡连接,访问测试:

22.png


33.png

启动 master 节点网卡,又恢复正常。

master 节点,关闭 nginx 服务,再进行访问测试:

44.png

4.4 监听脚本

问题:为什么 master 节点断开网卡,VIP 漂移到了 backup 节点,而 master 节点停掉 nginx 服务却无法访问?

答案:因为 keepalived 监听的是接口的 IP 状态和 nginx 没有关联,无法监控 nginx 服务状态。

解决:加监听脚本

  • 分别在 master 节点和 backup 节点添加如下启动脚本,并修改 keepalived 配置文件。

# master node
$ vim /etc/keepalived/ck_ng.sh
#!/bin/bash
# 检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
# 尝试启动一次nginx,停止5秒后再次监测
   service nginx start
   sleep 5
   counter=$(ps -C nginx --no-heading|wc -l)
   if [ "${counter}" = "0" ];then
   # 如果启动没成功,就杀掉 keepalived 触发主备切换
       service keepalived stop
   fi
fi


$ chmod +x /etc/keepalived/ch_ng.sh
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1                            # 设备在高可用组中的标识,不一样即可
}

vrrp_script chk_nginx {              # 健康检查
script "/etc/keepalived/ck_ng.sh"      # 检查脚本
interval 2                         # 检查频率(秒)
weight -5                              # priority减5
fall 3                                 # 失败三次
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state MASTER                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.10        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 100                       # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }

   track_script {                     # 引用脚本
       chk_nginx
   }
}
$ systemctl restart keepalived
# backup node
$ vim /etc/keepalived/ck_ng.sh
#!/bin/bash
# 检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
# 尝试启动一次nginx,停止5秒后再次监测
   service nginx start
   sleep 5
   counter=$(ps -C nginx --no-heading|wc -l)
   if [ "${counter}" = "0" ];then
   # 如果启动没成功,就杀掉keepalived触发主备切换
       service keepalived stop
   fi
fi


$ chmod +x /etc/keepalived/ch_ng.sh
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 2                            # 设备在高可用组中的标识,不一样即可
}

vrrp_script chk_nginx {              # 健康检查
script "/etc/keepalived/ck_ng.sh"      # 检查脚本
interval 2                         # 检查频率(秒)
weight -5                              # priority减5
fall 3                                 # 失败三次
}

vrrp_instance VI_1 {                   # 实例名:两台路由器相同
   state BACKUP                       # MASTER OR BACKUP
   interface ens32                    # 网卡名称
   mcast_src_ip 192.168.100.20        # 心跳源IP
   virtual_router_id 55               # 虚拟路由编号,主备要一致
   priority 99                        # 优先级
   advert_int 1                       # 心跳间隔(秒)
   
   authentication {                   # 秘钥验证
       auth_type PASS                 # 认证方式:密码
       auth_pass 123456
   }
   
   virtual_ipaddress {                # VIP
   192.168.100.88
   }

   track_script {                     # 引用脚本
       chk_nginx
   }
}
$ systemctl restart keepalived

访问测试,问题解决,特地修改监听 nginx 脚本不尝试启动 nginx,直接杀掉 keepalived,发现成功切换。


相关文章

sqlserevr索引、自增列查询SQL

sqlserevr索引、自增列查询SQL

一、索引查询1.可视化方式查询1) 进入实例数据库内,选择想要查看的数据库及表信息。2) 展开表,即可查看其索引情况(一般情况下,PK为主键,IX为索引)。 3) 或者右击表,编辑表结构,可以查看到索...

开源大数据集群部署(十三)Ranger 集成Trino

开源大数据集群部署(十三)Ranger 集成Trino

1、安装ranger trino插件在trino的coordinator节点部署Ø 解压ranger-2.3.0-trino-plugin.tar.gz[root@hd2.dtstack.com ]#...

Hbase&Hive区别对比

Hbase和Hive定义区别Hbase,其实是Hadoop database的简称,是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等。Hiv...

Spark接入Kerberos交互式命令窗口提交任务

Spark接入Kerberos交互式命令窗口提交任务

1. Spark-shell首先需要使用有操作hdfs文件权限的keytab用户认证,认证上之后可以通过spark-shell交互命令行窗口执行任务如果集成了Ranger组件,如果创建的普通用户没有在...

MongoDB 单机安装部署

MongoDB 单机安装部署

说明本篇文章介绍 MongoDB 二进制安装的步骤,整个过程还是比较简单。1. 下载安装包进入 MongoDB 官网,获取安装包的下载链接:https://www.mongodb.com/try/do...

kafka性能关键参数配置指导

本文为kafka调优过程中主要参数以及参数相关释意,在遇到kafak性能问题时可优先调整一下参数1.Broker参数指导KAFKA_HEAP_OPTS:-Xmx6G   ...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。