MySQL 分表方案及中间件介绍

article/2025/10/6 7:26:53

背景

什么情况下需要分表?这里归纳了3点:

(1)某个表被操作的频率过于频繁的时候(可以查看某个表的访问频繁),在流量越来越大的时,可以考虑分表。

(2)某个表的数据量过于庞大的时候(我给自己设置的底限是1千万)。

(3)单行数据的某几个字段位高频访问的字段。

水平分表

按哈希切分

通过某个唯一键(如雪花算法生成的值),除以分表数量后取余。比如我分了16个表,在新来数据后,我得到某个唯一值为1。接着,1除以16取余后,得到16,将该数据插入16号表。

缺点:这种方式一般需要预设好分表的数量,如果是需要动态增加分表数量的场景,那就麻烦了,需要将数据重新哈希了。

按时间切分

采取按时间切分的策略,在需要动态增加表数量的场景是比较适合的。比如按月份分表,将当前月的数据放置于同一张表中,然后设置一个定时任务,在下一个月到来之前预先创建好表。

垂直分表

某些场景下,我们的表数据可能不多,但列数据却非常多,我就见过有100多个字段的表设计。而以MySQL为例,页是InnoDB磁盘管理的最小单位,默认大小为16KB。

虽然可以通过参数innodb_page_size来设置

但即使如此,也有可能会引起数据的跨页存储,这会造成数据库额外的性能开销,而垂直分表可以解决这个问题,这是其一。

其二,如果只某几列的数据是操作频繁的,也就是我们说的热点数据,那通过垂直分表,将冷热数据分离,也是一种提高效率的手段。

中间件

在真正的业务实践中,可能更多的人倾向于使用中间件来达到分表的效果。于是总结了一些中间件的的特性,它们大致可以两种模式划分,即CLIENT模式和PROXY模式。

PROXY模式下,相当于把中间件作为一个独立的服务了,它将接收到的SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

CLIENT模式下,中间件在Driver或者连接池的基础之上,增加了一层封装。我们使用时,以Java开发为例,需要先引入一个jar包。中间件接收持久层产生的sql,同样对sql进行分析等操作,然后才落实到具体的库上。

具体的中间件可以归纳为如下两大类:

client模式

TDDL(taobao)

淘宝根据自己的业务特点开发了TDDL(Taobao Distributed Data Layer )框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制。

sharding-jdbc(apache)

据官网描述,定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

zebra(美团点评)

Zebra是一个基于JDBC API协议上开发出的高可用、高性能的数据库访问层解决方案,是美团点评内部使用的数据库访问层中间件。

zdal(支付宝)

Zdal是支付宝自主研发的数据中间件产品,也是采用标准的JDBC规范。Zdal主要提供分库分表,结果集合并,sql解析,数据库failover动态切换等功能,提供互联网金融行业的数据访问层统一解决方案,目前已经在支付宝的交易,支付,会员,金融等大部分关键应用上使用,并且在2013年双11大促中运行稳定。

proxy模式

mysql-proxy

mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。很多中间件都基于它进行了魔改。

cobar(Alibaba)

Cobar 是由 Alibaba 开源的 MySQL 分布式处理中间件,它可以在分布式的环境下看上去像传统数据库一样提供海量数据服务。不过最近的一次维护也是两年前的事了。

mycat

mycat是在cobar基础上研发出来的,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

drds

阿里云分布式关系型数据库服务 Distributed Relational Database Service ,前身是 TDDL。似乎现在又升级了变为PolarDB-X,具体看看他们的文档了。

sharding-sphere

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。

atlas

Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用 Atlas 运行的 MySQL 务,每天承载的读写请求数达几十亿条。

heisenberg

百度的熊照大佬编写的一款基于MySQL协议之上的分库分表中间件服务器,支持各种灵活(velocity脚本自定义)的分库分表规则,做到应用和分库分表相隔离。

Oceanus

58同城数据库中间件,按其官方的描述,致力于打造一个功能简单、可依赖、易于上手、易于扩展、易于集成的解决方案,甚至是平台化系统。文档链接如下:

Vitess

Vitess一直为YouTube所有的数据库提供服务,据其官方描述,它是一款用于部署、扩展和管理大型MySQL实例集群的数据库解决方案。

OneProxy

OneProxy是由原支付宝首席架构师楼方鑫大佬开发,保留了 MySQL-Proxy 0.8.4官方版本上其协议处理和软件框架,然后对软件做了大量优化,极大增强了系统的并发能力。


http://chatgpt.dhexx.cn/article/nTql4b3P.shtml

相关文章

中间件之MYSQL

体系结构 server层 负责建立连接、分析和执行 SQL 连接器:与客户端进行TCP三次握手;校验用户名和密码;读取权限。查询缓存:key-value缓存在mysql8.0后默认将其关闭;高级版本默认采用页缓存。解析器:词法…

mysql优化——mycat数据库中间件

文章目录 目录 文章目录 前言 一、mycat原理 二、mycat完成读写分离 2.1搭建MySQL的主从模式 2.2实现读写分离 三、mycat垂直分库 四、水平分表 五、水平拆分表的连表操作 六、全局表 总结 前言 Mycat是数据库中间件,所谓中间件,是一类连接软件组件和应用的计算机软件,以…

mysql中间件汇总

一、写在前面 mysql作为互联网公司都会用到的数据库,在使用过程中。会用主从复制来提高性能。会用分库分表解决写入问题。以下介绍mysql中间件的一些实现方案 二、Atlas Atlas时 360 公司开发维护的一个基于MySQL协议的数据中间层项目。 2.1 atlas架构 Atlas是一…

makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS

1、LDFLAGS & LIBS 关于makefile的依赖规则以及目标生成的步骤,这篇先不介绍,这里主要关注我在看makefile时遇到的一堆CFLAGS与LDFLAGS定义进行说明。 费了牛劲,才查到GNUmake中文手册中关于CFLAGS与LDFLAGS的说明,他们都是…

Makefile 编译与链接选项及CFLAGS与LDFLAGS说明

CFLAGS与LDFLAGS的说明,他们都是是隐含规则的变量,且是一种命令参数变量. makefile内嵌隐含规则的命令中,所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改:在Makefile中、通…

Go新项目-项目添加版本说明,以及参数传递:ldflags、gcflags,外加stripped说明(5)

在Go项目中,会存在展示该项目的版本信息,以及打包日期,项目版本,Go版本等;继Go新项目-编译项目的细节(4)以后再记录下编译优化方向,刚好也有项目版本输出的需求。 关键词&#xff1…

linux编译参数CPPFLAGS、CFLAGS、LDFLAGS参数的理解

参考到下面博客,把编译步骤分解的很细 linuxC编译参数CPPFLAGS、CFLAGS、LDFLAGS参数的理解 - yongfengnice - 博客园 CPPFLAGS : 预处理器需要的选项 如:-I (大写i指定头文件路径) CFLAGS:编译的时候使用的参数 –Wall –g -c LDFLAGS &…

【Java位运算】异或运算的使用

异或运算有个特性:两个相同的数做异或运算,结果为0。 n ^ n 0;常用的方式是查找数组中只出现一次的数字。 例如:在一个数组中,只有一个数字出现了一次,其余数字都出现了两次。 求这个数字。利用异或运算的特性进行计…

java中与运算,或运算,异或运算

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^) 位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻…

Java中的与、或、非以及异或( | ~ ^)运算符的运算原理

首先,我们要知道Java存储数据是保存的补码,如果对原码、反码以及补码不太懂,可以参考我的另一篇博客。 1. Java的 与( & ) 运算 所有的逻辑运算都是按位计算的,所以第一步就是先把数据转成二进制,然后相应位进行…

java运算符 与()、非(~)、或(|)、异或(^)

欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符&…

java中的异或非运算

一、java 与或非 操作 与(&)、非(~)、或(|)、异或(^) 1.与运算符 与运算符用符号“&”表示,其使用规律如下: 两个操作数中位都为1&#x…

java运算符异或(^)的用法

Java中的位运算符中有一个叫做异或的运算符,符号为(^),其主要是对两个操作数进行位的异或运算,相同取0,相反取1。即两操作数相同时,互相抵消。 试例:13 与15 两个整数的异或 public static void…

一文搞懂 位运算 异或(Java实现)

提起异或想必很多小伙伴们既熟悉又陌生,熟悉是因为好像在离散数学或者学某个编程语言 时听过这个东西,而陌生呢,则是因为自己平时并没有用过,以至于当在某个场景 (我猜是在看 题解或者某篇博客时) 看到这…

java中异或运算的应用

java中异或运算(^)的应用 异或运算法则 1. a ^ b b ^ a   2. a ^ b ^ c a ^ (b ^ c) (a ^ b) ^ c;   3. d a ^ b ^ c 可以推出 a d ^ b ^ c.   4. a ^ b ^ a b. 异或运算 1、异或是一个数学运算符。应用于逻辑运算。   2、例如:真异或假的结果是…

java的异或运算

一、题目 输入两个数,交换后输出 二、解题思路 一开始学习的语言是c语言,里面非常有特色的是指针,通过传引用可以直接交换两个数。但java无法达成这种操作,翻阅资料找到了一种有趣的解法:异或! 异或原理: …

java基础-异或运算

小伙伴们,你们好呀!我是老寇! 异或运算主要用于判断两个值是否一样 异或运算的3个性质: 1.任何数和0进行异或运算,结果是原来的数,即b⊕0b 2.任何数和其自身进行异或运算,结果为0,即…

Java中的异或运算符^

Testpublic void test2() {int a2;int b3;aa^b;ba^b;aa^b;System.out.println("a"a",b"b);}第一种:用真实值计算 ^是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1. 一个数a与另一个数b异或的结果…

java中的异或运算

👏作者简介:大家好,我是Rockey,不知名企业的不知名Java开发工程师 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝联系方式:he18339193956&…

HTTP Status 505 – HTTP Version Not Supported

这个大部分的原因不是httpserver不支持,而是请求url里有空格,检查有空格UTF-8编码再传 比如:远程调用服务端地址有空格 去除空格