hypertable在table中存储数据,数据通过主键排序. cell中的数据没有类型,所有的数据都存储为字节串. 通过把table分段到集群来进行scaling.hypertable中有两种类型的server: Range Server用于存储数据段, Master Server负责任务管理和Range Server定位. 同一台机器上可以同时运行Range Server和Master Server程序. 一个Range Server上可能保存着不连续的range, Master Server负责智能的定位和管理数据, farming. 如果一个range被填满了, 此range会被切分并重新分配.前半部分range仍保留原位, 后半部分range被master指派到一个新的Range Server.默认情况下,最大的range尺寸为200MB. 如果整个Range Server填满了, Master把部分ranges迁移到其它server. range列表和它们的路径信息被存放在一个METADATA 表中, 同时也作为Hypertable中的一个普通表. 第三个元素: Hyperspace, 包含一个指向root METADATA表range的指针,负责给client充当路由. Hyperspace同时也提供了一个类似于文件系统的名字空间, 并为clients充当一个锁管理器的角色. Hypertable的Schemas非常灵活, 仅仅需要定义列族(column family):CREATE TABLE Items { tag, review, price}; 数据以名值对(key:value)的方式存储. 数据的所有版本都被存放在Hypertable中, 所以时间戳会作为key的一部分.针对单个cell的key典型格式为<row><column-family><column-qualifier><timestamp>. timestamps在查询时通常作为范围来传递, 所以在此范围内的值被返回. 这种方式方便老版本数据的查阅, 并确保所有数据的先前状态都被保存而非覆盖. 当然,你还可以指定固定保留的版本数量. 允许老数据被延迟进行垃圾收集. 随机更新的效率很高,这归咎于Cell Cache和Cell Store. 一个Range实际上由许多Cell Store组成. 在同一个cell store中保存的所有行按照行标识排序. 在向Hypertable执行写操作时, 信息被写入到DFS上的一个commit log中, 之后被存储在Cell Cache中. 当Cell Cache达到尺寸上限时会被压缩并作为一个cell store写入磁盘。Cell store不是连续的, 所以一个Heap Merge scanner负责合成cell cache和cell store中的key/value对并有序地返回.当range达到cell store的上限时, 会执行一个heap merge并把多个cell store压缩为一个. 在极端情况下,每个Range最终只有唯一一个Cell Store. Hypertable让用户可以控制数据如何使用Access Group机制在DFS上进行物理存储.每个column family属于一个单个Access Group. 同一个Access Group中所有column families的数据在物理上是一起存储的。这对于读写频繁的column families来说具有更好的性能.比如,一个table中存在100个column families, 但是只有2个column families被频繁访问. 如果这两列被存储在同一个access group中, 系统仅仅需要针对这两个column families进行磁盘I/O。
hypertable原理
最新推荐文章于 2019-12-09 14:08:25 发布