第十一章 可扩展的MySQL(上)

现在互联网的信息量爆发,单个数据库的容量、读写性能,很快就达到了瓶颈,那怎么办呢,那就得扩展啊...

垂直扩展(向上扩展)

即堆砌硬件,512G内存,32核CPU,厉害不!

特点:

  1. 最简单(如果是云服务器,买买买就行了)
  2. 贵!!!
  3. 性能很快到天花板,花一倍的钱,可能只提升20%的性能(-。-)
  4. 适合短期提升性能解决问题,后期再水平扩展

水平扩展

即所谓的横向扩展、向外扩展,就是平时听到的分库分表分片啦

策略:复制、拆分、数据分片(Sharding)

  • 复制

就是前一章讲的复制,一主多备,互为主备,读写分离

  • 拆分
  1. 按功能拆分

比如一个大型应用,把论坛、新闻、支持,拆分成三个部分,三个不同的数据库(很少这么干)

  1. 数据分片

想要扩展写容量,就必须切分数据,目前用于扩展MySQL最成功的方案!把数据分割成一小块,储存到不同的节点中!

  1. 选择分区键

选分区键,决定了数据怎么存,怎么查询;

  1. 分配数据、分片和节点

分片和节点不一定是一对一的关系,应该尽可能的让分片的大小比节点容量小得多,这样就可以在单个节点上储存多个分片

  1. 在节点上部署分片

多种方式,比如按数据库名,表名,bookclub_23.comments_23,后面的数字是分片号

  1. 固定分配

比如哈希和取模,分到不同的“桶”中

  1. 动态分配

类似建立一个记录<->分片号的索引表,先找到分片号,再去读写数据

  1. 显式分配

把分片号和id都放在同一列中,比如高8位代表分片号,后8位用来储存id的值

  1. 生成全局唯一ID
  • 使用自增字段,比如两台服务器,一台按奇数自增,一台按偶数自增,这样两台服务器就不会重复(不推荐这种,维护难)
  • 在全局节点中创建一个表专门用来获取自增id
  • 使用mamcached、redis这种生成自增数字并返回
  • 批量分配数字:比如批量生成10万个id,不够了再来申请
  • 使用复合id,比如分片号+自增id
  • 使用GUID值,这个不方便复制(不推荐!)
  1. 分片工具

数据分片这种麻烦的事情,肯定不能硬编码啦,必须使用抽象层,需要解决以下几个问题:

  1. 连接到正确的分片并执行查询
  2. 分布式一致性校验
  3. 跨分配结果集聚合
  4. 跨分片关联操作
  5. 锁和事务管理
  6. 创建新的分片、重新平衡分片

牛逼的Sharding-JDBC了解一下!!!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 作业的必要性以及存在的问题 1. 为什么需要作业? 作业即定时任务。一般来说,系统可使用消息传递代替部分使用作业的...
    Sununy阅读 7,060评论 3 25
  • 一、 设计理念 1.空间换时间 1)多级缓存,静态化 客户端页面缓存(http header中包含Expires/...
    帅T阅读 3,705评论 1 15
  • 简介 目前,在所有的区块链协议中每个节点存储所有的状态(账户余额,合约代码和存储等等)并且处理所有的交易。这提供了...
    编程狂魔阅读 1,113评论 0 3
  • 连着两天的雨,一切都变得乱七八糟的,这不是我大西北该有的天气,以前挂在嘴边的十年九旱呢?现在继续那么说会不会有人说...
    生杏子阅读 433评论 0 1
  • 从小到大情商就不高,也不怎么会和别人相处,虽然我是个话唠+自来熟。看起来心大,其实还是有点小敏感。然而吧,总是爱发...
    树也有脚心阅读 334评论 0 4

友情链接更多精彩内容