古詩詞大全網 - 成語用法 - TDSQL TCA 分布式實例特點初探分布表和SQL透傳

TDSQL TCA 分布式實例特點初探分布表和SQL透傳

TDSQL分布式實?通過Proxy接口提供和mysql兼容的連接方式,用戶通過IP地址、端口號以及用戶名、密碼進?連接:

(註意:公有雲TDSQL需要在實例頁面申請公網連接地址)

連接示例:mysql -h172.21.32.13 (proxy地址) -P3306(proxy端口) -utest (數據庫賬號) -p

與普通的mysql連接方法壹致,分布式實?兼容mysql的協議和語法,支持SSL加密等功能。當然,您也可以使用navicat、 jdbc、 odbc、 php、 Python等來連接分布式TDSQL實例。

1、TDSQL分布式實例支持表的類型介紹

a、分布式表: 即水平拆分表,也成為“分表”,該表從業務視角是壹張完整的邏輯表,但後端根據分表鍵(shardkey)的HASH值將數據分布到不同的物理節點組(SET)中。

b、普通表: 又名Noshard表,即無需拆分的表,和傳統集中式數據庫中的表壹致,且沒有做任何特殊處理的表,目前分布式實?將該表默認存放在第壹個物理節點組(set)中。

c、廣播表: 又名小表廣播技術,即設置為廣播表後,該表的所有操作都將廣播到所有物?節點組(set)中,每個set都有該表的全量數據,常用於業務系統關聯查詢較多,修改較少的小表或配置表等。

表類型選用註意事項:

在分布式實例中,如果兩張表分表鍵相等,這意味著兩張表**相同的分表鍵對應的?**,存儲在相同的物?節點組中。這種場景通常被稱為組拆分(groupshard),會極大的提升業務聯合查詢等語句的處理效率。由於單表默認放置在第壹個set上,如果在分布式實例中建立大的單表,則會導致第壹個set的負載太大。除非特別需要,在分布式實例中盡量使用分布式表,這也是分布式實例的特點之壹。

2、TDSQL分布式實例表的創建

接下來我們來看下分布式數據庫TDSQL所支持的三種類型表的使用方法和註意事項。

a、分布式表的使用

簡述:普通的分表創建時必須在最後面**指定分表鍵(shardkey)的值,該值為表中的壹個字段名字,會用於後續sql的路由選擇。連接到TDSQL分布式實例後,我們創建壹個本次操作使用的數據庫名為:testdb

mysql> create database testdb;

mysql>use testdb;

接下來我們創建分布式表,命名以分布式拼音首字母命名

**建表語句1:**

MySQL testdb> create table fbs ( a int, b int, c char(20),primary key (a),unique key u_1(a,c) ) shardkey=a;

Query OK, 0 rows affected (0.07 sec)

**建表語句2:**

MySQL testdb> create table fbs2 ( a int, b int, c char(20), primary key (a,b) ) shardkey=a;

Query OK, 0 rows affected (0.09 sec)

b、廣播表的創建

簡述:支持建小表(廣播表),此時該表在所有set中都是全部數據,這個主要方用於跨set的join操作,同時通過分布式事務保證修改操作的原子性,使得所有set的數據是完全壹致的 。

**語句:**

MySQL testdb> create table gbb(a int,b int key) **shardkey=noshardkey_allset;**

Query OK, 0 rows affected (0.03 sec)

c、傳統普通表

簡述:支持建立普通的表,語法和傳統mysql完全壹樣,此時該表的數據全量存在第壹個set節點中,所有該類型的表都放在第壹個set中。

MySQL testdb> create table ptb(a int ,b varchar(10));

Query OK, 0 rows affected (0.03 sec)

註意事項:

1、在分布式實例中,分布式表shardkey對應後端數據庫的分區字段,因此必須是主鍵以及所有唯壹索引的壹部分, 否則可能無法完成建表操作。

2、分布式表shardkey字段的值不包含中文, 否則proxy會轉換字符集可能會出錯。另外SQL語法上如:shardkey=a 壹般放在SQL語句最後來寫。

3、TDSQL分布式實例表的數據操作

為?更好的發揮分布式架構的優勢,在進行SQL操作時和傳統數據庫還是有部分差異。接下來我們從數據庫的插入,更新,刪除方面分別來看有哪些註意事項。

======INSERT插入操作=======

**插入語句1:**

MySQL testdb> insert into fbs(a,b) values(10,1000);

Query OK, 1 row affected (0.00 sec)

**插入語句2:**

MySQL testdb> insert into fbs values(1,10,1000);

MySQL testdb> insert into test1 (b,c) values(100,"record3");

ERROR 810 (HY000): Proxy ERROR:sql is too complex,need to send to only noshard table.Shard table insert must has field spec

註意:語句2報錯的原因insert時字段需要包含shardkey,否則會拒絕執行該sql,因為Proxy不知道該sql發往哪個後端分片節點。

=====UPDATE、DELETE更新、刪除操作=====

更新語句1:

MySQL testdb> update fbs set b=2000 where a=10;

Query OK, 1 row affected (0.00 sec)

更新語句2:

MySQL testdb> update fbs set b=2000 ;

ERROR 658 (HY000): Proxy ERROR: Join internal error: update query has no where clause

刪除操作:

MySQL testdb> delete from fbs;

ERROR 913 (HY000): Proxy ERROR:Join internal error: delete query has no where clause

註意事項:

1、出於數據操作安全上和減少人為誤操作導致數據丟失情況的出現,TDSQL禁止update 無 where 條件的更新動作。

2、同樣的delete操作無where條件也會被禁止執行,如果確認要刪除表數據或表,建議備份後用truncate或drop方式操作。

3、同樣的update操作時盡量避免更新shardkey字段,因為影響Proxy中的路由更新,會導致錯誤。

1、TDSQL透傳功能介紹

對於分布式實例,會對SQL進行語法解析,有壹定的限制,如果用戶想在某個set中獲取單個節點數據,或在指定節點執行SQL,可以使用TDSQL的透傳SQL的功能。

使用透傳功能,我們需要重新連接登錄TDSQL分布式實例時指定 **- c選項**。普通登錄方式,不支持指定節點執行SQL的透傳功能。

登錄如下:

mysql -h172.21.32.13 (proxy地址) -utest -P3306 -p -c(透傳必須指定-c)

2、TDSQL透傳操作演示

首先我們重新登陸TDSQL分布式實例: mysql -h172.21.32.13 -utest -P3306 -p -c

仍舊切換使用testdb數據庫。

a、查看分布式實例set節點

使用/*proxy*/show status 查看當前的TDSQL分布式實例的節點信息,***有兩個set ,分別為set_1605181898_1、set_1605181972_3

MySQL testdb> /*proxy*/show status ;

+-----------------------------+-------------------------------------------------------------------+

| status_name | value |

+-----------------------------+-------------------------------------------------------------------+

| cluster | group_1605181791_302290 |

| **set_1605181898_1:ip | 10.53.179.14:4322;s1@10.53.178.227:4322@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181898_1:hash_range | 0---31 |

| **set_1605181972_3:ip | 10.53.179.14:4323;s1@10.53.178.227:4323@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181972_3:hash_range | 32---63 |

| set | set_1605181898_1,set_1605181972_3 |

+-----------------------------+-------------------------------------------------------------------+

6 rows in set (0.00 sec)

b、演示數據插入

我們針對之前創建的fbs分布式表進行數據的插入

MySQL testdb> insert into fbs(a,b,c) values(10,1,'AAA'),(20,2,'bbb'),(30,3,'ccc'),(40,4,'dddd'),(50,5,'eee'),(60,6,'fff'),(70,7,'ggg'),(80,8,'hhhh');

MySQL testdb> select * from fbs order by 1;

+----+------+------+

| a | b | c |

+----+------+------+

| 10 | 1 | AAA |

| 20 | 2 | bbb |

| 30 | 3 | ccc |

| 40 | 4 | dddd |

| 50 | 5 | eee |

| 60 | 6 | fff |

| 70 | 7 | ggg |

| 80 | 8 | hhhh |

+----+------+------+

8 rows in set (0.00 sec)

c、透傳查看數據在各個節點的分布情況

MySQL testdb> /*proxy*/show status;

+-----------------------------+-------------------------------------------------------------------+

| status_name | value |

+-----------------------------+-------------------------------------------------------------------+

| cluster | group_1605181791_302290 |

| **set_1605181898_1:ip | 10.53.179.14:4322;s1@10.53.178.227:4322@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181898_1:hash_range | 0---31 |

| set_1605181972_3:ip | 10.53.179.14:4323;s1@10.53.178.227:4323@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181972_3:hash_range | 32---63 |

| set | set_1605181898_1,set_1605181972_3 |

+-----------------------------+-------------------------------------------------------------------+

6 rows in set (0.00 sec)

查看數據在set_1605181898_1 節點上的分布

MySQL testdb> /*sets:set_1605181898_1*/select * from fbs order by 1;

+----+------+------+------------------+

| a | b | c | info |

+----+------+------+------------------+

| 10 | 1 | AAA | set_1605181898_1 |

| 30 | 3 | ccc | set_1605181898_1 |

| 40 | 4 | dddd | set_1605181898_1 |

| 50 | 5 | eee | set_1605181898_1 |

| 80 | 8 | hhhh | set_1605181898_1 |

+----+------+------+------------------+

5 rows in set (0.00 sec)

查看數據在set_1605181972_3節點上的分布

MySQL testdb> /*sets:set_1605181972_3*/select * from fbs order by 1;

+----+------+------+------------------+

| a | b | c | info |

+----+------+------+------------------+

| 20 | 2 | bbb | set_1605181972_3 |

| 60 | 6 | fff | set_1605181972_3 |

| 70 | 7 | ggg | set_1605181972_3 |

+----+------+------+------------------+

3 rows in set (0.00 sec)

d、通過shardkey分片號查看數據

MySQL testdb> /*shardkey:2*/select * from fbs order by 1;

+----+------+------+

| a | b | c |

+----+------+------+

| 20 | 2 | bbb |

| 60 | 6 | fff |

| 70 | 7 | ggg |

+----+------+------+

3 rows in set (0.00 sec)

支持透傳種類和格式:

1、set名字可以通過/*proxy*/show status查詢

2、/*sets:set_1名稱*/ 透傳指定節點

3、/*sets:allsets*/ 透傳所有節點

4、/*shardkey:10*/ 透傳到shardkey分片對應的set

5、支持透傳sql到對應的壹個或者多個set

分布式表的DDL部分的語句限制:

暫不支持CREATE TABLE ... LIKE

暫不支持CREATE TABLE ... SELECT

暫不支持CREATE TEMPORARY TABLE

暫不支持CREATE/DROP/ALTER SERVER/LOGFILE GROUP/

暫不支持ALTER對分表鍵(shardkey)進行重命名,不過可以修改類型

分布式表的DML部分的語句限制:

暫不支持SELECT INTO OUTFILE/INTO DUMPFILE/INTO LOAD DATA導出

暫不支持INSERT ... SELECT

暫不支持UPDATE 分布式shardkey列的值

本操作主要是面向傳統數據庫的開發者或者DBA用戶,讓大家能夠初步入手了解分布式數據庫的特點。另外分布式數據庫在架構上提供了靈活的讀寫分離模式,在SQL上支持全局的order by, group by, limit操作,支持聚合函數,跨set節點的join、子查詢、支持分布式事務,傳統數據庫所支持的大部分操作在分布式數據庫中得到繼承。分布式數據庫是在傳統數據庫的基礎之上發展起來的,對傳統集中式的數據庫有較好的兼容性,對SQL語句語法的使用上兼容大部分SQL1999,SQL2003標準,且對SQL的ACID特性都予以支持。分布式數據庫在邏輯上是壹個獨立完整的數據庫,但在架構上和物理上采用 多節點分片方式,經過內部算法將數據打散分布來到不同節點存儲數據,對前端業務屏蔽後端的復雜架構,並且自身具備數據的最終壹致性訪問,可用性和分區容災等特性的數據庫。希望本次操作能給大家帶來壹些對分布式數據庫TDSQL的壹些認識和收獲。

*禁止轉載,可轉發(轉發文章請註明出處)

TDPub企業級分布式關系數據庫