文章集中整理总结mysql分库分表开源产品,分布式数据库的设计,以及实际应用案例等相关内容,部分附上本文作者实际应用过程中的理解。

本文感谢sjdbcmycat姜承尧,林涛等文章提供的精彩介绍。

1、先抛出两个问题

问题一、当mysql单表数据量爆炸时,你怎么办?
问题二、当你的数据库无法承受高强度io时你怎么办?


2、 基本概念

2.1 谈数据库分片需要首先确定以下概念

​ 1) 单库,就是一个库

​ 2) 分片(sharding),分片解决扩展性问题,属于水平拆分,引入分片,就引入了数据路由分区键的概念。分表解决的是数据量过大的问题,分库解决的是数据库性能瓶颈的问题。

​ 3) 分组(group),分组解决可用性问题,分组通常通过主从复制(replication)的方式实现。(各种可用级别方案单独介绍)

​ 4) 互联网公司数据库实际软件架构是(大数据量下):又分片,又分组(如下图)


3、 分片

3.1 水平拆分,垂直拆分都是什么?

分区表?1)若不走分区键很容易出现全表锁,并发上来后简直是灾难。2)自己分库分表,自己掌控业务场景、访问模式,可控。mysql分区表官方介绍是针对myisam做的优化,你知道他怎么玩的?分半天还是一个ibdata是不是很尴尬

3.2 为什么分表?

​ 关系型数据库在大于一定数据量的情况下检索性能会急剧下降。在面对互联网海量数据情况时,所有数据都存于一张表,显然会轻易超过数据库表可承受的数据量阀值。这个单表可承受的数据量阀值,需根据数据库和并发量的差异,通过实际测试获得。

水平拆分如果能预估规模,越早做成本越低。

2.3 为什么分库?

​ 单纯的分表虽然可以解决数据量过大导致检索变慢的问题,但无法解决过多并发请求访问同一个库,导致数据库响应变慢的问题。所以通常水平拆分都至少要采用分库的方式,用于一并解决大数据量和高并发的问题。这也是部分开源的分片数据库中间件只支持分库的原因。

3.4 分布式事务?

​ 但分表也有不可替代的适用场景。最常见的分表需求是事务问题。同在一个库则不需考虑分布式事务,善于使用同库不同表可有效避免分布式事务带来的麻烦。目前强一致性的分布式事务由于性能问题,导致使用起来并不一定比不分库分表快。目前采用最终一致性的柔性事务居多。分表的另一个存在的理由是,过多的数据库实例不利于运维管理。

mysql本身?
消息补偿?
2PC?

3.5 小结

​ 综上所述,最佳实践是合理地配合使用分库+分表。

3.6 如何自己实现分库分表?

​ 1) dao层,首先通过分区键算出库名表名(如shardKey%shardNum 算出来表index如y,然后y/(shardNum/sourceNum)=x,y是表下标,x是库下标)。
​ 2) 把source从spring容器中拿出来,把表名当参数传进去,拼成分片后的sql。
​ 3) 思路大概是(select … from order where … -> 先拿到db_x的source 然后 select … from order_y where …)

你想这么干?你已经成功了。当然淘宝和当当的架构师也是这么干的。

3.7 SO,不需要我们亲自动手,其实你需要做的只是按照实际需求挑选而已。

3.8 重点介绍两个产品,先不说具体配置,只说思想

​ 1) sharding-jdbc(所处位置,通用数据访问层,部署在客户端的jar包,用于将用户的SQL路由到指定的数据库中)

盗一波图





​ 2) jproxy

jproxy是什么?

​ jproxy提供MariaDB, MySQL等数据库的统一接入访问,拥有流量过载保护,数据自动拆分,可配置路由规则,数据无缝迁移等功能。
​ 应用场景:数据需要分库分表,自动扩容的应用。

为什么分片都是2的n次方?a % (2^n) 等价于 a & (2^n - 1) 其中一个原因就是位运算

扩容? 虚拟桶。 极限就是一片一库。

演变过程 cobar->mycat->jproxy

mycat是什么?

​ 简单的说,就是:一个彻底开源的,面向企业应用开发的“大数据库集群”。支持事务、ACID、可以替代Mysql的加强版数据库,一个的数据库中间件产品。
- 其优势具有:
1) 基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能
2) 拥有众多成熟的使用案例
3) 强大的团队(其参与者都是5年以上资深软件工程师、架构师、DBA等)
4) 开源,创新,持续更新

盗一波图


4、 分组

4.1 为什么分组?

​ 分组解决可用性问题

mysql的ha 网洛上的都是vip漂移实现的

盗一波图


方案一:MYSQL主从复制(单活)

方案二:双主(单活),failover比单主简单

方案三:双主配SAN存储(单活)

方案四:DRBD 双主配DRBD (单活)

方案五:NDB CLUSTER

共享存储? 不需要复制了 更高的一致性

真正的高并发场景,什么架构都抗不住,老老实实用缓存。

需要大量读的场景尽量做到最终一致性。

4.2 同步,异步,半同步

1) 异步复制 (mysql默认)

Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。当Slave准备好才会向Master请求binlog。缺点:不能保证一些事件都能够被所有的Slave所接收。

2) 同步复制

Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。

3) 半同步复制

半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录。它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。

半同步复制的步骤:
i.当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。

ii.当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。

iii.当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。

iv.如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。

v.半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。

4.3 ha方案

4.3.1 MHA

4.3.2 MMM


5、 应用案例

5.1 记录一次mongo迁移mysql的过程(分库分表使用jproxy)

mongo怎么了?跟分片无关的部分简单说。

​ mongo很好,只是业界并没有成熟的MongoDB运维经验,jd too。
像高并发的系统 订单和库存 商品 还是拿nosql把,高并发的写,也不会打挂他,比如hbase,顶多GC频繁点,但是也是可用的。
一致性完全可以CAS搞定,而不是mysql的排他锁。

  • 迁移数据库的一个方案
    1) 中心化(统一入口)
    2) 双写(先同步写mysql如果发生异常改异步,尽量避免服务不可用)
    3) 倒库(jproxy支持通过游标形式全量遍历库-逐个表操作,可以利用其异步同步数据)
    4) 数据校验
    5) 切库提供服务

去mongo+优化方案(此处引入了分片的概念)


压测与性能





去mongo任务线

类型 任务 备注 影线系统 风险
design 海关迁移方案设计评审
design 分库分表技术选型 jproxy
apply 申请迁移相关应用(辅助系统) 跑批任务
apply 申请mysql集群 dbs系统
apply 申请jproxy集群 直接找接口人
apply 申请es集群 esm杰斯
coding trace表服务中心化 soa center
coding 涉及trace业务逻辑梳理,全部切换中心接口 接口完全适配 platform
verify 回归测试,并线上走单验证一段时间 先预发后正式
coding 实现mysql版本共2个表sql映射文件 基于自主研发的generator center
verify mysql版本sql映射文件单元测试 基于自主研发的generator center
coding trace表实现基于jproxy的分库分表 128个库(主) 1主3从 center
coding es分别按照商家id分片,保税区id分片,异步写,读开放jsf 2套集群4套索引 es
coding 中心接口加入代理层,可利用开关切换读mongo/mysql/es center
coding 异步补偿mongo,mysql,es功能开发 基于jmq platform
coding 代理层实现mongo和mysql版本互为主被双写(mongo主),异步写es 双11后mysql主 center
verify 线上开双写(包括es) 两套es集群
coding 倒库功能开发,数据校验功能开发 reactor config
verify 倒库,并进行数据校验 校验规则(特殊字段不校验)
verify 对中心接口进行压测 线上,压测环境隔离(jsf别名)
coding 优化配置(mysql调整最大连接数,es使用filterCache)
verify 对中心接口进行压测
verify 升级后架构正式上线
verify 监控切换mysql之后的接口性能
verify 监控切换mysql之后对相关依赖系统的影响
todo 停mongo写
todo 继续迁移海关mongo中其他表(以上均为trace表)
todo 彻底下线mongo数据库服务器,只保留mysql服务器

5.2 记录一次异构具有复杂分片规则数据库的过程

5.2.1 难点

​ 交易库存复杂的分片规则,数据量大,更新频繁,一致性保证。

回到本源,缓存+队列

5.2.2 不跑题,我们就说分片部分,如何接手一个复杂分片规则的数据库?

参考案例如何异构一个数十亿级别的数据库

有多复杂?​ 6000+表,28个库,4套分片规则。(解决方案 sharding-jdbc)


[分享]浅谈分布式数据库相关推荐

  1. 云原生数据库的幕后英雄:浅谈分布式数据库的计算和存储分离

    引言 分布式数据库替代传统商业数据库是近年最热门和最具争议的话题.理论上没有什么数据库不能被替代,现实却往往是代价大到难以承受.怎样才能更好的降低替代带来的代价呢?开源数据库TiDB创始人黄东旭在&l ...

  2. 【干货】浅谈分布式数据库中间件之分库分表

    分库分表,顾名思义就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.那么关于分库分表,你了解多少呢?接下来,我们将从什么是数据分片及如何进行分片两方面对DDM ...

  3. 【转载】运维角度浅谈MySQL数据库优化

     运维角度浅谈MySQL数据库优化 2015-06-02 14:22:02 标签:mysql优化   mysql分库分表分区 mysql读写分离 mysql主从复制 原创作品,允许转载,转载时请务必以 ...

  4. 搞懂分布式技术16:浅谈分布式锁的几种方案

    搞懂分布式技术16:浅谈分布式锁的几种方案 前言 随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景, ...

  5. 浅谈分布式架构搭建-理论知识

    浅谈分布式架构搭建 基础 理念 技术选型 后端技术设计 总体架构设计 关键案例设计 架构师搭建架一般优先考虑的是安全性.稳定性.高吞吐量.哈哈,菜鸟的我让我装个B,回忆一下以前架构搭建 基础 理念 C ...

  6. 浅谈计算机数据库技术的应用,浅谈计算机数据库技术的应用意义.doc

    浅谈计算机数据库技术的应用意义.doc 浅谈计算机数据库技术的应用意义 [摘 要]随着计算机技术与网络通信技术的发展,数据库技术已成为信息社会中对大量数据进行组织与管理的重要技术手段及软件技术,是网络 ...

  7. 管理中计算机系统的应用论文,浅谈计算机数据库的管理与应用论文

    浅谈计算机数据库的管理与应用论文 摘要:随着社会经济的快速发展,信息化网络技术手段不断进步,信息技术在人们日常生活.工作及学习中的广泛渗透,不仅给人们生活带来了极大便利,还极大的提升了人们工作与学习效 ...

  8. 浅谈时序数据库(TSDB)

    浅谈时序数据库(TSDB) 一.什么是时序数据库 二.时序数据库特点 基本特点 核心特性 三.补充知识 LSM树(LSM tree vs B tree) B tree LSM tree 总结 四.常见 ...

  9. 从运维角度浅谈MySQL数据库优化,中小企业DBA必会

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致 ...

最新文章

  1. 只允许指定IP远程桌面连接_使用IP安全策略
  2. maxcompute 2.0复杂数据类型之struct
  3. Java 位图法排序
  4. tomcat 目录结构 web 目录结构
  5. HTML期末作业-美食点餐网页
  6. mysql写入不了数据文件_求助,为何我的数据不能写入数据库
  7. 关于vray 5.2的使用(自研笔记)
  8. h3c交换机配置nat_H3C NAT配置实例
  9. 058.克鲁斯卡尔(Kruskal)算法的原理以及解决最小生成树问题
  10. 通过phpstudy(小皮面板)搭建DVWA靶场教程
  11. mongoDB 注册成开启自启动项
  12. 2014-2015年开发的机器人仿真测试平台
  13. 电脑高效率工作、学习工具软件推荐
  14. java 性能优化小细节
  15. import 下划线作用
  16. 链表和分开查询的区别
  17. 永洪Desktop实例分享|星巴克数据指标体系建设及炫酷可视化大屏搭建
  18. AD5541+XTR111非标准测试
  19. java escpos_Java通过ESC/POS指令打印条码
  20. 淘宝可以找人找朋友代付款吗?

热门文章

  1. scratch中的植物大战僵尸之豌豆射手收集豌豆
  2. 如果去掉数学前后的空格_excel表格数据消除前后空格-EXCEL表格中数据后面的空格怎么去掉,一条条手工删......
  3. 任务卡_05-数据库_数据库基础
  4. C# winform表格datagridview行高自动设置问题
  5. 垃圾分类很难吗?这是一篇来自AI垃圾回收箱的灵魂拷问…
  6. 香港服务器需要如何来维护呢?
  7. 打印机无线连接台式机、笔记本找不到目标打印机解决方案
  8. 一个实际电路的原理图是怎样设计出来的?
  9. SSM SpringBoot vue办公自动化计划管理系统
  10. 用c语言按键控制数码管,按键与数码管C语言例程