`
jieke_ZJ
  • 浏览: 44816 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MySQL分库分表

 
阅读更多

MySQL处理大规模业务数据的方案一般都是分库分表.

最开始一般都选择垂直拆分.
比如电商网站,可能按照家电,图书,母婴等商品分类进行拆分.
这样做的好处是拆分简单,并且没有破坏数据库事务.

但是随着业务的增长,比如图书分类的订单数据表已经到达了10个T的规模.
就需要考虑做水平拆分了.把逻辑上一个表的数据,分别存放到不同的数据库服务器.
水平拆分的好处是
    多个数据库服务器分担CPU,内存,网络带宽的压力.
    多个数据库服务器分担备份、恢复的压力.
缺点是
    破坏了原生的数据库事务.如果使用分布式事务,则会拖累数据库性能.
    增加了运维管理的负担.原来管一台服务器就行了,现在得管一堆服务器.

水平拆分的三种主要方式
1.Hash拆分.比如按照 userId mod 64.将数据分布在64个服务器上
2.范围拆分.比如每台服务器计划存放一个亿的数据,先将数据写入服务器A.一旦服务器A写满,则将数据写入服务器B,以此类推.
这种方式的好处是扩展方便.数据在各个服务器上分布均匀.
3.路由表.自定义分布方式.
    

吕海波老师SACC2015的内容.
用事务补偿的方式,实现最终一致性.

下图是水平拆分之后的结构. 假设用户A向B转账100元.



由于水平拆分破坏了原有的事务.一个转账的业务,可能遇到如下的几个情况.


第一种情况,应用写队列超时导致重发了消息.那么结果是A本来向B转账100元.结果却转账了200元..
第二种情况,应用将消息成功写入队列,但是队列服务器挂了.结果是A向B转账失败.
第三种情况,中间层(队列的消费者)将消息取出,修改A的账户余额,但是用户A的库挂了,导致事务失败.结果是A向B转账失败.
第四种情况,中间层已经成功修改了用户A的账户余额,但是在修改B用户余额的时候,用户B的数据库挂了。结果是用户A的钱扣了,但是用户B的钱没有增加.
第五种情况.中间层从队列拿到了消息,但是还未及处理,中间层本身挂了..

最终一致性.
1.应用先将本次事务的业务日志写入业务日志的数据库,暂不提交
然后,向队列发送两个消息.一个消息是用户A -100元,另一个消息是用户B +100元.
确保两个消息都成功入队,则提交业务日志的事务,获取全局事务ID(tran_id).一旦有任何异常,回滚事务.
提交了事务,应用则可以直接返回.提示用户交易完成.


2.中间层获取消息.先连接用户A的数据库.
查询业务日志表(tran_log),如果没有该全局事务ID,则不予处理.(确认有这个全局事务,才处理)
查询消息日志表(msg_log),如果存在记录,则不予处理.(防止消息超时重发)
然后,开始事务.
先update用户A,减100元.
再写消息日志表,记录本次处理
最后提交事务.


3.中间层连接用户B的数据库,做相同的操作.

每隔5分钟,检查tran_log和msg_log.如果有不一致的情况,则进行事务补偿.

吕老师说到这里的时候,我觉得tran_log应该在如下的位置,然后作为各个底层库的Master.
用MySQL异步复制,将tran_log复制到用户A、B所在的库.

但是当面问吕老师,他说他们不是这么弄的.因为这个tran_log的数据量也是非常巨大.
他们把tran_log放在了底层库,但是我实在想不出来这样怎么弄.
可惜当时的环境也不容许我再刨根问底了.
不过留着自己琢磨,也挺有意思.

如果按照我的这个方式设计,后期问题会比较多,一个是tran_log数据量巨大.另外,tran_log所在的数据库容易产生瓶颈.

分享到:
评论

相关推荐

    MySQL 分库分表的实现原理及演示案例

    MySQL分库分表是一种数据库架构优化技术,其目的是为了提高大型数据库系统的性能和可扩展性。在面对大规模数据和高并发访问时,单库单表往往难以满足需求,分库分表就成为了必要之选。分库分表技术可以将数据分散...

    MySQL分库分表技术

    **MySQL分库分表技术** 随着互联网业务的快速发展,数据量呈现爆炸性增长,单个数据库的性能瓶颈问题日益突出。在这种背景下,MySQL的分库分表技术应运而生,旨在解决高并发、大数据量场景下的性能挑战。本篇将深入...

    一个MySQL分库分表php类

    一个MySQL分库分表php类。当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区 别请自行搜索。一般而言,分库分表属于...

    MySQL 分库分表的实现原理及演示案例.zip

    在实现MySQL分库分表的过程中,通常会遇到一些挑战,如数据一致性、事务处理、跨库跨表查询等。为了应对这些问题,可以使用以下技术: 1. **ShardingSphere**:Apache ShardingSphere是一个开源的分布式数据库解决...

    mysql分库分表分区1

    这里的“mysql分库分表分区1”主要讨论的是 MySQL 中的表分区技术,这是一种将大表物理分割为多个更小、更易管理的部分的方法。下面将详细介绍四种常见的分区类型:RANGE、LIST、HASH 和 KEY。 1. **RANGE分区**: ...

    Python+MySQL分表分库实战

    MySQL分库分表是数据库架构设计中用于处理大规模数据量以及高并发请求的一种技术手段。通过将数据拆分到不同的数据库服务器中,能够有效降低单个数据库的负载,提高系统的扩展性和性能。Python作为一种流行的编程...

    MySQL分库分表课件.zip

    MySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库...

    php mysql分库分表实例

    MySQL分库分表还有其他考虑因素,如数据一致性、事务处理、跨表查询等。在分库分表后,通常需要避免跨库查询,因为这会导致性能下降。可以通过设计良好的API和业务逻辑,尽量在单个数据库中完成大部分操作。此外,还...

    MySQL分库分表无限扩容后的瓶颈及解决方案.docx

    "MySQL 分库分表无限扩容后的瓶颈及解决方案" MySQL 是一个非常popular 的数据库管理系统,广泛应用于各行各业。随着业务的发展,数据量也在不断增长,数据库的性能和容量也将面临着极大的挑战。这篇文章将讨论 ...

    19道MySQL分库分表高频题整理(附答案背诵版).md

    《19道MySQL分库分表高频题整理(附答案背诵版)》是一份专门针对MySQL分库分表技术的高频考题集,旨在帮助数据库管理员、后端开发人员以及准备相关面试的考生全面掌握MySQL分库分表的核心概念和实际操作。通过详细的...

    一个MySQL分库分表php类.zip

    分享一个MySQL分库分表php类。当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区 别请自行搜索。一般而言,分库分表...

    去年底写的mysql分库分表中间件heisenberg

    **MySQL分库分表中间件Heisenberg详解** 在数据库设计中,随着业务的发展和数据量的增加,单个数据库往往难以承受高并发和大数据量的处理压力,这时就需要引入分库分表策略来优化系统性能。Heisenberg是一款开源的...

    mysql 分库分表查询工具-shard.zip

    MySQL 分库分表查询工具——Shard 在大型的互联网应用中,数据库的性能瓶颈往往成为系统扩展性的关键因素。为了应对高并发、大数据量的挑战,MySQL 数据库的分库分表策略被广泛采用。分库是将数据分散到多个独立的...

    Mysql分库分表实例.zip

    为了解决这一问题,"Mysql分库分表实例" 提供了一种解决方案——数据分片技术,即通过分库分表来提升数据库的读写效率。 分库分表是数据库水平扩展的一种策略,它的核心思想是将一个大的数据库拆分成多个小的数据库...

    mysql分库分表-shardingmysql.zip

    在这个“mysql分库分表-shardingmysql.zip”压缩包中,我们重点关注的是如何使用 ShardingSphere 来实现 MySQL 的分库分表。 首先,理解分库分表的基本概念。分库是将一个大型数据库拆分成多个小型数据库,每个...

    MyCat实现MySQL分库分表.docx

    MyCat 实现 MySQL 分库分表 MyCat 是一个开源的 MySQL 中间件,可以帮助实现 MySQL 的分库分表。下面是使用 MyCat 实现 MySQL 分库分表的知识点总结: 一、MyCat 安装 * 使用 wget 命令下载 MyCat 服务器 * 使用 ...

    Mysql分库分表11111111111

    ### MySQL分库分表策略详解 #### 一、场景与系统分析 在互联网技术日新月异的今天,数据量的快速增长对数据库系统的性能提出了更高要求。为了应对这些挑战,许多企业选择实施分库分表策略。分库分表是指将原来单一...

    MySQL分库分表.doc

    MySQL分库分表是一种应对大数据量和高并发场景下的数据库优化策略,旨在提高数据库系统的性能、可用性和可扩展性。MYCAT(曾用名:Maatkit)是一款开源的数据库中间件,它允许开发者将MySQL数据库集群化,实现分库...

    MySQL分库分表的PHP类.zip

    <?php namespace App\Model\Database; class Config {  public $dsn;  public $user;...这是一个非常好用的MySQL分库分表的PHP类,需要的朋友可以下载使用,更多精彩尽在在PHP中文网。

    mysql分库分表-atlantic.zip

    1. **MyCat**:开源的MySQL分库分表中间件,支持自动路由、分布式事务等。 2. **ShardingSphere**:Apache孵化器项目,提供分库分表、读写分离等功能,兼容多种数据库。 3. **OceanBase**:阿里巴巴开源的分布式...

Global site tag (gtag.js) - Google Analytics