阿里Tablestore是基于阿里盘古分布式文件系统的一个处理大数量的一个产品。可以将TableStore的架构简单理解为Lucene+ BigTable。BigTable解决大数据存储的问题,Lucene解决搜索和排序的问题。
Bigtable分布式数据存储系统是Google为其内部海量的结构化数据开发的云存储技术,是Google的第三项云计算关键技术,是所有云时代分布式存储系统的开发蓝本,已经在超过60个Google的产品和项目上得到了应用。
如果使用主键进行分区。那么不要使用连续的标识,这样会形成数据热点。会造成热点的业务主键,身份证号【是一种区域性比较强的数据】
高可用的存储引擎
- 存储。Tablestore没有Schema,与mongo中的NoSQL数据库类似,是一个泛KV结构的记录
- 索引。单就索引能力上看,多元索引可以覆盖二级索引的所有能力。二级索引在响应时间上比多元索引短。如果二级索引超过3个,就可以考虑多元索引。
- 多元索引。基于Lucene,支持Lucene索引的所有能力。
- 二组索引。基于内存中的KV结构进行查询,只支持相等匹配。类似于Mysql的索引,并且按索引中字段顺序,按最左匹配原则进行匹配,譬如二级索引 a,b,c,d四个字段,使用a,b字段是可以命中索引,使用a,b,d字段就不能命中索引。
常见问题及解决方案:
- 一个字段的不同记录中存放了不同的数据类型,使用多元索引时无法命中。
原因:
Tablestore是泛KV结构,无Schema。一条记录中某个字段没有值,在这条记录中就没有这个字段。但索引是强Schema的,如果Tablestore记录中字段类型与索引中的字段类型不同,则无法命中。
与索引中字段类型不同的字段值,可以认为是脏数据。
解决办法:
刷数据,让Tablestore中的字段数据类型、索引中的字段数据类型 统一。
- 查询超过千万的数据时超时
解决办法:
基于通道服务,消费Tablestore中的每条数据。
- 写入的数据使用多元索引不能立即查出。
原因:
不使用索引,指定主键是可以查到的。
Tablestore中的数据会先写入泛KV存储结构,然后通过通道服务同步到Lucene,来重建倒排索引,索引完成后,查询API就可以查到。
通道服务同步到Lucene且索引建立完成,需要1s+的时间。
数据对多元索引同见性的默认的时延是10s内 。
可以根据情况对这个值进行优化,最低可到1s-2s。 集群的优点和弱点,因为使用集群提供对外查询服务,所以高可用、高性能。
写入一条数据,要分发到集群中各个节点,就需要花时间。 新写入数据让多元索引可见,最短的耗时是1s~2s ,要达到这个时间,需要额外调优。默认的时延是10s内
解决办法:
其实没有解决办法。
Tablestore的查询速度就是靠这个弱一致性来实现的:写进去的数据,需要索引更新后才能查到,这中间就需要时间。有一个折衷的办法,就是写完成后,实现一个类似自旋锁的机制,每隔一定时间查询一次,如果查到则给请求方返回写入完成。
4、读写的QPS
写的QPS:可以认为没有上限。TableStore的节点可以无限扩展,可以理解为执行写入客户端的带宽永远会低于 TableStore的节点 的扩展能力。
读的QPS:这个没有确定值,因与查询条件紧密相关。正常pageSize 100的情况下,且使用MatchQuery和TermQuery QPS为1万+【默认三副本的配置】 。 嵌套查询和范围查询,是对qps影响较大的操作类型
5、排序和翻页
使用limit和offset翻页
当需要获取的返回结果行数小于50000行时,可以使用limit和offset进行翻页,即limit+offset<=50000,其中limit的最大值为100。
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(new MatchAllQuery());
searchQuery.setLimit(10);
searchQuery.setOffset(0);
如果使用此方式进行翻页时未设置limit和offset,则limit的默认值为10,offset的默认值为0。
6、存在性查询
ExistsQuery也叫NULL查询或者空值查询,一般用于判断稀疏数据中某一行的某一列是否存在。例如查询所有数据中address列不为空的行,与mysql中的 is not null相同的主义。
{
"primaryKeys": [
{
"name": "id",
"type": "INTEGER",
"value": "614"
}
],
"columns": {
"customer_no": [
{
"name": "customer_no",
"type": "STRING",
"value": "A1110605",
"timestamp": 1686707558924
}
],
"create_time_str": [
{
"name": "create_time_str",
"type": "STRING",
"value": "2023-06-14 09:52:38",
"timestamp": 1686707558924
}
],
"create_time": [
{
"name": "create_time",
"type": "INTEGER",
"value": "1686707558758",
"timestamp": 1686707558924
}
]
}
}
要对Nested字段进行列存在性查询(ExistsQuery)时,请使用嵌套类型查询(NestedQuery)进行嵌套。
如果需要查询某一列为空,则ExistsQuery需要和BoolQuery中的mustNotQueries结合使用。
以下情况会认为某一列不存在,以city列为例说明。
city列在多元索引中的数据类型为keyword(或其他基础类型),如果数据表中某行数据不存在city列,则多元索引认为该行数据的city列不存在。
city列在多元索引中的数据类型为keyword(或其他基础类型)数组,如果数据表中某行数据的city列为空数组,即"city" = "[]",则多元索引认为该行数据的city列不存在。
稀疏数据具有以下特点:
1、大部分元素为零:在稀疏数据中,大部分元素都是零,只有少数元素包含有用信息。这使得处理稀疏数据时可以采用各种技术来减少存储空间和计算成本。
2、存在局部性:尽管大多数元素都是零,但这些非零元素通常会聚集在一起,形成局部性结构。例如,在图像文件中,非零像素通常形成连续的区域;在社交网络图中,用户之间的关系也常常呈现出社区结构。这种局部性可以进一步优化稀疏数据处理的效率。
3、数据规模巨大:稀疏数据集通常具有巨大的规模,需要使用高效的算法和数据结构来处理。对于某些应用程序,稀疏数据集可能会达到“超大规模”级别,需要特殊的技术和架构来实现。
4、应用广泛:稀疏数据集在很多领域都有广泛的应用,例如科学计算、金融分析、机器学习、物联网等。选择适当的技术和工具来处理稀疏数据集可以提高效率并实现更好的性能。
总之,稀疏数据具有特殊的结构和规模,需要使用专门的技术和工具来处理。了解这些特点可以帮助我们更好地理解稀疏数据,并选择适当的方法来处理它们。
稀疏数据库是指专门用于存储和处理稀疏数据的数据库。
以下是一些常见的稀疏数据库:
SciDB:一个开源的科学数据库,专门为存储和处理大规模稀疏数组而设计。
Kdb+:一个高性能的时序数据库,专门用于存储和分析时间序列数据,包括稀疏数据。
HBase:一个基于Hadoop的分布式数据库,可以存储和处理稀疏数据。
Cassandra:一个高度可扩展的分布式数据库,支持稀疏数据和复杂的数据结构。
Couchbase:一个面向文档的NoSQL数据库,支持JSON格式的稀疏数据。
MongoDB:一个面向文档的NoSQL数据库,支持JSON格式的稀疏数据和地理空间数据。
总之,稀疏数据库在各个领域都有广泛的应用,包括科学计算、金融分析、机器学习、物联网等。选择适当的稀疏数据库可以使我们更有效地存储和处理稀疏数据,并实现更高效的算法和应用程序。