阿里Tablestore是基于阿里盤古分布式文件系統(tǒng)的一個(gè)處理大數(shù)量的一個(gè)產(chǎn)品??梢詫ableStore的架構(gòu)簡(jiǎn)單理解為L(zhǎng)ucene+ BigTable。BigTable解決大數(shù)據(jù)存儲(chǔ)的問題,Lucene解決搜索和排序的問題。
Bigtable分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)是Google為其內(nèi)部海量的結(jié)構(gòu)化數(shù)據(jù)開發(fā)的云存儲(chǔ)技術(shù),是Google的第三項(xiàng)云計(jì)算關(guān)鍵技術(shù),是所有云時(shí)代分布式存儲(chǔ)系統(tǒng)的開發(fā)藍(lán)本,已經(jīng)在超過60個(gè)Google的產(chǎn)品和項(xiàng)目上得到了應(yīng)用。

如果使用主鍵進(jìn)行分區(qū)。那么不要使用連續(xù)的標(biāo)識(shí),這樣會(huì)形成數(shù)據(jù)熱點(diǎn)。會(huì)造成熱點(diǎn)的業(yè)務(wù)主鍵,身份證號(hào)【是一種區(qū)域性比較強(qiáng)的數(shù)據(jù)】



高可用的存儲(chǔ)引擎













- 存儲(chǔ)。Tablestore沒有Schema,與mongo中的NoSQL數(shù)據(jù)庫類似,是一個(gè)泛KV結(jié)構(gòu)的記錄
- 索引。單就索引能力上看,多元索引可以覆蓋二級(jí)索引的所有能力。二級(jí)索引在響應(yīng)時(shí)間上比多元索引短。如果二級(jí)索引超過3個(gè),就可以考慮多元索引。
- 多元索引?;贚ucene,支持Lucene索引的所有能力。
- 二組索引。基于內(nèi)存中的KV結(jié)構(gòu)進(jìn)行查詢,只支持相等匹配。類似于Mysql的索引,并且按索引中字段順序,按最左匹配原則進(jìn)行匹配,譬如二級(jí)索引 a,b,c,d四個(gè)字段,使用a,b字段是可以命中索引,使用a,b,d字段就不能命中索引。
常見問題及解決方案:
- 一個(gè)字段的不同記錄中存放了不同的數(shù)據(jù)類型,使用多元索引時(shí)無法命中。
原因:
Tablestore是泛KV結(jié)構(gòu),無Schema。一條記錄中某個(gè)字段沒有值,在這條記錄中就沒有這個(gè)字段。但索引是強(qiáng)Schema的,如果Tablestore記錄中字段類型與索引中的字段類型不同,則無法命中。
與索引中字段類型不同的字段值,可以認(rèn)為是臟數(shù)據(jù)。
解決辦法:
刷數(shù)據(jù),讓Tablestore中的字段數(shù)據(jù)類型、索引中的字段數(shù)據(jù)類型 統(tǒng)一。
- 查詢超過千萬的數(shù)據(jù)時(shí)超時(shí)
解決辦法:
基于通道服務(wù),消費(fèi)Tablestore中的每條數(shù)據(jù)。
- 寫入的數(shù)據(jù)使用多元索引不能立即查出。
原因:
不使用索引,指定主鍵是可以查到的。
Tablestore中的數(shù)據(jù)會(huì)先寫入泛KV存儲(chǔ)結(jié)構(gòu),然后通過通道服務(wù)同步到Lucene,來重建倒排索引,索引完成后,查詢API就可以查到。
通道服務(wù)同步到Lucene且索引建立完成,需要1s+的時(shí)間。
數(shù)據(jù)對(duì)多元索引同見性的默認(rèn)的時(shí)延是10s內(nèi) 。
可以根據(jù)情況對(duì)這個(gè)值進(jìn)行優(yōu)化,最低可到1s-2s。 集群的優(yōu)點(diǎn)和弱點(diǎn),因?yàn)槭褂眉禾峁?duì)外查詢服務(wù),所以高可用、高性能。
寫入一條數(shù)據(jù),要分發(fā)到集群中各個(gè)節(jié)點(diǎn),就需要花時(shí)間。 新寫入數(shù)據(jù)讓多元索引可見,最短的耗時(shí)是1s~2s ,要達(dá)到這個(gè)時(shí)間,需要額外調(diào)優(yōu)。默認(rèn)的時(shí)延是10s內(nèi)
解決辦法:
其實(shí)沒有解決辦法。
Tablestore的查詢速度就是靠這個(gè)弱一致性來實(shí)現(xiàn)的:寫進(jìn)去的數(shù)據(jù),需要索引更新后才能查到,這中間就需要時(shí)間。有一個(gè)折衷的辦法,就是寫完成后,實(shí)現(xiàn)一個(gè)類似自旋鎖的機(jī)制,每隔一定時(shí)間查詢一次,如果查到則給請(qǐng)求方返回寫入完成。
4、讀寫的QPS
寫的QPS:可以認(rèn)為沒有上限。TableStore的節(jié)點(diǎn)可以無限擴(kuò)展,可以理解為執(zhí)行寫入客戶端的帶寬永遠(yuǎn)會(huì)低于 TableStore的節(jié)點(diǎn) 的擴(kuò)展能力。
讀的QPS:這個(gè)沒有確定值,因與查詢條件緊密相關(guān)。正常pageSize 100的情況下,且使用MatchQuery和TermQuery QPS為1萬+【默認(rèn)三副本的配置】 。 嵌套查詢和范圍查詢,是對(duì)qps影響較大的操作類型
5、排序和翻頁
使用limit和offset翻頁
當(dāng)需要獲取的返回結(jié)果行數(shù)小于50000行時(shí),可以使用limit和offset進(jìn)行翻頁,即limit+offset<=50000,其中l(wèi)imit的最大值為100。
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(new MatchAllQuery());
searchQuery.setLimit(10);
searchQuery.setOffset(0);
如果使用此方式進(jìn)行翻頁時(shí)未設(shè)置limit和offset,則limit的默認(rèn)值為10,offset的默認(rèn)值為0。

6、存在性查詢
ExistsQuery也叫NULL查詢或者空值查詢,一般用于判斷稀疏數(shù)據(jù)中某一行的某一列是否存在。例如查詢所有數(shù)據(jù)中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
}
]
}
}
要對(duì)Nested字段進(jìn)行列存在性查詢(ExistsQuery)時(shí),請(qǐng)使用嵌套類型查詢(NestedQuery)進(jìn)行嵌套。
如果需要查詢某一列為空,則ExistsQuery需要和BoolQuery中的mustNotQueries結(jié)合使用。
以下情況會(huì)認(rèn)為某一列不存在,以city列為例說明。
city列在多元索引中的數(shù)據(jù)類型為keyword(或其他基礎(chǔ)類型),如果數(shù)據(jù)表中某行數(shù)據(jù)不存在city列,則多元索引認(rèn)為該行數(shù)據(jù)的city列不存在。
city列在多元索引中的數(shù)據(jù)類型為keyword(或其他基礎(chǔ)類型)數(shù)組,如果數(shù)據(jù)表中某行數(shù)據(jù)的city列為空數(shù)組,即"city" = "[]",則多元索引認(rèn)為該行數(shù)據(jù)的city列不存在。
稀疏數(shù)據(jù)具有以下特點(diǎn):
1、大部分元素為零:在稀疏數(shù)據(jù)中,大部分元素都是零,只有少數(shù)元素包含有用信息。這使得處理稀疏數(shù)據(jù)時(shí)可以采用各種技術(shù)來減少存儲(chǔ)空間和計(jì)算成本。
2、存在局部性:盡管大多數(shù)元素都是零,但這些非零元素通常會(huì)聚集在一起,形成局部性結(jié)構(gòu)。例如,在圖像文件中,非零像素通常形成連續(xù)的區(qū)域;在社交網(wǎng)絡(luò)圖中,用戶之間的關(guān)系也常常呈現(xiàn)出社區(qū)結(jié)構(gòu)。這種局部性可以進(jìn)一步優(yōu)化稀疏數(shù)據(jù)處理的效率。
3、數(shù)據(jù)規(guī)模巨大:稀疏數(shù)據(jù)集通常具有巨大的規(guī)模,需要使用高效的算法和數(shù)據(jù)結(jié)構(gòu)來處理。對(duì)于某些應(yīng)用程序,稀疏數(shù)據(jù)集可能會(huì)達(dá)到“超大規(guī)?!奔?jí)別,需要特殊的技術(shù)和架構(gòu)來實(shí)現(xiàn)。
4、應(yīng)用廣泛:稀疏數(shù)據(jù)集在很多領(lǐng)域都有廣泛的應(yīng)用,例如科學(xué)計(jì)算、金融分析、機(jī)器學(xué)習(xí)、物聯(lián)網(wǎng)等。選擇適當(dāng)?shù)募夹g(shù)和工具來處理稀疏數(shù)據(jù)集可以提高效率并實(shí)現(xiàn)更好的性能。
總之,稀疏數(shù)據(jù)具有特殊的結(jié)構(gòu)和規(guī)模,需要使用專門的技術(shù)和工具來處理。了解這些特點(diǎn)可以幫助我們更好地理解稀疏數(shù)據(jù),并選擇適當(dāng)?shù)姆椒▉硖幚硭鼈儭?
稀疏數(shù)據(jù)庫是指專門用于存儲(chǔ)和處理稀疏數(shù)據(jù)的數(shù)據(jù)庫。
以下是一些常見的稀疏數(shù)據(jù)庫:
SciDB:一個(gè)開源的科學(xué)數(shù)據(jù)庫,專門為存儲(chǔ)和處理大規(guī)模稀疏數(shù)組而設(shè)計(jì)。
Kdb+:一個(gè)高性能的時(shí)序數(shù)據(jù)庫,專門用于存儲(chǔ)和分析時(shí)間序列數(shù)據(jù),包括稀疏數(shù)據(jù)。
HBase:一個(gè)基于Hadoop的分布式數(shù)據(jù)庫,可以存儲(chǔ)和處理稀疏數(shù)據(jù)。
Cassandra:一個(gè)高度可擴(kuò)展的分布式數(shù)據(jù)庫,支持稀疏數(shù)據(jù)和復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
Couchbase:一個(gè)面向文檔的NoSQL數(shù)據(jù)庫,支持JSON格式的稀疏數(shù)據(jù)。
MongoDB:一個(gè)面向文檔的NoSQL數(shù)據(jù)庫,支持JSON格式的稀疏數(shù)據(jù)和地理空間數(shù)據(jù)。
總之,稀疏數(shù)據(jù)庫在各個(gè)領(lǐng)域都有廣泛的應(yīng)用,包括科學(xué)計(jì)算、金融分析、機(jī)器學(xué)習(xí)、物聯(lián)網(wǎng)等。選擇適當(dāng)?shù)南∈钄?shù)據(jù)庫可以使我們更有效地存儲(chǔ)和處理稀疏數(shù)據(jù),并實(shí)現(xiàn)更高效的算法和應(yīng)用程序。