# teledb-udal实践分享

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: 解决方案
> 标签: 数据库, 安全, 前端
> 原文链接: http://117.50.162.249:3000/yun/articles/742

---

# teledb-udal实践分享

> 来源: https://www.ucloud.cn/yun/130162.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

teledb-udal实践分享

udal简单概述

分布式数据库由数据存储和数据访问构成：数据存储基于开源关系型数据库MariaDB改造，提供高可靠的数据存储能力。数据访问基于开源数据库中间件Cobar改造，屏蔽数据库分库分表带来的访问难题。这里所指的分布式数据库由统一数据访问层(TeleUDAL)及数据高可用(TeleDB)两部分组成。统一数据访问层(TeleUDAL)：借鉴多种分布式数据库访问模式，基于MySQL开源协议，采用数据库代理方式，形成分布式数据库中间件解决方案，解决分布式系统数据库分库分表带来的数据透明访问难题。数据高可用(TeleDB)：基于开源MariaDB数据库，自主研发，为客户提供高性能、高可用的数据库集群系统。

**udal特性**

1、无限扩容

自动水平拆分

支持多种分片算法

支持字符串，数字，日期等多种拆分纬度

业务不中断平滑扩容

2、弹性扩展

应用透明读写分离，应用零代码改动

平滑扩展，业务不中断

3、性能卓越

分布式服务架构，对比单机数据库服务能力线性提升

优化SQl解析引擎，效率成倍提升

支持切片索引，减少广播查询

全局表同步功能，分布式JOIN效率成倍提升

单机平均性能：~11w TPS（4路8核，512GB内存，万兆网卡）

4、简单易用

全面兼容MYSQL协议、语法

兼容大部分MYSQL客户端

提供WEB控制台，数据库操作简单

一键实现数据库扩容（分片数不变）

业务零代码改动，实现读写分离

5、安全稳定

完善的数据层主备容灾方案，保证数据安全

分布式架构无服务单点,服务稳定

完善的运维管控报警体系

6、低成本

使用廉价X86主机

使用廉价存储

开源软件+自研结合

架构原理

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_000.png)

**从上面的架构图可看出，UDAL主要的构成如下：**

**LVS:**为DBProxy提供服务注册发现及负载均衡功能，应用发送的请求通过LVS均衡分布到各个DBProxy上。

**DBProxy：**UDAL的核心组件，是一个实现了mysql协议的Sever进程，前端用户可以把DBProxy看成数据库代理，可用mysql客户端工具或命令行方式直接访问，其后端以mysql原生协议与多个mysql数据库进行通信，也可以用jdbc协议与大多数主流数据库服务器通信，DBProxy的核心功能是分库分表并对应用层屏蔽分库分表带来的访问难题。

**GiServer：**切片索引服务进程，是为了提升非分片键查询（select语句）时的效率（避免广播查询）而开发的，与数据库的索引没有任何关系，是完全不同的两个概念，GiServer是切片索引数据的生产者，真正的消费者是DBProxy进程，假设客户表是以cust\_id进行分表的，但应用需要通过客户身份证来查询客户信息，如果没有切片索引，则DBProxy会将查询语句广播到所有节点执行，接收到执行结果进行汇聚后再返回给应用，如果建立了切片索引，则DBProxy首先会根据身份证号码从切片索引中查询到对应的cust\_id，再根据分片算法定位到cust\_id对应的分片，这样就避免了广播查询。

**配套功能：**包括功能测试、性能测试、持续集成、监控、发布、配置、运维等功能，这些配套功能都将通过管理平台（UDAL\_ADMIN）进行管理。

**外部组件：**UDAL依赖的外部组件主要有zookeeper及分布式缓存，zookeeper用于存放DBProxy、GiServer的配置信息及全局序列数据，分布式缓存用于存放切片索引数据。

udal简单原理

1、读写分离

对于sql进行类型判定，如果判定为读取操作，则按照用户设置的读权重进行sql路由，到主实例或者到只读上进行sql操作。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_001.png)

**dbproxy使用以下两种方式开启读写分离功能:**

1、配置dbproxybalance参数.

2、在select语句前增加/\*!HINT({"balance":"?"})\*/注解

**属性配置**

在管理平台依次点击以下按钮即可打开相应数据库的读写分离属性配置窗口:

即可打开设置属性窗口设置balance参数:

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_002.png)

balance参数可选值为01 2，分别对应页面上”关闭”,“读语句发往读库”,“读语句随机发往读库和写库”个选项:

balance= 0 不开启读写分离,所有语句发往写节点.

balance= 1 开启读写分离,所有事务外(autocommit=1)的select语句发往读节点;所有事务内(autocommit=0)的语句发往写节点.

balance= 2 开启读写分离,所有事务外(autocommit=1)的select语句随机发往读节点或写节点;所有事务内(autocommit=0)的语句发往写节点.

**/\* !HINT({"balance":"?"})\*/ 语句**

使用/\*!HINT({"balance":"?"})\*/注解可以强制指定select语句按照指定规则进行读写分离，balance有三种取值方式,与dbproxy的balance属性类似:

/\*!HINT({"balance":"0"})\*/ 强制select语句发往写节点

/\*!HINT({"balance":"1"})\*/ 强制select语句发往读节点

/\*!HINT({"balance":"2"})\*/ 强制select语句随机发往数据库读节点或写节点

**注意**

insert,update, delete语句在任何情况下都将发往写节点，所以读写分离实际只针对select语句。

/\*!HINT({"balance":"?"})\*/的读写分离规则优先级高于配置balance属性。

配置balance属性进行读写分离需结合autocommit=1使用，而/\*!HINT({"balance":"?"})\*/方式不需要。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_003.png)

**2、水平拆分**

分片键（拆分字段）

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_004.png)

**3、数据分布**

UDAL中的数据是按照拆分字段值，加上特定的算法进行计算，根据结果存储数据到对应分片。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_005.png)

**4、Sql路由**

当用户SQL到UDAL时，UDAL会理解整个SQL含义，然后按照拆分字段的值和执行策略将SQL路由到对应分区进行执行。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_006.png)

**5、数据汇聚**

如果一个SQL对应多个分片数据执行，UDAL会将各个分片返回的数据按照原始SQL语义进行合并。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130162/images/130162_007.png)