简介
HBase是一款分布式的列式存储数据库,适用于需要处理大量数据并且对读写性能有较高要求的场景,具有以下特性:
- 高可用
- 高读写性能
- 强读写一致性
- 列式存储(核心能力)
架构
zk
- 负责元数据的存储,包含HMaster的地址
- 负责HMaster的高可用,如果故障了重新选新的HMaster
HMaster
- HMaster负责维护整个集群的数据元信息,提供HRegion的元信息(地址、存储的数据ROWKEY范围,所在的HRegionServer地址),元数据还是存储子啊zk中。
- 负责HRegionServer的故障转移
HRegionServer
- 负责管理物理机上的HRegion(单个region数据量太大,需要分裂成两个)
- 接收客户端的读写请求,并与hregion交互
- 维护Write-Ahead Log(WAL),用于记录所有数据变更,支持数据恢复
HRegion
HRegion负责数据的读写,类似MySql中的引擎层(innodb等)。
核心原理
高性能写读操作-LSM
对于写操作,会先记操作日志到HLog中(顺序写磁盘),然后会写到内存中(memstore),最终异步写入HFile中,因此避免了随机写磁盘的高耗时io操作。memstore使用跳表有序地存储最近的数据,当数目超过阈值时,则写入磁盘。
当处理读操作时,如果数据不在内存中,则需要到所有磁盘文件中寻找,当写入操作越来越多,磁盘文件也会随之增加,读性能会下降。因此,磁盘上会存在多个文件,为了提高效率,Hbase使用布隆过滤器快速过滤无效的请求;并异步合并文件,会删除过期、已删除和超过最大版本号的数据,能减少文件的数目。
列簇
文件的存储粒度既不是rowkey对应的所有字段,也不是每个字段单独存一个文件,HBase采用了折中的方式。一张表包含多个列簇,列簇则是包含多个列,业务上使用紧密相关的多个列可以放在一个列簇中,查询或者写入时,避免操作多个文件。{row, column, version} 元组就是一个HBase中的一个
cell,Cell的内容是不可分割的字节数组。cell是用户操作的最小数据粒度。
最佳实践
- 列族数量最好小于或等于3
- 使用批量API(如批量Get和批量Put)来减少网络IO,提高写入和读取性能
- 合理设置列族的版本数量,以控制StoreFile的大小和避免过多的IO操作
- GET操作指定需要的列或者列簇,避免多余的数据传输
- 接口放在领域层,数据读写接口的实现放在基础设施层