Keepalived状态切换的条件和因素

一、Keepalived 应用场景

keepalived的研发是针对LVS的,特点是轻量级、配置简洁。正因为这个特点,个人认为其适合应用在资源相对少,且无共享存储的环境下,尤其适合在负载均衡器上使用,如LVS、haproxy、nginx等上,也可以用于轻量级的http环境,作为其高可用组件。当然理论上很多高可用的场景其都可以实现,不过基于keepalived本身的资源切换方式功能并不推荐使用。

二、影响keepalived状态切换的因素

keepalived状态切换主要通过其VRRP协议中的weight值结合健康脚本实现,节点的优先级也会根据脚本的检测状态动态调整。其实keepalived实现根据资源健康情况进行自由切换会根据跑的业务类型会有差别的的,有些情况当master上的资源由于故障切换到backup上时候,那么如果想再切回来就需要关闭keepalived的服务才可以。

1.MASTER、BACKUP、priority(优先级)

设定keepalived的master和backup值主要是在priority(优先级)相同的前提下才有意义,如果优先级不同的话,还是以优先级高的为master,而不管其设定了master还是backup,通常下我们两个节点最好指定不同的优先级。

2.vrrp_script脚本的weight值

这个weight值必须指定,否则有时候重启服务后该节点被显示为fault 状态。

weight值分为正值和负值,假定weight值为W,初始的优先级为P,

当weight值<0时:

  • 如果检测脚本返回值=0,则节点最终优先级不改变。
  • 如果检测脚本返回值≠0,则节点最终优先级=P-W,优先级会减小

当weight值>0时

  • 如果检测脚本返回值=0,则节点最终优先级=P+W,优先级会增加
  • 如果检测脚本返回值≠0,则节点最终优先级不改变。

节点优先级的变化和所在节点的业务状态会有很大关系,看下面两个表格:

  • 一,当两个节点上的业务服务都处于启动状态,如httpd,那么优先级变化会如下:
节点 设定优先级 weight值 节点正常运行优先级
(两个节点httpd都启动)
节点A:服务检测失败 A恢复,且不抢占  
A 100 -2 100 100-2=98 100  
B 99 -2 99 99 99  
状态 A为master A为master A为master 切换到B为master 切换到A为master  
  • 二,当master节点业务启动,backup节点业务为停止状态,如,haproxy(因为haproxy没有监听的地址是无法启动的,其实很多业务都是两个节点一启一停的)
节点 设定优先级 weight值 节点正常运行时的优先级 节点A业务失败时的优先级 停止A的keepalived后的优先级 重新开启A的keepalived优先级 停止B的keepalived后的优先级
A 100 -2 100 100-2=98 100-2=98 98
B 99 -2 99-2=97(因为haproxy停止) 97 97 99
状态 A为master A为master A为master A>B,并不切换 切换到B为master A<B,不切换回去 切换回A为master

由上可以看出,如果是第二种情况,那么只有关闭keepalived服务才能进行切换,这就是很多人做实验发现为什么业务停了却不能切换的原因,这种情况下我们可以改编初始优先级和weight值使 A切换到B,但是如果要切换回去,就手动停止keepalived才可以。这也是为什么keepalived不适合做大业务集群的原因,如果只是针对调度器做高可用的话还比较合适。

时间: 2024-10-14 06:47:47

Keepalived状态切换的条件和因素的相关文章

[基础控件]---状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用

一.事件监听 对于普通的Button,对其进行事件监听Google官方给出了常见的三种监听方式:1.对每一个button设置事件监听器button.setOnClickListener(View.OnclickListener  listener);此种方法当button按钮较多时代码显得多.乱.不够简洁明了. 2.在Activity中实现接口View.OnclickListener,然后重写void onClick(View v)方法,在方法中通过switch(v.getId())予以区分不同

UI--Android中的状态切换按钮自定义

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/46715453 1.概述 Android中关于控制开关和页面/状态切换的使用场景还是比较多的.源生做的支持也有比如RadioGroup 和Tabhost等.这里准备通过自定义View来模仿学习下IOS两种常见UI样式: SwitchButton 和 SegmentControl. 首先先通过简易的组

按钮插件和按钮状态切换

//按钮插件 1.data-loading-text="正在登录..."; //按钮单击后呈现不能点击,按钮颜色变浅并且(文字为="正在登录..."); //绑定事件(定时器) $("#id").button("loading"); window.setTimeout(function(){ $("#id").button("reset"); },2000) 2.data-complet

关于MFC共享DLL的模块状态切换 .

什么是模块状态? 在每个模块(EXE或DLL)中,都存在一种全局的状态数据,MFC依靠这种全局的状态数据来区分不同的模块,以执行正确的操作.这种数据包括:Windows实例句柄(用于加载资源),指向应用程序当前的CWinApp和CWinThread对象的指针,OLE模块引用计数,以及维护Windows对象句柄与相应的MFC对象实例之间连接的各种映射等.但当应用程序使用多个模块时,每个模块的状态数据不是应用程序范围的.相反,每个模块具有自已的MFC状态数据的私有副本.这种全局的状态数据就叫做MFC

Java(1):多线程内存模型和状态切换

线程的内存模型 32位操作系统的寻址空间为2的32次方,也就是4GB的寻址空间:系统在这4GB的空间里划分出1GB的空间给系统专用,称作内核空间,具有最高权限:剩下3GB的空间为用户空间(一般JVM的可用内存最大只能是2GB),只能访问当前线程划分的内存地址.用户线程需要访问硬件资源的时候需要委托内核线程进行访问,这就涉及到CPU上下文在用户模式和内核模式的切换.因此在使用线程或者进程的时候需要尽量避免不必要的用户模式和内核模式的切换. 进程是资源管理的最小单位,线程是CPU调度的最小单位.线程

Egret 中实现3种状态切换按钮

一.游戏中的常用3种状态按钮 Egret种提供了2种状态切换的按钮ToggleButton. 但是在游戏中常用到3种状态的按钮,比如任务系统的领取.已领取.未领取. 比如下图中宝箱的打开.浏览后打开.邀请后打开 二.利用eui.Button来实现3种状态切换按钮 测试用素材 继承eui.Button,并实现3种状态切换按钮 /** * 三种状态切换按钮 * @author chenkai 2018/8/8 */ class ThreeButton extends eui.Button{ publ

Java学习之==&gt;Java线程生命周期与状态切换

一.Java线程生命周期与状态切换 这些状态的描述可以总结成下图: NEW 一个刚创建但尚未启动的Java线程实例就是处于 NEW 状态 public class App { public static void main(String[] args) { Thread thread = new Thread(); Thread.State state = thread.getState(); System.out.println(state); } } // 输出结果 NEW RUNNABLE

mysql+keepalived主从切换脚本 转

Keepalived MySQL故障自动切换脚本 MySQL架构为master-slave(主从),master故障自动切换到slave上.当然也可以设置为双master,但这里有个弊端:就是当主的压力很大时,从上延时很大,比如落后2000秒,此时主挂了,从接管(VIP漂移到从),用户刚才发表的文章,此时因为同步延时大,还没复制过来,于是用户又发表了一篇文章,当原来的master修好后,因从的IO和SQL线程还在开启状态,还会继续同步刚才没有同步复制完的数据,这时有可能把用户新发表的文章更改掉,

第5章(6) 状态切换(Switch)和评级条(RatingBar)

分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 1.利用Switch或者ToggleButton切换状态 如果只有两种状态,可以用ToggleButton控件或Switch控件切换这两种状态.如下图所示(左侧是ToggleButton的效果,右侧是从API 19开始增加的Switch的效果): 2.利用五角星评级条(RatingBar)设置评级 [NumStars]属性:定义星级的个数. [StepSize]属性:定义每一颗星的粒度(值为 0.5 将允许半星