MySQL主从复制,并行复制,半同步复制和组复制

主从复制

主从复制过程存在三个线程,Master端的I/O线程,Slave的I/O线程与SQL线程。Master端需要开启binlog日志,Slave端需要开启relaylog。
1、Slave端的I/O读取master.info文件,获取binlog文件名和位置点,然后向Master端的I/O线程请求,该binlog文件名和位置点的binlog信息。
(master.info文件在配置主从复制时使用change master命令来指定生成)
2、Master端的I/O线程会根据Slave端的I/O线程请求的信息来读取Master的binlog日志信息与及读取到最新的binlog文件名和位置点一同返回给Slave的I/O线程。
3、Slave端的I/O线程会把获取到的binlog日志写入relaylog(中继日志)文件中,并且更新master.info文件信息。(把读取到Master最新的binlog日志文件名和位置点更新到master.info文件中,下一次当前位置去读取Master的binlog日志)
4、Slave端的SQL线程会定期读取relaylog,把二进制的日志解析成SQL语句,并执行这些SQL语句,同步数据到从库中。
图解:
在这里插入图片描述
注: mysql 数据库的版本,两个数据库版本要相同,或者 slave 比 master 版本高

主从复制

环境:
Server1(master):172.25.24.1
Server2(slave):172.25.24.2
Mysql 版本:5.7
本篇博客中涉及的所有软件包下载可参考此博客:https://blog.csdn.net/qq657886445/article/details/83662696

Server1
安装 mysql
在这里插入图片描述

vim /etc/my.cnf 修改配置文件 并开启 mysql
在[mysqld]下添加以下参数
server-id=1                        #必须为 1 到 232-1 之间的一个正整数值
log-bin=mysql-bin              #启动二进制日志系统

在这里插入图片描述

mysql 初始化

cat /var/log/mysqld.log | grep password   #查看初始密码
mysql_secure_installation          #安全初始化  Westos.3q

Enter password for user root:             #输入从日志中查看到的密码
Change the password for root ? ((Press y|Y for Yes, any other key for No) :  #是否修改root密码,此处回车即可
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y    #是否移除匿名用户
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y   #是否禁止root用户远程登陆
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y   #是否移除test测试库
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y       #是否刷新数据库授权表

在这里插入图片描述

登陆 mysql 进行授权

GRANT REPLICATION SLAVE ON *.* TO redhat@'%' IDENTIFIED BY 'Westos.3q';

在这里插入图片描述

Server2
安装 mysql
在这里插入图片描述

vim /etc/my.cnf 修改配置文件 并开启 mysql
添加
server-id=2

在这里插入图片描述

mysql 初始化 #密码在/var/log/mysqld.log 中查看
在这里插入图片描述

登陆 mysql 指定要复制的 master,并开启 slave

change master to master_host='172.25.24.1',master_user='redhat',master_password='Westos.3q',master_log_file='mysql-bin.000003',master_log_pos=995;   #指定要复制的 master   在master主机中登陆数据库show master status; 查看master_log_file和master_log_pos
start slave;      #开启 slave

在这里插入图片描述

show slave status \G;     #查看 slave 状态信息,以下两个线程为 Yes 表示连接成功即主从复制配置完成
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

在这里插入图片描述

基于gtid主从复制

GTID:
1)全局事务标识:global transaction identifiers。
2)GTID是一个事务一一对应,并且全局唯一ID。
3)一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4)GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
5)MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6)在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

组成:
1)GTID = source_id:transaction_id
2)source_id:用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
3)transaction_id:为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。

原理:
1)master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2)slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3)sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4)如果有记录,说明该GTID的事务已经执行,slave会忽略。
5)如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

具体配置

基于主从配置只需在mysql配置文件中开启gtid模式即可
Server1:

vim /etc/my.cnf修改配置文件 并重启mysql
在[mysqld]下添加y以下参数
gtid_mode=on        #开启gtid模式
enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持

在这里插入图片描述

Server2:
修改配置文件并重启数据库

vim /etc/my.cnf
添加
gtid_mode=ON
enforce_gtid_consistency=true

在这里插入图片描述

登陆数据库关闭slave重新指定master
mysql -p
stop slave;
change master to master_host='172.25.24.1',master_user='redhat',master_password='Westos.3q',master_auto_position=1;
start slave;
show slave status \G;

在这里插入图片描述

若是出现如下报错:
在这里插入图片描述
是由于主键冲突报错
此时先在master端reset master, 然后在slave端关掉slave,reset ,然后再打开slave就好了
在这里插入图片描述
在这里插入图片描述

并行复制

基于组的并发复制,可以支持在一个database中,并发执行relaylog中的事务。相同的二进制日志组在master上提交并行应用到slave节点上,没有跨数据库的限制,并且不需要把数据分割到多个数据库。

配置

Slave端:
修改配置文件并重启mysql

vim /etc/my.cnf
添加以下参数
 slave-parallel-type=LOGICAL_CLOCK     #基于组提交的并行用户
 slave-parallel-workers=16             #开启16个worker:单线程变成多线程(前两个必须加入,后面为优化)
 master_info_repository=TABLE          #优化选项,默认以文件存储,记录master信息,用表来记录,更新速度更快   
 relay_log_info_repository=TABLE       #读日志信息,用表来记录(原来是记录在磁盘里)
 relay_log_recovery=ON                 #激活recovery:读取master二进制日志,如果损坏,直接丢弃然后重新读取

在这里插入图片描述
配置完成,登陆数据库,在mysql数据库中可以看见系统自动建立了三个表
在这里插入图片描述

show processlist;           #查看线程

在这里插入图片描述

半同步复制

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
只当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
图解:
在这里插入图片描述

配置

两边进入数据库加入模块 ,开启即可,
注:
SET GLOBAL rpl_semi_sync_master_enabled=1;
SET GLOBAL rpl_semi_sync_slave_enabled=1;
此参数每当数据库关闭再次开启时都会失效,如果要永久生效则将其分别写到master端和slave端的mysql配置文件/etc/my.cnf里即可

master端:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=1;

在这里插入图片描述

slave端:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled=1;
stop slave io_thread;                        #停止io线程
start slave io_thread;                       #开启io线程
show status like '%rpl%';                 #查看模块状态

在这里插入图片描述

master端:
show status like ‘%rpl%’;
在这里插入图片描述
show variables like ‘%rpl%’;
在这里插入图片描述
show plugins; # 查看插件
在这里插入图片描述

级联复制

级联复制:是指从主场地复制过来的又从该场地再次复制到其他场地,即A场地把数据复制到B场地,B场地又把这些数据或其中部分数据再复制到其他场地。
server1(主) -> server2(从,主) -> server3(从)
server2为中继节点既是master也是slave

配置

Server1:
备份数据库

mysqldump -p linux > linux.sql
scp linux.sql server3:

Server2:
修改配置文件

vim /etc/my.cnf           

server-id=2
log-bin=mysql-bin
log-slave-updates=ON

gtid_mode=ON
enforce_gtid_consistency=true

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1

在这里插入图片描述

登陆数据库安装模块并授权

	INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
	SET GLOBAL rpl_semi_sync_master_enabled=1;
	GRANT REPLICATION SLAVE ON *.* TO redhat@'%' IDENTIFIED BY 'Westos.3q';

在这里插入图片描述
重启数据库

/etc/init.d/mysqld restart  

Server3:
安装mysql,安全初始化并开启mysql ,使用server1中数据库备份文件恢复数据库

mysqladmin -p create linux
mysql -p linux < linux.sql

vim /etc/my.cnf          #修改配置文件
server-id=3

gtid_mode=ON
enforce_gtid_consistency=true

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

rpl-semi-sync-slave-enabled=1

在这里插入图片描述

登陆数据库

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

重启数据库

/etc/init.d/mysqld restart

在这里插入图片描述
登陆数据库

change master to master_host='172.25.24.2',master_user='redhat',master_password='Westos.3q',master_auto_position=1;
start slave;
show slave status\G;

在这里插入图片描述

SET GLOBAL rpl_semi_sync_slave_enabled=1;
stop slave io_thread;
start slave io_thread;
show status like '%rpl%';

在这里插入图片描述

测试:
在server1中linux库的redhat表中插入数据,server2和server3都同步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组复制之多主模式

组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomicmessage)和完全有序信息交互等保障机制,实现了基于复制协议的多主更新
复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。
图解:
在这里插入图片描述

配置

Server1

rm -fr /var/lib/mysql/*           # 为确保数据一致性,若是之前安装过数据库就删除所有数据,若没有安装过直接安装mysql即可
vim /etc/my.cnf 
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="b8b8d7dd-9312-4539-971c-b013f49d6e51"      # uuid  可用uuidgen命令生成
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.1:24901"
loose-group_replication_group_seeds= "172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="172.25.0.0/24"
loose-group_replication_enforce_update_everywhere_checks=on

在这里插入图片描述
在这里插入图片描述

/etc/init.d/mysqld start
grep password /var/log/mysqld.log 
mysql_secure_installation         #安全初始化

在这里插入图片描述
登陆数据库

SET SQL_LOG_BIN=0;              #关闭二进制日志
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Westos.3q'; FLUSH PRIVILEGES;
reset master;                   #清除日志
SET SQL_LOG_BIN=1;              #启动二进制日志
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.3q' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;  #需注意本地解析,若解析不对,则会一直显示RECOVERING状态
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
SELECT * FROM t1;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Server2:
若是之前安装过数据库就删除所有数据,若没有安装过直接安装mysql即可
在这里插入图片描述

vim /etc/my.cnf 
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="b8b8d7dd-9312-4539-971c-b013f49d6e51"      # uuid  可用uuidgen命令生成
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.2:24901"
loose-group_replication_group_seeds= "172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="172.25.0.0/24"
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off

/etc/init.d/mysqld start
grep password /var/log/mysqld.log 
mysql_secure_installation        #安全初始化

在这里插入图片描述
在这里插入图片描述
登陆数据库

SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Westos.3q' FLUSH PRIVILEGES;
reset master;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.3q' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在这里插入图片描述

SHOW PLUGINS;
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述

Server3:
为确保数据一致性,若是之前安装过数据库就删除所有数据,若没有安装过直接安装mysql即可

vim /etc/my.cnf 
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="b8b8d7dd-9312-4539-971c-b013f49d6e51"      # uuid  可用uuidgen命令生成
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.3:24901"
loose-group_replication_group_seeds= "172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="172.25.0.0/24"
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off


/etc/init.d/mysqld start
grep password /var/log/mysqld.log 
mysql_secure_installation        #安全初始化

在这里插入图片描述
登陆数据库

SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Westos.3q';  FLUSH PRIVILEGES;
reset master;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.3q' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在这里插入图片描述

SHOW PLUGINS;
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述

测试:
在三台主机任何一个上登陆数据库在test测试库中插入数据,其他两台主机都可以同步复制
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq657886445/article/details/83588877
今日推荐