白话HBase-快照snapshot

背景

快照就是把某个表的某个瞬时的状态像照照片一样固定下来,谓之曰快照

思考

那么既然要保留某个瞬时的数据状态,一直有写入的数据会不会影响快照的结果?会增加存储的数据量吗?快照能用来做什么?

解答

1.逻辑:写入的新数据不会影响快照的结果

2.资源:存储的数据量会有一定增加,但不是做快照的时候直接就翻倍了,而是做完compact之后,放到归档目录下面本来要被清理掉的文件,现在因为有link引用而不去清理了

3.功能:通过快照的特点,可以做表恢复,迁移,离线读取等,这三个我们目前都在用

入手

snapshot相关命令(hbase shell中)

clone_snapshot:克隆生成一个新的表

delete_all_snapshot:删除所有的snapshot

delete_snapshot:按snapshot Name删除某个快照

delete_table_snapshots:按tableName删除某个快照

list_snapshots:列出所有的snapshotName

list_table_snapshots:列出某个表的snapshotNames

restore_snapshot:使用snapshot恢复原来的表

snapshot:创建一个新的快照

原理


1.开始

如何找到对应的代码起始点,各种功能都有api的调用,即便是后台功能也有一些定时器来触发

通过jruby脚本,能看到调用的HBaseAdmin java api

比如快照,通过hbase shell snapshot命令可以触发,底层调用的是HBaseAdmin.snapshot(xxx)方法


2.Server端

HMaster.java

客户端的各种操作都对应Master端或者Rs的方法

对应HMaster.snapshot方法

public SnapshotResponse snapshot(RpcController controller, SnapshotRequest request)

其中会执行SnapShotManager的takeSnapShot

snapshotManager.takeSnapshot(snapshot);


SnapShotManager.java

根据表状态是Enable或者是disable有两个分支

1.snapshotEnabledTable

2.snapshotDisabledTable

两者都有的操作:

1.prepare工作

2.构造handler

3.用对应的handler执行snapshotTable方法


SnapShotManager.takeSnapShot

都是Runnable类型,

不同类型实现不同的snapshotRegions方法—>TakeSnapshotHandler.process()—>EventHandler.run()

1.snapshotEnabledTable

通过Procedure将任务分发到各个机器上

在zk中创建acquired节点,标注需要做哪些操作,通过Zookeeper实现的Procedure去分发任务

Rs会有watcher监控acquired节点

里面有EnabledTableSnapshotHandler

098是Zk实现的

Procedure proc = coordinator.startProcedure(this.monitor, this.snapshot.getName(),

  this.snapshot.toByteArray(), Lists.newArrayList(regionServers));

将任务“分发”到各个机器,并等待完成


2.snapshotDisabledTable

里面有DisabledTableSnapshotHandler



目录

/hbase/.hbase-snapshot  快照的hfile link文件

/hbase/archive  归档目录  ,被执行过compact的文件,放在整理,没有link连接的会被定时清理

/hbase/data 未被compact的文件


重要的类

* Client:

    * HBaseAdmin - 入口类

* Master:

    * MasterRpcServices - 接收Client端的RPC请求

    * SnapshotManager 调度enable,disable handler

    * EnabledTableSnapshotHandler extends TableSnapshotHandler - 在线表

    * DisabledTableSnapshotHandler extends TableSnapshotHandler - 离线表

    * ProcedureCoordinator - 用于提交分布式snapshot事务

    * Procedure

    * ZKProcedureCoordinatorRpcs extends ProcedureCoordinator

    * SnapshotFileCache - 缓存snapshot引用文件,用于判断文件是否deletable

    * SnapshotFileCleaner - 清理snapshot文件线程

* RegionServer:

    * RegionServerSnapshotManager - 监控分布式任务,并创建管理具体子任务

    * FlushSnapshotSubprocedure

    * RegionSnapshotTask - FlushSnapshotSubprocedure内部类

    * HRegion - 调用snapshot接口,处理具体的snapshot任务

    * SnapshotManifest - Utility class to help read/write the Snapshot Manifest

    * SnapshotManifestV2/SnapshotManifestV1 - SnapshotManifest内存数据结构   负责管理snapshot记录信息文件的格式


其他

做snapshot可以有几个选项:

flush,sikpflush,disabled


文件

hdfs上相关的.snapshot .tabledesc    .regioninfo文件


注意

clone_snapshot生成的新表只是增加元数据,相关的数据文件还是复用snapshot指定的数据文件

什么时候clone的表下面文件才变成实际的hfile呢?——在进行compact之后

发布了52 篇原创文章 · 获赞 4 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Gloria_y/article/details/85064549
今日推荐