文章 > TDSQL > TDSQL TCA 分布式实例特点初探--分布表和SQL透传

TDSQL TCA 分布式实例特点初探--分布表和SQL透传

云贝教育 · 2021-08-13 1294 TDSQL
分享 收藏

原创 王坤


第一部分:公有云或私有云TDSQL的连接方法介绍

TDSQL分布式实例通过Proxy接口提供和mysql兼容的连接方式,用户通过IP地址、端口号以及用户名、密码进行连接:

连接示例:mysql -h172.21.32.13 (proxy地址)   -P3306(proxy端口)   -utest (数据库账号)  -p

第二部分:TDSQL分布式实例支持的表类型介绍和应用

a、分布式表:即水平拆分表,也成为“分表”,该表从业务视角是一张完整的逻辑表,但后端根据分表键(shardkey)的HASH值将数据分布到不同的物理节点组(SET)中。

c、广播表:又名小表广播技术,即设置为广播表后,该表的所有操作都将广播到所有物理节点组(set)中,每个set都有该表的全量数据,常用于业务系统关联查询较多,修改较少的小表或配置表等。

在分布式实例中,如果两张表分表键相等,这意味着两张表**相同的分表键对应的行**,存储在相同的物理节点组中。这种场景通常被称为组拆分(groupshard),会极大的提升业务联合查询等语句的处理效率。由于单表默认放置在第一个set上,如果在分布式实例中建立大的单表,则会导致第一个set的负载太大。除非特别需要,在分布式实例中尽量使用分布式表,这也是分布式实例的特点之一。

接下来我们来看下分布式数据库TDSQL所支持的三种类型表的使用方法和注意事项。

简述:普通的分表创建时必须在最后面**指定分表键(shardkey)的值,该值为表中的一个字段名字,会用于后续sql的路由选择。连接到TDSQL分布式实例后,我们创建一个本次操作使用的数据库名为:testdb

mysql>use  testdb;

**建表语句1:**

Query OK, 0 rows affected (0.07 sec)

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

b、广播表的创建

**语句:**

Query OK, 0 rows affected (0.03 sec)

c、传统普通表

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

注意事项:

2、分布式表shardkey字段的值不包含中文, 否则proxy会转换字符集可能会出错。另外SQL语法上如:shardkey=a 一般放在SQL语句最后来写。

为了更好的发挥分布式架构的优势,在进行SQL操作时和传统数据库还是有部分差异。接下来我们从数据库的插入,更新,删除方面分别来看有哪些注意事项。

**插入语句1:**

Query OK, 1 row affected (0.00 sec)

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

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

注意:语句2报错的原因insert时字段需要包含shardkey,否则会拒绝执行该sql,因为Proxy不知道该sql发往哪个后端分片节点。

更新语句1:

Query OK, 1 row affected (0.00 sec)

MySQL testdb> update fbs set b=2000 ;

删除操作:

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

1、出于数据操作安全上和减少人为误操作导致数据丢失情况的出现,TDSQL禁止update 无 where 条件的更新动作。

3、同样的update操作时尽量避免更新shardkey字段,因为影响Proxy中的路由更新,会导致错误。

第三部分:TDSQL分布式实例SQL透传功能(指定节点访问)

1、TDSQL透传功能介绍

使用透传功能,我们需要重新连接登录TDSQL分布式实例时指定 **- c选项**。普通登录方式,不支持指定节点执行SQL的透传功能。

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

首先我们重新登陆TDSQL分布式实例: mysql    -h172.21.32.13   -utest    -P3306    -p     -c

a、查看分布式实例set节点

MySQL testdb> /*proxy*/show status ;

| status_name                 | value                                                             |

| cluster                     | group_1605181791_302290                                           |

| set_1605181898_1:hash_range | 0---31                                                            |

| set_1605181972_3:hash_range | 32---63                                                           |

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

b、演示数据插入

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');

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

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

| 20 |    2 | bbb  |

| 40 |    4 | dddd |

| 60 |    6 | fff  |

| 80 |    8 | hhhh |

8 rows in set (0.00 sec)

MySQL testdb> /*proxy*/show status;

| status_name                 | value                                                             |

| cluster                     | group_1605181791_302290                                           |

| set_1605181898_1:hash_range | 0---31                                                            |

| set_1605181972_3:hash_range | 32---63                                                           |

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

查看数据在set_1605181898_1 节点上的分布

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

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

| 30 |    3 | ccc  | set_1605181898_1 |

| 50 |    5 | eee  | set_1605181898_1 |

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

查看数据在set_1605181972_3节点上的分布

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

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

| 60 |    6 | fff  | set_1605181972_3 |

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

d、通过shardkey分片号查看数据

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

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

| 60 |    6 | fff  |

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

支持透传种类和格式:

2、/*sets:set_1名称*/   透传指定节点

4、/*shardkey:10*/ 透传到shardkey分片对应的set

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

暂不支持CREATE TABLE ... SELECT

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

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

暂不支持INSERT ... SELECT

内容总结:

<p style="margin-top: 0px; margin-bottom: 8px; padding: 0px; box-sizing: border-box; list-style: inherit; min-height: 24px; color: rgb(51, 51, 51); font-family: " pingfang="" sc",="" "helvetica="" neue",="" arial,="" "hiragino="" sans="" gb",="" "microsoft="" yahei="" ui",="" yahei",="" simsun,="" sans-serif;="" font-size:="" 14px;="" white-space:="" pre-wrap;="" background-color:="" rgb(255,="" 255,="" 255);"="">本操作主要是面向传统数据库的开发者或者DBA用户,让大家能够初步入手了解分布式数据库的特点。另外分布式数据库在架构上提供了灵活的读写分离模式,在SQL上支持全局的order by, group by, limit操作,支持聚合函数,跨set节点的join、子查询、支持分布式事务,传统数据库所支持的大部分操作在分布式数据库中得到继承。分布式数据库是在传统数据库的基础之上发展起来的,对传统集中式的数据库有较好的兼容性,对SQL语句语法的使用上兼容大部分SQL1999,SQL2003标准,且对SQL的ACID特性都予以支持。分布式数据库在逻辑上是一个独立完整的数据库,但在架构上和物理上采用 多节点分片方式,经过内部算法将数据打散分布来到不同节点存储数据,对前端业务屏蔽后端的复杂架构,并且自身具备数据的最终一致性访问,可用性和分区容灾等特性的数据库。希望本次操作能给大家带来一些对分布式数据库TDSQL的一些认识和收获。


点击加载更多