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
将原有的一台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 ~]
最下级从节点配置:
[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; #开启线程