Keepalived中Master和Backup主备切换机制浅析

在keepalived的VRRP实例配置中会一般会设置Master和Backup来指定初始状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值和vrrp_script模块中设置的“weight”值。下面分别分情况对主备机切换机制作详细说明。

配置简介:

主机 IP 操作系统 软件 VIP 备注
nginx01 172.27.9.91 Centos7 keepalived nginx 172.27.9.200 关闭防火墙和selinux,nginx端口为82
nginx02 172.27.9.92 Centos7 keepalived nginx 172.27.9.200 关闭防火墙和selinux,nginx端口为82

初始nginx01中keepalived配置:

[[email protected] keepalived]# more keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id proxy1 
}
vrrp_script chk_nginx {
  script "/etc/keepalived/test.sh"
  interval 2
  weight 20
  fall 1
  rise 10
}
vrrp_instance VI_1 {
    state MASTER 
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.27.9.200
    }
    track_script {
        chk_nginx
    }
}

初始nginx02中keepalived配置:

[[email protected] keepalived]# view keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id proxy2
}
vrrp_script chk_nginx {
  script "/etc/keepalived/test.sh"
  interval 2
  weight 20
  fall 2
  rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.27.9.200
    }
    track_script {
        chk_nginx
    }
}

vrrp_script中的脚本:

[[email protected] keepalived]# more test.sh 
#!/bin/bash
count=`ps -ef|grep nginx|grep -v grep|wc -l`
if [ $count -gt 0 ];then
    exit 0
else
    exit 1
fi

该脚本用于检测nginx进程是否存在。

场景一:

主机 state指定值
priority值

vrrp_script中的weight值 nginx状态
nginx01 MASTER 100 20 正常启动
nginx02 BACKUP 90 20 正常启动

此种方式为keepalived常规配置方式,也是本次测试的初始状态,下面的场景都是基于该初始状态。查看ip和页面访问:

发现vip在nginx01上,访问的页面也是nginx01。

场景二:

主机 state指定值 priority值 vrrp_script中的weight值 nginx状态
nginx01 BACKUP 100 20 正常启动
nginx02 MASTER 90 20 正常启动

修改nginx两台服务器state的值,重启keepalived服务,查看vip是否切换。

发现vip还是在nginx01上,页面访问也是nginx01。

结论:keepalived主备和state值无关。

场景三:

主机 state指定值 priority值 vrrp_script中的weight值 nginx状态
nginx01 MASTER 100 20 挂起
nginx02 BACKUP 90 20 正常启动

初始状态nginx01上的nginx进程kill掉,查看是否发生切换。

nginx01日志:

页面访问:

此时nginx01的nginx进程检验脚本检测失败,vip切换至nginx02,页面访问为nginx02。

结论:若nginx01中的priority值小于nginx02中的priority值+vrrp_script中的weight值,则发生主备切换。

场景四:

主机 state指定值 priority值 vrrp_script中的weight值 nginx状态
nginx01 MASTER 100 5 正常启动
nginx02 BACKUP 90 20 正常启动

初始状态nginx01中vrrp_script中的weight值为5,重启nginx01的keepalived服务,查看是否发生切换。

nginx01日志:

发现vip由初始状态的nginx01上漂移至nginx02,页面访问为nginx02。

结论:若nginx01中的priority值+vrrp_script中的weight值小于nginx02中的priority值+vrrp_script中的weight值,则发生主备切换。

场景五:

主机 state指定值 priority值 vrrp_script中的weight值 nginx状态
nginx01 MASTER 100 20 挂起
nginx02 BACKUP 90 5 正常启动

初始状态nginx01中nginx进程kill掉,修改nginx02的vrrp_script中的weight值为5,重启nginx02的keepalived服务,查看是否发生切换。

nginx01日志:

nginx02日志:

此时nginx01的nginx进程检测脚本检测失败,发现vip并未发生漂移,keepalived为切换,页面访问为nginx01。

结论:若nginx01中的priority值大于nginx02中的priority值+vrrp_script中的weight值,则发生主备切换。

综上所述,通过实践可以得出结论:

1.keepalived的主备状态与state值设置无关;

2.主备机由priority值和vrrp_script中的weight值之和决定,大的为主;

3.主备比较权值=priority值+weight值*标志位,当vrrp_script检测脚本为true时标志位为1,反之为0;

4.为保证正常的主备切换,weight值应大于主备priority值之差。

原文地址:http://blog.51cto.com/3241766/2097483

时间: 2024-10-27 08:48:40

Keepalived中Master和Backup主备切换机制浅析的相关文章

Spark系列(五)Master主备切换机制

Spark Master主备切换主要有两种机制,之中是基于文件系统,一种是基于Zookeeper.基于文件系统的主备切换机制需要在Active Master挂掉后手动切换到Standby Master上,而基于Zookeeper的主备切换机制可以实现自动切换Master. 切换流程图 流程说明: Standby Master模式 1. 使用持久化引擎读取持久化的storeApps.storeDrivers.storeWorkers,持久化引擎有FileSystemPersistenceEngin

Keepalived中Master和Backup角色选举策略

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

测试redis+keepalived实现简单的主备切换

转自: 测试redis+keepalived实现简单的主备切换 - Try My Best 尽力而为 - ITeye技术网站http://raising.iteye.com/blog/2311757 keepalived是一个是集群管理中保证集群高可用的一个服务软件,它具备心跳检测的功能.运用在redis上,则是具备主备切换的控制功能. keepalived的主备切换方案的设计思想如下: 当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby: 当 

keepalived实现redis主备切换

试验目标: 1:主redis发生故障时,从redis自动切换为主redis. 2:主redis恢复正常后,自动降级为从redis. 试验环境: 主redis:192.168.189.138 从redis:192.168.189.131 VIP:192.168.189.123 主从redis均安装了keepalived与redis,redis已配置好主从.Redis端口44444. 1:制作redis监控与主备切换脚本: Redis监控脚本:(监控redis是否正常) # cat /usr/loc

mysql主从配置&&基于keepalived的主备切换

mysql互为主从设置 && 主备切换配置 需求说明: 1.公司架构一直是一台单独的mysql在线上跑,虽然一直没有出现什么宕机事件,但是出于一个高可用的考虑,提出主从备份.主备切换的需求: 2.实现这个需求的前一段时间只是在做数据库备份的时候实现了主从热备,为了实现主备切换功能,继续操作上述需求: 实验环境: master1:10.1.156.3:3306 master2:10.1.156.5:3306 my.cnf配置文件关于主从这块的修改: master1: server-id =

Nginx+Keepalived主备切换(包含nginx服务停止)

原文地址:http://blog.sina.com.cn/s/blog_79ac6aa80101bmed.html Nginx+Keepalived主备切换(包含nginx服务停止) 环境: VM中4台CentOS 本机PC充当测试机win8 步骤: 1.搭建 nginx+keepalived主备切换(不考虑主nginx停掉现象)文章中的环境 2.修改两台部署的keepalived的配置文件 3.编写观察nginx进程情况的脚本内容 #!/bin/bash A=`ps -C nginx --no

VRRP负载均衡及端口跟踪实现主备切换

VRRP 实验 1. 实现PC1和PC2的流量分别走R1和R2,实现负载均衡2. 跟踪端口,当外部链路出现故障实现主备切换. R1#conf tR1(config)#interface e0/0R1(config-if)#ip address 192.168.1.1 255.255.255.0R1(config-if)#no shutdownR1(config-if)#R1(config-if)#vrrp 10 ip 192.168.1.254 vrrp 10号组虚拟ip地址R1(config-

主备切换,双机热备,负载均衡,nginx

MySQL主备切换 数据库由主服务器和备份服务器组成,主备同时运行,主服务器有数据改动后,立刻会同步到备份服务器.在日常运维中,为了防患未然,切换的操作只需要将连接池中数据库服务器的IP换成备份服务器的IP就可以了.Nginx高性能的http和反向代理服务,能实现主备切换工作. 双机热备 双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备 方式(Active-Standby方式)和双主机方式(Activ

Oracle 11.2.0.4.0 Dataguard部署和日常维护(5)-Datauard 主备切换和故障转移篇

1. dataguard主备切换 1.1. 查看当前主备库是否具备切换条件 on slave select sequence#,first_time,next_time,archived,applied from v$archived_log where SEQUENCE#=(select max(SEQUENCE#) from v$archived_log); SEQUENCE# FIRST_TIME NEXT_TIME ARCHIVED APPLIED ---------- --------