前言
本章节主要讲解表格存储Tablestore的实例、表的创建步骤和共享充电宝场景的数据表设计。
表设计
表功能设计
这里按照功能需求分为三张数据表:元数据表、订单数据表、元数据时序表
- 元数据表
元数据表保存了机柜的最新状态数据。用户租借、归还充电宝,以及运维人员上下线机柜,都会更新元数据表记录。在元数据表上建立索引,可提供多维查询的能力。对元数据表按照字段进行聚合分析,可获取到机柜损坏比、充电宝租赁比等数据。
- 订单数据表
订单数据表保存了充电宝租借订单信息。用户租借、归还充电宝会更新订单数据表记录。通过对订单数据表进行流批计算,可以实时获取到营业额报表数据。也可以在订单数据表上建立索引,实现按照订单号、订单日期等字段搜索的功能。
- 元数据时序表
元数据时许表保存每个时间点上的元数据信息。例如一小时上报一次机柜元数据信息,那么元数据时序表上就会有多份元数据的冗余。通过分析元数据时序表可获取不同时间维度上的机柜状态,例如可统计一天内每个时间段的机柜租赁比。上报的间隔越频繁,可以获取到的时间粒度越细。
表结构设计
在介绍表结构之前,有必要带大家了解一下表格存储Tablestore数据表模型。
宽表模型
宽表模型(Wide column)是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) | 机柜充电宝租赁时价(元) |
以上就是共享充电宝场景所需要用到的表结构了。下面将带大家了解表格存储服务开通、实例创建、表创建等操作步骤。
开通表格存储服务
- 登陆阿里云官网表格存储产品页,点击立即开通。若已开通表格存储服务,请跳过此步骤。
创建实例
- 登录表格存储产品页,点击管理控制台。
说明:可在实例列表页面上方点击试用新版控制台按钮,切换到新版本控制台
- 选择对应的地域,点击创建实例。创建按量模式实例。
说明:实例创建完毕后,会有一段初始化时间,请等待初始化完毕后再进入实例。更多关于实例概念的介绍请参考官网文档实例。
创建表
可以通过表格存储控制台、CLI客户端工具、SDK代码三种方式创建表。
-
表格存储控制台创建
- 点击创建数据表。
- 填写表主键信息。
说明:Tablestore表是Schema-free的,所以不需要指定属性列的字段名和字段类型,通过数据添加接口插入数据即可。
-
Cli客户端工具创建
- 进入表格存储官网,根据操作系统类型下载对应的CLI客户端工具。
- 输入配置实例接入信息命令 config --endpoint endpoint --instance instance --id id --key key
- 输入创建数据表命令 create -t tablename --pk pks --ttl ttl --version version
说明:更多关于CLI客户端工具的用法请参考文档CLI客户端工具。
- SDK代码创建
SDK代码创建数据表请参考文档创建数据表。
小结
本章节主要介绍了共享充电宝场景的表结构设计,以及表格存储Tablestore的宽表特性。在设计Tablestore数据表的过程中,分区键设计是至为重要的一环,设置合理的分区键可避免数据写入热点,提升读写性能。下一章节将模拟机柜元数据,展示海量数据的读写操作与性能,以及利用多元索引实现共享充电宝场景下的多维查询能力。
联系我们
如对本章节所述有疑问或有其他问题需要咨询,欢迎加入钉钉群:“表格存储公开交流群-2”。群内提供免费的在线专家服务,欢迎扫码加入,群号23307953。