MySQL分库分表方案

MySQL分库分表方案

翻译一个stackoverflow上的问答,关于分库分表的缺点的,原文链接: 
MySQL sharding approaches?

问题:

什么是最好的MySQL分库分表方案?我想到的有:

  1. 应用层切分?
  2. MySQL代理层切分?
  3. 提供查找数据库分片的中心服务?

你们知道任何这方面有趣的项目或者工具吗?

回答:

最好的切分MySQL的方式就是:除非万不得已,否则不要去干它。

当你写一个应用时,你通常都想要最快的开发速度。只有必要时,你才开始优化延时,提高吞吐量,

你切分数据库的原因无非因为数据库的读或者写

  • 数据库写
    写操作永久的超过了服务器的磁盘负载;太多写入导致副本同步永远的落后了。
  • 数据库读
    读取到的数据量太大以至于称爆内存;并且大多数读操作开始直击磁盘而不是从内存中读取数据。

只有这时,你才需要考虑做数据库切分。

当你开始切分后,你开始以下面几种方式支付代价:

你的SQL语句不再是声明式的(declarative)

一般的,你用SQL语句告诉数据库你要什么数据,然后让优化器优化SQL,并将SQL转化成数据获取程序。
这很棒,因为它非常灵活,而且写这些转化程序很无聊,严重影响开发速度。

分布式环境下,你将A节点的表和B节点的表进行join,甚至有些表的数据大到超过一个节点,
在A节点和B节点将数据join起来,然后将B节点和C节点join后的数据再次聚合。
你开始写单方面的hash应用程序来解决这个问题(或者你可以再造MySQL的集群),
这表示结果你得到一大堆的非声明式的SQL,而且让程序以一种面向过程的方式开始工作

你招致了大量的网络延时

一般的,一条SQL查询语句可以本地解决并且通过优化器以最小的耗时解决这个查询问题。

在分布式环境下,查询语句必须要通过KV映射,访问多个网络节点(希望是批量访问,
而不是每个Key都来一次网络往返),或者将WHERE条件放在他们将被执行的节点上。

但是即使在最好的情况下,涉及到多个网络访问都会更加复杂。特别是MySQL的优化器完全不知道网络延时的情况。

你失去了SQL的许多强大能力

好吧,这或许没那么重要,但是外键约束,其他保证数据完整性的SQL机制,对于跨多个节点是无能为力的。

MySQL没有API保证异步查询返回顺序结果

当相同类型的数据存放在多个节点上(比如用户数据存放在A,B,C节点上),水平查询需要访问所有节点,
数据访问时间直接因以节点数线性增长。除非多个节点是以并行方式访问,然后再以Map-Reduce的方式聚合。

前提是需要提供异步通信的API,但这并不存在于MySQL提供的功能中。可选的方案是在子进程中增加很多的forking和连接。

总结

当你开始做数据库分库分表,数据结构和网络拓扑明显影响到应用的性能。 
为了运行良好,你的应用需要当心这些事情,所以只有应用层的切分才有意义。

如果需要自动切分,问题会更多(比如决定那个节点的那个列作为hash主键),或者
你想要手动进行切分,xyz用户去这个主库上,abc去和def去到那个主库上。

业务功能上的切分有些好处,如果做对了,这对绝大部分开发人员是透明的。因为所有相关的表都存放在本地。 
这让程序的透明性可以从声明式的SQL中尽量受益,并且有更少的网络延时,因为跨节点的网络访问被保持到最小化。

业务功能上的切分的缺点是:它不能准许单个表的数据膨胀过大,这需要设计者的特别注意。

业务功能切分的好处是:针对一个并没有太多改变的代码库,它相对而言非常简单。 
Booking.com在过去几年进行过几次业务功能上的分库分表,并且一直工作的很好。

时间: 2024-10-21 07:32:10

MySQL分库分表方案的相关文章

【分库、分表】MySQL分库分表方案

一.Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性.表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行.行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作. 2. mysql proxy:amoeba 做mysql集群,利用amoeba. 从上层的ja

MySQL 分库分表方案,总结的非常好!

前言 公司最近在搞服务分离,数据切分方面的东西,因为单张包裹表的数据量实在是太大,并且还在以每天60W的量增长. 之前了解过数据库的分库分表,读过几篇博文,但就只知道个模糊概念, 而且现在回想起来什么都是模模糊糊的. 今天看了一下午的数据库分库分表,看了很多文章,现在做个总结,"摘抄"下来.(但更期待后期的实操) 会从以下几个方面说起: 第一部分:实际网站发展过程中面临的问题. 第二部分:有哪几种切分方式,垂直和水平的区别和适用面. 第三部分:目前市面有的一些开源产品,技术,它们的优缺

oracle迁移到mysql分库分表方案之——ogg(goldengate)

之前文章主要介绍了oracle 迁移到mysql,主要是原表原结构迁移,但是实际运维中会发现,到mysql以后需要分库和分表的拆分操作,这个时候,用ogg来做,也是很强大好用的.主要结合ogg的2个参数 参数1:filterUse a FILTER clause to select rows based on a numeric value by using basic operators or one or more Oracle GoldenGate column-conversion fu

MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库. 1.设置说明 Master服务器: 192.168.41.196 Slave服务器: 192.168.41.197 Proxy服务器: 192.168.41.203 2.安装Mysql Pro

OneProxy实现MySQL分库分表

OneProxy实现MySQL分库分表 简介 Part1:写在最前 随着网站的壮大,MySQL数据库架构一般会经历一个过程: 当我们数据量比较小的时候,一台单实例数据库足矣.等我们数据量增大的时候,我们会采用一主多从的数据库架构来降低我们的读写io.当我们某张业务表达到几百万上千万甚至上亿时,就应该去进行分表处理.本文演示OneProxy对数据库实现分表处理,对前端应用是透明的. Part2:环境简介 HE1:192.168.1.248 Master1 HE3:192.168.1.250 Mas

如何设计可以动态扩容缩容的分库分表方案?

对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测试: 设计你的分库分表的一个方案,你要分成多少个库,每个库分成多少个表,比如 3 个库,每个库 4 个表: 基于选择好的数据库中间件,以及在测试环境建立好的分库分表的环境,然后测试一下能否正常进行分库分表的读写: 完成单库单表到分库分表的迁移,双写方案: 线上系统开始基于分库分表对外提供服务: 扩容了,扩容成 6 个库,每个库需要 12 个表,你怎么来增加更多库和表呢? 是你必须面对的一个事儿,就是你已经弄好分库分表方案

分库分布的几件小事(三)可以动态扩容缩容的分库分表方案

1.扩容与缩容 这个是你必须面对的一个事儿,就是你已经弄好分库分表方案了,然后一堆库和表都建好了,基于分库分表中间件的代码开发啥的都好了,测试都ok了,数据能均匀分布到各个库和各个表里去,而且接着你还通过双写的方案咔嚓一下上了系统,已经直接基于分库分表方案在搞了. 那么现在问题来了,你现在这些库和表又支撑不住了,要继续扩容咋办?这个可能就是说你的每个库的容量又快满了,或者是你的表数据量又太大了,也可能是你每个库的写并发太高了,你得继续扩容. 缩容就是现在业务不景气了,数据量减少,并发量下降,那么

浅谈-分库分表方案

名词解释 库:database:表:table:分库分表:sharding 数据库架构演变 刚开始我们只用单机数据库就够了,随后面对越来越多的请求,我们将数据库的写操作和读操作进行分离, 使用多个从库副本(Slaver Replication)负责读,使用主库(Master)负责写, 从库从主库同步更新数据,保持数据一致.架构上就是数据库主从同步. 从库可以水平扩展,所以更多的读请求不成问题. 但是当用户量级上来后,写请求越来越多,该怎么办?加一个Master是不能解决问题的, 因为数据要保存一

如何设计动态扩容缩容的分库分表方案?

面试官:如何来设计动态扩容的分库分表方案?面试官心理剖析:这个问题主要是看看你们公司设计的分库分表设计方案怎么样的?你知不知道动态扩容的方案? 回答: 背景说明:如果你们公司之前已经做了分库分表,你们当时分了 4 个库,每个库 4 张表:公司业务发展的很好,现在的数据库已经开始吃力了,不能满足快速发展的业务量了,需要进行扩容. 1)停机扩容 这个方案跟单库迁移方案是一样的,就是停服进行数据迁移,不过现在的数据迁移比之前的单库迁移要复杂的多,还有数据量也是之前的好几倍,单库的数据量可能就几千万,但