1.Hbase读ååç
2.hbase majoråminorçåºå«
3.Hbase读写原理
4.HBase 底层原理详解(深度好文,源码建议收藏)
5.HBASE stop-hbase.sh å为ä»ä¹HRegionServerè¿ç¨è¿å¨è¿è¡
6.LSM树详解
Hbase读ååç
ä¸ååæåå«åå¨ä¸åçæ件夹éãä¸MySQLæ¯è¾
é¦å Hbaseæ¯ä¾èµäºHDFSåzookeeperçã
Zookeeperåæ äºHmasterçä¸é¨ååè½ï¼å®¢æ·ç«¯è¿è¡DMLè¯å¥çæ¶åï¼é½æ¯å è·ZK交äºã
RegionServer管çäºå¾å¤çRegionï¼è¡¨ï¼ï¼RegionServeréé¢çWAL(HLog)æ¯é¢åå ¥æ¥å¿ï¼åè½æ¯é²æ¢å åä¸çæ°æ®æ²¡ææ¥çåè½çæ¶ä¸¢å¤±ãå¨Regionéé¢ç®¡ççStore管ççæ¯åæï¼Storeéé¢æMem Storeï¼å åï¼ï¼Flushä¹åï¼å é¤å åä¸çæ°æ®ï¼åæ¶åå ¥æ件StoreFile Hfile,源码Hfile å ¶å®æ¯å¨DataNodeéé¢çã
Hbaseç读æ¯åæ ¢ã
Hbaseå½å空é´ä¸æä¸å¼ å æ°æ®è¡¨meta表ånamespace表ãmeta表éé¢ä¿åäºè¦æä½ç表æå¨çä½ç½®çå æ°æ®ã
ï¼1ï¼é¦å 客æ·ç«¯åzk请æ±å æ°æ®è¡¨æå¨çRegionServerï¼zkè¿åç»å®¢æ·ç«¯meta表æå¨çregionServerã
ï¼2ï¼ç¶å客æ·ç«¯åå»å¯¹åºçRegionServeræ¥æ¾meta表ï¼æ¾å°çæ£è¦æä½ç表æå¨çregionServerï¼åæ¶æmeta表çä¿¡æ¯ç¼åä¸æ¥ï¼å å¿«åç»çæ¥è¯¢ã
ï¼3ï¼ç¶å客æ·ç«¯ååç®æ 表æå¨çRegionServeråéput请æ±ãå ææ°æ®åå°Hlogéé¢ï¼ååå°å åMemStore,æ°æ®ä¼å¨å åæåºï¼ç¶åå客æ·ç«¯åéackï¼å°è¿é对äºå®¢æ·ç«¯æ¥è¯´åæ°æ®å·²ç»ç»æäºãåçå°MemStoreçå·åæ¶æºåï¼å°æ°æ®å·åå°Hfile.
注ï¼meta表æå¨çä½ç½®ä¿¡æ¯ä¿åå¨zkçmeta-region-serverèç¹ä¸ï¼å®¢æ·ç«¯é¦å å°±æ¯å¨è¿ä¸ªèç¹ä¸å·®è¯¢meta表æå¨çRegionServerãmeta表éé¢çä¿¡æ¯å°±æ¯è¡¨ä¸å ¶å¯¹åºçRegionServerçä¿¡æ¯
è¿ä¸ªstu表å¯è½ä¸æ¢ä¸æ¡ï¼å 为stu表å¯è½æ°æ®é大äºä¹åæ ¹æ®RowKeyè¿è¡äºååï¼å¹¶ä¸å¯è½ä¼å¨ä¸åçæºå¨ä¸ã
ä¸åçåææ¯å¨ä¸åçæ件夹ã
MemStoreå·åæ¶æºï¼
å ¨å±çMemStoreç容éï¼é»è®¤æ¯å å åç%ãè¿ä¸ªå®¹éå¼ä¼è§¦åflushæä½ï¼ææçMemStoreé½è¦å·åï¼flushæä½ä¼é»å¡è¯»åæä½ã
ä¼å·å并é»å¡å°å°MemStore大å°éå°å®çæ大容éç%
WALæ¥å¿çå·åæ¶æºï¼
å¯ä»¥è®¾ç½®æ¥å¿ç大å°åæ°éï¼å½è¾¾å°ä¸å®æ°éï¼å·åå°HDFS
ï¼1ï¼ä»zkæ¾meta表æå¨çRegionServer
ï¼2ï¼ä»ä¸è¿°RegionServeréçmeta表éæ¾ç®æ 表æå¨çRegionServerï¼åæ¶æmeta表ç¼åï¼å éåé¢çæ¥è¯¢ã
ï¼3ï¼åç®æ 表æå¨çRegionServeråéget请æ±ãå¯ä»¥ä»block Cacheï¼MemStoreè¿æStoreFileéé¢æ¥ï¼å ·ä½ä»åªæ¥æ ¹æ®æ¶é´æ³ï¼æ¥æ¶é´æ³å¤§çï¼å ·ä½å°±é½æ¥ç¶åmergeåææ°ã
RegionServeréé¢æblock Cacheå¯ä»¥ç¼åç£ççæ°æ®ï¼å éæ¥è¯¢ãå¦æblock Cacheéé¢æï¼å°±å°ç¼ååMemStoreçæ°æ®mergeç¶ååææ°æ¶é´æ³ï¼æ²¡æå°±æ¯æç£ç读çåMemStoreéé¢çå并ãæ以hbase大å¤æ°è¯»è¦èµ°ç£çï¼æ以读å¾æ ¢ã
æ¯æ¬¡å·åä¼çææ°çHfileï¼Hfileå¾å°å¹¶ä¸æ°éå¤çæ¶åä¼å½±åæ¥è¯¢çé度ãæ以è¦è¿è¡å并ãå并å为minor Compactionåmajor Compaction
minor Compactionå°ä¸´è¿çè¥å¹²è¾å°çHfileå并æä¸ä¸ªè¾å¤§çHfileï¼ä¸ä¼æ¸ çè¿æåå é¤çæ°æ®ï¼major Compactionä¼å°ä¸ä¸ªStoreéé¢çææHfileå并æä¸ä¸ªå¤§çHfileï¼å¹¶ä¸ä¼æ¸ çæè¿æåå é¤çæ°æ®ã
æ°æ®ç读åå¯ä»¥ä¸ä¾èµHmasterï¼åªéè¦æå®zookeeperï¼ä½æ¯Hmasterè´è´£regionè°åº¦çå æ°æ®
ä½æ¯DDLè¯è¨æ¯è¦æHmasterç
Flushåmajor Compact
ï¼1ï¼flushå¨åä¸ä¸ªå åä¸æ¸ é¤è¿ææå é¤ï¼å é¤æ è®°ä¹æ¯ä¸è¡æ°æ®ï¼çæ°æ®ï¼ä½æ¯å¦ææ°æ®ä¸åççæ¬åå¸å¨ä¸åçmemStroeï¼å°±ä¸è½æ¸ é¤ãå é¤çæ è®°å¨flushä¹åä¸ä¼è¢«å ï¼ä½å¨åé¢çmajor compactionä¼æå é¤æ è®°å é¤æã
ï¼2ï¼major compaction ä¼æ¸ é¤è¿ææå é¤çæ°æ®ã
é»è®¤æ åµä¸ï¼æ¯ä¸ªTableèµ·ååªæä¸ä¸ªRegionï¼éçæ°æ®çä¸æåå ¥ï¼Regionä¼èªå¨æåï¼ä¸¤ä¸ªåRegionå¼å§é½ä¼å¨ä¸ä¸ªRegionserveréé¢ï¼ä½æ¯åºäºè´è½½åè¡¡çèèï¼Hmasteræå¯è½ä¼å°æ个Regionä¼ ç»å ¶ä»çRegionServerã
Splitçæ¶æºï¼
ï¼1ï¼å½ä¸ä¸ªRegionä¸çæ个Storeä¸çStoreFileçæ»å¤§å°æ¥è¿æ个å¼ï¼ç±åæ°hbase.hregion.max.filesize设å®ï¼é»è®¤gï¼ï¼è¯¥Regionå°±ä¼æç §RowKeyè¿è¡æåã
ï¼2ï¼å¨æ°çæ¬ä¸è¿ä¸ªå¼æ¯Minï¼R^2*"hbase.hregion.memStore.flush.sizeï¼Mï¼","hbase.hregion.max.filesize"ï¼,Ræ¯å½åRegionServerä¸å±äºè¯¥TableçRegion个æ°ãåregionæ¯æç §RowKeyååçãè¿ä¼å¯¼è´æ°æ®å¾æï¼å°±æ¯å 为ååçéå¼å¨ååï¼å¯¼è´ååä¹åçregionæ°æ®éä¸ååï¼å¯¼è´çç¹çé®é¢ãæ以å¨å»ºè¡¨çæ¶åè¦åé¢ååºï¼å°±æ¯ç¨RowKeyè§å好å¤å°ä¸ªregionï¼ä¸è®©hbaseèªå·±çååé»è¾ååã
å®æ¹å»ºè®®åªç¨ä¸ä¸ªåæï¼é²æ¢ä¸åçåæä¹é´æ°æ®ä¸ååï¼åä¸åææ°æ®éå¢å¤ï¼å¯¼è´å ¨å±çflushï¼æ°æ®éå°çåæä¹è¦flushï¼è¿æ ·ä¼å½¢æå¾å¤å°çstoreFileã
deleteæä½ï¼
ï¼1ï¼è®¾ç½®RowKeyï¼æçå é¤æ è®°æ¯deleteFamilyï¼å é¤å¤ä¸ªçæ¬
ï¼2ï¼è®¾ç½®RowKey+Familyï¼æçæ è®°æ¯deleteFamilyï¼å é¤å¤ä¸ªçæ¬
ï¼3ï¼è®¾ç½®RowKey+family+columnï¼æaddColumn()åaddColumns().addColumnæ¯å é¤ææ°ççæ¬æè å é¤æå®æ¶é´æ³ççæ¬ï¼å é¤æ è®°æ¯deleteæ è®°ãaddColumnsæ¯å é¤ææççæ¬æè å é¤æå®æ¶é´æ³æä¹åççæ¬ï¼å é¤æ è®°æ¯deleteColumn
Deleteçæä½å ¶å®ä¹æ¯putæä½ï¼putçæ¯å é¤çæ è®°ã
å¨Hbaseä¸HMasterè´è´£çæ§HRegionServerççå½å¨æï¼åè¡¡RegionServerçè´è½½ï¼å¦æHMasterææäºï¼é£ä¸ªæ´ä¸ªHbaseé群å°å¤äºä¸å¥åº·çç¶æï¼å¹¶ä¸æ¤æ¶çå·¥ä½ç¶æä¸ä¼ç»´æå¤ªä¹ ãæ以Hbaseæ¯æ对HMasterçé«å¯ç¨é ç½®ã
å¨Hbaseçconfç®å½ä¸æ°å»ºbackup-mastersæ件ï¼vimå å ¥å¤ä»½Masterï¼æ¯å¦slave,slave.å¨ææ件ååå°å个slaveéï¼ç¶ååå¯å¨hbase å°±è½å®ç°HMasterçé«å¯ç¨äºã
æ¯ä¸ä¸ªregionç»´æ¤çStartRowåEndRowï¼å¦æå å ¥çæ°æ®ç¬¦åæ个regionç»´æ¤çRowKeyèå´ï¼å该æ°æ®äº¤ç»è¿ä¸ªregionç»´æ¤ãé£ä¹ä¾ç §è¿ä¸ªååï¼æ们å¯ä»¥å°æ°æ®æè¦ææ¾çååºæå大è´çè§å好ï¼ä»¥æé«Hbaseæ§è½ã
ï¼1ï¼æå¨è®¾å®é¢ååº
æå¨è®¾ç½®RowKeyåäº5个region
ï¼2ï¼çæè¿å¶åºåé¢ååº
ï¼3ï¼æç §æ件ä¸è®¾ç½®çè§åé¢ååº
å建split.txt
ç¶åæ§è¡
è¿éå¦ææ件éé¢ç»çååºé®ä¸æ¯æç §é¡ºåºçï¼hbaseä¼å 帮æ们æé®æåºï¼ç¶åæç §é®æ¥ååºã
ï¼4ï¼ä½¿ç¨JavaAPIé¢ååº
adminçå建表çæ¹æ³æå¤ä¸ªéè½½ï¼å¯ä»¥åªä¼ 表çæè¿°ï¼ä¹å¯ä»¥å å ¥ååºçä¿¡æ¯ãadmin.createTable
è§åååºè¦èèæªæ¥æ°æ®éåæºå¨çè§æ¨¡ãè½ç¶æååäºååºï¼ä½æ¯æåå¦æååºå¤§äºäºG,è¿æ¯ä¼è§¦åsplitãå设ä¸å°æºå¨æGç£çï¼é£ä¹é¢ååºå°½é大äºä¸ªï¼è¿æ ·å°±è½é¿å é¢ååºä¹åå触åäºå¤§äºGçsplitã
ï¼1ï¼å¸ææ°æ®è½å¤å°½éååçåé å¨å¤ä¸ªååºéé¢ï¼æ£åæ§ï¼ã
ï¼2ï¼å¯ä¸æ§
ï¼3ï¼é¿åº¦ååï¼ç产ç¯å¢å°ä½ï¼
常è§ç设计æ¹æ¡ï¼
ï¼1ï¼ç产éæºæ°ãhashãæ£åå¼
ï¼2ï¼å符串å转
ï¼3ï¼å符串æ¼æ¥
çµä¿¡é¡¹ç®ï¼
ä¸æ¬¡éè¯çè®°å½ï¼-> -- ::
å设å个åº
ååºé®æä¹è®¾è®¡ï¼
ï¼ä¸ªé®ï¼
|
|
...
|
RowKeyçåé¢ä¸è¬ä¼æ¼ä¸_,_,...,_
è¿æ ·åç好å¤æ¯ï¼æ ¹æ®åä¸ä½å°±è½ç¥éåªä¸ªååºã
ï¼1ï¼æ们å¸æææºå·å°½éåå¸å¨ä¸åçååºï¼ä½æ¯ç¸åçææºå·æ°æ®éä¸å¨åä¸ä¸ªååºï¼è¿æ ·æ¹ä¾¿æ¥è¯¢æ个ç¨æ·çéè¯ä¿¡æ¯ã_
ï¼2ï¼å 为æ¯ä¸ªäººéè¯çéæ±ä¸åï¼ä¹å¸ææåä¸ä¸ªäººçéè¯è®°å½ä¹åå¸å¨ä¸åçååºéé¢ã__--
åå¸åä½ï¼[ï¼^ï¼.hash]%
å设è¦æ¥è¯¢æç¨æ·å¹´2æçéè¯è®°å½ï¼å¯ä»¥ç¨ åstartRowkeyï¼ åendRowKey
å¾®åã
1ãéæ±
ï¼1ï¼å¾®åå 容çæµè§
ï¼2ï¼ç¨æ·ç¤¾äº¤ï¼å ³æ³¨ç¨æ·ï¼åå ³ç¨æ·
ï¼3ï¼æåå ³æ³¨äººçå¾®åç¨æ·
2ã设计表
ï¼1ï¼å¾®åå 容表Content
è¡é®ï¼ç¨æ·id+æ¶é´æ³
ï¼2ï¼ç¨æ·å ³ç³»è¡¨
å 为æ£å¸¸æ åµä¸ä¸ªç¨æ·çç²ä¸åå ³æ³¨é½ä¸å¤ï¼å¯ä»¥ç¨ä¸è¡åå¨å ³æ³¨åç²ä¸çæ åµã
è¡é®ï¼ç¨æ·id
ï¼3ï¼åå§å页é¢ç表ï¼æ¾ç¤ºå ³æ³¨ç人çæè¿ä¸æ¡å¾®åï¼
hbase majoråminorçåºå«
HBaseAdminæä¾compactæ¹æ³æ¥æå¨å并å°æ件 public void compact(final byte [] tableNameOrRegionName) public void majorCompact(final byte [] tableNameOrRegionName) majorCompactä¼å¯¹ææçæ件è¿è¡Compactï¼ècompactä¼éååéçè¿è¡coã
Hbase读写原理
HBase的读写原理涉及到数据的存储、管理以及优化过程。源码在写入阶段,源码客户端的源码数据首先写入内存的MenStore,然后HBase会定期将MemStore内容写入StoreFile。源码查看spring源码触发刷写的源码因素包括MemStore大小达到预设阈值、所有MemStore总和达到上限以及RegionServer的源码WAL文件数量限制。当达到高水位,源码写入操作会暂时阻塞,源码直到数据被刷写到磁盘。源码
读取数据时,源码与写入相反,源码HBase需要从文件开始查找,源码因此写操作通常比读操作更快。源码HBase利用LSM树(Log-Structured Merge Tree)进行底层数据存储,这种结构将数据增量保存在内存中,定期写入磁盘,以提升写入性能。读取时则涉及磁盘和内存数据的tipdm源码说明合并,有时会对读取性能产生影响。HBase通过布隆过滤器加速内存数据读取,同时提供flush、compact和major-compact指令进行数据管理和优化。
在删除操作中,HBase并不立即删除数据,而是添加删除标记,等待major-compact阶段才彻底删除,以保持历史版本的完整性和数据一致性。文件大小和数量达到一定阈值时,HBase会自动触发文件合并,以减少磁盘I/O和提高查询性能。
总的来说,HBase的读写机制在追求写入性能的同时,也注重数据的持久化和读取效率的优化,以适应大规模数据存储和处理的需求。
HBase 底层原理详解(深度好文,建议收藏)
HBase是一个分布式的、面向列的opengl学习源码开源数据库,基于Hadoop,主要用于存储大量数据。它在HDFS之上构建,依赖Hadoop生态系统。HBase介于NoSQL和RDBMS之间,只能通过主键(row key)和范围检索数据,支持单行事务。其表具有行键排序和位置相关性特性。
HBase中表的特点是行键用于检索记录,支持三种访问方式:按行键、按行键范围和通过Zookeeper。行键可以是任意字符串,长度为KB,实际应用中长度一般为-bytes,存储为字节数组。行键排序存储,设计时应考虑经常一起读取的行应放在一起。存储时数据按字典顺序排序,读写操作是借用nginx源码原子的。
列族是表的结构的一部分,列归属于列族。列族用于访问控制、磁盘和内存使用统计。列族过多会增加读取数据的I/O和搜索文件次数,因此除非必要,不要设置过多列族。
列是列族下的具体列,类似于MySQL中的具体列。时间戳用于记录数据的多个版本,通过行键、列和时间戳确定数据单元(cell)。HBase提供两种数据版本回收方式,根据列族设置。单元由row key、column和version唯一确定。数据存储为字节码,版本号为默认时间戳,类型为Long。德国sam源码
HRegion存储在HDFS上的StoreFile格式,每个StoreFile包含Trailer、FileInfo、Data Index、Meta Index和Data Block。Data Block是HBase I/O的基本单位,可选择压缩方式存储,以提高效率。每个Data Block由Magic、Key、Value组成,其中Value为二进制数据。
Memstore和StoreFile组成一个HRegion,写操作先写入Memstore,当达到阈值时,触发Flush到StoreFile。StoreFile达到一定大小,触发Compact合并操作或Split操作,实现负载均衡。读操作先在Memstore查找,找不到再查找StoreFile。
HLog(WAL log)用于记录数据变更,用于灾难恢复。每个Region Server维护一个Hlog,而非每个Region一个。合并操作分为Minor Compact和Major Compact,将相同Key的修改合并,形成大StoreFile。当StoreFile大小达到阈值,进行Split,分为两个StoreFile。
HBase的读写过程包括读请求和写请求。读请求先从Zookeeper获取Meta表信息,访问Meta表所在HRegionServer,扫描Memstore和StoreFile获取数据。写请求先写入HLog和Memstore,Memstore达到阈值触发Flush到StoreFile,系统记录redo point。数据写入后,进行Compact和Split操作,以维持高效的数据管理。
HRegion管理包括分配、上线和下线。HMaster记录HRegion Server状态,当需要分配HRegion时,发送装载请求给有空闲空间的HRegion Server。HRegion Server上线和下线由HMaster监控,HRegion Server下线时,HMaster重新分配HRegion。
HMaster工作机制包括上线和下线。HMaster下线导致元数据修改被冻结,集群短时间内不受影响。HMaster下线后,集群中会有一个HMaster等待时机抢占位置。
HBase的三个重要机制包括Flush机制、Compact机制和Split机制。Flush机制控制Memstore大小,触发数据写入StoreFile。Compact机制合并StoreFile,清理过期数据,将版本号保存为1。Split机制将过大的HRegion一分为二,减少StoreFile数量。
HBASE stop-hbase.sh å为ä»ä¹HRegionServerè¿ç¨è¿å¨è¿è¡
æå ¥æ°æ®ç»æåï¼hbaseå¨åcompactçæä½å¢ï¼ä¹å°±æ¯hregionserverè¿ç¨å¨è¿è¡å¢!ä½ å½ç¶å ³ä¸æå¦
LSM树详解
解锁LSM树的神秘面纱:存储性能的优化艺术 LSM树,一个看似平凡实则蕴含强大魔力的数据存储结构,它通过非严格树形布局,巧妙地平衡写入速度与读取效率。其核心策略在于顺序写入,MemTable(内存表)就像是数据的高速缓冲区,记录最近产生的数据,通过Write-Ahead Log (WAL) 确保数据的可靠性。当MemTable达到容量极限,数据会被转换为Immutable MemTable,并以SSTable(顺序读取的磁盘存储结构)的形式持久化。 LSM树巧妙地避免直接修改SSTable,从而减少写放大和存储冗余。读取时,虽然需要遍历所有SSTable,但通过索引优化,搜索效率得以提升。其中,Compact(合并SSTable)操作是关键所在,它能消除冗余,减少存储空间占用。有两种主要策略:size-tiered和leveled。 size-tiered策略通过设置每层SSTable的数量和大小限制,虽然可以控制文件大小,但可能导致大文件和空间浪费。而leveled策略更为智能,它在不同层次管理SSTable,确保每个key只在最合适的层中占用一条记录,有效防止空间放大。然而,写放大问题在leveled策略下尤为明显,需要在性能和存储效率之间找到平衡。 LSM树的设计思想在实践中得到广泛应用,比如在Hbase的MergeTree和ClickHouse的存储组件中,这些数据库凭借LSM树的特性实现了高效的数据处理。存储优化策略并非一蹴而就,Hbase的Major/Minor Compact提供了精细的控制,深入研究RocksDB的合并策略,能让你更深入理解LSM树的奥秘。 虽然LSM树的世界充满了细节和复杂性,但它正是推动现代数据库性能提升的基石。深入理解LSM树,无疑能让你在数据存储和管理的道路上走得更远。参考资料:
《LSM Tree-Based存储引擎的compaction策略(RocksDB)》