什么是数据库主从架构?
主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。
下面用一张图简单介绍一下,主从架构
读写分离的好处?
- 将读操作和写操作分离到不同的数据库上,避免主服务器出现性能瓶颈;
- 主服务器进行写操作时,不影响查询应用服务器的查询性能,降低阻塞,提高并发;
数据拥有多个容灾副本,提高数据安全性,同时当主服务器故障时,可立即切换到其他服务器,提高系统可用性;
为什么需要主从架构呢?
高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库。
- 读写分离,提供查询服务,减少主库压力,提升性能
-
主从部署必要条件
主库开启binlog日志(设置log-bin参数)
- 主从server-id不同
-
主从复制的原理?
简单来说就是分三步曲进行:
主数据库有个bin log二进制文件,纪录了所有增删改SQL语句。(binlog线程)
- 从数据库把主数据库的bin log文件的SQL 语句复制到自己的中继日志 relay log(io线程)
- 从数据库的relay log重做日志文件,再执行一次这些sql语句。(Sql执行线程)
主从复制过程如图:
上图主从复制过程分了五个步骤进行:
- 主库的更新SQL(update、insert、delete)被写到binlog
- 从库发起连接,连接到主库。
- 此时主库创建一个binlog dump thread,把bin log的内容发送到从库。
- 从库启动之后,创建一个I/O线程,读取主库传过来的bin log内容并写入到relay log
- 从库还会创建一个SQL线程,从relay log里面读取内容,从ExecMasterLog_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
主从、主主与主备架构
主从架构可以分为,一主一从、一主多从。
一主一从:即一台是主数据库,同时对外提供读写操作。一台是从数据库,对外提供读的操作。数据从主库同步到从库。
- 优点:从库支持读,分担了主库的压力,提升了并发度。一个机器故障了可以自动切换,操作比较简单。
- 缺点:一台从库,并发支持还是不够,并且一共两台机器,还是存在同时故障的机率,不够高可用。
一主多从:即一台是主数据库,多台从数据库。
- 优点:多个从库支持读,分担了主库的压力,明显提升读的并发度。
- 缺点:只有一台主机写,因此写的并发度不高
主主架构:两台都是主数据库,同时对外提供读写操作。客户端访问任意一台。数据存在双向同步。
- 优点:读写的并发度都明显提升,可以任意节点读写,可以自动剔除故障节点,具有较高的可靠性。
- 缺点:数据量不支持特别大。要避免大事务卡死,如果集群节点一个变慢,其他节点也会跟着变慢。
主备架构:一台是主数据库,同时对外提供读写操作。一台是备库,只作为备份作用,不对外提供读写,主机挂了它就取而代之。数据从主库同步到备库。
- 优点:一个机器故障了可以自动切换,操作比较简单。
- 缺点:只有一个库在工作,读写压力大,未能实现读写分离,并发也有一定限制
MySQL是怎么保证主从一致的?
从主从复制原理了解到从库拿到并执行主库的binlog日志,就可以保持数据与主库一致了。
这是为什么呢?哪些情况会导致不一致呢?长链接
主库和从库在同步数据的过程中断怎么办呢,数据不就会丢失了嘛。因此主库与从库之间维持了一个长链接,主库内部有一个线程,专门服务于从库的这个长链接的。binlog格式
binlog 日志有三种格式,分别是statement,row和mixed。
statement格式,binlog记录的是SQL的原文。
row格式,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录为两个event:Table_map 和 Delete_rows。Table_map event说明要操作的表,Delete_rows event用于定义要删除的行为,记录删除的具体行数。
mixed格式,以上两种的混合使用。当MySQL判断可能数据不一致时,就用row格式,否则使用就用statement格式。
使用statement格式,如果主库和从库选的索引不一致,可能会导致主从库不一致。
可以把binlog格式修改为row。row格式的binlog记录的就是要删除的主键ID信息,因此不会出现主从不一致的问题。
但是如果SQL删除10万行数据,使用row格式就会很占空间的,10万条数据都在binlog里面,写binlog的时候也很耗IO。但是statement格式的binlog可能会导致数据不一致,因此设计MySQL采用了一个折中的方案,mixed格式的binlog。所谓的mixed格式其实就是row和statement格式混合使用,当MySQL判断可能数据不一致时,就用row格式,否则使用就用statement格式。
附参考资料: