Zookeeper在分布式环境中的假死脑裂

假死脑裂 
在一个大的集群中往往会有一个master的存在,在长期运行过程中不可避免会出现宕机等等的问题导致master不可用,在出现这样的情况以后往往会对系统产生很大的影响,所以一般的分布式集群中的master都采用了高可用的解决方案来避免这样的情况发生。 
master-slaver方式,存在一个master的节点,平时对外服务,同时有一个slaver节点来监控master,监控的同时有某种方式来进行数据同步。假如现在master挂掉了,slaver能很快获知并且迅速切换为新的master。但是在这种方式中,监控切换是一个很大的难题,但是现在Zookeeper的watch和分布式锁机制能比较好的解决这个问题。虽然Zookeeper很好的解决了这个问题,但是它的使用也存在其他的问题,比如脑裂。 
导致脑裂的一个根源问题就是假死。

什么叫假死呢? 
有一个很重要的问题,就是到底是根据一个什么样的情况来判断一个节点死亡down掉了。 
在分布式系统中这些都是有监控者来判断的,但是监控者也很难判定其他的节点的状态,唯一一个可靠的途径就是心跳,包括Zookeeper也是使用心跳来判断客户端是否仍然活着。 
使用ZooKeeper来做master HA基本都是同样的方式,每个节点都尝试注册一个象征master的临时节点其他没有注册成功的则成为slaver,并且通过watch机制监控着master所创建的临时节点,Zookeeper通过内部心跳机制来确定master的状态,一旦master出现意外Zookeeper能很快获悉并且通知其他的slaver,其他slaver在之后作出相关反应。这样就完成了一个切换。这种模式也是比较通用的模式,基本大部分都是这样实现的,但是这里面有个很严重的问题,如果注意不到会导致短暂的时间内系统出现脑裂,因为心跳出现超时可能是master挂了,但是也可能是master,zookeeper之间网络出现了问题,也同样可能导致。这种情况就是假死,master并未死掉,但是与ZooKeeper之间的网络出现问题导致Zookeeper认为其挂掉了然后通知其他节点进行切换,这样slaver中就有一个成为了master,但是原本的master并未死掉,这时候client也获得master切换的消息,但是仍然会有一些延时,zookeeper需要通讯需要一个一个通知,这时候整个系统就很混乱可能有一部分client已经通知到了连接到新的master上去了,有的client仍然连接在老的master上如果同时有两个client需要对master的同一个数据更新并且刚好这两个client此刻分别连接在新老的master上,就会出现很严重问题。

是什么原因导致这样情况的出现呢? 
主要原因是Zookeeper集群和Zookeeper client判断超时并不能做到完全同步,也就是说可能一前一后,如果是集群先于client发现那就会出现上面的情况。同时,在发现并切换后通知各个客户端也有先后快慢。一般出现这种情况的几率很小,需要master与Zookeeper集群网络断开但是与其他集群角色之间的网络没有问题,还要满足上面那些情况,但是一旦出现就会引起很严重的后果,数据不一致。

如何避免? 
在slaver切换的时候不在检查到老的master出现问题后马上切换,而是在休眠一段足够的时间,确保老的master已经获知变更并且做了相关的shutdown清理工作了然后再注册成为master就能避免这类问题了,这个休眠时间一般定义为与Zookeeper定义的超时时间就够了,但是这段时间内系统不可用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 头歌zookeeper是一个分布式协调服务,用于管理和协调分布式系统的各个节点。在搭建分布式环境时,可以使用头歌zookeeper来实现节点之间的通信和同步。 搭建头歌zookeeper分布式环境的步骤如下: 1. 下载并安装头歌zookeeper。 2. 配置zookeeper的配置文件,包括zookeeper的端口号、数据存储路径等。 3. 在每个节点上启动zookeeper服务。 4. 在每个节点上配置zookeeper的集群信息,包括集群其他节点的IP地址和端口号。 5. 测试zookeeper集群的连接和同步功能。 需要注意的是,在搭建分布式环境时,要确保各个节点之间的网络连接稳定,并且zookeeper的配置文件和集群信息要保持一致。 ### 回答2: Zookeeper是一个分布式协调服务,可以为分布式应用程序提供一致性、可靠性和高效性。在分布式系统,通常需要协调各个节点之间的任务分配、状态同步等,Zookeeper就是实现这个目的的工具之一。 要搭建分布式环境,首先需要在多台机器上安装ZookeeperZookeeper的安装可以采用源码编译安装或者直接使用二进制包安装。在安装时需要注意配置Zookeeper的数据目录、日志目录等信息,还需要创建一个Zookeeper的配置文件,用于指定端口、数据目录等参数。 安装完成后,需要启动每个Zookeeper实例。在启动时,需要指定Zookeeper的配置文件和服务器ID。服务器ID应该在每台机器上是唯一的,并且应该落在1~255之间。启动时可以输入命令“./zkServer.sh start”启动。 搭建完分布式环境后,需要在Zookeeper创建znodes。znode是Zookeeper的数据节点,是分布式环境数据交换、同步的基本单位。可以使用Zookeeper提供的命令行工具或者编写Java程序实现znode的创建、读取、更新、删除等操作。 创建完znode后,就可以在分布式应用程序使用Zookeeper实现分布式协调了。例如,可以使用Zookeeper实现分布式锁、分布式任务分配等功能。在使用Zookeeper时,需要注意Zookeeper的一致性协议,避免出现数据不一致的情况。 总之,Zookeeper分布式环境搭建需要注意配置文件和服务器ID的设置,在使用需要注意一致性问题,才能发挥出其实现分布式协调的能力。 ### 回答3: Zookeeper是一个分布式协调服务,为分布式应用提供一致性服务。对于分布式 系统来说,Zookeeper用于解决如何协调和管理各种分布式服务的问题,有效提 高了分布式系统的可靠性和可用性。 搭建Zookeeper分布式环境,需要以下步骤: 1. 下载和安装Zookeeper软件 从官方网站下载Zookeeper软件包,并解压到想要安装的目录。安装完成后,还可 以配置环境变量,使Zookeeper命令可以全局访问。 2. 配置Zookeeper 在安装Zookeeper后,需要对Zookeeper进行配置。在Zookeeper主目录下创建con f目录,并在其创建zoo.cfg文件。在zoo.cfg文件设置Zookeeper服务器的 参数,例如服务器的数量、端口号、数据目录位置等。 3. 启动Zookeeper集群 在配置完Zookeeper后,可通过启动Zookeeper集群来实现对分布式应用程序的协 调和管理。启动Zookeeper集群需要在各个节点主机上运行Zookeeper服务,不同节 点的id必须唯一,并且节点间需要配置相应的IP地址和端口号。 4. 验证Zookeeper集群 启动Zookeeper集群后,需要验证其是否正常工作。可以通过使用客户端连接到 Zookeeper服务器,执行相关的Zookeeper命令来验证Zookeeper集群的工作是否正 常。例如,可以使用"ls /"来列出Zookeeper根节点上的所有子节点,使用"create /temp "hello""创建一个名为temp的节点,并将其值设置为hello。 5. 集成Zookeeper 将程序集成到Zookeeper需要进行三项基本工作:连接Zookeeper、注册/订阅 节点和断开连接。连接Zookeeper是第一步,每个节点都需要在启动时尝试连接到 一个或多个Zookeeper服务器。注册/订阅节点需要在连接到Zookeeper后进行,以确 保在每个节点上正确维护应用程序运行的状态。断开连接是最后一步,确保在程 序退出之前,关闭与Zookeeper的所有连接。 搭建Zookeeper分布式环境需要仔细配置和验证,确保可以正常工作。通过搭建 分布式环境,可以更好地实现对分布式应用程序的协调和管理,提高系统的可靠性 和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值