分布式脑裂问题分析

1 "脑裂"定义

在一个高可用系统中,当联系着的节点断开联系时,本来为一个整体的系统,分裂成两个独立节点,两个节点开始争抢共享资源造成系统混乱、数据损坏的现象,成为“脑裂”。

2 "脑裂"成因

主要原因: 心跳检测做准备切换时的“不确定性”

当网络原因,导致心跳检测超时,主备切换的情况下,此时slave已经开始提供服务。但是后续之前被判定“死”的master由于网络恢复重新“复活”,此时系统存在两个“主”,发生脑裂问题;

3 "脑裂"解决思路

解决脑裂问题,有三种常用思路,分别如下:

  • 设置仲裁机制
  • lease机制
  • 设置隔离机制

下面将分别对三种方案展开说明;

3 .1 仲裁机制

设置仲裁机制的方案通常是设置一个第三方检测服务器,当slave确定准备接管master 时候,manitor会ping以下master,如果master未回复,则判定其死亡!

同时master对外提供服务时候,monitor也会定时ping master和slave,保证出现异常情况下,暂停服务器业务操作!

在这里插入图片描述

仲裁机制的主要问题是monitor存在高可用性能瓶颈!

3.2 分布式授权承诺机制

假定slave已经提供服务,那么对应服务器获得了颁发的lease。假设master仍然在提供服务,则lease必然是过期的,因此请求失效,因此请求也必然失效。

在请求频繁失效情况下,可以通过监控点触发报警,自动或者人工介入,促使老master转换成slave;

3.3 隔离机制

隔离机制参考引自文章:

隔离机制

这里提出三种层面隔离方式,解决脑裂问题:

  • 共享存储fencing:确保只有一个Master往共享存储中写数据。
  • 客户端fencing:确保只有一个Master可以响应客户端的请求。
  • Slave fencing:确保只有一个Master可以向Slave下发命令。

Hadoop公共库中对外提供了两种fenching实现,分别是sshfence和shellfence(缺省实现),其中sshfence是指通过ssh登陆目标Master节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比jps命令更准确),shellfence是指执行一个用户事先定义的shell命令(脚本)完成隔离。

4 本文小结

“脑裂问题”的本质是分布式环境由于网络不稳定,导致了分布式环境主备切换后,双主同时存在的问题,规避该问题的核心是隔离----保证系统识别得到唯一主,剔除掉失效主节点;

  • 仲裁机制是引入第三方检测器的方式,定时检测保障主存活;
  • lease方式则是以认证凭据方式,保障切换后,老主失效;
发布了88 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xinquanv1/article/details/103126372