【TcaplusDB知識庫】什麼是TcaplusDB資料庫?

zmgogo發表於2021-11-22


TcaplusDB與MongoDB術語對比

SQL術語/概念 MongoDB術語/概念 TcaplusDB術語/概念 解釋/說明
database database cluster 資料庫
table collection tablegroup/table 資料庫表/集合
row document record 資料記錄行/文件
column field field 資料欄位/域
index index index 索引
primary key primary key primary key "主鍵,MongoDB自動將_id欄位設定為主鍵"

TcaplusDB表由主鍵欄位和非主鍵欄位兩部分組成,主鍵欄位最多可以指定8個,普通欄位(非普通欄位)最多可以指定256個。

img

按照表定義可分為Protobuf表和TDR表,按照表結構可以分為Generic表和List表。

Protobuf表定義

TDR表定義

Generic表和List表

分表因子

Tcaplus的表定義要求設定一個分表因子(splittablekey)屬性,分表因子必須是主鍵欄位(primarykey)的子集。本質上,splittablekey所包含的欄位將參與hash計算,然後根據hash值決定該記錄被儲存至叢集中的哪個節點。因此,一個表的多個記錄,它們splittablekey欄位的值應該是多樣化的,這樣資料分佈才比較均衡。舉例來說,假設一個表的primarykey是"uid,role_id,zone_id",其中uid和role_id的值足夠多樣,而zone_id只有幾個、最多幾百個不同的值,那麼使用zone_id作為splittablekey將會有很大的風險,若某個特定zone_id對應的記錄特別多,會導致Tcaplus特定的儲存節點嚴重過載,甚至資料量超過機器儲存容量而無法提供服務。假設一個表的分表因子是性別,這會導致資料最多分佈到2個儲存節點, 那麼業務的分散式能力就會被限制到最多2個儲存節點的效能上。

分表因子決定了資料的物理分佈(系統根據該欄位做hash分散到不同節點),建議取離散度高的欄位,利於負載均衡。不指定時預設取primarykey的所有欄位。

記錄

TcaplusDB記錄由一行字串組成每個欄位的數字都支援巢狀型別,巢狀最多32層。單個記錄大小最高10MB,可以將常用的物件檔案序列化成二進位制檔案儲存。

img

索引

TcaplusDB支援兩種形式的索引:本地索引和全域性索引。

  • 本地索引:基於TcaplusDB主鍵欄位建立的索引,在建表時隨表一起建立。

  • 全域性索引:基於TcaplusDB表一級欄位(包括主鍵欄位和非主鍵欄位)建立的索引。

通過本地索引和全域性索引,使用者可方便利用索引進行資料查詢。優勢:

  • 基於本地索引查詢,可以滿足使用者通過部分主鍵欄位進行索引查詢

  • 基於全域性索引,可以滿足使用者通過任意一級欄位進行多種形式查詢,如範圍、模糊、聚合、分頁等。

img

本地索引

基於TcaplusDB主鍵欄位建立的索引,在建表時隨表一起建立。

建立

本地索引是在建立表的時候,在表定義中申明的,比如proto或者xml檔案中。並且一旦表建立後,就不能再增加、修改和刪除本地索引了,刪除表的時候,本地索引會一併刪除。

查詢

本地索引只支援等值查詢,也就說,使用本地索引查詢時,需要將本地索引中定義的欄位全部都給值,比如定義了本地索引,包含欄位為key1, key2,那麼使用該索引進行查詢時,就必須把key1和key2的值給出來才可以,並且是key1=XXX and key2=XXX的方式進行查詢;

在tcaplus中,對應的是GetByPartKey請求,只有該請求是利用本地索引進行查詢的;

由於本地索引查詢時,可能會返回非常多的資料,此時,tcaplus會進行分包返回的,如果業務側收包速度低於tcaplus返回響應包的速度,那麼就可能導致tcaplus出現因為網路快取區滿而丟包的情況,一般建議是使用本地索引查詢時,利用limit和offset的方式來分多次請求資料,特別是當資料量很大時。

特點

  • 本地索引是實時索引,當插入或者刪除資料時,會同時更新索引資料;

  • 本地索引的欄位必須包含在主鍵欄位中,並且欄位中還必須包含分表因子,因此,查詢時最終只會落到一個資料分片上進行查詢;

  • 本地索引只支援等值查詢;

  • 一個表可以建立多個本地索引,查詢時必須包含某一個本地索引的全部欄位;

  • 目前只有generic表支援本地索引;

約束

  • 本地索引一旦建立,無法在使用期間修改、刪除、新增,隨表刪除而刪除。

  • 本地索引只支援精確匹配,即在用本地索引欄位作為查詢條件時,只能精確匹配到具體值,不支援模糊、範圍匹配。

  • 本地索引必須包含分片因子。

  • 本地索引中的欄位都必須屬於主鍵欄位。

  • 對其它非主鍵欄位建立本地索引也是不允許的。

注意事項

假設本地索引包含的欄位為key1, key2,如果出現key1=XXX and key2=XXX的記錄數非常多時,當進行這個條件的本地索引查詢時,就很容易出現效能問題,需要儘量避免,當然,目前tcaplus是沒有限制記錄數個數的。

全域性索引

全域性索引是基於TcaplusDB表一級欄位(包括主鍵欄位和非主鍵欄位)建立的索引,顧名思義,就是tcaplus與索引系統之間是相互獨立的,通過非同步同步的方式,將tcaplus中的資料同步到索引系統,因此,全域性索引是一個準實時索引系統,即進行索引查詢時,tcaplus表中新更新的資料無法實時查詢出來,正常情況下,新更新的資料到能夠通過索引查詢出來的時延為秒級,大部分情況是1秒之內;

全域性索引目前只支援對generic表建立索引,並且只支援表的一級欄位(包括key欄位和value欄位)建立索引;並且也只支援簡單型別建立索引,支援的型別包括:int8, uint8, int16, uint16, int32, uint32, int64, uint64, float, double, string(字串); 對於pb表的bool和enum型別也支援,當pb表欄位定義為string型別,如果該欄位儲存的是二進位制,那麼查詢結果可能會不符合預期;對於uint64型別,如果值大於int64的最大值,查詢結果將不符合預期,因此,如果該欄位值會超過int64的最大值,建議不要為該欄位建立索引;

tcaplus支援動態建立和修改索引,業務可以隨時增加或刪除或者修改全域性索引,修改全域性索引時,比如增加了一個索引欄位,不會影響業務對修改前的全域性索引查詢;

tcaplus與全域性索引之間的架構如下圖所示:

img

建立

建立或者修改全域性索引,需要在頁面上進行申請,進入oms頁面,點選 “業務管理” ---- > "表管理" ---- > 選擇要建立全域性索引的表,拉到最右側,如下圖:

img

點選 “索引”,進入到索引配置頁面,在該頁面勾上要建立索引的欄位,然後點選“確認建立索引”按鈕,這樣就生成了建立全域性索引的申請單,dba稽核之後,會生成一個建立全域性索引的事務,當事務執行成功後,該索引就可以被訪問了。

資料同步

資料同步,是指tcaplus資料同步到索引系統,兩者之間的資料是最終一致的,資料同步架構如下圖所示:

img

查詢

tcaplus提供sql查詢語句進行索引查詢,其中,sql查詢條件中的欄位必須是建立了全域性索引的欄位,另外,如果是聚合查詢,那麼聚合查詢的欄位也必須是建立了全域性索引的欄位;

一個索引查詢請求,當前限制最多返回3000條記錄;

img

索引使用方式

  • tcaplus_client客戶端工具

tcaplus_client工具支援全域性索引查詢,查詢命令直接使用sql查詢語句進行查詢即可,使用help select 命令可以獲取相關查詢命令。注意tcaplusdb_client使用版本,目前最新的支援3.46.0。

  • C++ SDK

C++ SDK 已整合相關全域性索引API,在示例程式碼中也有相關實現,具體請參考:

C++ TDR SDK 全域性二索引示例路徑

TcaplusServiceApiXXX/release/x86_64/examples/tcaplus/C++_tdr1.0_syncmode_generic_simpletable/SingleOperation/globle_index_query

C++ PB SDK全域性索引示例路徑

TcaplusPbApiXXX/release/x86_64/examples/tcaplus/C++_pb2_coroutine_simpletable/SingleOperation/global_index_query

支援的sql語句

  1. 條件查詢

支援 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:


select 
* 
from 
table 
where a 
> 
100 
and b 
< 
1000
;


select * from table where a between 1 and 100 and b < 1000 ;

select * from table where str like "test" ;

select * from table where a > 100 or b < 1000 ;

注意:between查詢時,between a and b,對應的查詢範圍為[a, b],比如 between 1 and 100, 是會包含1和100這兩個值的,即查詢範圍為[1,100]

注意:like查詢是支援模糊匹配,其中"%"萬用字元,匹配0個或者多個字元; “_”萬用字元,匹配1個字元;

  1. 分頁查詢

支援limit offset分頁查詢,比如:

select * from table whre a > 100 limit 100 offset 0;

注意:當前limit必須與offset搭配使用,即不支援limit 1 或者 limit 0,1這種;

  1. 聚合查詢

當前支援的聚合查詢包括:sum, count, max, min, avg,比如:

select sum(a), count(*), max(a), min(a), avg(a) from table where a > 1000;

注意:聚合查詢不支援limit offset,即limit offset 不生效;

注意:目前只有count支援distinct,即 select count(distinct(a)) from table where a > 1000; 其他情況均不支援distinct

  1. 部分欄位查詢

支援查詢部分欄位的值,比如:

select a, b from table where a > 1000;

對於pb表,還支援查詢巢狀欄位的值,類似:

select field1.field2.field3, a, b from table where a > 1000;

不支援的sql查詢語句

  1. 不支援聚合查詢與非聚合查詢混用


select 
*
, a
, b 
from 
table 
where a 
> 
1000
;


select sum (a ) , a , b from table where a   > 1000 ;

select count ( * ) , * from table where a   > 1000 ;
  1. 不支援order by查詢

select * from table where a > 1000 order by a;
  1. 不支援group by查詢

select * from table where a > 1000 group by a;

  1. 不支援having查詢

select sum(a) from table where  a > 1000 group by a having sum(a) > 10000;
  1. 不支援多表聯合查詢

select * from table1 where table1.a > 1000 and table1.a = table2.b;
  1. 不支援巢狀select查詢

select * from table where a > 1000 and b in (select b from table where b < 5000);
  1. 不支援別名

select sum(a) as sum_a from table where a > 1000;
  1. 不支援的其他查詢

  • 不支援join查詢;

  • 不支援union查詢;

  • 不支援類似 select a+b from table where a > 1000 的查詢;

  • 不支援類似 select * from table where a+b > 1000 的查詢;

  • 不支援類似 select * from table where a >= b 的查詢;

  • 不支援其他未提到的查詢。


img

TcaplusDB是騰訊出品的分散式NoSQL資料庫,儲存和排程的程式碼完全自研。具備快取+落地融合架構、PB級儲存、毫秒級時延、無損水平擴充套件和複雜資料結構等特性。同時具備豐富的生態、便捷的遷移、極低的運維成本和五個九高可用等特點。客戶覆蓋遊戲、網際網路、政務、金融、製造和物聯網等領域。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982264/viewspace-2843480/,如需轉載,請註明出處,否則將追究法律責任。

相關文章