checkpoint 机制具体实现示例详解
作者:点滴星光 发布时间:2023-03-31 21:42:01
checkpoint 机制的具体实现
我们都知道为了优化分布式存储系统中 NameNode 的重启性能,我们引进了 checkpoint 机制和 FsImage 快照,使得 FsImage 和 editslog 共同为系统元数据提供持久化功能。
那么我们今天就来学习一下,checkpoint 机制具体应该要怎么实现??
BackNode 节点冷备份
NameNode 的主要工作时维护系统中文件元数据,并实现其持久化;在每执行一个操作之后,NameNode 都要生成一个 editslog,最后刷盘(但是不是每生成一条数据就刷盘一次)。
从这我们可以发现,NameNode 进程,它需要额外分配出来一个线程,后台线程定时的去进行磁盘IO的操作,其实这个是很影响本地 CPU 负载的;另外,假设这时候来了很多操作请求,那么系统中将有大量的线程用来来更新内存的文件目录树,这时候肯定是要加锁的了。此时如果系统还要每隔一段时间,耗费比如说几秒钟,甚至几分钟的时间来对文件目录树进行加锁,读取数据,写入本地磁盘;这样就会导致更新文件目录树,和读取文件目录树写入磁盘,它们之间会产生巨大的锁的冲突。
如果上述所有操作都在 NameNode 上执行的话,就太影响 NameNode 节点的性能了。
为此,我们需要考虑给系统中增加一个角色——BackNode,其实它的功能就有点像 HDFS 中的 SecondaryNameNode。
BackNode 是充当于 NameNode 的一个冷备份的角色,我们可以将 checkpoint 的操作交给其来执行,这样就可以减轻 NameNode 这边的性能消耗了。
checkpoint 的实现
BackNode 在启动的时候会启动一个 checkpoint 的调度任务:
// 调度任务:fsImageCheckpointer
defaultScheduler.schedule("FSImage Checkpoint操作", fsImageCheckpointer,
backupnodeConfig.getCheckpointInterval(), backupnodeConfig.getCheckpointInterval(), TimeUnit.MILLISECONDS);
这是一个定时任务,每隔一段时间就会被执行一次。
下面我们一起来看看 checkpoint 任务具体需要做些什么?
判断当前系统中的 txid 和上一次 checkpoint 时的是否一致,不一致才继续执行
根据当前系统中的数据生成 FsImage
处理掉旧的 FsImage
具体代码如下:
/**
* checkpoint 任务
*/
@Override
public void run() {
log.info("BackupNode启动checkpoint后台线程.");
try {
// 如果是正在恢复元数据,则直接返回
if (nameSystem.isRecovering()) {
log.info("正在恢复元数据...");
return;
}
// 当前 maxid 和 之前记录的 maxid 相等
if (nameSystem.getMaxTxId() == lastCheckpointTxId) {
log.info("EditLog和上次没有变化,不进行checkpoint: [txId={}]", lastCheckpointTxId);
return;
}
// 以下讨论的情况是:当前 maxid 和 之前记录的 maxid 不相等(大于)
// 对当前内存中的数据生成快照
FsImage fsImage = nameSystem.getFsImage();
// 更新记录中的 maxid
lastCheckpointTxId = fsImage.getMaxTxId();
// 路径
String fsImageFile = backupNodeConfig.getFsImageFile(String.valueOf(System.currentTimeMillis()));
log.info("开始执行checkpoint操作: [maxTxId={}]", fsImage.getMaxTxId());
// 写入FsImage文件
doCheckpoint(fsImage, fsImageFile);
// 上传 FsImage 给 NameNode
uploadFsImage(fsImageFile);
// 删除旧的FSImage
namenodeClient.getDefaultScheduler().scheduleOnce("删除FSImage任务", fsImageClearTask, 0);
} catch (Exception e) {
log.error("FSImageCheckPointer error:", e);
}
}
来源:https://juejin.cn/post/7197072170395746360


猜你喜欢
- 本文实例为大家分享了java web实现简单留言板的具体代码,供大家参考,具体内容如下一、目标用户可以登录并记住密码进入留言板,添加留言,点
- 先说一下对异步和同步的理解:同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任
- 大多数开发人员现在还在使用if else的过程结构,曾看过jdon的banq大哥写的一篇文章,利用command,aop模式替代if els
- Android底部支付弹窗实现的效果:实现的思路:1.通过继承PopupWindow自定义View来达到弹窗的弹出效果;2.通过回调将输入的
- 前言前面几篇文章已经为 Input 系统的分析打好了基础,现在是时候进行更深入的分析了。通常,手机是不带键盘的,但是手机上仍然有按键,就是我
- 基本概念:类加载的过程大致分为三个阶段1、加载阶段:本阶段主要把class的二进制代码加载进入JVM,并且进行常量池(类名,方法名,字段名)
- 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。下面是c#实现汉诺塔示例using System;using System
- import java.io.IOException;import javax.xml.parsers.*;import javax.xml
- 概述:App几乎都离不开与服务器的交互,本文主要讲解了flutter网络请求三种方式 flutter自带的HttpClient、 第三方库h
- jwt介绍: JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范
- 任务超时处理是比较常见的需求,比如在进行一些比较耗时的操作(如网络请求)或者在占用一些比较宝贵的资源(如数据库连接)时,我们通常需要给这些操
- 一,哈希表(Hashtable)简述在.NET Framework中,Hashtable是System.Collections命名空间提供的
- 本文实例为大家分享了java代码获取新浪微博应用的access token的具体代码,供大家参考,具体内容如下package test;im
- 多说无益,贴代码:/** * 校验银行卡卡号 * * @param cardId &nbs
- 需求有一个固定URL的文件,服务器端程序会定期的更新这个文件,现在需要写一个工具来监控这个文件的变化。解决办法最初我想到的是把这个文件下载下
- 本文实例讲述了C#索引属性的用法。分享给大家供大家参考。具体如下:这里演示C#类如何声明索引属性以表示不同种类事物的类似数组的集合。// i
- 本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下前言我把录音分成了两部分1.UI界面,弹窗读秒 2.一个
- 本文实例讲述了JavaMail实现邮件发送的方法。分享给大家供大家参考。具体如下:下载 activation.jar 和 mail.jar配
- 1、安装依赖<dependency> <
- 本文实例为大家分享了Android实现摄像头切换,拍照及保存到相册,预览等功能,解决android7拍照之后不能连续预览的问题、参数设置相关