​如何一步步让MySQL支撑亿级流量

这篇具有很好参考价值的文章主要介绍了​如何一步步让MySQL支撑亿级流量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

​如何一步步让MySQL支撑亿级流量

1 主从读写分离

大部分互联网业务都是读多写少,因此优先考虑DB如何支撑更高查询数,首先就需要区分读、写流量,这才方便针对读流量单独扩展,即主从读写分离。

若前端流量突增导致从库负载过高,DBA会优先做个从库扩容上去,这样对DB的读流量就会落到多个从库,每个从库的负载就降了下来,然后开发再尽力将流量挡在DB层之上。

Cache V.S MySQL读写分离 由于从开发和维护的难度考虑,引入缓存会引入复杂度,要考虑缓存数据一致性,穿透,防雪崩等问题,并且也多维护一类组件。所以推荐优先采用读写分离,扛不住了再使用Cache。

1.1 core

主从读写分离一般将一个DB的数据拷贝为一或多份,并且写入到其它的DB服务器中:

  • 原始DB为主库,负责数据写入
  • 拷贝目标DB为从库,负责数据查询

所以主从读写分离的关键:

  • 数据的拷贝 即主从复制
  • 屏蔽主从分离带来的访问DB方式的变化 让开发人员使用感觉依旧在使用单一DB

2 主从复制

MySQL的主从复制依赖于binlog,即记录MySQL上的所有变化并以二进制形式保存在磁盘上二进制日志文件。

主从复制就是将binlog中的数据从主库传输到从库,一般异步:主库操作不会等待binlog同步完成。

2.1 主从复制的过程

  • 从库在连接到主节点时会创建一个I/O线程,以请求主库更新的binlog,并把接收到的binlog写入relay log文件,主库也会创建一个log dump线程发送binlog给从库
  • 从库还会创建一个SQL线程,读relay log,并在从库中做回放,最终实现主从的一致性

使用独立的log dump线程是异步,避免影响主库的主体更新流程,而从库在接收到信息后并不是写入从库的存储,是写入一个relay log,这是为避免写入从库实际存储会比较耗时,最终造成从库和主库延迟变长。

​如何一步步让MySQL支撑亿级流量

基于性能考虑,主库写入流程并没有等待主从同步完成就返回结果,极端情况下,比如主库上binlog还没来得及落盘,就发生磁盘损坏或机器掉电,导致binlog丢失,主从数据不一致。不过概率很低,可容忍。

主库宕机后,binlog丢失导致的主从数据不一致也只能手动恢复。

主从复制后,即可:

  • 在写入时只写主库
  • 在读数据时只读从库

这样即使写请求会锁表或锁记录,也不会影响读请求执行。高并发下,可部署多个从库共同承担读流量,即一主多从支撑高并发读。

从库也能当成个备库,以避免主库故障导致数据丢失。

那无限制地增加从库就能支撑更高并发吗?NO!从库越多,从库连接上来的I/O线程越多,主库也要创建同样多log dump线程处理复制的请求,对于主库资源消耗较高,同时受限于主库的网络带宽,所以一般一个主库最多挂3~5个从库。

2.2 主从复制的副作用

比如发朋友圈这一操作,就存在数据的:

  • 同步操作 如更新DB
  • 异步操作 如将朋友圈内容同步给审核系统

所以更新完主库后,会将朋友圈ID写入MQ,由Consumer依据ID在从库获取朋友圈信息再发给审核系统。此时若主从DB存在延迟,会导致在从库取不到朋友圈信息,出现异常!

  • 主从延迟对业务的影响示意图
​如何一步步让MySQL支撑亿级流量

2.3 避免主从复制的延迟

这咋办呢?其实解决方案有很多,核心思想都是 尽量不去从库查询数据。因此针对上述案例,就有如下方案:

2.3.1 数据冗余

可在发MQ时,不止发送朋友圈ID,而是发给Consumer需要的所有朋友圈信息,避免从DB重新查询数据。

推荐该方案,因为足够简单,不过可能造成单条消息较大,从而增加消息发送的带宽和时间。

2.3.2 使用Cache

在同步写DB的同时,把朋友圈数据写Cache,这样Consumer在获取朋友圈信息时,优先查询Cache,这也能保证数据一致性。

该方案适合新增数据的场景。若是在更新数据场景下,先更新Cache可能导致数据不一致。比如两个线程同时更新数据:

  • 线程A把Cache数据更新为1
  • 另一个线程B把Cache数据更新为2
  • 然后线程B又更新DB数据为2
  • 线程A再更新DB数据为1

最终DB值(1)和Cache值(2)不一致!

2.3.3 查询主库

可以在Consumer中不查询从库,而改为查询主库。

使用要慎重,要明确查询的量级不会很大,是在主库的可承受范围之内,否则会对主库造成较大压力。

若非万不得已,不要使用该方案。因为要提供一个查询主库的接口,很难保证其他人不滥用该方法。

主从同步延迟也是排查问题时容易忽略。有时会遇到从DB获取不到信息的诡异问题,会纠结代码中是否有一些逻辑把之前写入内容删除了,但发现过段时间再去查询时又能读到数据,这基本就是主从延迟问题。所以,一般把从库落后的时间作为一个重点DB指标,做监控和报警,正常时间在ms级,达到s级就要告警。

主从的延迟时间预警,那如何通过哪个数据库中的哪个指标来判别?在从从库中,通过监控show slave status\G命令输出的Seconds_Behind_Master参数的值判断,是否有发生主从延时。这个参数值是通过比较sql_thread执行的event的timestamp和io_thread复制好的 event的timestamp(简写为ts)进行比较,而得到的这么一个差值。但如果复制同步主库bin_log日志的io_thread线程负载过高,则Seconds_Behind_Master一直为0,即无法预警,通过Seconds_Behind_Master这个值来判断延迟是不够准确。其实还可以通过比对master和slave的binlog位置。

3 如何访问DB

使用主从复制将数据复制到多个节点,也实现了DB的读写分离,这时,对DB的使用也发生了变化:

  • 以前只需使用一个DB地址
  • 现在需使用一个主库地址,多个从库地址,且需区分写入操作和查询操作,再结合“分库分表”,复杂度大大提升。

为降低实现的复杂度,业界涌现了很多DB中间件解决DB的访问问题,大致分为:

3.1 应用程序内部

如TDDL( Taobao Distributed Data Layer),以代码形式内嵌运行在应用程序内部。可看成是一种数据源代理,它的配置管理多个数据源,每个数据源对应一个DB,可能是主库或从库。当有一个DB请求时,中间件将SQL语句发给某个指定数据源,然后返回处理结果。

优点

简单易用,部署成本低,因为植入应用程序内部,与程序一同运行,适合运维较弱的小团队。

缺点

缺乏多语言支持,都是Java语言开发的,无法支持其他的语言。版本升级也依赖使用方的更新。

3.2 独立部署的代理层方案

如Mycat、Atlas、DBProxy。

这类中间件部署在独立服务器,业务代码如同在使用单一DB,实际上它内部管理着很多的数据源,当有DB请求时,它会对SQL语句做必要的改写,然后发往指定数据源。

优点

  • 一般使用标准MySQL通信协议,所以可支持多种语言
  • 独立部署,所以方便维护升级,适合有运维能力的大中型团队

缺点

所有的SQL语句都需要跨两次网络:从应用到代理层和从代理层到数据源,所以在性能上会有一些损耗。

4 总结

可以把主从复制引申为存储节点之间互相复制存储数据的技术,可以实现数据冗余,以达到备份和提升横向扩展能力。

使用主从复制时,需考虑:

  • 主从的一致性和写入性能的权衡 若保证所有从节点都写入成功,则写性能一定受影响;若只写主节点就返回成功,则从节点就可能出现数据同步失败,导致主从不一致。互联网项目,一般优先考虑性能而非数据的强一致性
  • 主从的延迟 会导致很多诡异的读取不到数据的问题

很多实际案例:

  • Redis通过主从复制实现读写分离
  • Elasticsearch中存储的索引分片也可被复制到多个节点
  • 写入到HDFS中,文件也会被复制到多个DataNode中

不同组件对于复制的一致性、延迟要求不同,采用的方案也不同,但设计思想是相通的。

FAQ

若大量订单,通过userId hash到不同库,对前台用户订单查询有利,但后台系统页面需查看全部订单且排序,SQL执行就很慢。这该怎么办呢?

由于后台系统不能直接查询分库分表的数据,可考虑将数据同步至一个单独的后台库或同步至ES。

 

作者|顶尖架构师栈文章来源地址https://www.toymoban.com/news/detail-710439.html

到了这里,关于​如何一步步让MySQL支撑亿级流量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql-主从复制与读写分离

    1.在企业应用中,成熟的业务通常数据量都比较大 2.单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求 3.配置多台主从数据库服务器以实现读写分离 1.MySQL的复制类型 基于语句的复制(STATEMENT, MySQL默认类型) 基于行的复制(ROW) 混合类型的复制(MIXED) 2. MySQL主从复制

    2024年02月15日
    浏览(49)
  • MySQL 主从复制与读写分离

    MySQL 主从复制与读写分离 1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什么要读写分离呢?读快写慢

    2024年02月06日
    浏览(46)
  • Docker 搭建MySQL主从复制-读写分离

    MySQL主从复制是一种常用的数据库高可用性解决方案,通过在主数据库上记录的数据变更,同步到一个或多个从数据库,实现数据的冗余备份和读写分离。在Docker环境下搭建MySQL主从复制和读写分离,不仅方便管理,还能充分发挥Docker的轻量、可移植性等特性。 在开始搭建之

    2024年02月22日
    浏览(42)
  • 【简单认识MySQL主从复制与读写分离】

    在企业应用中,成熟的业务通常数据量都比较大 单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求 配置多台主从数据库服务器以实现读写分离 1、 MySQL的复制类型 基于语句的复制(STATEMENT, MySQL默认类型) 基于行的复制(ROW) 混合类型的复制(MIXED) 2、 MySQL主从复制

    2024年02月15日
    浏览(92)
  • MySQL数据库 主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月10日
    浏览(48)
  • 【MySQL数据库】主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月11日
    浏览(59)
  • 【数据库】mysql主从复制与读写分离

      读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE ),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。   因为数据库的\\\"写”(写10000条数据可能要3分钟)操作是比较耗时的。   

    2024年02月11日
    浏览(72)
  • Mysql - 配置Mysql主从复制-keepalived高可用-读写分离集群

    目录 高可用: 为什么需要高可用呢? 高可用的主要作用: keepalived是什么?它用在哪里? 什么是VRRP协议,它的作用是什么? 搭建一个基于keepalived的高可用Mysql主从复制读写分离集群 一、项目中的IP地址配置表: 二、项目拓扑图: 项目步骤:(主从复制、读写分离、单vi

    2024年02月13日
    浏览(47)
  • 【数据库七】MySQL主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作 (insert、update、delete),而 从数据库处理select查询操作 。 数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据

    2024年02月11日
    浏览(59)
  • MySQL 主从复制[异步 同步 半同步复制] 读写分离 优化 (非常重要)

    1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什么要读写分离呢? 因为数据库的“写”(写10000条数据

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包