keepalived配置详解

一、软件安装部署

两种安装方式:

(1)yum方式安装

yum -y install keepalived
​
# 查看安装路径
rpm -ql keepalived

(2)源码安装

1)安装依赖
yum -y install gcc openssl-devel libnfnetlink-devel
​
2)下载源码
wget https://www.keepalived.org/software/keepalived-1.4.5.tar.gz
​
3)解压
tar -zxvf keepalived-1.4.5.tar.gz -C /usr/src
​
4)编译安装
cd /usr/src/keepalived-1.4.5/
./configure && make -j 4 && make install

二、 keepalived配置文件解析

Keepalived 主配置文件的名称为:

###默认存放的位置
/etc/keepalived/keepalived.conf

一个功能比较完整的常用的 keepalived 配置文件,主要包含以下三块:

! Configuration File for keepalived
#全局定义块
global_defs {
   ...
}
​
#VRRP 实例定义块
vrrp_instance VI_1 {
   ...
}
​
#虚拟服务器定义块
virtual_server 10.10.10.2 1358 {
   ...
}
​

image-20231213152803334

注意:全局定义块是必须配置项;如果Keepalived只用来做HA,则虚拟服务器是可选配置。下面详细介绍Keepalived配置文件:

(1)全局定义块

这部分主要用来设置Keepalived的故障通知机制和Router ID标识。示例代码如下:

image-20231213153019658

参数说明:
1)第一行是注释(可省略)
​
2)第4~8行:email通知,用于服务有故障时发送邮件报警。可选项,不建议用。需系统开启sendmail服务,建议用第三方独立监控服务,如使用nagios监控代替。(可省略)
​
3)第9行:指定发件人,可选配置。(可省略)
​
4)第10行:指定发送邮件的smtp服务器地址,可选配置。(可省略)
​
5)第11行:指定连接smtp的超时时间,可选配置。 (可省略)
​
6)第12行:用户标识本节点的名称,通常为 hostname 。(生产必备配置!!!)
    主备节点的一定要不一致才行 

(2)VRRP 实例定义块

image-20231213153435950

参数说明:
​
1)第15行:定义一个vrrp_install实例,名称为VI_1
​
2)第16行:表示该实例的角色状态,有MASTER和BACKUP两种主备状态。(生产必备配置!!!)
​
3)第17行:对外提供服务的网络接口,如eth0,ens33 (生产必备配置!!!)
    使用ip a查看IP地址,获取对应的网络接口
​
4)第18行:虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致,否则将出现脑裂问题。(生产必备配置!!!)
​
5)第19行:priority表示实例优先级。数字越大,优先级越高。(生产必备配置!!!)
​
6)第20行:advert_int为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。(生产必备配置!!!)
​
7)第21~24行:权限认证配置。 (生产必备配置!!!)
​
8)第25~29行:虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中需要和域名绑定的ip,即可配置的高可用服务监听的ip保持一致。 (生产必备配置!!!)

(3)虚拟服务器定义块

image-20231213153922667

参数说明:
​
1)virtual_server:定义一个虚拟服务器,这个ip是virtual_address中定义的其中一个。语法格式:ip+空格+服务端口
​
第58行:delay_loop 6
健康检查时间间隔,单位:秒
​
第59行:lb_algo rr
负载均衡调度算法,互联网应用常用方式为 wlc或rr
​
第60行:lb_kind NAT
负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
​
第61行:persistence_timeout 50
http服务会话保持时间,单位:秒
​
第62行:protocol TCP
转发协议,分为TCP和UDP两种
​
2)real_server:真实服务器IP和端口,可以定义多个
​
第67行:weight 1
负载权重,值越大,转发的优先级越高
​
第81行:connect_timeout 3
服务连接超时时长,单位:秒
​
第82行:nb_get_retry 3
服务连接失败重试次数
​
第83行:delay_before_retry 3 :重试连接间隔,单位:秒

三、生产环境配置详解

(1)主库配置

image-20231213154948883

(2)备库配置

image-20231213155038090

(3)配置详解

cat /etc/keepalived/keep
global_defs {                        ###全局定义块
    router_id MySQL-HA-1             ###用户标识本节点的名称,主备节点要不一致
}
​
vrrp_script check_mysql {            ###应用状态检查
    script "/etc/keepalived/check_mysql.sh"   ###mysql数据库状态检查脚本
interval 30                          ###检查间隔时间
}
​
vrrp_instance VI_1 {                 ###定义一个vrrp_install实例,名称为VI_1
    state BACKUP                     ###表示该实例的角色状态,有MASTER和BACKUP两种主备状态。
    interface ens192                 ###对外提供服务的网络接口,如eth0,ens33,ens192
    virtual_router_id 101     ###虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致,否则将出现脑裂问题。
    priority 120              ###priority表示实例优先级。数字越大,优先级越高。
advert_int 1                  ###advert_int为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。
nopreempt               ###nopreempt允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
    authentication {    ###权限认证配置,下方2行参数。
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {  ###虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中需要和域名绑定的ip,即可配置的高可用服务监听的ip保持一致。
        10.2.87.101 dev ens192 
    }
   track_script {     ###可以在keepalived.conf文件中定义的脚本,用以实现某个检测功能;
       check_mysql    ###此处调用check_mysql中的脚本。
   }
}
​
​
MySQL检查脚本
cat /etc/keepalived/check_mysql.sh
​
#!/bin/bash
mysql_proc_3306=`ps aux | grep -v grep | grep "bin/mysqld" | grep -c "port=3306"`
if [[ $mysql_proc_3306 -eq 1 ]]
then
    exit 0
else
    exit 1

四、vrrp_script 详解

通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup。当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。因此可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt解决异常恢复后再次抢占的问题。

(1)vrrp_script能做什么

keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务进程,比如说nginx,keepalived+nginx实现nginx的负载均衡高可用,如果nginx异常,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控

例如:编写个简单脚本查看haproxy进程是否存活

#!/bin/bash
count = `ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count > 0 ]; then
    exit 0
else
    exit 1
fi

在keepalived的配置文件中增加相应配置项

vrrp_script checkhaproxy
{
    script "/home/check.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ...
    
    track_script
    {
        checkhaproxy
    }
    
    ...
}

(2)优先级更新策略

keepalived会定时执行脚本对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加

如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少

其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

(3)vrrp_script中节点权重改变算法**

在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。

3.1不设置weight

在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。

3.2设置weight

vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败;

  1. weight 为正时脚本检测成功时此weight会加到priority上,检测失败时不加;

    1. 主失败:

      1. 主 priority < 从 priority + weight 时会切换。

    2. 主成功:

      1. 主 priority + weight > 从 priority + weight 时,主依然为主

  2. weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)

    1. 主失败:

      1. 主 priority – abs(weight) < 从priority 时会切换主从

    2. 主成功:

      1. 主 priority > 从priority 主依然为主

(4)配置不抢占nopreempt带来的问题

例如:A,B两台keepalived

A的配置大概为:

vrrp_script checkhaproxy
{
    script "/etc/check.sh"
    interval 3
    weight -20

}

vrrp_instance test
{
    ....
    
    state backup
    priority 80
    nopreempt

    track_script
    {
        checkhaproxy
    }

    ....
}

B的配置大概为:

vrrp_script checkhaproxy
{
    script "/etc/check.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ....
    
    state backup
    priority 70

    track_script
    {
        checkhaproxy
    }

    ....
}

A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。

所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值