mysql主从复制(原理以及配置)
目录
主从原理
Mysql内建的复制功能是构建大型,高性能应用程序的基础。将
Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的
某一台主机(Master)的数据复制到其它主机(slaves)上,并重新执
行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其
它服务器充当从服务器。主服务器将更新写入二进制日志文件,这些日志
可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通
知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器
接收从那时起发生的任何更新,然后*并等待主服务器通知新的更新。
MySQL主从复制主要有三个步骤:
(1) 主服务器(master)将改变记录到二进制日志(binary
log)中(这些记录叫做二进制日志事件,binary log events)
(2) 从服务器(slave)将主服务器master的binary log
events拷贝到它的中继日志(relay log)
(3) slave重做中继日志中的事件,将改变反映它自己的
数据。
在MySQL的主从复制过程中,从服务器上有两个线程起到了很关键的作用,分别是I/O线程和SQL从线程。工作步骤如下图所示:
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的缓存中,所以中继日志的开销很小。
配置实现
实验介绍
主机名 | IP | 角色 |
---|---|---|
mysql1 | 172.25.0.41 | 主服务器 |
mysql2 | 172.25.0.42 | 从服务器 |
要求:对数据库的所有操作,从数据库都能够自动的备份,跟踪。保持跟主数据库的一致性。
配置主服务器:
1、修改配置文件 [aaa@qq.com ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id = 1
log-bin = binlog
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
2、授权复制账户
在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。
MariaDB [(none)]> grant replication slave ,replication client on *.* to aaa@qq.com'172.25.%.%' identified by 'centos';
3、查看主服务器的状态
在Master的数据库执行show master status,查看主服务器二进制日志状态
配置从服务器
1、修改从服务器配置文件
对slave进行配置,打开中继日志,指定唯一的servr ID,设置只读权限 [aaa@qq.com ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id=2
#配置server-id,标识从服务器
relay_log = mysql-relay-bin
#打开Mysql中继日志
read-only =1
#设置从服务器只读权限
log_bin =mysql-bin
#打开从服务器的二进制日志
log_slave_updates =1
#使得更新的数据写进二进制日志中
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
2、启动从服务器复制线程
让slave连接master,并开始重做master二进制日志中的事件。
MariaDB [(none)]> change master to master_host='172.25.0.41', master_user='slave',
master_password='centos',
master_log_file='binlog.000003',
master_log_pos=245;
#master_log_file代表从哪个二进制文件开始执行,
#master_log_pos表示从什么位置开始执行二进制文件。
MariaDB [(none)]> start slave;
#开启slave模式
3、查看从服务器状态 MariaDB [(none)]> show slave status\G;
由上图可知I/O线程是和SQL线程都已经开启,表示从服务器状态正常。
测试:
在主服务器中创建数据库,创建表,添加表信息等操作。然后在从服务器上进行查看,查看的内容是一致的,那么就说明两个数据库的数据是一致的。也就是说,从服务器能够实时的同步主服务器的数据。
注:
如果添加SLAVE服务器的时候,主服务器已经运行了一段时间,此时就需要在从服务器上先同步主服务器之前的数据。可以使用物理的备份方式,复制数据库文件,在复制的过程中注意数据库文件的权限问题,如果数据库文件的权限不够的话,在从数据库中是无法读取到相关信息的。
上一篇: 笔记-2018年5月网络工程师软考