Keepalived高可用集群部署

1、keepalived说明

Keepalived最初是为lvs负载均衡软件设计的,三个功能,管理lvs,实现集群节点健康检查,作为系统网络服务的高可用功能(failover)。

Keepalived高可用对之间是通过vrrp协议通信。

 

2、安装keepalived环境说明

硬件环境准备,如下

hostname

ip

说明

Lb01

192.168.19.154

Keepalived主服务器(nginx)

Lb02

192.168.19.157

Keepalived从服务器(nginx)

Web01

192.168.19.154

Web01服务器

Web02

192.168.19.157

Web02服务器

 3、Nginx、keepalived安装

[root@www logs]# cat /etc/redhat-release

CentOS Linux release 7.6.1810 (Core)

[root@www logs]# ls /usr/local/nginx/

[root@www logs]# yum install keepalived -y

 

4、启动keepalived

Centos7默认网卡,因此启动前需要修改配置网卡信息,

[root@www keepalived]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {

    state MASTER

    interface ens33

[root@www keepalived]# systemctl start keepalived   

[root@www keepalived]# ip add |grep 200

    inet 192.168.200.16/32 scope global ens33

    inet 192.168.200.17/32 scope global ens33

    inet 192.168.200.18/32 scope global ens33

 

5、keepalived配置文件解析

主要有3个功能,本章主要讲解高可用功能,高可用部分主要分为两个重要区块:全局定义部分和实例定义区块。

[root@www keepalived]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

全局部分:主要设置故障通知和Router ID标识,示例配置如上,

第一行是注释,!和#都表示注释。

第二行为空行

第3-8行定义报警故障的Email通知

第9行指定发送邮件的发送人,可选

第10行指定smtp_server发送邮件的smtp服务器,如果本机开启了sendmail或者postfix,就可以使用上面的默认配置实现邮件发送,可选

第11行,连接smtp_server超时时间

第4-11行,都可以不配置,实际工作会交给(zabbix、nagios)监控系统。

第12行,是keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。

 

Vrrp实例定义区块

具体实例配置信息,keepalived主备状态,端口,优先级,认证方式和ip信息。

 19 vrrp_instance VI_1 {

 20     state MASTER

 21     interface ens33

 22     virtual_router_id 51

 23     priority 100

 24     advert_int 1

 25     authentication {

 26         auth_type PASS

 27         auth_pass 1111

 28     }

 29     virtual_ipaddress {

 30         192.168.200.16

 31         192.168.200.17

 32         192.168.200.18

 33     }

 34 }

第19行,标识定义一个vrrp_instance实例,名字为VI_1,每个vrrp_instance实例可以认为是服务的一个实例或者作为一个业务服务,在keepalived服务配置中,这样的vrrp_instance实例可以有多个,注意存在主节点的vrrp_instance实例在备节点中也需要存在,这样才能实现故障切换接管。

第20行,state表示当前实例VI_1的角色状态,当前角色为MASTER,这个状态只能有MASTER和BACKUP两者状态,并且需要大写字母,当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。

第21行,interface为网路通信接口。对外提供服务的网络接口,如eth0、eth1.

第22行,virtual_router_id,虚拟路由id的标识,这个标识最好是一个数字,并且在keepalived中唯一,MASTER和SLAVE需要保持一致,否则会出现脑裂问题。

第23行,priority为优先级,其后面是一个数字,数字越大,标识优先级越高,在同一个vrrp_instance实例中,MASTER配置优先级要高于SLAVE。若MASTER为150,一般建议SLAVE为100或更小的数值,一般建议隔50以上为佳

第24行,同步通知间隔,MASTE和SLAVE之间通信时间,单位为秒。

第25-28行,authentiction为权限认证配置。官网推荐使用PASS明文方式,密码最好4-8位数字,同一实例的MASTER和SLAVE使用相同的密码才能通信。

第29-32行,虚拟ip地址,可以配置多个,每个地址占一行。

 

6、keepalived主从配置

主要有,如下参考配置。

 

 如上,主从配置信息,注意MASTERSLAVE配置文件的三个差别。

 

6、keepalived脑裂问题

什么是脑裂?

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

脑裂发生原因?

高可用服务对之间心跳线链路发生故障,导致无法正常通信。(如,心跳线坏了,网卡驱动,ip冲突,交换机)

高可用服务器开启了iptables、firewalld防火墙拦住了心跳信息

心跳网络配置信息不对

其他配置不当,心跳方式,广播。

解决脑裂问题

使用串行电缆和以太网电缆,同时使用两条心跳

当检测脑裂,强行关闭一个心跳节点

接入监控软件,通过监控信息判断故障节点

 

7、keepalived主主配置

主主配置,对于多实例而言。

 

  供参考,暂未使用。

 

8、keepalived配置邮件

操作步骤如下,

yum install mailx -y   安装邮件服务

[root@www keepalived]# tail -3 /etc/mail.rc

set from=wangweiwei_11@sina.cn  smtp=smtp.sina.cn

set smtp-auth-user=wangweiwei_11@sina.cn smtp-auth-password=xxx

set smtp-auth=login

邮件测试发送:echo "hello world" | mail -s "hello" 498886724@qq.com

[root@www keepalived]# cat keepalived.conf

...

    virtual_router_id 51

    priority 150

    advert_int 1

    # Keepalived进入MASTER状态执行脚本

    notify_master "/etc/keepalived/mail_notify.sh master"

    # Keepalived进入BACKUP状态执行脚本

    notify_backup "/etc/keepalived/mail_notify.sh backup"

    # Keepalived进入FAULT状态执行脚本

    notify_fault "/etc/keepalived/mail_notify.sh fault"

    authentication {

        auth_type PASS

        auth_pass 1111

....

}

[root@www keepalived]# cat mail_notify.sh

#!/bin/bash

echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com

触发邮件告警,

  

 

 

 9、keepalived配置脚本检查主从切换状态记录

结合具体的应用实现,完善脚本。

[root@www keepalived]# cat keepalived.conf

...

    advert_int 1

    # Keepalived进入MASTER状态执行脚本

    notify_master "/etc/keepalived/master_notify.sh master"

    # Keepalived进入BACKUP状态执行脚本

    notify_backup "/etc/keepalived/backup_notify.sh backup"

    # Keepalived进入FAULT状态执行脚本

notify_fault "/etc/keepalived/fault_notify.sh fault"

...

[root@www keepalived]# cat master_notify.sh

#!/bin/bash

echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com

LOGFILE=/var/log/keepalived-state.log

echo "[Mster]" >>$LOGFILE

date >> $LOGFILE

[root@www keepalived]# cat backup_notify.sh

#!/bin/bash

echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com

LOGFILE=/var/log/keepalived-state.log

echo "[Backup]" >>$LOGFILE

date >> $LOGFILE

[root@www keepalived]# cat fault_notify.sh

#!/bin/bash

echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com

LOGFILE=/var/log/keepalived-state.log

echo "[Fault]" >>$LOGFILE

date >> $LOGFILE

查看日志,[root@www keepalived]# cat /var/log/keepalived-state.log

[Mster]

Sat Aug 22 19:49:21 CST 2020

[Mster]

Sat Aug 22 19:51:25 CST 2020

[Backup]

Sat Aug 22 19:53:18 CST 2020

 

10、keepalived配置脚本健康检查

结合具体的应用实现,当nginx或者ha故障,则停止当前节点的keepalived,自动切换到备用节点。一般通过脚本方式实现。以为nginx为例。

[root@www_test keepalived]# cat nginx_check.sh

#!/bin/bash

/usr/bin/curl http://127.0.0.1/index.html -o /dev/null -s || /usr/sbin/nginx

if [ $? -ne 0];then

   systemctl stop keepalived &> /dev/null

fi

[root@www_test keepalived]# chmod +x nginx_check.sh

[root@www_test keepalived]# cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     1456576084@qq.com

     18672933592@163.com

   }

   notification_email_from wangweiwei_11@sina.cn

   smtp_server stmp.sina.cn

   smtp_connect_timeout 30

   router_id LVS_2

}

 

vrrp_script check_nginx {

   script "/etc/keepalived/nginx_check.sh"

   interval 2

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 200

    advert_int 1

    # Keepalived进入MASTER状态执行脚本

    notify_master "/etc/keepalived/master_notify.sh master"

    # Keepalived进入BACKUP状态执行脚本

    notify_backup "/etc/keepalived/backup_notify.sh backup"

    # Keepalived进入FAULT状态执行脚本

    notify_fault "/etc/keepalived/fault_notify.sh fault"

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.19.180

    }

    track_script {

        check_nginx

    }

}

自此,完成了keepalived基本操作。

posted @ 2020-08-22 21:03  wang_wei123  阅读(225)  评论(0编辑  收藏  举报