阿里云HBase针对冷数据存储的场景,提供一种新的冷存储介质,其存储成本仅为高效云盘的1/3,写入性能与云盘相当,并能保证数据随时可读。

背景信息

用户可以在购买云HBase实例时选择冷存储作为一个附加的存储空间,并通过建表语句指定将冷数据存放在冷存储介质上面,同时HBase增强版还基于冷存储实现了在同一张表内的冷热分离功能,能够自动将表中热数据放到读写速度快的热存储中,而把不常访问的数据放到冷存储中降低成本。

成本对比

注意事项

  • 冷存储的读IOPS能力很低(每个节点上限为25),所以冷存储只适合低频查询场景。
  • 写入吞吐上,冷存储和基于高效云盘的热存储相当,可以放心写入数据。
  • 冷存储不适合并发大量读请求,如果有这种行为可能会导致请求异常。
  • 购买冷存储空间特别大的客户可以酌情调整 “读IOPS 能力”,可以工单咨询。
  • 建议平均每个core节点管理冷数据不要超过30T。如果需要单个core节点管理更大数据量的冷数据,可以工单咨询优化建议。

前提条件

HBase增强版2.1.8版本以上才支持冷存储,如果低于此版本在开通过程中会自动升级到最新版本,客户端依赖要求AliHBase-Connector 1.0.7/2.0.7以上,Shell要求alihbase-2.0.7-bin.tar.gz以上。

使用场景

冷存储适用于数据归档、访问频率较低的历史数据等各种冷数据场景。

开通冷存储

方式一:创建HBase增强版集群时,可在购买页面选择是否选购冷存储和冷存储的容量请参考购买集群购买冷存储

方式二:
  1. 登录云数据库HBase控制台
  2. 集群列表页面,单击集群实例名称,进入集群详情页。
  3. 在实例信息页面在左侧导航栏选择冷存储
  4. 单击立即开通
说明 只有HBase增强版2.1.8版本以上才支持冷存储,如果低于此版本在开通过程中会自动升级到最新版本。

使用冷存储

HBase增强版支持在ColumnFamily(列簇)级别设置存储属性。可以将表的某个列簇(或者所有列簇)的Storage设为冷存储。一旦设置为冷存储后,那么这个表中该列簇(或者所有列簇)的数据,都会存储在冷存储中,并不会占用该集群的HDFS空间。设置的方法可以在建表时指定,也可以在建好表后,对列簇的属性进行修改。

建表和修改表属性均可以使用Java API和HBase shell完成,在使用Java API前请按照使用 Java API访问增强版集群文档完成Java SDK安装和参数配置。在使用HBase shell前,请按照使用HBaseue Shell访问增强版集群文档完成Shell的下载和配置。

建表时指定冷存储

HBase Shell
hbase(main):001:0> create 'coldTable', {NAME => 'f', STORAGE_POLICY => 'COLD'}
Java API
 Admin admin = connection.getAdmin();
 HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("coldTable"));
 HColumnDescriptor cf = new HColumnDescriptor("f");
 cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_COLD);
 descriptor.addFamily(cf);
 admin.createTable(descriptor);

修改表属性指定冷存储

如果表已经建立后,可以通过修改表中列簇的属性来设置冷存储的列簇。如果这个列簇中已经有数据,那么只有在major compaction之后,数据才会进入到冷存储。

HBase Shell
hbase(main):011:0> alter 'coldTable', {NAME=>'f', STORAGE_POLICY => 'COLD'}
Java API
Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("coldTable");
HTableDescriptor descriptor = admin.getTableDescriptor(tableName);
HColumnDescriptor cf = descriptor.getFamily("f".getBytes());
// 设置表的存储类型为冷存储
cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_COLD);
admin.modifyTable(tableName, descriptor);

更改表属性为热存储

如果表的列存储类型为冷存储,想更改为热存储,可以通过修改表属性的方式实现。如果这个列簇中已经有数据,那么只有在major compaction之后,数据才会回到热存储中

HBase Shell
hbase(main):014:0> alter 'coldTable', {NAME=>'f', STORAGE_POLICY => 'DEFAULT'}
Java API
// 创建连接
Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("coldTable");
HTableDescriptor descriptor = admin.getTableDescriptor(tableName);
HColumnDescriptor cf = descriptor.getFamily("f".getBytes());
// 设置表的存储类型为默认存储,默认存储为热存储
cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_DEFAULT);
admin.modifyTable(tableName, descriptor);

查看冷存储使用情况

在控制台的冷存储界面,可以查看整体的冷存储使用状况,并可以单击冷存储扩容进行扩容。冷存储扩容集群管理系统的表Tab中,可以显示某一张表的冷存储使用大小和热存储使用大小。User table

性能测试

说明 环境说明:
  • Master:ecs.c5.xlarge, 4core 8G, 20G高效云盘。
  • 4RegionServer:4RegionServer: ecs.c5.xlarge, 4core 8G, 20G高效云盘。
  • 测试机器:ecs.c5.xlarge, 4core 8G。

写性能

表类型 avg rt p99 rt
热表 1736 us 4811 us
冷表 1748 us 5243 us
说明 每条记录10列,每列100B,也就是单行1k, 16线程写入。

随机Get性能

表类型 avg rt p99 rt
热表 1704 us 5923 us
冷表 14738 us 31519 us
说明 关闭表的BlockCache,完全读盘。每条记录10列,每列100B,也就是单行1k。8线程读,每次读出1k。

范围Scan性能

表类型 avg rt p99 rt
热表 6222 us 20975 us
冷表 51134 us 115967 us
说明 关闭表的BlockCache,每条记录10列,每列100B,也就是单行1k。8线程读,每次读出1k。Scan的Caching设为30。