HBase 架构,
region服务器将数据保存到内存中,直到累积到足够多的数据再将其刷写到磁盘上,这样可以避免产生较多的小文件,但保存在内存中的数据是不稳定的,如果发生断电,内存中的数据将会丢失,HBase采用的方式每次更改都会被先写到日志中,然后在写入到内存。这样即使突遇断电,还可以通过回放日志恢复到断电之前的状态。这也意味着如果某个操作写入日志失败,那么整个操作也是失败的。
下图展示了WAL是怎样和HBase架构结合的
从图中可以看出,WAL是被多个region实例共享的。
大致流程是客户端向region服务器发送put或delete操作请求,到达region服务器端后,会被分配给与行相关的HRegion实例处理,首先会被写到WAL中,然后再写入到memstore中。整个过程看起来就是HBase的写路径。
为什么是多个region共享一个日志,而不是一个region一个日志文件?
因为一个region一个日志文件,就需要向HDFS并发写入多个文件,这样会造成大量的磁盘寻道来向不同的物理日志文件中写数据,降低性能。
当在shell上使用get命令来获取某一行数据时,系统是怎么知道该返回什么呢?
在读取所有存储文件来查找匹配的条目之前,会有一个快速排查的阶段:使用时间戳和可选的布隆过滤器(Bloom Filter)来排除那些绝对不包含所需条目的文件。然后再扫描剩下的文件和memstore来查找匹配的键。
HBase提供了两个目录表:-ROOT-表和.META.表,用来查找region。-ROOT-表用来查询.META.表中的region的位置。HBase中只有一个root region,并且是不能拆分的,从而保证类似于B+树的三层结构:第一层ZooKeeper中包含root region位置信息的节点,第二层是从-ROOT-表中查找对应meta region的位置,第三层是从.META.表中查找用户表对应的region的位置。
region的状态是受master控制的。
HBase使用ZooKeeper作为其协同服务组件,用来跟踪region服务器的状态、保证集群中只有一个Master、保存root region的地址等。
HBase的复制有些类似于MySQL的statement-based复制,它主要是通过WALEdit和HLog来实现的。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。