文章目录

  • 1. 主从复制
  • 1.1 原理
  • 1.2 复制方式
  • 1.3 优势
  • 1.4 搭建
  • 2. 半同步复制



1. 主从复制

分布式扩展中最常用的一种模式就是主从复制,主从复制的主要作用是通过读写分离提高数据库的并发性能。复制指将主数据库的DDL 和 DML 操作通过二进制日志(bin log)传到从库服务器中,然后在从库上对这些日志重新执行,从而使得从库和主库的数据保持同步。Mysql支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

Mysql默认使用异步复制

1.1 原理

主从复制的原理如下所示,假设此时为单主单从模式:

atlas centos7 mysql 主从复制 mysql 主从复制模式_mysql

如上图所示:

  • 当master节点执行insert、update和delete等DML操作时,对应的语句会按序写入到bin log中
  • slave节点需要使用mater节点提供的账号和密码连接到mater节点,并且对每一个slave节点都创建爱你一个binlog dump线程
  • 当master节点的binlog发生改变时,binlog dump线程会通知所有的slave节点,并将相应的binlog内容推送到slave节点
  • 当IO线程接受到binglog内容后,就将内容写入到slave节点本地的relay log中
  • SQL线程就会读取IO线程写入的relay log,并且根据relay log的内容对slave节点的数据库做相应的操作;操作执行成功后,relay log中的内容将会被删除

1.2 复制方式

由于主从复制依赖于二进制日志文件(binlog),而binlog有三种格式:

  • Statement:基于SQL语句级别,记录每条修改数据的SQL语句
  • Row:基于行级别,记录每行数据的详细变化;一致性更好,但更大
  • Mixed:混合模式,默认使用Statement

因此,主从复制也就有三种方式:

  • binlog_format=Statement:基于SQL语句的复制
  • binlog_format=Row:基于行的复制
  • binlog_format=Mixed:混合复制模式

1.3 优势

主从复制的优势主要包含如下几点:

  • 当master节点发生故障时,可以快速的切换到slave节点继续提供服务,保证数据库服务的可用性
  • 可以在salve节点上执行查询操作,而master节点执行更新等改变数据的操作,从而实现读写分离,降低mater节点的访问压力
  • 可以在slave节点中执行备份,以避免备份期间影响mater节点的服务

1.4 搭建

主从复制常用的搭建方式有:

  • 单主单从
  • 一主多从
  • 多级复制
  • 双主复制,Dual Master
  • 双主多级复制

这里以最简单的单主单从的模型进行说明如何搭建,过程如下:

  • 首先,编辑作为mater节点的MySQL的配置文件(/usr/my.cnf),内容如下:
#mysql 服务ID,保证整个集群环境中唯一
server-id=1

#mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin

#错误日志,默认已经开启
#log-err

#mysql的安装目录
#basedir

#mysql的临时目录
#tmpdir

#mysql的数据存放目录
#datadir

#是否只读,1 代表只读, 0 代表读写
read-only=0

#忽略的数据, 指不需要同步的数据库
binlog-ignore-db=mysql

#指定同步的数据库,如不指定,默认同步所有数据库
#binlog-do-db=db01
  • 重启MySQL服务
service mysql restart;
  • 创建同步数据的账户,并且进行授权操作
grant replication slave on *.* to 'root'@'xxx.xxx.xxx.xxx' identified by 'root';
flush privileges;

通过show master status可以查看mater节点的状态

atlas centos7 mysql 主从复制 mysql 主从复制模式_主从复制_02

其中:

  • File : 从哪个日志文件开始推送日志文件
  • Position : 从哪个位置开始推送日志
  • Binlog_Ignore_DB : 指定不需要同步的数据库
  • 然后,继续配置slave节点,同样先修改配置文件,添加如下内容:
#mysql服务端ID,唯一,不和mater节点的id相同即可
server-id=2

#指定binlog日志
log-bin=/var/lib/mysql/mysqlbin
  • 重启slave节点的MySQL
service mysql restart;
  • 连接到master节点
change master to master_host= 'xxx.xxx.xxx.xxx, master_user='root',
master_password='root', master_log_file='mysqlbin.000001', master_log_pos=413;
  • 开启同步操作
start slave;

show slave status;
  • 停止同步操作:stop slave;

MySQL主从复制读写分离,看这篇就够了!


2. 半同步复制

Mysql默认使用的是异步复制,由于异步操作所带来的延迟,当主库由于某种原因导致binlog日志的丢失,没有成功的同步到从库上,那么就会造成主从之间的不一致性。导致不一致性出现的原因是因为:异步复制中,主库在执行完对binlog的commit操作后即可返回客户端,无需等待binlog日志成功的传送到从库上



atlas centos7 mysql 主从复制 mysql 主从复制模式_数据_03


而半同步复制执行时,为了保证主库中的binlog能够被可靠的复制到从库上,主库在每次事务成功提交后,并不是立即返回给客户端,而是等待binlog至少在一个从库上成功提交并写入到relaylog中。只有binlog成功的写入到了其中的一个从库中,主库才会给客户端反馈。

半同步通过上述的操作保证了主库的binlog和其中某一个从库的relaylog中都至少成功了保存了日志,进一步的保证了数据的完整性和一致性。



atlas centos7 mysql 主从复制 mysql 主从复制模式_主从复制_04


如上所示,只要主库相关的操作过程中,因为某种原因导致事务未成功提交,这时从库也没有收到主库的binlog日志,从而保证了数据的一致性。另外,如果在从主库传输binlog到从库的过程中发生问题,那么主库会等待一段时间,如果之后仍然没有传输成功,那么复制方式会调整为异步复制,等待事务成功提交后再反馈给客户端。