本文来说下集群的脑裂问题

文章目录

  • 什么是脑裂(split-brain)
  • 集群脑裂产生的原因
  • 如何预防HA集群脑裂
  • 什么是Fence设备
  • 本文小结

什么是脑裂(split-brain)

在"双机热备"高可用(HA)系统中,当联系两个节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体、动作协调的HA系统,就分裂成为两个独立的节点(即两个独立的个体)。由于相互失去了联系,都以为是对方出了故障,两个节点上的HA软件像"裂脑人"一样,“本能"地争抢"共享资源”、争起"应用服务"。就会发生严重后果:1)或者共享资源被瓜分、两边"服务"都起不来了;2)或者两边"服务"都起来了,但同时读写"共享存储",导致数据损坏(常见如数据库轮询着的联机日志出错)。

两个节点相互争抢共享资源,结果会导致系统混乱,数据损坏。对于无状态服务的HA,无所谓脑裂不脑裂,但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂。

[但有些生产环境下的系统按照无状态服务HA的那一套去配置有状态服务,结果就可想而知]。


集群脑裂产生的原因

一般来说,裂脑的发生,有以下几种原因:

  1. 高可用服务器各节点之间心跳线链路发生故障,导致无法正常通信。
  2. 因心跳线坏了(包括断了,老化)。
  3. 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
  4. 因心跳线间连接的设备故障(网卡及交换机)。
  5. 因仲裁的机器出问题(采用仲裁的方案)。
  6. 高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。
  7. 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  8. 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

提示: Keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致也会导致裂脑问题发生。


如何预防HA集群脑裂

第一种:添加冗余的心跳线 [即冗余通信的方法]

同时使用串行电缆和以太网电缆连接,同时用两条心跳线路 (即心跳线也HA),这样一条线路坏了,另一个还是好的,依然能传送心跳消息,尽量减少"脑裂"现象的发生几率。

第二种方法:设置仲裁机制

当两个节点出现分歧时,由第3方的仲裁者决定听谁的。这个仲裁者,可能是一个锁服务,一个共享盘或者其它什么东西。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

第三种方法:fence机制 [即共享资源的方法] [前提是必须要有可靠的fence设备]

当不能确定某个节点的状态时 ,通过fence设备强行关闭该心跳节点,确保共享资源被完全释放!相当于Backup备节点接收不到心跳信息,通过单独的线路发送关机命令关闭主节点的电源。

第四种:启用磁盘锁

正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。


什么是Fence设备

Fence设备是集群中很重要的一个组成部分,通过Fence设备可以避免因出现不可预知的情况而造成的"脑裂"现象, Fence设备主要就是通过服务器或存储本身的硬件管理接口或者外部电源管理设备,来对服务器或存储直接发出硬件管理指令,将服务器重启或关机,或者与网络断开连接。在设备为知故障发生时,Fence负责让占有浮动资源的设备与集群断开。


每个节点之间互相发送探测包进行判断节点的存活性。一般会有专门的线路进行探测,这条线路称为"心跳线"(上图直接使用eth0线路作为心跳线)。假设node1的心跳线出问题,则node2和node3会认为node1出问题,然后就会把资源调度在node2或者node3上运行,但node1会认为自己没问题不让node2或者node3抢占资源,此时就出现了"脑裂"(split brain)。此时如果在整个环境里有一种设备直接把node1断电,则可以避免脑裂的发生,这种设备叫做fence或者stonith(Shoot The Other Node In The Head爆头哥)。在物理机里virsh是通过串口线管理虚拟机的,比如virsh destroy nodeX,这里我们把物理机当成fence设备。


本文小结

本文介绍了高可用集群中的脑裂问题,这也是zk集群,es集群等常见集群需要解决的问题。

高可用集群的脑裂问题相关推荐

  1. [转]HA高可用集群中“脑裂“问题解决

    什么是脑裂(split-brain) 在"双机热备"高可用(HA)系统中,当联系两个节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体.动作协调的H ...

  2. nginx keepalived高可用集群主从模式

    hostname ip 说明 proxy-01 172.0.5.108 keepalived主节点nginx主负载均衡 proxy-02 172.0.5.39 keepalived备节点nginx辅负 ...

  3. corosync+pacemaker高可用集群

    简介 高可用集群,是指以减少服务中断(如因服务器宕机等引起的服务中断)时间为目的的服务器集群技术.简单的说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节 ...

  4. mysql vip_MySQL高可用集群的VIP切换

    一.目的 实现在mysql高可用集群的VIP切换,不涉及数据补偿 二.基础环境 python3.0+ 三.具体三大部分 1.启动条件检测检测集群是否down机 方式 select 1 检测主库是否有V ...

  5. 高可用集群技术之corosync应用详解(一)

    Corosync概述: Corosync是集群管理套件的一部分,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等.它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义 ...

  6. PostgreSQL高可用集群在360的落地实战

    本文主要从以下几个方面介绍PostgreSQL高可用集群在360的落地实战 为什么选择Patroni + Etcd + PostgreSQL高可用集群方案 PostgreSQL高可用集群在360的落地 ...

  7. 高可用集群原理概念详述

    一.高可用集群的定义 高可用集群,英文原文为High Availability Cluster,简称HACluster,简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网 ...

  8. 18.1 集群介绍 18.2 keepalived介绍 18.3/18.4/18.5 用keepalived配置高可用集群

    2019独角兽企业重金招聘Python工程师标准>>> 第十八章 Linux集群 18.1 集群介绍 Linux集群根据功能划分为两大类:高可用和负载均衡. 高可用集群 高可用集群通 ...

  9. 高可用集群HA基本知识概述

    HA集群架构 每个节点上都有 信息层和集群管理层 唯一区别的是: DC被推举出来运行资源的主机才有,只有DC上才有PE,TE.D 当DC上通过PE决策引擎改变了CIB配置文件后,会自动同步到每个节点的 ...

最新文章

  1. 降低噪声和电磁干扰的原则
  2. 3 事务隔离:为什么你改了我还看不见?
  3. 微信小程序-路由方式
  4. mysql服务器_windows mysql服务器
  5. 将NetBeans代码模板弯曲到我的意愿
  6. mysql-5.1.73-8.el6_在centos中安装mysql详细步骤说明
  7. Oracle MySQL社区版与Oracle MySQL企业版特征对比
  8. 网站界面设计没有灵感,不妨去探索广袤的大自然!
  9. SpringCloud工作笔记065---lombok的使用和原理_在开发工具STS_eclipse_Idea中集成lombok
  10. linux NFS 配置步骤
  11. Zilliqa Scilla入门
  12. SpringBoot集成mybatis拦截器修改表名
  13. 刘未鹏的博中带的技术博客链接
  14. css 的 calc() 方法
  15. Android10读写权限
  16. GolangBlog ModuleSeries - Part 2 | Migrating to Go Modules
  17. linux下zip加密压缩和解压
  18. 百囚徒问题(100 prisoners problem)
  19. BZOJ 3143: [Hnoi2013]游走 高斯消元 期望
  20. Eclipse 搭建ESP32开发环境

热门文章

  1. GDC2016 【巫师3 狂猎】的游戏事件工作流
  2. MyBatis学习总结(13)——Mybatis查询之resultMap和resultType区别
  3. javascript frame框架间函数变量的相互引用 frame间相互传值
  4. json介绍及简单示例
  5. 服务端I/O性能:Node、PHP、Java、Go的对比
  6. Vue.js 2 入门与提高(一)
  7. deprecated conversion from string constant to ‘char*’
  8. Spring学习笔记002 - AOP
  9. android chrome 不支持 audio/video的autoplay 属性
  10. eclipse 开发环境配置