文章目录
- 1. 主从复制
- 1.1 原理
- 1.2 复制方式
- 1.3 优势
- 1.4 搭建
- 2. 半同步复制
1. 主从复制
分布式扩展中最常用的一种模式就是主从复制,主从复制的主要作用是通过读写分离提高数据库的并发性能。复制指将主数据库的DDL 和 DML 操作通过二进制日志(bin log)传到从库服务器中,然后在从库上对这些日志重新执行,从而使得从库和主库的数据保持同步。Mysql支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
Mysql默认使用异步复制。
1.1 原理
主从复制的原理如下所示,假设此时为单主单从模式:
如上图所示:
- 当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节点的状态
其中:
- 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;
2. 半同步复制
Mysql默认使用的是异步复制,由于异步操作所带来的延迟,当主库由于某种原因导致binlog日志的丢失,没有成功的同步到从库上,那么就会造成主从之间的不一致性。导致不一致性出现的原因是因为:异步复制中,主库在执行完对binlog的commit操作后即可返回客户端,无需等待binlog日志成功的传送到从库上。
而半同步复制执行时,为了保证主库中的binlog能够被可靠的复制到从库上,主库在每次事务成功提交后,并不是立即返回给客户端,而是等待binlog至少在一个从库上成功提交并写入到relaylog中。只有binlog成功的写入到了其中的一个从库中,主库才会给客户端反馈。
半同步通过上述的操作保证了主库的binlog和其中某一个从库的relaylog中都至少成功了保存了日志,进一步的保证了数据的完整性和一致性。
如上所示,只要主库相关的操作过程中,因为某种原因导致事务未成功提交,这时从库也没有收到主库的binlog日志,从而保证了数据的一致性。另外,如果在从主库传输binlog到从库的过程中发生问题,那么主库会等待一段时间,如果之后仍然没有传输成功,那么复制方式会调整为异步复制,等待事务成功提交后再反馈给客户端。