HBase中ZooKeeper核心配置
一个分布式HBase集群的部署运行强烈依赖于ZooKeeper,在当前的HBase系统实现中,ZooKeeper扮演了非常重要的角色。在配置文件conf/中配置与ZooKeeper相关的几个重要配置项
- :ZooKeeper集群的地址,必须进行配置,该项默认为localhost。
- :默认为2181,可以不进行配置。
- :默认为/hbase,可以不配置。
- :表示RegionServer与ZooKeeper之间的会话超时时间,一旦session超时,ZooKeeper就会感知到,通知Master将对应的RegionServer移出集群,并将该RegionServer上所有Region迁移到集群中其他RegionServer。
HBase集群启动之后,使用客户端进行读写操作时也需要配置上述ZooKeeper相关参数
HBase在ZooKeeper中创建的主要子节点
meta-region-server:存储HBase集群hbase:meta元数据表所在的RegionServer访问地址。客户端读写数据首先会从此节点读取hbase:meta元数据的访问地址,将部分元数据加载到本地,根据元数据进行数据路由。
rs:集群中所有运行的RegionServer。
master: backup-masters: 通常来说生产线环境要求所有组件节点都避免单点服务,HBase使用ZooKeeper的相关特性实现了Master的高可用功能。其中Master节点是集群中对外服务的管理服务器,backup-masters下的子节点是集群中的备份节点,一旦对外服务的主Master节点发生了异常,备Master节点可以通过选举切换成主Master,继续对外服务。需要注意的是备Master节点可以是一个,也可以是多个。
table:集群中所有表信息。
region-in-transition:(该路径在 版本中已经去掉)在当前 HBase 系统实现中,迁移 Region 是一个非常复杂的过程。首先对这个 Region 执行 unassign 操作,将此 Region 从 open 状态变为 offline 状态(中间涉及 PENDING_CLOSE、CLOSING 以及CLOSED 等过渡状态),再在目标 RegionServer 上执行 assign 操作,将此 Region 从 offline 状态变成 open 状态。这个过程需要在 Master 上记录此 Region 的各个状态。目前,RegionServer 将这些状态通知给 Master 是通过 ZooKeeper 实现的,一旦 Region 发生 unssign 操作,就会在这个节点下生成一个子节点,子节点的内容是“事件”经过序列化的字符串,并且 Master 会在这个子节点上监听,一旦发生任何事件,Master 会监听到并更新 Region 的状态。RegionServer 会在 region-in-transition 中变更 Region 的状态,Master 监听 ZooKeeper 对应节点,以便在 Region 状态发生变更之后立马获得通知,得到通知后 Master 再去更新 Region 在 hbase:meta 中的状态和在内存中的状态。
table-lock:HBase系统使用ZooKeeper相关机制实现分布式锁。HBase中一张表的数据会以Region的形式存在于多个RegionServer上,因此对一张表的DDL操作(创建、删除、更新等操作)通常都是典型的分布式操作。每次执行DDL操作之前都需要首先获取相应表的表锁,防止多个DDL操作之间出现冲突,这个表锁就是分布式锁。分布式锁可以使用ZooKeeper的相关特性来实现,在此不再赘述。
online-snapshot:用来实现在线snapshot操作。表级别在线snapshot同样是一个分布式操作,需要对目标表的每个Region都执行snapshot,全部成功之后才能返回成功。Master作为控制节点给各个相关RegionServer下达snapshot命令,对应RegionServer对目标Region执行snapshot,成功后通知Master。Master下达snapshot命令、RegionServer反馈snapshot结果都是通过ZooKeeper完成的。•
replication:(该路径在版本中已经去掉)用来实现HBase复制功能。
splitWAL recovering-regions:(该路径在版本中已经去掉) 用来实现HBase分布式故障恢复。为了加速集群故障恢复,HBase实现了分布式故障恢复,让集群中所有RegionServer都参与未回放日志切分。ZooKeeper是Master和RegionServer之间的协调节点。