Keepalived高可用服务搭建

Keepalived高可用服务搭建

标签(空格分隔): linux服务


文章目录

  • Keepalived高可用服务搭建
  • 1 keepalived高可用软件
    • 1.1 介绍
    • 1.2 三大功能
    • 1.3 Keepalived高可用故障切换转移原理
    • 1.4 VRRP虚拟路由冗余协议
  • 2 Keepalived高可用服务搭建
    • 2.1 CentOS 6*安装
    • 2.2 双实例双主模式
    • 2.3 Keepalived高可用服务器的“裂脑”问题
  • 3 keepalived相关问题的一些方案
    • 3.1 防止nginx服务宕机,VIP不发生漂移的问题
    • 3.2 解决多组Keepalived服务器在一个局域网的冲突问题
    • 3.3 开发检测“裂脑”问题的脚本
  • 4 CentOS 7.5部署keepalived
    • 4.1 下载源码包
    • 4.2 安装部署
    • 4.3 配置文件

1 keepalived高可用软件

1.1 介绍

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

1.2 三大功能

  1. 管理LVS负载均衡软件
  2. 实现对LVS集群节点健康检查功能
  3. 作为系统网络服务的高可用功能

1.3 Keepalived高可用故障切换转移原理

  • Keepalived高可用服务之间的故障切换转移,是通过VRRP(Virtual Router Redundancy - Protocol,虚拟路由器冗余协议)来实现的。
  • 在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,告诉备Backup节点自己存活,当主节点发生故障无法发送心跳消息时,备节点检测不到主节点的“心跳”了,于是调用接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

1.4 VRRP虚拟路由冗余协议

  • VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

  • 在VRRP路由器集群中,有多台物理VRRP路由器。其中,一Master工作,其他都是Backup。Master拥有虚拟路由器的IP地址,负责转发发送给网关地址的包和响应ARP请求。

  • VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-225)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因Master的改变而修改自己的路由配置。

  • 在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master。这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性。出于安全性考虑,VRRP数据包使用了加密协议进行了加密。

2 Keepalived高可用服务搭建

2.1 CentOS 6*安装

在两台负载均衡服务器上配置,一台为主,一台为备

  1. keepalived有yum安装方式,源码编译安装方式,这里用yum安装,以主服务器为例(如果是虚拟机设置,需要在这两台服务器上添加一块新网卡,用于keepalived主备之间心跳信息发送)
  2. 使用yum安装并检查版本
    yum -y install keepalived
    rpm -qa keepalived
  3. 启动keepalived并检查
    /etc/init.d/keepalived start
    ps -ef | grep keep | grep -v grep
  4. 提示有三个keepalived进程表示安装正确
    ip add | grep 192.168
    默认情况下会开启三个VIP地址,和配置文件有关,检查都完成后关闭服务,进行自定义配置
  5. keepalived配置文件高可用部分详解(主MASTER)

输入vim /etc/keepalived/keepalived.conf
其内容为:

! Configuration File for keepalived
global_defs {               #全局配置
    notification_email {
    [email protected]       #用于接收切换信息及RS节点故障报错信息的邮箱
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1        #发送邮件的服务器IP
    smtp_connect_timeout 30
    router_id lb01               #id为lb01,不能和其他Keepalived节点相同(全局唯一)
    }
    
vrrp_instance VI_1 {            #实例名字为VI_1,同实例备节点名字要和这个相同
    state MASTER                #状态为MASTER,备节点为BACKUP
    interface eth1              #通信/心跳接口为eth1,此参数主备相同
    virtual_router_id 55        #实例ID为55,要和备节点相同
    priority 150                #优先级为150,备节点的优先级必须比此数字低
    advert_int 1                #通信检查间隔时间1秒
    authentication {            #PASS认证模块,此模块主备相同
        auth_type PASS              
        auth_pass 1111              
    }
    virtual_ipaddress {
    192.168.88.120/24 dev eth0 label eth0:1 
    }
}
    #VIP为192.168.88.120,子网掩码为24位,和服务器的网段相同,绑定接口为eth0,标签为eth0:1,此参数备节点设置和主节点相同,可以配置多个VIP,每个地址占一行,

Keepalived配置参数|MASTER节点特殊参数|BACKUP节点特殊参数
–|
|router_id(唯一标识)|router_id lb01|router_id lb02
state(角色状态)|state MASTER|state BACKUP
priority(竞选优先级)|priority 150|priority 100

  • 主备都配置完成后启动服务,通过关闭主备服务器的keepalived服务,来测试VIP漂移是否正常
    使用命令来查看eth0:1的状态
    ip a | grep 192.168.88.120

2.2 双实例双主模式

  • 只需要在主备的配置文件中再加入一个vrrp模块,配置好就行,需要修改的参数有
    state(状态):和第一个实例反过来
    priority(优先级):决定第二个VIP在哪个机器上初始运行
    virtual_router_id:每个实例不同,但同实例的主从需要一致

2.3 Keepalived高可用服务器的“裂脑”问题

  • 解释
    由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。

  • 原因
    心跳线故障,网卡相关故障,防火墙阻挡心跳信息,配置文件问题如同实例虚拟路由参数不同等

  • 解决方法
    多根心跳线,冗余的方式;脚本检测故障;防火墙配置

3 keepalived相关问题的一些方案

3.1 防止nginx服务宕机,VIP不发生漂移的问题

  1. 在主服务器上,利用脚本监控nginx服务
    cat /etc/keepalived/nginx_check.sh
    其内容为:
#!/bin/sh
    
while true
do
    if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then
        /etc/init.d/keepalived stop
    fi
    sleep 5
done

sh nginx_check.sh &
后台运行脚本
当主服务器上负载均衡失效时,主动释放VIP

  • 或者脚本写的像下面这个,更方便,只用来被keepalived引用
    cat /etc/keepalived/nginx_check.sh
    给执行权限
    chmod +x /etc/keepalived/nginx_check.sh
#!/bin/bash
    
pidof nginx
if [ $? -ne 0 ];then
    /etc/init.d/keepalived stop
fi 

2.在服务器上,利用keepalived本身来执行脚本
脚本主体沿用上个脚本,但是要去除while循环,此时脚本名为:
在keepalived配置文件中,加入vrrp检测模块(在vrrp实例模块之前):

#定义vrrp脚本,检测nginx服务
vrrp_script chk_nginx {       
    script "/etc/keepalived/nginx_check.sh"
    interval 2          #间隔2秒
    weight -20

且在vrrp实例模块最后,加入触发检查参数:

vrrp_instance VI_1 {
    ......
    track_script {
        chk_nginx
    }
}

当Nginx停止的时候,Keepalived服务2秒钟内会被自动停掉,VIP被释放,由备服务器接管,这样就实现了即使nginx服务宕机也会进行IP漂移。

3.2 解决多组Keepalived服务器在一个局域网的冲突问题

当在同一个局域网内部署了多组Keepalived服务器对,而又未使用专门的心跳线通信时,可能会发生高可用接管的严重故障问题。之前已经讲解过Keepalived高可用功能是通过VRRP协议实现的,VRRP协议默认通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组Keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的Keepalived都会使用默认的224.0.0.18作为多播地址。此时的解决办法是,在同组的Keepalived服务器所有的配置文件里指定独一无二的多播地址,配置如下:

global_defs {
    router_id LVS_19
    vrrp_mcast_group4 224.0.0.19        #这个就是指定多播地址的配置
}
  • 提示:
    1不同实例的通信认证密码也最好不同,以确保接管正常。
    2)另一款高可用软件Heartbeat,如果采用多播方式实现主备通信,同样会有多播地址冲突问题。

3.3 开发检测“裂脑”问题的脚本

  • 思路:
  1. 在备节点上执行脚本,使用ip a | grep VIP的方式过滤,存在VIP则执行下一步
  2. ping 心跳连接的IP,不通则执行下一步
  3. ping master_IP,通则执行下一步
  4. telent master_IP 80 ,通则代表主服务器nginx服务正常,需要检测keepalived服务是否正常,若正常,则“裂脑”,不正常,则需要手动恢复主服务的keepalived服务

此脚本不完整

#!/bin/bash

lb01_vip=192.168.0.240
lb01_ip=192.168.0.221

while true
do
    ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is OK"
    fi
    sleep 5
done

4 CentOS 7.5部署keepalived

4.1 下载源码包

cd ~
wget http://www.keepalived.org/software/keepalived-1.4.5.tar.gz

4.2 安装部署

yum install -y gcc openssl-devel popt-devel
tar xf keepalived-1.4.5.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.4.5/
./configure --prefix=/usr/local/keepalived
make && make install

#启动前的配置    
cp /usr/src/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/src/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

#修改配置文件后可以启动,也可以加入开机自启,但是前提是nginx也是开机自启
/etc/init.d/keepalived start
systemctl enable keepalived

4.3 配置文件

! Configuration File for keepalived

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id lb01
}

#检测nginx是否运行
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface ens34
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #引用nginx检测
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.200.120/24 dev ens32 label ens32:1
    }
}

你可能感兴趣的:(linux服务,keepalived,nginx)