冷数据是大数据存储当中常见的场景。阿里云Lindorm针对冷数据存储的场景,提供了专门的冷存储介质,其存储成本仅为标准型存储的20%,写入能力与标准型存储相近,并能保证数据随时可读。冷存储适用于数据归档、访问频率较低的历史数据等各种冷数据场景。冷存储的使用非常简单,用户可以在购买云Lindorm实例时选择冷存储作为一个附加的存储空间,并通过建表语句指定将冷数据存放在冷存储介质上面,从而降低存储成本。

同时Lindorm还基于冷存储实现了在同一张表内的冷热分离功能,能够自动将表中将热数据放到读写速度快的热存储中,而把不常访问的数据放到冷存储中降低成本,如果用户有冷热分离的需求,请参见冷热分离章节。

开通冷存储

冷存储可以独立购买,作为一个附加存储空间使用。

创建新的Lindorm实例时,可在购买页面选择是否选购冷存储和冷存储的容量。 如果您在创建实例时没有选择开通冷存储,也没有关系。在集群控制台上,找到冷存Tab,单击开通
说明 只有Lindorm增强版2.1.8版本以上才支持冷存储,如果低于此版本在开通过程中会自动升级到最新版本。

配置冷存储

说明 冷存储功能需要Lindorm服务端升级到2.1.8版本以上

Lindorm支持在表级别设置存储属性。可以将整个表或某个列簇的Storage设为冷存储。一旦设置为冷存储后,那么这个表或某个列簇的数据,都会存储在冷存储中,并不会占用该集群的默认存储空间。设置的方法可以在建表时指定,也可以在建好表后,对表或列簇的属性进行修改,具体方法,请参考以下说明:

方式一:使用HBase API配置

可以通过HBase Shell 和 Java API对表配置或取消冷存储,在使用HBase Shell前,请先参考使用HBase Shell访问Lindorm,完成Shell的下载和配置;在使用Java API之前,请参考使用HBase Java API 访问Lindorm,完成SDK安装和参数配置

  • 建表时指定冷存储

    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
    java 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);

方式二:使用Cassandra CQL配置

即将支持,如有需求,可咨询后台人员(参考专家服务)

查看冷存储使用情况

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

性能测试

环境说明

Master: ecs.c5.xlarge, 4core 8G, 20G高效云盘4 RegionServer: ecs.c5.xlarge, 4core 8G, 20G高效云盘4 测试机器: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。

注意事项

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