资讯详情

为了庆祝EDG,学一学MySQL主从同步吧

大家好,我是亚索!

八年来,有多少场比赛不敢输掉大龙! 恭喜EDG今天凌晨,今天凌晨一点左右拿下LOL全球总决赛冠军。

我真的很惭愧,我还在学校。实验室的任务和生活中的各种事情,包括娱乐,都被打破了很长一段时间。亚索一天也有三个省。如何抓紧时间,多学习,多写代码,多写分享,少玩手机游戏(最近手机游戏排名持续上升ing,亚索在召唤师峡谷疯狂坑人)。

说到娱乐比赛,亚索觉得无论是娱乐还是生活学习,都会遇到各种所谓的挫折和困难,保持良好、积极、乐观的态度,关注问题的原因和根本原因,最终会得到更好的结果,鼓励大家。

EDG夺冠,可以像过年一样庆祝。

凌晨一点亚索就听到有童鞋在宿舍楼大声呼喊,在网上也有看到很多人实现flag,倒立洗头,表白求爱,更夸张的还有,大街上裸奔,跳l跳河...这...

亚索认为这是完全没有必要的。请始终保持理性和清醒,不要参加一些毫无意义的庆祝活动来破坏三种观点。


正题

闲聊,今天主要和大家分享一下亚索之前学到的东西。

这也是后端Java面试官爱问知识之一,知识介绍均来自互联网搜集资料以及课本笔记,如有重复涉及版权问题,纯属偶然,还请私信纠正一下哈。

MySQL主从分库架构

互联网项目是读多写少的场景。如果过多的读数据要求落在数据库上,无疑会给数据库和整个系统带来很大的压力和瓶颈。因此,业内普遍采用一主多从、写主读从的架构,以提高数据库的相关性能,如下图所示:

具体地有,一般先做三步:

1.部署多个数据库,选择一个作为主库,其他作为从库;

2.保证主从数据库的一致性,实时同步数据,即主从复制;

3.确保系统将写作请求交给主数据库,读取请求交给数据库。

  • 它是在应用程序和数据库之间添加一个代理,所有的数据请求都由代理处理,分离读写请求,路由到相应的数据库。提供功能的中间部件包括:MySQL Router、Maxscale、MyCat、Atlas

  • 目前,互联网应用广泛,推荐使用。直接在项目中使用。maven引入jar可以使用包。关于读写分离的实现,请参考官方网站 https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/usage/read-write-splitting/

读写分离的实现对于提高数据库的并发性非常有效。为了保证读取的一致性,需要及时从库中更新数据,即,原理及示意图如下:

怕大家看不清图,再写一遍步骤亚索:

  • 主库更新数据后,将数据库中变化的数据写入bin log写在日志里的是DML命令语句(Data Manipulation Language)

  • 主库从库连接

  • 从库会创建一个IO线程,请求主库更新bin log

  • 创建一个主库bin log从库发送线程bin log,从库的IO线程负责接收

  • 从库的IO接收线程bin log写入relay log中,从库的SQL线程读取relay log将数据同步写入本地数据库(即从库),即再次执行DML类型的SQL语句。

主从同步延迟以及解决办法

万物有利有弊,主从分库,读写分离,会带来

主库和从库的数据有延迟。例如,在编写主库后,需要时间将主库的数据同步到从库。在此期间,主库与从库的数据不一致。读取从库的数据可能是错误的或旧的。

方案一 延迟读取

简而言之,等主在同步延迟时间过后再读取数据,只适用于数据敏感场景:

可以设计业务流程,写完请求后避免立即操作请求:比如你成功付款后,跳转到成功付款页面,点击返回后再返回账户。

方案二 强制读主库

在主从同步延迟时间内,从库数据过期。此时,必须向主库阅读最新数据的请求路由。这个方案可以通过HintManager可实现分片键值管理器:

HintManagerhm=HintManager.getInstance(); hm.setMasterRouterOnly(); 

方案三 半同步复制

同步完成后,主库上的写作请求将返回,即半同步复制:

  • 系统首先对主库Master写作操作

  • 等主同步完成后,写主库的请求才返回

  • 读从库,读到最新数据

该方案相对简单,但主库的写作请求返回时间延长,吞吐量减少。

方案四 数据库中间件

在应用程序服务层和数据库之间添加一个中间件,所有数据请求都是中间件:

  • 所有的阅读和写作都在数据库中间。正常情况下,阅读请求路由从库处理到主库处理

  • 将所有路由记录给主库的所有路由key,主从同步延迟时间内(经验时间为500ms),如果有相关key如果读取请求访问中间件,请将此读取key阅读请求交给主库,因为此时从库可能仍然是旧的错误数据。

  • 主同步延迟时间后,保持正常,所有阅读请求均由库处理。

该方案基本上可以保证读取数据的一致性,但数据库中间件的成本较高。

方案五 缓存记录写key法

  • 用缓存代替中间件,如果某个key写作操作要记录在缓存下Cache根据经验设置主同步时间

  • 写主库,执行写作操作

  • 发生阅读请求时,先到缓存检查是否有相关信息key的记录

  • 如果,则为缓存命中,需将读取请求路由到主库进行处理

  • 如果没有命中,说明应该key最近相关数据没有变化,请求继续从库处理,读写分离继续。

小结

本文主要介绍MySQL主从库、读写分离,实现主从同步复制的步骤原理和相关问题的解决方案。请指出,如果亚索在未来的学习中有更好的解决方案和技术补充,它将继续更新。

好了,今天就到这里。我是亚索,关注我。让我们一起学习Java吧!

标签: edg连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台