背景
快照就是把某个表的某个瞬时的状态像照照片一样固定下来,谓之曰快照
思考
那么既然要保留某个瞬时的数据状态,一直有写入的数据会不会影响快照的结果?会增加存储的数据量吗?快照能用来做什么?
解答
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之后