基于Tablestore的一站式物联网存储解决方案-表设计篇

前言

本章节主要讲解表格存储Tablestore的实例、表的创建步骤和共享充电宝场景的数据表设计。

表设计

表功能设计

这里按照功能需求分为三张数据表:元数据表、订单数据表、元数据时序表

  • 元数据表

元数据表保存了机柜的最新状态数据。用户租借、归还充电宝,以及运维人员上下线机柜,都会更新元数据表记录。在元数据表上建立索引,可提供多维查询的能力。对元数据表按照字段进行聚合分析,可获取到机柜损坏比、充电宝租赁比等数据。

  • 订单数据表

订单数据表保存了充电宝租借订单信息。用户租借、归还充电宝会更新订单数据表记录。通过对订单数据表进行流批计算,可以实时获取到营业额报表数据。也可以在订单数据表上建立索引,实现按照订单号、订单日期等字段搜索的功能。

  • 元数据时序表

元数据时许表保存每个时间点上的元数据信息。例如一小时上报一次机柜元数据信息,那么元数据时序表上就会有多份元数据的冗余。通过分析元数据时序表可获取不同时间维度上的机柜状态,例如可统计一天内每个时间段的机柜租赁比。上报的间隔越频繁,可以获取到的时间粒度越细。

表结构设计

在介绍表结构之前,有必要带大家了解一下表格存储Tablestore数据表模型。

宽表模型

宽表模型(Wide column)是Tablestore数据表的物理模型。如下图所示
基于Tablestore的一站式物联网存储解决方案-表设计篇

Tablestore数据表是由多个分区组成的,不同的分区会自动负载均衡到多台物理机(worker)上,提高读写吞吐能力。分区的分布规则,由分区键值决定的,所以设置合理的分区键非常重要。另外,Tablestore数据表是schema-free的,支持的属性列个数无上限,这种结构可以满足诸多机柜元数据字段的存储。

说明:Tablestore表支持多主键,第一个主键作为分区键。更多关于宽表模型的介绍请参考模型介绍

分区键设计

分区键的值直接影响着数据分布的均匀度,若分区键设置不合理,则可能引起写入倾斜,降低系统整体的负载能力。分区键的值应该尽量保证不递增、离散、均匀。这里机柜ID是按照机柜型号+写入时间戳的格式,若使用机柜ID作为分区键的话,则时间戳越大的数据分布在越靠后的分区,形成尾部热点,所以需要对机柜ID进行Md5打散。考虑到Md5算法的打散规则与字符串前缀相关性很大,这里设置分区键cabinet_Md5ID的格式为Md5(cabinet_location+cabinet_type+timestamp)。这样能最大程度上保证分区键均匀写入到各个分区上。同理,订单数据表的分区键也需要对订单ID进行打散。

说明:更多关于分区键设计的介绍请参考表设计

表结构列表

元数据表 - cabinet

字段名 描述
主键(分区键) cabinet_Md5ID(String) 机柜Md5ID
主键 cabinet_ID(String) 机柜ID
属性列 cabinet_geo(String) 机柜经纬度
属性列 cabinet_location(String) 机柜地理位置
属性列 cabinet_province(String) 机柜位置所在省份
属性列 cabinet_available_size(long) 可租用充电宝数量
属性列 cabinet_damage_size(long) 损坏的充电宝数量
属性列 cabinet_powerbank_size(long) 机柜槽位
属性列 cabinet_isonline(String) 机柜上线状态
属性列 cabinet_powerPercent(double) 机柜电量百分比
属性列 cabinet_type(String) 机柜型号
属性列 cabinet_manufacturers(String) 机柜生产厂商
属性列 cabinet_overhaul_time(long) 机柜检修时间戳
属性列 cabinet_pricePerHour(double) 机柜充电宝租赁时价(元)

订单数据表 - order

字段名 描述
主键(分区键) order_Md5ID(String) 订单Md5ID
主键 order_ID(String) 订单ID
属性列 order_start_time(long) 租赁时间戳
属性列 order_end_time(long) 归还时间戳
属性列 order_isRevert(bool) 是否归还
属性列 order_lose_pay(double) 未归还违约金
属性列 cabinet_ID(String) 机柜ID
属性列 order_phone(String) 客户手机
属性列 cabinet_pricePerHour(double) 机柜充电宝租赁时价(元)
属性列 cabinet_type(String) 机柜型号
属性列 cabinet_geo(String) 机柜经纬度
属性列 cabinet_province(String) 机柜位置所在省份

元数据时序表 - cabinet_time

字段名 描述
主键(分区键) cabinet_Md5ID(String) 机柜Md5ID
主键 cabinet_ID(String) 机柜ID
主键 cabinet_state_timestamp(long) 数据时间戳
属性列 cabinet_geo(String) 机柜经纬度
属性列 cabinet_location(String) 机柜地理位置
属性列 cabinet_province(String) 机柜位置所在省份
属性列 cabinet_available_size(long) 可租用充电宝数量
属性列 cabinet_damage_size(long) 损坏的充电宝数量
属性列 cabinet_powerbank_size(long) 机柜槽位
属性列 cabinet_isonline(String) 机柜上线状态
属性列 cabinet_powerPercent(double) 机柜电量百分比
属性列 cabinet_type(String) 机柜型号
属性列 cabinet_manufacturers(String) 机柜生产厂商
属性列 cabinet_overhaul_time(long) 机柜检修时间戳
属性列 cabinet_pricePerHour(double) 机柜充电宝租赁时价(元)

以上就是共享充电宝场景所需要用到的表结构了。下面将带大家了解表格存储服务开通、实例创建、表创建等操作步骤。

开通表格存储服务

  1. 登陆阿里云官网表格存储产品页,点击立即开通。若已开通表格存储服务,请跳过此步骤。

基于Tablestore的一站式物联网存储解决方案-表设计篇

创建实例

  1. 登录表格存储产品页,点击管理控制台
说明:可在实例列表页面上方点击试用新版控制台按钮,切换到新版本控制台
基于Tablestore的一站式物联网存储解决方案-表设计篇
  1. 选择对应的地域,点击创建实例。创建按量模式实例。
说明:实例创建完毕后,会有一段初始化时间,请等待初始化完毕后再进入实例。更多关于实例概念的介绍请参考官网文档实例
基于Tablestore的一站式物联网存储解决方案-表设计篇

创建表

可以通过表格存储控制台CLI客户端工具SDK代码三种方式创建表。

  1. 表格存储控制台创建

    1. 点击创建数据表

基于Tablestore的一站式物联网存储解决方案-表设计篇

  1. 填写表主键信息。
说明:Tablestore表是Schema-free的,所以不需要指定属性列的字段名和字段类型,通过数据添加接口插入数据即可。
基于Tablestore的一站式物联网存储解决方案-表设计篇
  1. Cli客户端工具创建

    1. 进入表格存储官网,根据操作系统类型下载对应的CLI客户端工具
    2. 输入配置实例接入信息命令 config --endpoint endpoint --instance instance --id id --key key
    3. 输入创建数据表命令 create -t tablename --pk pks --ttl ttl --version version
说明:更多关于CLI客户端工具的用法请参考文档CLI客户端工具
  1. SDK代码创建

SDK代码创建数据表请参考文档创建数据表

小结

本章节主要介绍了共享充电宝场景的表结构设计,以及表格存储Tablestore的宽表特性。在设计Tablestore数据表的过程中,分区键设计是至为重要的一环,设置合理的分区键可避免数据写入热点,提升读写性能。下一章节将模拟机柜元数据,展示海量数据的读写操作与性能,以及利用多元索引实现共享充电宝场景下的多维查询能力。

联系我们

如对本章节所述有疑问或有其他问题需要咨询,欢迎加入钉钉群:“表格存储公开交流群-2”。群内提供免费的在线专家服务,欢迎扫码加入,群号23307953。
基于Tablestore的一站式物联网存储解决方案-表设计篇

上一篇:htop的安装和使用!


下一篇:表格存储(Tablestore)入门指南