对MySQL数据库复制技术进行深度解析,从主从同步开始,一直到高可用架构实践活动。

MySQL复制,这一数据库高可用架构里的核心技术,借助二进制日志,达成主服务器跟从服务器之间的数据同步,给系统扩展性、数据安全以及查询性能优化,奠定了坚实不拔的基础。

本文会深度剖析,MySQL复制的实现原理,以及配置技巧,还有常见运维场景。

一、复制机制的核心原理

MySQL复制是依照主服务器能持续展开日志记录的二进制日志,其中涵盖所涉及的数据库各种更改操作咯,也就像是这里有针对数据方面包括更新呀除此外还有删除呀等等所有那些会修改数据的语句情形呢。

在从服务器与主服务器进行连接之际时,会把最后一次成功同步的日志位置告知主服务器,紧接着,主服务器会去创建专用dump线程,而后将后续二进制日志内容传送给从服务器。

从服务器依托I/O线程来接收数据,把接收到的数据写入本地中继日志(relay log),之后SQL线程会按照顺序执行日志里的更新操作,借此保持往主服务器数据的一致性。

MySQL主从复制架构_MySQL复制原理_数据库异步复制

这种多线程架构设计保障了复制的健壮性,哪怕从服务器由于种种原因离线较长时段,在重新启动之后,I/O线程能够迅速地从主服务器那里获取积压着的二进制日志,而SQL线程会依据实际的处理能力慢慢应用中继日志,以此防止主服务器因为等待从服务器而没办法清理过期日志。

二、主从复制环境搭建要点

要在主服务器那儿,得先启动二进制日志功能,接着特地搞出个专用的复制账户,最后赋予该账户REPLICATION_SLAVE权限。

从服务器启动起来的时候,要具备那份跟主服务器开启二进制日志当时完全相同的数据副本。倘若不这样,就有致使同步宣告失败的可能性存在。

MySQL 8.0给出了更便利的初始化办法,然而在传统环境里会常用mysqldump协调一致--master-data参数去取得一致性备份。

MySQL主从复制架构_数据库异步复制_MySQL复制原理

为mysql的安装提供前提环境和初始化安装mysql
创建数据库目录
# mkdir /mydata/data –pv
创建mysq用户
# useradd -r mysql
修改权限
# chown -R mysql.mysql /mydata/data/
使用mysql-5.5通用二进制包安装
解压mysql软件包
# tar xf mysql-5.5.28-linux2.6-i686.tar.gz-C /usr/local/
创建连接,为了方便查看mysql的版本等信息
# cd /usr/local/
#ln –sv mysql-5.5.28-linux2.6-i686.tar.gzmysql
修改属主属组
# cd mysql
# chown -R root.mysql ./*
初始化数据库
# scripts/mysql_install_db –user=mysql --datadir=/mydata/data/
提供配置文件
# cp support-files/my-large.cnf /etc/my.cnf
提供服务脚本
# cp support-files/mysql.server/etc/rc.d/init.d/mysqld
添加至服务列表
# chkconfig --add mysqld
# chkconfig --list mysqld
# chkconfig mysqld on
编辑配置文件,提供数据目录
# vim /etc/my.cnf
# The MySQL server  修改mysqld服务器端的内容
log-bin=master-bin 主服务器二进制日志文件前缀名
log-bin-index=master-bin.index  索引文件
innodb_file_per_table= 1     开启innodb的一表一个文件的设置
server-id       = 1          必须是唯一的
datadir =/mydata/data        数据目录路径
启动mysql服务
# servicemysqld start
为了便于下面的测试,设置环境变量
# vim/etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
执行环境变量脚本,使其立即生效
# . /etc/profile.d/mysql.sh

当处于要启动从服务器复制的状态情况下,就应当去确认主服务器的二进制日志文件名以及偏移量,接着借助CHANGE MASTER TO语句来指定连接信息。

数据库异步复制_MySQL主从复制架构_MySQL复制原理

随后执行START SLAVE启动I/O线程和SQL线程。

MySQL复制原理_MySQL主从复制架构_数据库异步复制

借助SHOW SLAVE STATUS能够对复制状态予以监控,着重去关注Slave_IO_Running以及Slave_SQL_Running都呈现为Yes这一情况,意味着复制处于正常状态。

MySQL主从复制架构_数据库异步复制_MySQL复制原理

三、生产环境优化策略

MySQL复制原理_数据库异步复制_MySQL主从复制架构

为杜绝应用发生误向从服务器写入,进而致使出现数据不一致的状况,要在从服务器的配置文件my.cnf里面添加read_only=1这个参数,以此来防止应用误写入从服务器导致数据不一致,并且仅允许拥有SUPER权限的用户开展必要维护,对于从服务器只读作出设置。

MySQL复制原理_数据库异步复制_MySQL主从复制架构

2. 半同步复制得以增强,出现情况为,默认的异步复制,当主服务器崩溃时,存在可能丢失已提交事务这一状况。

建立用户账户
mysql> grant replication slave on *.* to 'chris'@'172.16.%.%' identified by 'work';
刷新数据使其生效
mysql> flush privileges;

开启半同步复制,即要安装semisync_master和semisync_slave插件,之后,主服务器会等待,等待至少有一个从服务器确认收到二进制日志,然后才返回事务提交成功这一情况,如此一来,能大幅降低数据丢失风险。

MySQL复制原理_数据库异步复制_MySQL主从复制架构

配置时需同时修改主从配置文件以永久生效。

创建mysql数据库目录
# mkdir /mydata/data –pv
创建mysql用户
# useradd -r mysql
修改数据目录权限
# chown -R mysql.mysql /mydata/data/
使用mysql-5.5通用二进制包安装mysql
解压mysql软件包
# tar xf mysql-5.5.28-linux2.6-i686.tar.gz-C /usr/local/
创建连接,便于查看mysql的版本等信息
# cd /usr/local/
# ln –sv mysql-5.5.28-linux2.6-i686.tar.gzmysql
修改mysql属主属组
# cd mysql
# chown -R root.mysql ./*
初始化mysql数据库
# scripts/mysql_install_db –user=mysql--datadir=/mydata/data/
提供mysql配置文件
# cp support-files/my-large.cnf /etc/my.cnf
提供服务脚本
# cp support-files/mysql.server /etc/init.d/mysqld
添加至服务列表
# chkconfig --add mysqld
编辑配置文件
# vim /etc/my.cnf
# The MySQL server
#log-bin=mysql-bin      禁用二进制日志,从服务器不需要二进制日志文件
datadir = /mydata/data  mysql的数据目录
relay-log = relay-log   设置中继日志
relay-log-index = relay-log.index  中继日志索引
innodb_file_per_table = 1
server-id       = 2    id不要和主服务器的一样
设置环境变量
# vim/etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
执行此脚本(导出环境变量)
# . /etc/profile.d/mysql.sh
启动服务
# service mysqld start

MySQL复制原理_MySQL主从复制架构_数据库异步复制

3. 复制线程控制:在维护场景中,可能需要临时停止复制。

MySQL复制原理_数据库异步复制_MySQL主从复制架构

经由STOP SLAVE能够停止全部线程,而STOP SLAVE IO_THREAD或者STOP SLAVE SQL_THREAD能够进行单独操控。

数据库异步复制_MySQL复制原理_MySQL主从复制架构

如果期望当服务器开始启动的时候,并不会自动去进行复制这样的操作,那么能够设置skip - slave - start这个参数。

MySQL复制原理_MySQL主从复制架构_数据库异步复制

四、双主架构与高可用延伸

数据库异步复制_MySQL主从复制架构_MySQL复制原理

在双主复制这种架构里,也就是Master-Master架构情形下,存在两台服务器,它们相互之间呈现出主从的关系,这种双主复制架构适用于故障发生时能够进行转移的场景。

配置的关键要点在于,要保证双方日志记录的完整性,而且这种日志是二进制形式的,同时,要把对方当下的日志具体位置当作起始的复制点。

mysql> show master status; #在Master上执行查看二进制文件
在从服务器上开启复制功能
change master to master_host='172.16.7.1',master_user='chris',master_password='work',master_log_file='master-bin.000001',master_log_pos=407;
开启复制功能
mysql>start slave;

需要留意防止循环复制,一般是借助设置auto_increment_increment参数以及auto_increment_offset参数,来达成自增主键冲突的解决。

MySQL复制原理_MySQL主从复制架构_数据库异步复制

五、日志管理与故障恢复

MySQL复制原理_数据库异步复制_MySQL主从复制架构

MySQL数据目录下的二进制日志文件和中继日志是复制基础。

MySQL复制原理_MySQL主从复制架构_数据库异步复制

二进制日志不仅用于复制,还可实现时间点恢复。

进行提议,设置 sync_binlog 等于 1,以此达成强制事务提交之时同步并且写入磁盘的操作,最终防止服务器出现宕机状况致使日志因而丢失。

数据库异步复制_MySQL复制原理_MySQL主从复制架构

服务器的中继日志,是由SQL线程自动进行清理的,然而要是I/O线程因为网络方面的问题,持续不断地接收日志,进而导致SQL线程处理滞后的话,那么就需要对磁盘空间加以监控标点符号分隔开来了句末加上了标点符号。

MySQL主从复制架构_MySQL复制原理_数据库异步复制

若主服务器出现误操作情形,能够临时停下从服务器复制行动(也就是执行 STOP SLAVE 操作) ,借助从服务器的数据去抢救被误删除的记录,随后再进行重新同步。

除此之外,开启GTID(也就是全局事务标识符)能够让复制拓扑的故障转移流程得以简化,它在MySQL 5.6以及更高版本当中被广泛运用。

MySQL主从复制架构_数据库异步复制_MySQL复制原理

MySQL复制技术,借助灵活的多线程模型,以及日志机制,为构建可扩展的数据库架构,提供了可靠基石,同时也为构建高可用的数据库架构,再度提供了可靠基石。

数据库异步复制_MySQL主从复制架构_MySQL复制原理

于实际运维期间,要依据业务特性来综合考量,恰当地抉择异步模式、半同步模式或者组复制模式,借助监控工具与自动化工具,保障复制链路始终处于健康状态,最终达成数据安全与系统性能之间的平衡。

MySQL主从复制架构_数据库异步复制_MySQL复制原理