mysql主从复制
Posted An.amazing.rookie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql主从复制相关的知识,希望对你有一定的参考价值。
mysql一主一从
主从复制工作过程
mysql主从复制依赖于二进制日志;用户发送请求更新数据,数据库更新后生成二进制日志,主节点把新生成的二进制日志通过dump线程通过网络发送给从节点;从节点的io thread负责接收二进制日志,把二进制日志的内容放到中继日志中(relay log);从节点通过sql thread线程执行中继日志中的sql语句,实现更新本机的数据库数据
主从复制原理图如下:
主节点配置:
[root@centos7 ~]# vim /etc/my.cnf [mysqld] innodb-file-per-table #指定存储引擎 server-id=7 #设置区分主从的id;mysql配置文件不区分"_"和"-" log-bin #主节点必须启用二进制日志,主从复制基于二进制日志 [root@centos7 ~]# systemctl retart mariadb [root@centos7 ~]# mysql MariaDB [(none)]> grant replication slave on *.* to repluser@‘192.168.38.%‘ identified by ‘centos‘; #创建并授权一个账号,用于从节点连接主节点复制数据用,授权权限为从节点复制
从节点配置
[root@localhost ~]$ vim /etc/my.cnf #修改必须指定的配置 [mysqld] server-id=17 #指定id号,用以区分是本机通过sql语句更新的数据库还是通过主节点的二进制日志更新的数据库 read-only=on #设置为只读 [root@localhost ~]$ systemctl restart mariadb [root@localhost ~]$ mysql MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST=‘192.168.38.7‘, #指定主节点的IP MASTER_USER=‘repluser‘, #指定连接主节点的用户名 MASTER_PASSWORD=‘centos‘, #指定连接主节点的密码 MASTER_PORT=3306, MASTER_LOG_FILE=‘mariadb-bin.000001‘, #指定从主节点的哪个二进制日志开始复制,指定二进制日志文件名 MASTER_LOG_POS=245; #指定从主节点二进制日志位置开始复制的位置 MariaDB [(none)]> start slave; #开启从节点的io thread和sql thread两个线程 MariaDB [(none)]> show processlist; #可以查看当前进程列表 MariaDB [(none)]> show slave statusG #可以查看从节点的相关信息
将原有的一台mysql,实现主从复制
实验目的:前期访问量小,一台Mysql服务器足以应付;后期发现服务器压力大,需要增加一台从服务器
主节点配置:
[root@centos7 ~]# vim /etc/my.cnf #配置文件中必须开启的 [mysqld] log-bin server-id=7 [root@centos7 ~]# systemctl restart mariadb [root@centos7 ~]# mysqldump -A -F --single-transaction --master-data=1 > /data/`date +"%F-%T"_`all.sql #做完全备份;针对所有数据库、开启二进制日志、开启事务、生成新的日志并且记录二进制日志位置 [root@centos7 ~]# less /data/2019-11-25-17:44:54_all.sql #完全备份里面会有一行:CHANGE MASTER TO MASTER_LOG_FILE=‘mariadb-bin.000002‘(二进制日志名字根据配置文件中自己的设置), MASTER_LOG_POS=245(位置根据当时自己服务器的情况);这条记录之前的数据都做了备份,这条记录之后的都没有做备份 [root@centos7 ~]# scp /data/2019-11-25-17:44:54_all.sql 192.168.38.47:/data/ #把备份发送给从节点 [root@centos7 ~]# mysql MariaDB [(none)]> grant replication slave on *.* to repluser@‘192.168.38.%‘ identified by ‘centos‘; #创建授权用户
从节点配置
[root@localhost ~]# vim /etc/my.cnf [mysqld] server-id=27 read-only=on [root@localhost ~]# systemctl restart mariadb [root@localhost ~]# vim /data/2019-11-25-17:44:54_all.sql #编辑备份文件 CHANGE MASTER TO #在change master to和MASTER_LOG_FILE之间加上主节点的各种信息;备份文件中加入之后,就不用在mysql数据库中进行添加了 MASTER_HOST=‘192.168.38.7‘, MASTER_USER=‘repluser‘, MASTER_PASSWORD=‘centos‘, MASTER_PORT=3306, MASTER_LOG_FILE=‘mariadb-bin.000002‘, MASTER_LOG_POS=245; [root@localhost ~]# mysql < /data/2019-11-25-17:44:54_all.sql 把备份导入mysql数据库 [root@localhost ~]# mysql MariaDB [(none)]> start slave; #开启从节点的两个线程
级联复制
模型:
最少准备三台机器,一台主,两台从
主节点配置:
[root@centos7 data]# vim /etc/my.cnf [mysqld] log-bin server-id=7 [root@centos7 data]# systemctl restart mariadb [root@centos7 data]# mysqldump -A -F --single-transaction --master-data=1 > /data/`date +%F`-all.sql #完全备份 [root@centos7 data]# scp 2019-11-25-all.sql 192.168.38.37:/data [root@centos7 data]# scp 2019-11-25-all.sql 192.168.38.47:/data [root@centos7 data]# mysql MariaDB [(none)]> grant replication slave on *.* to repluser@‘192.168.38.%‘ identified by ‘centos‘;
中间的从节点配置:
[root@localhost ~]# vim /etc/my.cnf [mysqld] log-bin #中间从节点必须开启二进制日志;中间从节点相当于又是从又是主 server-id=17 log-slave-updates #必须开启;把本机中继日志中的sql语句执行完毕后,在本机生成二进制日志;不加这项,默认中继日志中的sql语句是不会产生二进制日志 read-only [root@localhost ~]# systemctl restart mariadb [root@localhost ~]# vim /data/2019-11-25-all.sql #在数据库备份中进行配置 CHANGE MASTER TO MASTER_HOST=‘192.168.38.7‘, MASTER_USER=‘repluser‘, MASTER_PASSWORD=‘centos‘, MASTER_PORT=3306, MASTER_LOG_FILE=‘mariadb-bin.000003‘, MASTER_LOG_POS=245; #根据当时的备份自动配置 [root@localhost ~]# mysql < /data/2019-11-25-all.sql #导入数据库备份 [root@localhost ~]# mysql MariaDB [(none)]> start slave;
最下级从节点配置:
[root@localhost ~]# vim /etc/my.cnf [mysqld] server-id=27 read-only [root@localhost ~]# systemctl restart mariadb [root@localhost ~]# vim /data/2019-11-25-all.sql CHANGE MASTER TO MASTER_HOST=‘192.168.38.37‘, MASTER_USER=‘repluser‘, MASTER_PASSWORD=‘centos‘, MASTER_PORT=3306, MASTER_LOG_FILE=‘mariadb-bin.000001‘, MASTER_LOG_POS=514701; #在中间的从节点上进行查询二进制日志为,使用show master logs;进行查询 [root@localhost ~]# mysql < /data/2019-11-25-all.sql [root@localhost ~]# mysql MariaDB [(none)]> start slave;
主主复制
主主复制一般不单独使用,一般一个主节点担当写操作,另一个主节点只担当读操作,一个主节点坏了,再提升另一个主节点
第一个主节点配置:
[root@centos7 ~]# vim /etc/my.cnf [mysqld] log-bin server-id=7 auto_increment_offset=1 #对数据库表的id字段进行区分;初始值为1,增长幅度为2;只记录奇数行,id字段必须为自动增长,以免造成数据不一致 auto_increment_increment=2 [root@centos7 ~]# systemctl restart mariadb [root@centos7 ~]# mysqldump -A -F --single-transaction --master-data=1 > /data/`date +%F`--all.sql #完全备份 [root@centos7 ~]# scp /data/2019-11-25--all.sql 192.168.38.37:/data [root@centos7 ~]# mysql MariaDB [(none)]> grant replication slave on *.* to repluser@‘192.168.38.%‘ identified by ‘centos‘;
第二个主节点配置
[root@localhost ~]# vim /etc/my.cnf [mysqld] log-bin server-id=17 auto_increment_offset=2 #id字段以偶数增长,初始值为2,id自动必须设置为自动增长 auto_increment_increment=2 [root@localhost ~]# systemctl restart mariadb [root@localhost ~]# vim /data/2019-11-25--all.sql #编辑备份 CHANGE MASTER TO #设置主节点的相关信息 MASTER_HOST=‘192.168.38.7‘, MASTER_USER=‘repluser‘, MASTER_PASSWORD=‘centos‘, MASTER_PORT=3306, MASTER_LOG_FILE=‘mariadb-bin.000004‘, MASTER_LOG_POS=245; #根据备份自动生成 [root@localhost ~]# mysql MariaDB [(none)]> set sql_log_bin=off; #临时关闭二进制日志,避免导入备份的时候产生大量的二进制日志 MariaDB [test]> source /data/2019-11-25--all.sql #导入备份 MariaDB [test]> start slave; #开启线程
第一个主节点还需要再次配置的内容
两个主节点都是互为主互为从
[root@centos7 ~]# mysql MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST=‘192.168.38.37‘, -> MASTER_USER=‘repluser‘, -> MASTER_PASSWORD=‘centos‘, -> MASTER_PORT=3306, -> MASTER_LOG_FILE=‘mariadb-bin.000002‘, #主节点二进制日志位置,通过在主节点上使用show master logs;进行查看 -> MASTER_LOG_POS=245; MariaDB [(none)]> start slave;
GTID复制
GTID工作原理:
GTID由server_uuid和transaction_id组合而成,每台机器的server_uuid都不同,表现为mysql目录下的auto.cnf文件中 1、GTID需要主从都开启相关的功能;主节点发生数据的更新,把server_uuid和发生的事务的transaction_id一同复制到bin-log中,通过dump线程发送给从节点 2、从节点的io thread负责把接收主节点的bin-log的内容放到relay-log中 3、sql thread执行relay-log中的sql语句,执行前先检查事务的GTID是否执行过,如果执行过,就跳过,没执行过就通过sql thread进行执行 注意: 1、GTID功能从Mysql-5.6以上新添加的功能;并且mysql-5.6必须在配置文件中添加log_slave_updates选项 2、log_slave_updates:把中继日志中的操作同步到二进制日志中;从节点查看复制过来的GTID编号的事务是否执行过,查看的是二进制日志中的GTID,所以此项在Mysql-5.6中必须开启 3、在mysql-5.7开始,不需要设置log_slave_updates这个选项;mysql-5.7在mysql库中添加了gtid_executed表,表中记录了GTID的信息 优点:不需要记录二进制日志的位置
实现GTID----主节点配置
[root@localhost mysql]# vim /etc/my.cnf [mysqld] server-id=17 log-bin=mysql-bin gtid_mode=on #开启GTID enforce_gtid_consistency #强制GTID的一致性 [root@localhost mysql]# service mysqld restart [root@localhost mysql]# mysql mysql> grant replication slave on *.* to ‘repluser‘@‘192.168.38.%‘ identified by ‘centos‘; #授权并且创建从节点连接主节点的账号
从节点配置
[root@localhost ~]# vim /etc/my.cnf [mysqld] server-id=27 gtid_mode=on enforce_gtid_consistency [root@localhost ~]# service mysqld restart [root@localhost ~]# mysql mysql> CHANGE MASTER TO -> MASTER_HOST=‘192.168.38.37‘, -> MASTER_USER=‘repluser‘, -> MASTER_PASSWORD=‘centos‘, -> MASTER_PORT=3306, -> MASTER_AUTO_POSITION=1; #必须开启此项;自动同步主节点位置 mysql> start slave; #开启线程
以上是关于mysql主从复制的主要内容,如果未能解决你的问题,请参考以下文章