HBase作为存储方案
HBase存储特点
* Client
1. 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息。
* Zookeeper:
1. 选举集群中的Master,Master与RegionServers 启动时会向ZooKeeper注册。
2. 存储所有Region的寻址入口。
3. 实时监控Region server状态并实时通知Master。
4. 存储HBase的schema和table元数据。
5. 使Master不存在单点故障。
* Master
1. 在Region Split后,为Region server分配region。
2. 管理HRegionServer的负载均衡,调整Region分布。
3. 发现失效的Region server后重新分配其上的region,并负责Regions迁移。。
4. 管理用户对table的增删改查操作。
* Region Server
1. Regionserver维护region,处理对这些region的IO请求,向HDFS文件系统读写数据。
2. Regionserver负责切分在运行过程中变得过大的region。
* Region
1. table按照行分割成若干Region,每个Region对应table中的一个Region。
2. Region由多个HStore组成。
* HLog
1. 类似mysql的binlog,数据会先写到WAL上,然后再放到内存中,数据恢复。
2. 已经持久化到StoreFile的HLog会定期被删除。
* HStore
1. HBase的存储核心,由MemStore和StoreFile组成。
2. 每个HStore对应Table的一个列族的存储。
* MemStore
1. 数据不直接写磁盘而是先写到MemStore,当满了才会Flush到StoreFile中。
2. 底层由HFile实现。
3. 数据只需写入到此内存即可返回,快速的插入操作。
* StoreFile
1. StoreFile文件数到一定阀值会触发Compact合并操作,多个StoreFile变成一个StoreFile。
2. 所有数据操作都是添加操作,保证I/O,而对于数据更新/删除都是在后续compact过程中完成。
底层存储
HBase支持很多文件系统的存储。
1. 操作系统原生文件系统。
2. HDFS文件系统。
3. 其他文件系统。
HDFS可靠性高及其同属同个生态,选择HDFS作为存储。
HBase 如何寻址
寻址过程大致为client -> -ROOT- -> .META. -> RS ->region -> rowkey。
- client通过zookeeper的root-region-server节点获取哪个Server管理-ROOT-表,包含该机器的IP地址和端口。
- 接着访问-ROOT-表,该表只有一个Region且不会split,每行记录了.META.表的一个region信息,以及这个region的startkey和endkey,查找到.META.表包含要查的rowkey记录的Region的ip和端口。
- 接着访问该ip和端口的.META.表,根据rowkey找到用户表数据存放对应的Region的机器信息,根据rowkey查找对应的regionserver和region。最后到对应的region找到value。
- 根据查到的用户表信息到对应机器上查找数据。
客户端会缓存查询过的rowkey的地址。
client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问region server),master仅仅维护table和region的元数据信息,负载很低。
HBase 的性能、如何扩展
HBase的插入性能很好,查询还不错,腾讯给出的数据是经过调优在百亿数据级别80%以上数据能在20ms查到。
详细的一些数据后面在写代码阶段会给出。
当数据峰值接近系统设计容量时,可以简单的通过增加服务器的方式来扩大容量。某种程度上来说,这个动态扩容过程无需停机,HBase系统可以照常运行并提供读写服务,完全实现动态无缝无宕机扩容。
balance模式下,会自动将数据迁移到新机器上,适合中小集群,迁移过程大量消耗机器资源。
非balance模式下,新写入文件写到新机器上。
运维
- 官方的命令行或二次开发,rest接口。官方有原生监控平台。
- BigInsights。
最后的说明
hbase优势在于接近线性的任意水平扩展,不必在单机上与redis性能太较真,看自己场景选择。
HBase作为存储方案的更多相关文章
- Redis百亿级Key存储方案(转)
1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...
- Redis百亿级Key存储方案
1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...
- HBase 数据迁移方案介绍
一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类: 图1.HBase数据迁移方案 从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类.下 ...
- Hadoop小文件存储方案
原文地址:https://www.cnblogs.com/ballwql/p/8944025.html HDFS总体架构 在介绍文件存储方案之前,我觉得有必要先介绍下关于HDFS存储架构方面的一些知识 ...
- HBase 数据迁移方案介绍 (转载)
原文地址:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html 一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分 ...
- BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览
一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...
- HBase 数据迁移方案介绍(转载)
原文链接:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html 一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分 ...
- MongoDb gridfs-ngnix文件存储方案
在各类系统应用服务端开发中,我们经常会遇到文件存储的问题. 常见的磁盘文件系统,DBMS传统文件流存储.今天我们看一下基于NoSQL数据库MongoDb的存储方案.笔者环境 以CentOS ...
- HTML5的五种客户端离线存储方案
最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及Fi ...
随机推荐
- C语言程序设计第二次作业——
1,编译过程过程中的错误缺引号和分号并且拼写错误. 正确结果: 2,编译过程 改正错误: 正确结果: 3,利用SIZEOF运算符求出的数据类型所占字节大小: 4,在头文件LIMITS.H中相关的编译 ...
- 【实用】【移动端】Retain屏1px解决方案
新浪微博HTML5版 微博的实现方式(rem + 小数px) <meta name="viewport" content="width=device-width,i ...
- SQL语句删除字段,改变字段长度
1.改变字段长度 ALTER TABLE T_MSG_SEND_R_ACC MODIFY reply_content VARCHAR(512); 2.删除字段ALTER TABLE MSG_TX_BA ...
- JVM内存模型及分区
Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示: jvm管理的内存区域包括以下几个区域: 栈区: 栈 ...
- 关于一些基础的Java问题的解答(一)
学习一门语言基础是非常重要的,因此本文总结了一些常见的Java基础问题的解答,希望可以帮到大家. 1. 九种基本数据类型的大小,以及他们的封装类. 9种基本数据类型 基本类型 包装类型 大小 bool ...
- Python小代码_10_判断是否为素数
import math n = int(input('Input an integer:')) m = int(math.sqrt(n) + 1) for i in range(2, m): if n ...
- Node.js ZLIB
Zlib 稳定性: 3 - 文档 可以通过以下方式访问这个模块: var zlib = require('zlib'); 这个模块提供了对 Gzip/Gunzip, Deflate/Inflate, ...
- python 反人类函数式编程模拟while和if控制流
比如下面这个简单明了的命令式程序,它不断捕捉用户输入的内容,然后对其求和.直到用户输入一个以'0'开头的字符串,停止捕捉. while 1: line = input() ': print(sum(m ...
- JAVA面向对象-----匿名内部类
匿名内部类 匿名内部类:就是没有类名字的内部类. 匿名内部类作用:简化内部类书写. 匿名内部类的前提:必须继承一个父类或者是实现一个接口. 匿名内部类的格式: new 父类或者接口(){ 执行代码-. ...
- 带你深入理解STL之RBTree
最近一直忙于校招的笔试,STL的深入理解系列也耽搁了好几天,再加上!红黑树真的是超级超级难理解,超级超级复杂,参考了好多博客上的大神的理解才稍微明白一点,勉强入个门,下面请以一个菜鸟的角度跟着我一起学 ...