1、该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务串行的写入二进制日志,在事件写入二进制日志完成后,master通知存储引擎提交事务。此后可接收slave的请求
2、下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始在主节点上binlog dump process(二进制转存线程)。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
3、 SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
I/O线程:将master数据库二进制日志拉到slave数据库上,并将二进制日志写到中继日志,写完之后,他会睡眠并等待master数据库二进制日志更新,一旦更新,就会写入slave数据库的中继日志中
SQL线程:读取中继日志的事件,并在数据库中执行,写入到内存中,使slave数据库的数据与master数据库中的数据一致
Mysql实现企业级数据库主从复制架构实战
注意:slave数据库只能是可读的,不能是可写的,如果改变了slave数据库的数据,master不能从slave数据库上同步数据,导致主从数据库数据不一致。
实战演练 一、环境准备centos系统服务器2台、一台用户做Mysql主服务器,一台用于做Mysql从服务器,都在同一个网段中,配置好yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信
二、准备步骤:1、iptables -F && setenforce 清空防火墙策略,关闭selinux
2、拿两台服务器都使用yum方式安装Mysql服务,要求版本一致
3、分别启动两台服务器mysql服务,确保服务正常
三、实现步骤: 1、配置master主服务器对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值
vim /etc/my.cnf
server-id=1 #配置server-id,让主服务器有唯一ID号(让从服务器知道他的主服务器是谁)
log-bin=mysql-bin #打开Mysql日志,日志格式为二进制
skip-name-resolve#关闭名称解析,(非必须)
然后重启数据库服务
systemctl restart mariadb
2.创建复制帐号在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master
。进行复制操作的用户会授予REPLICATION SLAVE权限。(给从服务器授权,让他能从主服务器拷贝二进制日志)
mysql
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';
3.查看主服务器状态在Master的数据库执行show master status,查看主服务器二进制日志状态
4、配置slave从服务器对slave进行配置,打开中继日志,指定唯一的servr ID,设置只读权限。在配置文件加入如下值
vim /etc/my.cnf
server-id=2 #配置server-id,让从服务器有唯一ID号
relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制
read_only = 1 #设置只读权限
log_bin = mysql-bin #开启从服务器二进制日志
log_slave_updates = 1 #使得更新的数据写进二进制日志中
然后重启数据库服务systemctl restart mariadb
5.启动从服务器复制线程让slave连接master,并开始重做master二进制日志中的事件。
mysql
CHANGE MASTER TO MASTER_HOST='192.168.10.190',
MASTER_USER='slave',
MASTER_PASSWORD='magedu',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=278;
执行start slave;# 启动复制线程。
6、查看从服务器状态可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看前复制状态:
mysql
SHOW SLAVE STATUS\G
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
7.测试理想的结果是在主服务器上添加的数据,在从服务器上也会同步
在主服务器上