深入探索HBase架构

HBase架构的组成

HBase大体上按照master-slave架构可以分解成三种类型的服务。Region server服务于数据的读和写。当有数据需要被访问,client与HBase RegionServer直接通讯。Region assignment,DDL(create,delete tables)操作由HBase Master处理。Zookeeper,可以理解成HDFS的一部分,用来维护集群状态。

Hadoop DataNode存储由RegionServer管理的数据。所有HBase数据存储在HDFS的文件中。RegionServer搭配DataNodes来使用,这样可以使用HBase的Locality特性(就是把RegionServer负责管理数据其中一份副本放在本地的DataNode)。HBase在数据被写入时本地会存储一份副本,但是当一个Region被挪到其他RS上,Region数据直到下一次compaction才会被写到本地DN。

NameNode负责管理由物理文件构成的data block所产生的metadata信息。

QQ20180506-150402@2x.png

Regions

HBase表会按照key range被水平的拆分成一个个的“Regions”。一个Region包含这张表从start key到end key之间的所有数据行(类似于Mysql应对海量数据所使用的分库分表策略),并且对这个范围内的数据读写提供服务。一个RegionServer可对大概1000个Region提供服务(1000是一个默认值,可使用配置项修改,超过这个值后将不能split)。


QQ20180506-151004@2x.png

HBase HMaster

Region assignment,DDL(create,delete表)等操作由HBase的Master负责处理。
一个Master具体负责的任务如下:

  • 协调RegionServer
    在启动阶段assigning region,或者recovery和balancing阶段重新assigning regions
    监控集群上所有RegionServer实例(通过监听zookeeper上的通知消息方式实现)
  • 管理操作
    create, delete, update表等操作。


    QQ20180506-151816@2x.png

ZooKeeper: 集群协调器

HBase使用Zookeeper来作为分布式服务协调器,用来维护集群中的状态。Zookeeper维护Server的存活和可用,也会通知server异常后的事件。Zookeeper使用内部的一致性协议(paxos)来维护共享的状态。但是要注意要有三台或者五台(奇数)机器来提供一致性服务。

QQ20180506-152558@2x.png

组件们是如何协同工作的

Zookeeper用来协调分布式系统中各成员的共享状态信息。RegionServer和active的HMaster与ZooKeeper之间会保持一个session通讯。Zookeeper通过临时znode的方式维护各组件的心跳。


QQ20180506-154020@2x.png

每个RegionServer创建一个临时znode。HMaster监控这些znode来发现可用的RegionServer,并且也通过监控这些Znodes来得知那些Server异常。HMasters之间通过创建临时znode的方式竞争active master(具体来说就是在zk上成功创建znode则为active,失败的为backup)。Active HMaster向Zookeeper发送心跳,Backup HMaster在zk上监控Active HMaster的失败通知。

如果一个RegionServer或者Active HMaster发送心跳失败,session则会超时,临时znode会被删除。所有的Listeners会受到关于删除失败znode的时间通知。Active HMaster监听RegionServer,并会进行RegionServer失败后的恢复工作。Backup HMaster监听Active HMaster的失败信息,如果Active HMaster发生异常,Backup HMaster会成为Active。

HBase第一次Read或Write

在HBase上有一张特别的catalog表被成为META表,它管理所有region在集群中的位置信息。ZooKeeper存储META表的位置信息。

下面是一个client第一次读或写时发生的事情:

  1. client通过zk获得META表所在的RegionServer。
  2. client与持有META表的Regionserver通讯,在.META表中查询所希望访问的rowkey所在的RegionServer。client会缓存数据表和META的位置信息。
  3. client通过前面所拿到的rowkey所在的RegionServer信息,与其通信拿到所需要的数据。

后面的read,client会使用之前从META表中取回的位置信息来读取rowkey。这样则不会再次重新访问META表,除非由于Region被移动走而没有访问到;这种情况下会重新访问META表并更新cache。


QQ20180506-155851@2x.png

HBase Meta Table

  • META表是一张HBase表,存储了整个集群中所有region的信息
  • META表像是一张B树结构
  • META表按下面的结构存储:
    -Key:region start key,region encode id
    -Value:RegionServer


    QQ20180506-160120@2x.png

RegionServer的组成

一个RegionServer通常在一个HDFS的DataNode运行,并且有如下的组件:

  • WAL:Write Ahead Log是HDFS上的一个文件。WAL用来存储还没有被持久化到存储层的新数据;用来作RS异常时的恢复工作中。
  • BlockCache:是一个读缓存。在内存中存储了频繁被访问的数据。当BlockCache空间将要用光时会进行evict操作,清理访问最少的数据
  • MemStore:是一个写缓存。存储了还未被写到磁盘上的新数据。在写到磁盘之前它是经过排序的。每个column family的每个region会持有一个Memstore。
  • HFile将排序过的KeyValue存储在磁盘上


    QQ20180506-160741@2x.png

HBase写步骤1

当请求put一行数据,第一步是将数据写到write-ahead log,即WAL:

  • WALEdits会被append到WAL文件的最末端,并存储在磁盘上
  • WAL用来在集群挂掉时恢复还未被持久化到HFile的数据。


    QQ20180506-161023@2x.png

HBase写步骤2

一旦数据写到了WAL,它也会被放置在MemStore。之后,client发出的put请求会受到一条ack信息,表示写入成功。


QQ20180506-161208@2x.png

HBase MemStore

MemStore在内存中存储update数据并排序(字典序正序),并按照同样的方式存储在一个HFile中。每个column family的一个Region有一个MemStore。数据的update则在column family的范围内排序。


QQ20180506-161601@2x.png

HBase Region Flush

当MemStore积累了足够的数据后,会将整个排序后的结果写到HDFS上的一个新的HFile。HBase每个column falimy有多个HFile,包含了真实的cell,或者KeyValue实例。这些文件被创建为排序后的KeyValue edits形式,并随着时间的推移,flush到磁盘。

这里要注意一个问题,HBase中的column family有一个数量的限制。这是因为每个CF的每个Region持有一个MemStore,无论哪个MemStore写满数据,所有的MemStore都会做flush操作。在这个过程中保存一个最近写文件时用到的sequence id,这样系统可以知道存储了多少文件。

最高的sequence id会作为一个meta变量存储在每个HFile上,用来响应当时写到了哪个id,可以从哪个id继续。在Region startup阶段,sequence id会被读取,最高的sequence id用来写新的edits。


QQ20180506-163710@2x.png

HBase HFile

数据在HFile中按照排序过的Key/Values存储。当MemStore积累了足够的数据,整个排序过的KeyValue会被重写成HDFS上一个新的HFile。这个过程是一次顺序写入,速度很快,避免了移动磁盘的磁头。


QQ20180506-163950@2x.png

HBase HFile结构

一个HFile包含了一个多层的Index结构,这样避免了HBase查找数据时要将所有Index加载到内存。这个多层Index结构类似于b+树:

  • Key value对按增序存储
  • Index通过rowkey指向Key value写成的64K block块(64K可在建表时动态修改,更大有助于顺序scan,更小有助于get)
  • 每个block都有指向自己的Leaf index
  • 每个block的last key会被放在intermediate index中
  • root index指向intermediate index
    HFile的Trailer指向meta block,trailer被写在hfile文件的最后。trailer也包含像bloom filter和time range信息。Bloom filters帮助确定文件中是否不包含指定的rowkey。Time range信息帮助在读操作时跳过过期的文件。


    QQ20180506-164928@2x.png

HFile Index

刚才讨论的Index,会在HFile被打开时被加载到内存。对在单磁盘的seek操作性能提升有帮助。


QQ20180506-165505@2x.png

HBase Read Merge 1

我们已经知道,一行数据KeyValue单元格可能被存储在多个位置,row单元格已经被持久化在HFile中,近期更新的单元格在MemStore,近期被读取的单元格存储在BlockCache。这样的话,当读一行数据,系统如何返回对应的单元格回来?总的来说会在BlockCache,MemStore,HFile之间进行一次Read Merge操作,具体步骤如下:

  1. 首先,scanner从BlockCache中读取Row cell。近期被读过的Key values会在这里被缓存,并且当BlockCache空间不足时读取最少的数据将被evicted出BlockCache
  2. 接下来,scanner在MemStore中查找数据
  3. 如果scanner没有在MemStore和BlockCache找到所有的数据时(这里提出一个问题,HBase通过什么条件判断读写缓存中的数据不是要查询的全部?),HBase会使用BlockCache index和Bloom filter加载可能包含数据的HFile到内存,来查找目标单元格。


    QQ20180506-171807@2x.png

HBase Read Merge 2

如之前所讨论的,每个MemStore会有多个HFile,这意味着一次读,多个文件可能会被检查,将会影响到整体性能。这就是所谓的“读放大”。


QQ20180506-172157@2x.png

HBase Minor Compaction

HBase会自动挑选小一点的HFiles并重写为一个相对大一些的HFile。这个过程称为minor compaction。Minor compaction通过将过小的存储文件重写成更大的文件的方式减少文件数量,并在过程中进行归并排序。


QQ20180506-172415@2x.png

HBase Major Compaction

Major compaction重写并合并每个CF中的一个region内的所有HFiles,并且在过程中,丢掉被删除和已经过期的单元格。这个过程会提升度性能;但是,当major compaction重写所有文件时,大量的磁盘和网络I/O会在过程中产生。这个过程叫做“写放大”

Major compactions可被系统定时自动执行。因为写放大的关系,major compaction经常在周末或者夜间执行。一次Major compaction也会重写由于server挂掉或load balancing交接过来的region数据到本地。


QQ20180506-172943@2x.png

Region = Continguous Keys

我们对region进行一次快速回顾:

  • 一张HBase table可被水平的拆分成一个或多个region。一个region包含一段连续的,在startkey和endkey之间有序(字典序正序)的数据
  • 每个Region最大1GB(可配置,社区默认1G)
  • 一张表的一个Region呗一台RegionServer持有,向client提供服务
  • 一个RegionServer可以对1000个Region进行管理(这些region可能会属于不同的HBase table)


    QQ20180506-173305@2x.png

Region Split

起初每张表一个Region。当一个Region增长的过于大时,会split成两个child region。两个chlid region,持有original region的一半数据,并行的在与original region相同的RegionServer中打开,之后split操作会报告给HMaster。并且由于load balancing的关系,HMaster可能会将新Region assign到其他RegionServer上。


QQ20180506-173616@2x.png

Read Load Balancing

Split起初会发生在阈值相同的RegionServer上,但是由于load balancing的原因,HMaster可能会将新Region移动到其他Server。结果是新的Region使用远端的HDFS DataNode来提供服务,直到下一次Major Compaction才会将数据写到本地。


QQ20180506-173927@2x.png

HDFS Data Replication 1

所有write和read操作会优先通过主节点。HDFS会复制WAL和HFile blocks。HFile block repication会自动发生。HBase依赖HDFS提供数据安全性。当数据写到HDFS时,一份数据写到RegionServer本地的Datanode,之后复制到第二个节点,最后拷贝到第三个节点。

QQ20180506-174217@2x.png

HDFS Data Replication 2

WAL文件和HFile被持久化在磁盘并被replicated。这是HBase恢复MemStore中没有被持久化为HFile的数据并保障数据安全的方式。

QQ20180506-174442@2x.png

HBase Crash Recovery

当一台RegionServer异常,上面的Region在recovery过程执行完成之前会是不可用状态。Zookeeper会在RegionServer失去心跳时决定Node异常。HMaster之后会被通知,得知RegionServer挂掉的消息。

当HMaster检测到RegionServer挂掉,HMaster会重新assign挂掉RegionServer上的所有Region到可用的RegionServer上。为了恢复挂掉RegionServer的Memstore中没有被持久化到磁盘上的edit信息,HMaster会将属于挂掉RegionServer的WAL按照新的RegionServer拆分成新的文件存储到datanode。每个RegionServer使用各自的split WAL回访数据,重建出那个region的Memstore的信息。

QQ20180506-175705@2x.png

Data Recovery

WAL文件包含一系列的edits数据,每个edit代表依次put或delete操作。Edits会按时间顺序重写,这样,为了持久化,新的数据被追加到WAL的最后,存储在磁盘。

如果挂机发生在数据仍然在内存中并且还没被持久化到HFile时会发生什么?WAL已经被replay。replay会将旧的edits写到新的WAL中,并在当前的Memstore中排序。最后,MemStore被flush,将数据写到HFile。

QQ20180506-180425@2x.png

总结:HBase架构的优点

HBase提供如下优点:

  • 强一致性模型:当一次write操作范围,所有的read操作看到的都是相同的value
  • 自动扩展:Region在过大时会自动split。使用HDFS进行数据多副本化。
  • 内置的Recovery:使用Write Ahead Log(类似于文件系统的日志,mysql的binlog)
  • 与Hadoop生态整合:在HBase上的MapReduce会非常简单

总结:HBase架构的缺点

HBase的强一致模型带来如下问题:

  • WAL replay过程过于慢
  • Server Crash和Recovery过程过于慢和复杂
  • Major Compaction 带来的I/O风暴。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容