文章目录

  • 生猛干货
  • 官方文档
  • 主从复制 解决不了 主节点DB写的的压力
  • 常见的分库分表的方式
    • 分库
    • 分表
      • DB分片前的准备
        • 如何选择分区键 ,尽量避免跨分片查询
        • 如何存储无需分片的表
        • 如何在节点上部署分片
        • 如何分配分片中的数据
        • 如何生成全局唯一ID
  • 使用oneProxyp 分库分表演示
    • 目标效果
  • oneProxyp
    • 简介
    • 下载安装使用
  • 搞定MySQL

生猛干货

带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试


官方文档

https://dev.mysql.com/doc/

如果英文不好的话,可以参考 searchdoc 翻译的中文版本

http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html


主从复制 解决不了 主节点DB写的的压力

我们前面的 主从复制 构建的高可用的架构中,主要解决的是 主节点 读的压力。 (通常情况下,一个系统中的读请求占据绝大部分)

那主节点的 写请求呢? — 主从复制高可用架构解决不了了。。。。。

当然了,你可以增加硬件配置,这里我们不讨论。我们这里要讨论的是 通过分库分表 来解决 主节点 写的压力。


常见的分库分表的方式

有个MySQL的集群哈

分库

两种方式,如下

  • 方式一: 把一个实例中的多个数据库拆分到不同的实例

    假设我们是个电商系统, DB集群中有 订单、用户、促销 三个数据库。

当然了,如果你的情况是: 订单节点的写入压力比较大,你这样拆也解决不了问题。

那就需要第二种方式了


  • 方式二: 把一个库中的表分离到不同的数据库中 。

原来写的压力 都在 一个节点上,这样才到不同的数据库上,原来一个节点的写压力,就被分散到了3个节点上。

如果 随着业务的发展,订单的DB 写压力 又扛不住了呢? -----------> 那只有终极大招-----> 分表


分表

分表 : 就是对一个库中的相关表 进行水平拆分到不同实例的数据库中。

这一块很复杂,坑太多。。。。。 一句话,能不分就不分。

举个订单的表的分表后的例子。


DB分片前的准备

如何选择分区键 ,尽量避免跨分片查询

  • 分区键要能尽量避免跨分片查询的发生 ,

    举个例子,博客系统 ,如果我们按照博客id hash进行分片,那么这个blog_id 会分配到各个节点上,那么查询某个用户的博客, 不得不去所有的数据库上去查询。 但如果按照user_id分呢? 那只要查询一个数据库就可以了。 就避免了跨分区的查询

  • 分区键要尽可能的使各个分配片中数据平均

    分片的目的,是为了降低数据库的写负载,如果分片不均匀,大部分数据都写到一个节点上了,这个节点很累,其他节点闲的没事儿,那么这个分片还有啥意义???

比较好的方式,如果 分完以后,你的查询能包含这个分区键,那就非常好了。


如何存储无需分片的表

一个库中,大部分的表,是没有必要分片的,只有几个写入非常频繁的表,才需要分片。

那不用分片的如何存储呢?

  • 每个分片中存储一份相同的数据

    这种方法通常用于: 表本身数据量不大,而且不怎么变更的表,比如字典表。 查询也经常关联这种表,每个分片都有的话,这样的话 就不用跨分片查询了,提高查询效率。

    当然了,缺点要维护多个分片的一致性,避免不一致导致查询出错。

  • 使用额外的节点统一存储

    需要查询的话,由应用来分别查询,然后组合了。 效率不如第一种,但好在不用去维护数据一致性。


如何在节点上部署分片

  • 方式一: 每个分片使用单一的数据库,并且数据库名也相同

  • 方式二: 将多个分片表存储在一个数据库中,并在表名上加入分片号后缀
    这个是对表进行编号

  • 方式三: 在一个节点中部署多个数据库,每个数据库包含一个分片

    这个是对数据库进行编号

  • 其他方式。。。。


如何分配分片中的数据

数据如何分布,对查询的性能,影响很大。

这个平均包括 : 数据分部平均,第二 并发访问也要平均

  • 方式一: 按照分区键的hash值取模来分配分片数据

    先hash再取模, 并不是所有的分区键都是数字,所以最好hash一下

    如果是自增id为主键,也可以不用hash, 直接取模就行。

    举个例子 10个分片, 101 这个该存在哪个分片呢 ?

    101 % 10 = 1 ----> 第一个分分片 。


  • 方式二: 按照分区键的范围来分配数据

    举个例子 10个分片 ,第一个分片存 1 - 100 ,第二个 101 -199 依次类推

    那101 放哪里呢 ----> 第二个分片

    常用于 分区键为 日期类型或者数值类型的场景。

    优点: 很容易知道放哪里
    缺点: 容易造成数据的分配不平均 ,从而导致访问也不平均。

    比如一个 在线题库,以 课程id作为分区键来分区, 但是Java这个课,大家都爱选这个,导致运行一段时间后,java课程的那个分片,压力特别大,所以前期设计要充分考量。


  • 方式三:利用分区键和分片的映射表来分配分片数据

    使用第三种方式,方便控制

    需要建立一张 分区键和分片的映射表, 先通过查询映射表 来查询具体的分区。

    这个表的压力比较大, 记得做缓存。


如何生成全局唯一ID

这个可能是最关键的了

  • 方式一: 单节点的话,可以采用auto_increament_increament和 auto_increament_offset 参数

  • 方式二: 分片的话 ,也可以用 可以采用auto_increament_increament和 auto_increament_offset 参数

    auto_increament_increament 和 分片数目相同

    比如 6个节点, auto_increament_increament 就要设置为6 ,auto_increament_offset 分别设置为 1到 6 ,每个节点相同表的自增id ,不冲突。

    但这个只适用于 一个节点 只有一套分片表的情况。


  • 方式二:全局节点

    弄个全局表 ,但这个表有可能成为瓶颈,所以引入第三种

  • 方式三: 使用redis代替全局节点,Redis缓存服务器中创建全局ID

  • 其他方式。。。。


使用oneProxyp 分库分表演示

目标效果

解释下

原来在一个节点中存储了 订单表 + 订单商品表 + 分类表

经过分库分表后

两个节点

节点1 : 存储 订单表 01 + 订单商品表 01 + 分类表 (每个节点数据一致,冗余)

节点1 : 存储 订单表 02 + 订单商品表 02 + 分类表 (每个节点数据一致,冗余)



oneProxyp

简介

OneProxy 中间件是具备透明读写分离、分库分表功能的数据库中间件,轻松构建分布式数据库集群,支持Oracle/MySQL等多种数据库

下载安装使用

带后续使用的话补充,这里有个思路即可。

链接:https://pan.baidu.com/s/15kdQ-Q2u1sT063A-Qa2tdg
提取码:pbp9


搞定MySQL

MySQL-分库分表初探相关推荐

  1. mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)

    前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...

  2. 企业Shell实战-MySQL分库分表备份脚本

    本文来自 http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.ht ...

  3. php+mysql分库分表的哈希(hash)算法

    转自:http://itlab.idcquan.com/linux/PHP/905174.html php+mysql分库分表的哈希(hash)算法: 我们在实际开发的时候,难免会遇到大访问量的问题, ...

  4. 使用EntityFrameworkCore实现Repository, UnitOfWork,支持MySQL分库分表

    昨天(星期五)下班,19:00左右回到家,洗个澡,然后20:30左右开始写代码,写完代码之后,上床看了<生活大爆炸10季>17.18两集,发现没有更新到19集,瞄了一眼手机,竟然已经是凌晨 ...

  5. mysql 分库分表 建表,mysql 分库分表 建表MySQL常用操作

    通过命令行启动.停止MySQL服务器: start: net start mysql stop: net stop mysql 连接MySQL服务器:\>mysql -h127.0.0.1 -u ...

  6. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...

    [Mysql主从复制] 解决的问题 数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了. 负载均 ...

  7. 如何彻底解决烦人的 MySQL 分库分表问题?写一个更好的数据库!

    作者 | 黄东旭 责编 | 郭   芮 我还清楚记得,五年前的这个时候,当时还在豌豆荚,午后与刘奇和崔秋的闲聊关于未来数据库的想象,就像一粒种子一样,到了今天看起来也竟枝繁叶茂郁郁葱葱,有点感慨.按照 ...

  8. 超实用的mysql分库分表策略,轻松解决亿级数据问题

    超实用的mysql分库分表策略,轻松解决亿级数据问题 参考文章: (1)超实用的mysql分库分表策略,轻松解决亿级数据问题 (2)https://www.cnblogs.com/xichji/p/1 ...

  9. MySQL分库分表多维度查询——比较好的方法

    转载自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL分库分表,一般只能按照一个维度进行查询. 以订单表为例, 按照用户ID mod 6 ...

  10. MySQL运维(二)MySQL分库分表概念及实战、读取分离详解

    MySQL运维(二)MySQL分库分表详解.读取分离详解 1.MySQL分库分表相关概念 1.1 分库分表概念 1.1.1 分库的原因 分库:就是一个数据库分成多个数据库,部署到不同机器. 如果业务量 ...

最新文章

  1. 家用机器人风口来临,但巨头围猎背后的前景不容乐观
  2. python学会了可以做什么菜_python学习之路(24)
  3. OpenStack上传镜像报错__init__() got an unexpected keyword argument 'token'
  4. 知识贴!单片机C语言编程之.H文件与.C文件的关系
  5. 网络监控系统安装的4种方式,安防必备
  6. python学习(八)定制类和枚举
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第2篇]多核处理器和向量处理器的区别
  8. 微擎应用笔记3--manifest.xml文件使用说明
  9. php对pdf关键字定位,如何在PDF文件中快速查找关键字
  10. 无锁atomicInteger
  11. 关于C语言中文件的基本操作
  12. android Sqlite操作之-- 自定义ORM关系实体映射类
  13. 如何将Eclipse的javaWeb项目改为IDEA的maven项目
  14. 郑州双轨制直销系统开发奖金制度介绍
  15. 清明上河图密码2笔记
  16. python英语小词典代码_小作品: Python 命令行词典,含 15 万离线词库(附源码)...
  17. js给页面添加随机像素噪声背景
  18. 淘淘商城第30讲——实现商品添加功能
  19. 不要再「外包」AI 模型了!最新研究发现:有些破坏机器学习模型安全的「后门」无法被检测到...
  20. 会声会影如何去除视频黑边

热门文章

  1. 分拣外观残缺的机器人_中国鞋业高峰论坛大咖云集,国辰机器人解读“鞋业智造”...
  2. C++ vector用法 基本用法
  3. python管理图片_Django 管理图片
  4. DPVS_DPVS配置说明
  5. 97. Leetcode 剑指 Offer 60. n个骰子的点数 (动态规划-背包问题)
  6. 强化学习(三)---马尔科夫决策过程
  7. 错误处理:IndexError: index out of range in self
  8. python包介绍:numpy
  9. SpringBoot 源码解析 —— SpringApplication 源码分析
  10. 深度学习核心技术精讲100篇(二十四)-简单谈下深度学习在中文分词中的应用