MySQL 主从一直是面试常客,里面的知识点虽然基础,但是能回答全的同学不多。
网站的建设创新互联专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为墙体彩绘等企业提供专业服务。
比如楼哥之前面试小米,就被问到过主从复制的原理,以及主从延迟的解决方案,因为回答的非常不错,给面试官留下非常好的印象。你之前面试,有遇到过哪些 MySQL 主从的问题呢?
所谓 MySQL 主从,就是建立两个完全一样的数据库,一个是主库,一个是从库, 主库对外提供读写的操作,从库对外提供读的操作 ,下面是一主一从模式:
对于数据库单机部署,在 4 核 8G 的机器上运行 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS, 当遇到一些活动时,查询流量骤然,就需要进行主从分离。
大部分系统的访问模型是读多写少,读写请求量的差距可能达到几个数量级,所以我们可以通过一主多从的方式, 主库只负责写入和部分核心逻辑的查询,多个从库只负责查询,提升查询性能,降低主库压力。
MySQL 主从还能做到服务高可用,当主库宕机时,从库可以切成主库,保证服务的高可用,然后主库也可以做数据的容灾备份。
整体场景总结如下:
MySQL 的主从复制是依赖于 binlog 的,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。
主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步的完成。
详细流程如下:
当主库和从库数据同步时,突然中断怎么办?因为主库与从库之间维持了一个长链接,主库内部有一个线程,专门服务于从库的这个长链接的。
对于下面的情况,假如主库执行如下 SQL,其中 a 和 create_time 都是索引:
我们知道,数据选择了 a 索引和选择 create_time 索引,最后 limit 1 出来的数据一般是不一样的。
所以就会存在这种情况:在 binlog = statement 格式时,主库在执行这条 SQL 时,使用的是索引 a,而从库在执行这条 SQL 时,使用了索引 create_time,最后主从数据不一致了。
那么我们改如何解决呢?
可以把 binlog 格式修改为 row,row 格式的 binlog 日志记录的不是 SQL 原文,而是两个 event:Table_map 和 Delete_rows。
Table_map event 说明要操作的表,Delete_rows event用于定义要删除的行为,记录删除的具体行数。 row 格式的 binlog 记录的就是要删除的主键 ID 信息,因此不会出现主从不一致的问题。
但是如果 SQL 删除 10 万行数据,使用 row 格式就会很占空间的,10 万条数据都在 binlog 里面,写 binlog 的时候也很耗 IO。但是 statement 格式的 binlog 可能会导致数据不一致。
设计 MySQL 的大叔想了一个折中的方案,mixed 格式的 binlog,其实就是 row 和 statement 格式混合使用, 当 MySQL 判断可能数据不一致时,就用 row 格式,否则使用就用 statement 格式。
有时候我们遇到从数据库中获取不到信息的诡异问题时,会纠结于代码中是否有一些逻辑会把之前写入的内容删除,但是你又会发现,过了一段时间再去查询时又可以读到数据了,这基本上就是主从延迟在作怪。
主从延迟,其实就是“从库回放” 完成的时间,与 “主库写 binlog” 完成时间的差值, 会导致从库查询的数据,和主库的不一致 。
谈到 MySQL 数据库主从同步延迟原理,得从 MySQL 的主从复制原理说起:
总结一下主从延迟的主要原因 :主从延迟主要是出现在 “relay log 回放” 这一步,当主库的 TPS 并发较高,产生的 DDL 数量超过从库一个 SQL 线程所能承受的范围,那么延时就产生了,当然还有就是可能与从库的大型 query 语句产生了锁等待。
我们一般会把从库落后的时间作为一个重点的数据库指标做监控和报警,正常的时间是在毫秒级别,一旦落后的时间达到了秒级别就需要告警了。
解决该问题的方法,除了缩短主从延迟的时间,还有一些其它的方法,基本原理都是尽量不查询从库。
具体解决方案如下:
在实际应用场景中,对于一些非常核心的场景,比如库存,支付订单等,需要直接查询从库,其它非核心场景,就不要去查主库了。
两台机器 A 和 B,A 为主库,负责读写,B 为从库,负责读数据。
如果 A 库发生故障,B 库成为主库负责读写,修复故障后,A 成为从库,主库 B 同步数据到从库 A。
一台主库多台从库,A 为主库,负责读写,B、C、D为从库,负责读数据。
如果 A 库发生故障,B 库成为主库负责读写,C、D负责读,修复故障后,A 也成为从库,主库 B 同步数据到从库 A。
精通:信手拈来,知其所以然,再高点就是自己能够实现mysql的部分功能。
熟悉:信手拈来,使用上毫无障碍。
了解:会使用基本常用语法,看得懂常用语句。
入门:看得懂一些,也会写一点。
酱油:啥都不会。
最近,有很多学员留言让我整理一下“零基础如何mysql学习?”.今天青岛电脑培训就整理一下学习MySQL你需要掌握的知识点以及送给新手学习的建议,希望对大家能够有所帮助!给新手的学习建议:1.在学习新的东西的时候,我们至少从三个问题开始。
What?why?how?2.学习需要坚持,如果还没准备好坚持半年比较枯燥的MySQL之旅,那么就别开始。
3.学习东西不在多,在精,市面上有非常多的MySQL教程,不要瞎学,今天这里学一点,明天那里学一点,这样你学的都只是知识点,无法形成一个知识面,知识网络。
4.在学习过程中充满好奇,使用google进行问题搜索,千万不要使用度娘了,质量不高。
至于怎么用Google,请自行搜索。
5.学习的目的在于使用,因此,不要仅仅看书,看一遍,看两遍,你可能还是没什么感觉。
因此学习一开始,就要动手练习,把资料上的情况,模拟一下。
6.请不要在windows上安装mysql进行学习,因为工作中都是linux系统。
我们需要从一开始就是实战,就是生产环境。
7.保持好心态,一步一个脚印的前进。
学习MySQL你需要掌握的知识点:1.系统,当然windos基本的要会。
然后就是Linux系统,现在做MySQLDBA的系统多数都是Linux系统,而生产环境大多又是RedHat,Centos。
其他的Linux和Unix系统可以只做了解。
2.Linux基础,网络,IO,内存,磁盘,CPU。
包括不限于安装,启动过程,目录结构,远程登录,文件属性与管理,用户与用户权限,LAMP结构vim,yum等shell命令,dns,ftp,以及一些常用工具。
3.MySQL基础:MySQL安装、MySQL体系结构,SQL,MySQL管理维护。
4.数据备份与恢复,常用的引擎:MyISAM、Innodb、NDB等。
5.数据库设计优化,一个好的MySQL系统,往往从设计开始。
6.SQL优化,参数优化,监控,安全等。
7.MySQL负载均衡,读写分离,MHA,MMM高可用架构,以及分布式架构:mycat、maxscale、galeracluster、MySQLGroupReplication等。
8.mysql5.6,mysql5.7新特性,mariadb、percona分支的差异和特点。
9.MySQLJSON、MySQLmemcached。
10.常见MySQL搭配的缓存系统,redis,memcached,以及NOSQL、NEWSQL。
以上,就是小编为大家整理的mysql学习你需要掌握的知识点以及送给新手学习的建议,希望能够帮助到大家!
数据库是当今世界最重要的技术,甚至都不用谦虚的加之一!
为什么?因为它是各种应用的基础!大数据,看名字就知道离不开数据库。人工智能,如果没有数据,你哪来的智能?网络,网络上的内容还不是存在数据库里的?管理系统,管理的是什么?还不是数据吗!哪怕你手机里的联系人,也是存在数据里的哦。
数据库是我们每天都会用到的一个工具,但我们都不知道它的存在。对于数据库,我们可以理解成数据的仓库,里面用表格的形式分门别类地存放你的数据。我们可以通过一种称为SQL的语言操作这些表。
SQL一般指结构化查询语言(Structured Query Language),简称SQL。
当然了,数据库系统还会提供一定的安全防护功能,备份和恢复功能。
如果我们想学习数据库的使用,要掌握哪些基础的技能才算入门呢?
一、理解数据库的实际意义,也就是前文说的表格形式存放数据。
二、要掌握基本的数据操作命令,一般就是四种:查询、插入、更新、删除。这个对应生活中的以下场景,上网浏览就是查询,发朋友圈就是插入,换个头像就是更新,撤回就是删除。
三、要能用编程语言操作数据,无论什么编程语言操作数据库都是按照以下的思路进行的:
1、连接到数据库
2、操作数据库,方式一般就四种:查询、插入、更新、删除。
3、关闭连接
四、当然了,还要能搭建一个数据库软件环境才行,常用的就是微软的SQLSERVER,图形化界面使用方便,只不过文件非常大。或者就是Mysql,字符操作,当然现在也有很多配套的软件可以方便的操作,推荐小皮面板,有兴趣的朋友可以百度或者看我发的图文里有。
一般地,掌握了上面的四个知识就算入门了,就可以写一些数据相关的小应用了。