概要
大数据早已经成为一项专门的领域。本人多年前也遇到过数据量巨大的项目,使用单mysql表读写性能非常的差,后来经过调研,使用了hbase存储加上spark计算的方式,存储效率和计算效率都得以巨大的提升,效果可以说是非常的好的。不过回头来看,这样的做法也存在一些弊端,主要有两个。一是前期的学习成本非常高,做后端研发的人几乎人人都会sql,但是hbase是一个nosql的数据库,接触过的人不多。Spark是一门scala开发的并行计算框架,主流使用scala和java语言开发。也就是使用该方案需要前期的学习周期很长。二是运维成本也较大,hbase底层使用hdfs进行数据存储,spark也是基于内存的并行计算框架,对资源的消耗都是巨大的。另外能运维好这些工具也是有成本的。
那么对于无限增长的数据,有什么简单又可靠的存储方式么?本文介绍一种基于meta表的两级存储模式。
架构图
描述
Meta table中存储的是bucket,内部是key value对。Data table是真实存储的数据表。Meta table其实只是存储一个对应关系,不会存储数据,因此它是可扩展的。Meta table中Value是表示真实数据存储的data table的地址。key的设计可以简单分为两种情况。一是很多互联网产品都是基于城市维度进行的开城,每个城市的数据量都不至于太大,可以单表存储。因此使用cityid作为meta table的key。二是类似于电商中的产品,不能简单由一个维度进行划分的,这时可以使用hash(uid)的方式,将一个用户的数据固定存放在一张mysql表中。设计表初期,也需要考虑数据增长的问题,当数据量增长过快时,可以将部分bucket中的映射关系改到新增的表中,然后再对原有的数据进行迁移。