负载均衡
由Master的LoadBalancer线程周期性的在各个RegionServer间移动region维护负载均衡
- 经常被并发查询的数据不要存储在同一个RegionServer中 避免热点读取问题
- 当一个机器上经过大量的插入或者删除数据以后 region合并或者分裂 那么机器上的region的数量会相差很大
- 当新增了节点以后 应该去分配一些其他机器上的region数据
- 当某个RegionServer宕机后 这台机器上数据的分配region的执行
自动负载均衡流程
- 两个有效参数:MIN=floor(average)(表示下限)和MAX=ceil(average)(表示上限)
- 循环过载机器,将Region卸载到MAX数量 在小于等于MAX时停止排序Region(按时间新旧)
- 遍历最轻负载机器 分配Region知道Server达到MIN值 在大于等于MIN时停止 这些Region都是之前卸载的 可能没有足够地卸载Region让轻负载的机器达到MIN值 如果这样 在Region数等于neededRegions(轻负载机器的数量)时停止 可能我们分配了卸载的Region到轻负载机器 但是仍然有Region没有分配出去 这种情况下 本步骤完成 在下面步骤中再做处理
- 如果neededRegions是非零的值 遍历负载最重的机器 从每台机器上卸载一个Region使得它们的值从MAX到MIN
- 现在有很多Region等待分配 遍历最轻的负载机器(多台) 分配Region到MIN
- 如果仍然有Region没有分配 遍历最轻的负载机器(多台)这次分配Region到MAX
- 所有Server的Region数量时MAX或者MIN 另外 所有大于等于MAX的Server保证在均衡完成后都是MAX个Region 从而保证Region移动的最小数量
其中 轻负载指的是Region数量小于等于AVG 过载指大于等于AVG 所有的RegionServer都按照负载从大到小排序 存放在TreeMap中(保证先遍历过载Server)
强制执行负载均衡
- kill掉不是Hmaster节点的regionserver(slave2)
- hbase16010查看regionserver在slave2节点
- 在master节点启动regionserver(slave2)
Hbase-daemons.sh start regionserver - hbase 16010 查看regionserver负载不均衡
快照原理(基于HDFS的快照)
Hdfs的快照(snapshot)是在某一时间点对指定文件系统拷贝 快照采用只读模式 可以对重要数据进行恢复 防止用户错误性的操作
快照分两种:一种是建立文件系统的索引 每次更新文件不会真正的改变文件 而是新开辟一个空间用来保存更改的文件 一种是拷贝所有的文件系统 Hdfs属于前者
Hdfs快照的特征如下
- 快照的创建是瞬间的 代价为O(1) 取决于子节点扫描文件目录的时间
- 当且仅当做快照的文件目录下有文件更新时才会占用小部分内存 占用内存的大小为O(M),其中M为更改文件或者目录的数量
- 新建快照的时候 Datanode中的block不会被复制 快照中只是记录了文件快的列表和大小信息
- 快照不会影响正常的hdfs操作 对做快照之后的数据进行的更改将会按照时间顺序逆序的记录下来 用户访问的还是当前最新的数据 快照里的内容为快照创建的时间点时文件的内容减去当前文件的内容
Hbase的角色和职责
- zookeeper
- 维护集群状态
- 接收客户端的连接请求 返回hbase集群信息
- 维护HA模式
- master
- Hmaster职责
- 监控RegionServer
- 处理RegionServer故障转移
- 处理region的分配和移除
- 处理元数据的变更
- 在空闲时间进行region的负载均衡
- 通过Zookeeper发布自己的位置给客户端
- Hmaster高可用
- Hmaster可以在多个节点上启动多个实例 并会利用zookeeper来实现自动failover
- 因此 Hmaster并不存在单点故障问题
- Hmaster职责
- regionserver
- 负责管理表的region数据
- 处理客户端的读写请求
- 刷新缓存到HDFS
- 维护HLog
- 执行压缩
- 负责处理Region分片
- 拆分
- 合并
- 执行负载均衡
- 管理元数据META
- 客户端
- 请求对应的RS获取META表
- zookeeper———- -ROOT-返回元数据的位置META到客户端
- 客户端
