Ceph分布式存储是怎么防止脑裂的?

看过其他的分布式存储是通过添加一个仲裁副本来防止脑裂的,那ceph没有仲裁副本是如何防止脑裂的?

1. 多数派机制:ceph分布式存储系统是依赖monitor管理ceph集群中的各种视图,如OSD视图与MDS视图。而monitor服务本身也是基于paxos算法的分布式集群。Monitor服务集群要求必须奇数个节点,在Monitor集群分裂为两个子集群时,通过多数派原则确定当前的Monitor集群有效成员。
2. 心跳及集群统一视图机制:Monitor通过心跳机制,与ceph分布式存储集群中的各成员节点保持通信。当心跳异常时,Monitor会将无法保持心跳通信的节点从集群中踢除,更新ceph集群的视图(包括MDS视图和OSD视图等),并将视图同步至ceph集群内的所有成员节点。
3. 版本号机制:当ceph集群分裂为两个子集群时,可能存在多个Master向一个Slave节点写数据,Slave节点根据数据中携带的版本号,将过期的老IO丢掉,避免数据不一致。
4. 深信服存储基于ceph原生分布式存储,对各种故障场景进行了深度优化。那么深信服存储集群怎么防止脑裂的呢?当存储集群内发生私网故障,而分裂为两个子集群时,Monitor集群也分裂为两个子集群,如果此时任意一个Monitor子集群内成员个数小于等于Monitor当前集群成员数的一半,则Monitor无法提供服务,存储集群将无法对外提供服务,以避免脑裂。如果存在一个Monitor子集群可以正常提供服务,则Monitor根据心跳信息更新存储集群的成员视图,并将新视图及新视图的版本号同步至存储集群内的所有节点。被踢出集群的无效成员节点,无法获得最新的视图信息,且视图版本号为落后版本号,无效成员的数据在发送至Slave节点时,Slave节点将判断视图版本号并将无效成员的数据丢弃。其他有效成员可以根据最新的视图正常发送数据及处理数据。点击了解更多信息
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-06-06
解决脑裂问题,通常采用隔离(Fencing)机制,包括三个方面:

共享存储fencing:确保只有一个Master往共享存储中写数据。

客户端fencing:确保只有一个Master可以响应客户端的请求。

Slave fencing:确保只有一个Master可以向Slave下发命令。

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

切换对外透明:为了保证整个切换是对外透明的,Hadoop应保证所有客户端和Slave能自动重定向到新的active master上,这通常是通过若干次尝试连接旧master不成功后,再重新尝试链接新master完成的,整个过程有一定延迟。在新版本的Hadoop RPC中,用户可自行设置RPC客户端尝试机制、尝试次数和尝试超时时间等参数。

在“双机热备”高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障,2个节点上的HA软件像“裂脑人”一样,“本能”地争抢“共享资源”、争起“应用服务”,就会发生严重后果:或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
运行于备用主机上的Heartbeat可以通过以太网连接检测主服务器的运行状态,一旦其无法检测到主服务器的“心跳”则自动接管主服务器的资源。通常情况下,主、备服务器间的心跳连接是一个独立的物理连接,这个连接可以是串行线缆、一个由“交叉线”实现的以太网连接。Heartbeat甚至可同时通过多个物理连接检测主服务器的工作状态,而其只要能通过其中一个连接收到主服务器处于活动状态的信息,就会认为主服务器处于正常状态。从实践经验的角度来说,建议为Heartbeat配置多条独立的物理连接,以避免Heartbeat通信线路本身存在单点故障。
1、串行电缆:被认为是比以太网连接安全性稍好些的连接方式,因为hacker无法通过串行连接运行诸如telnet、ssh或rsh类的程序,从而可以降低其通过已劫持的服务器再次侵入备份服务器的几率。但串行线缆受限于可用长度,因此主、备服务器的距离必须非常短。
2、以太网连接:使用此方式可以消除串行线缆的在长度方面限制,并且可以通过此连接在主备服务器间同步文件系统,从而减少了从正常通信连接带宽的占用。
基于冗余的角度考虑,应该在主、备服务器使用两个物理连接传输heartbeat的控制信息;这样可以避免在一个网络或线缆故障时导致两个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的情况,这种争用资源的场景即是所谓的“脑裂”(split-brain)或“partitioned cluster”。在两个节点共享同一个物理设备资源的情况下,脑裂会产生相当可怕的后果。
为了避免出现脑裂,可采用下面的预防措施:
添加冗余的心跳线,例如双线条线。尽量减少“裂脑”发生机会。
启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下 参考IP,不通则表明断点就出在本端,不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。追问

我只想要知道ceph放脑裂的机制。你整这些大多是基于主机平台本身的机制,不是在分布式文件系统层面的机制,跟ceph本身没有什么关系吧?

第2个回答  2020-06-05
看过其他的分布式存储是通过添加一