hbasehlog_HBase原理--RegionServer核心组件之HLog

RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。

RegionServer内部结构

RegionServer是HBase系统响应用户读写请求的工作节点组件,由多个核心模块组成,其内部结构如图所示。

一个RegionServer由一个(或多个)HLog、一个BlockCache以及多个Region组成。其中,HLog用来保证数据写入的可靠性;BlockCache可以将数据块缓存在内存中以提升数据读取性能;Region是HBase中数据表的一个数据分片,一个RegionServer上通常会负责多个Region的数据读写。一个Region由多个Store组成,每个Store存放对应列簇的数据,比如一个表中有两个列簇,这个表的所有Region就都会包含两个Store。每个Store包含一个MemStore和多个HFile,用户数据写入时会将对应列簇数据写入相应的MemStore,一旦写入数据的内存大小超过设定阈值,系统就会将MemStore中的数据落盘形成HFile文件。HFile存放在HDFS上,是一种定制化格式的数据存储文件,方便用户进行数据读取。

HLog

HBase中系统故障恢复以及主从复制都基于HLog实现。默认情况下,所有写入操作(写入、更新以及删除)的数据都先以追加形式写入HLog,再写入MemStore。大多数情况下,HLog并不会被读取,但如果RegionServer在某些异常情况下发生宕机,此时已经写入MemStore中但尚未f lush到磁盘的数据就会丢失,需要回放HLog补救丢失的数据。此外,HBase主从复制需要主集群将HLog日志发送给从集群,从集群在本地执行回放操作,完成集群之间的数据复制。

HLog文件结构

HLog文件的基本结构如图所示。

说明如下:

•每个RegionServer拥有一个或多个HLog(默认只有1个,1.1版本可以开启MultiWAL功能,允许多个HLog)。每个HLog是多个Region共享的,图中Region A、Region B和Region C共享一个HLog文件。

•HLog中,日志单元WALEntry(图中小方框)表示一次行级更新的最小追加单元,它由HLogKey和WALEdit两部分组成,其中HLogKey由table name、region name以及sequenceid等字段构成。

WALEdit用来表示一个事务中的更新集合,在0.94之前的版本中,如果一个事务对一行row R三列c1、c2、c3分别做了修改,那么HLog中会有3个对应的日志片段,如下所示:

然而,这种日志结构无法保证行级事务的原子性,假如RegionServer更新c2列之后发生宕机,那么一行记录中只有部分数据写入成功。为了解决这样的问题,HBase将一个行级事务的写入操作表示为一条记录,如下所示:

其中,WALEdit会被序列化为格式,比如,-1为标识符,表示这种新的日志结构。

HLog文件存储

HBase中所有数据(包括HLog以及用户实际数据)都存储在HDFS的指定目录(假设为hbase-root)下,可以通过hadoop命令查看hbase-root目录下与HLog有关的子目录,如下所示:

其中,/hbase/WALs存储当前还未过期的日志;/hbase/oldWALs存储已经过期的日志。可以进一步查看/hbase/WALs目录下的日志文件,如下所示:

/hbase/WALs目录下通常会有多个子目录,每个子目录代表一个对应的RegionServer。以hbase17.xj.bjbj.org,60020,1505980274300为例,hbase17.xj.bjbj.org表示对应的RegionServer域名,60020为端口号,1505980274300为目录生成时的时间戳。每个子目录下存储该RegionServer内的所有HLog文件,如下所示:

HLog文件为:

HLog生命周期

HLog文件生成之后并不会永久存储在系统中,它的使命完成后,文件就会失效最终被删除。HLog整个生命周期如图所示。

HLog生命周期包含4个阶段:

1)HLog构建:HBase的任何写入(更新、删除)操作都会先将记录追加写入到HLog文件中。

2)HLog滚动:HBase后台启动一个线程,每隔一段时间(由参数'hbase.regionserver. logroll.period'决定,默认1小时)进行日志滚动。日志滚动会新建一个新的日志文件,接收新的日志数据。日志滚动机制主要是为了方便过期日志数据能够以文件的形式直接删除。

3)HLog失效:写入数据一旦从MemStore中落盘,对应的日志数据就会失效。为了方便处理,HBase中日志失效删除总是以文件为单位执行。查看某个HLog文件是否失效只需确认该HLog文件中所有日志记录对应的数据是否已经完成落盘,如果日志中所有日志记录已经落盘,则可以认为该日志文件失效。一旦日志文件失效,就会从WALs文件夹移动到oldWALs文件夹。注意此时HLog并没有被系统删除。

4)HLog删除:Master后台会启动一个线程,每隔一段时间(参数'hbase.master.cleaner. interval',默认1分钟)检查一次文件夹oldWALs下的所有失效日志文件,确认是否可以删除,确认可以删除之后执行删除操作。确认条件主要有两个:

•该HLog文件是否还在参与主从复制。对于使用HLog进行主从复制的业务,需要继续确认是否该HLog还在应用于主从复制。

•该HLog文件是否已经在OldWALs目录中存在10分钟。为了更加灵活地管理HLog生命周期,系统提供了参数设置日志文件的TTL(参数'hbase.master.logcleaner.ttl',默认10分钟),默认情况下oldWALs里面的HLog文件最多可以再保存10分钟。

文章基于《HBase原理与实践》一书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++/C中 sizeof(指针)和sizeof(数组名)的区别

1、sizeof(array)/sizeof(int)的含义 array是个数组 sizeof (array)就是这个数组所占的内存总量(字节数), sizeof(int)就是单个所占的内存. 所以呢, sizeof (array) / sizeof (int)就是array数组的元素的个数. 2、 sizeof(指针)和sizeof(数…

python zipfile setpassword_Python模块:zipfile

"""author:Peng(非原创)记录:开发历程"""最近在写一个Android APP,需下载服务器上的数据。有些PDF如果直接传输的话,将会增加通信的数据量,使下载时间变长。服务器在传输这些数据之前先对其进行压缩…

C++迭代器的使用和操作总结

目录 一.定义和初始化二.常用操作三.迭代器const_iterator四.使迭代器失效的操作 正文 迭代器是一种检查容器内元素并遍历元素的数据类型。C更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型&am…

php页面之间传值_php如何在不同页面之间传值

php在不同页面之间传值的方法:1、利用post传值;2、利用get传值;3、利用session传值。session是全局变量的一种,经常用于用户登录后保存用户id之类的常用数据,选择session是非常好的选择。常用的三种方法:一…

数据结构-栈3-栈的应用-就近匹配

#define _CRT_SECURE_NO_WARNINGS #include"LinkList.c" #include<stdio.h> #include<stdlib.h> #include<string.h> //括号有没有匹配。哪个不匹配就指向哪个。。 //扫描字符串 //1、非括号字符忽略 //2、若遇到左括号&#xff0c;则入栈 //3、若…

使用 Jekyll 构建你的网站 - 初入门

文章目录 一、Jekyll介绍二、Jekyll安装和启动2.1 配置Ruby环境1&#xff09;Windows2&#xff09;macOS 2.2 安装 Jekyll2.3 构建Jekyll项目2.4 启动 Jekyll 服务 三、Jekyll常用命令四、目录结构4.1 主要目录4.2 其他的约定目录 五、使用GitLink构建Jekyll博客5.1 生成Jekyll…

调用ice服务器_Nodejs+socket.io搭建WebRTC信令服务器

前言我们在学习 WebRTC 时&#xff0c;首先要把实验环境搭建好&#xff0c;这样我们就可以在上面做各种实验了。对于 WebRTC 来说&#xff0c;它有一整套规范&#xff0c;如使它使用的接口、使用SDP进行媒体协商、通过ICE收集地址并进行连通性检测等等。除此之外&#xff0c;We…

数据结构-栈4-栈的应用-中缀转后缀

//碰到数字直接输出 //运算符号&#xff1a;与栈顶符号进行优先级比较//若栈顶符号优先级比运算符号优先级低&#xff1a;此符号进栈&#xff08;括号优先级最低&#xff09;//若栈顶符号优先级不低于运算符号优先级&#xff1a;将栈顶符号一直弹出并输出&#xff0c;直到不满足…

四二拍用音符怎么表示_每个音符都是赞美歌拍子分析 0基础识简谱每日必看

点击上方蓝字 关注我们拍子状态分析是为了帮助0基础家人识谱用的&#xff0c;一首诗歌拿在手上只所以看起来复杂&#xff0c;是这些节奏让人眼花缭乱&#xff0c;其实真正理解了其中的含义&#xff0c;就会感觉豁然开朗&#xff0c;此种方法是掌握节奏型的捷径&#xff0c;不需…

数据结构-栈5-栈的应用-后缀转中缀

#define _CRT_SECURE_NO_WARNINGS #include"LinkList.c" #include<stdio.h> #include<stdlib.h> #include<string.h>//遇到数字压栈 //遇到符号&#xff0c;取出栈的第一个元素为右操作符&#xff0c;第二个元素为左操作符。计算完毕后压栈typedef…

midl会议_2020年医学图像处理领域值得关注的期刊和会议

期刊注册IEEE Xplore账号&#xff0c;将该期刊的更新添加提醒&#xff0c;每有新文章出来就会推送到邮箱。注册账号后也可以订阅文章更新会议MICCAI: International Conference on Medical Image Computing and Computer Assisted Intervention (每年9-10月)2.IPMI: Informatio…

数据结构排序1-冒泡,选择,插入排序

冒泡排序 &#xff0c;选择排序&#xff0c;插入排序 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<random> #include<time.h> #include<sys/timeb.h> using namespace std; #define MAX 10long getSystemTime() {…

emacs shell插件_Windows 下 Emacs 中的 zsh shell 使用方法

导读运行跨平台 shell(例如 Bash 或 zsh)的最大优势在于你能在多平台上使用同样的语法和脚本。在 Windows 上设置(替换)shell 挺麻烦的&#xff0c;但所获得的回报远远超出这小小的付出。MSYS2 子系统允许你在 Windows 上运行 Bash 或 zsh 之类的 shell。使用 MSYS2 很重要的一…

数据结构排序2-希尔,快速,归并排序

希尔排序 希尔排序是对插入排序的改进。增加了分组 分组插入排序 降低元素个数&#xff0c;然后对每组分别进行插入排序 利用分组增量遍历&#xff0c;因为最后必须全部排序一次&#xff0c;然后分别对每组插入排序。把每组的第一个数作为有序序列&#xff0c; 要比较的第一个…

mysql 授权与回收权限_MySQL 操作命令梳理(4)-- grant授权和revoke回收权限

在mysql维护工作中&#xff0c;做好权限管理是一个很重要的环节。下面对mysql权限操作进行梳理&#xff1a;mysql的权限命令是grant&#xff0c;权限撤销的命令时revoke&#xff1b;grant授权格式&#xff1a;grant 权限列表 on 库.表 to 用户名ip identified by "密码&qu…

数据结构排序3-堆排序

堆排序 思想&#xff1a;假设数组放入完全二叉树中&#xff0c; 1、初始化堆&#xff1a;调节父结点与子结点的大小。让所有的子结点都小于父结点。 2、将完全二叉树中的叶子结点和根结点进行互换后&#xff0c;继续调整堆。直至结束 #include<iostream> #include<…

删除代码中的空行

打开替换&#xff08;ctrlh?&#xff09;&#xff0c;使用正则表达式&#xff1a; ^\s*\n ^ 匹配输入字符串的开始位置\s 表示匹配任何空白字符&#xff0c;包括制表符&#xff0c;空格&#xff0c;换页符等等* 表示匹配多次\n 表示匹配换行符 替换为&#xff1a; <…

python mysql in 参数_python mysql中in参数化说明

第一种&#xff1a;拼接字符串&#xff0c;可以解决问题&#xff0c;但是为了避免sql注入&#xff0c;不建议这样写还是看看第二种&#xff1a;使用.format()函数&#xff0c;很多时候我都是使用这个函数来对sql参数化的举个例子&#xff1a;select * from XX where id in (1&a…

数据结构-哈希与映射

二叉树映射map #include<iostream> #include<map> //映射&#xff08;也叫字典&#xff09;&#xff0c;二叉树映射&#xff0c;不是哈希映射 using namespace std; int main() {cout << "二叉树&#xff08;红黑树&#xff09;" << endl;…

mysql锁在粒度上分为_按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法?...

在关系型数据库中&#xff0c;可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。MyISAM和InnoDB存储引擎使用的锁&#xff1a;MyISAM采用表级锁(table-level locking)。InnoDB支持行级锁(row-level locking)和表级锁&#xff0c;默认…