Mysql数据库的主从复制(基于二进制文件、基于gtid)的三种模式详解

1.MySQL主从复制原理

MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:
在这里插入图片描述
主节点 binary log dump 线程

当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。

从节点I/O线程

当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。

从节点SQL线程

SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。
因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:
在这里插入图片描述

复制的基本过程如下:

从节点上的I/O 进程连接主节点,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
 主节点接收到来自从节点的I/O请求后,通过负责复制的I/O进程根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包括本次返回的信息的bin-log file 的以及bin-log position;
 从节点的I/O进程接收到内容后,将接收到的日志内容更新到本机的relay log中,并将读取到的binary log文件名和位置保存到master-info 文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log 的哪个位置开始往后的日志内容,请发给我”;
 Slave 的 SQL线程检测到relay-log 中新增加了内容后,会将relay-log的内容解析成在祝节点上实际执行过的操作,并在本数据库中执行。

2.Mysql的主从异步复制(Asynchronous replication)

(1)异步的解释:

1、逻辑上

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

2、技术上

主库将事务 Binlog 事件写入到 Binlog 文件中,此时主库只会通知一下 Dump 线程发送这些新的 Binlog,然后主库就会继续处理提交操作,而此时不会保证这些 Binlog 传到任何一个从库节点上。

(2)异步复制的实现:

所需环境:主库:172.25.33.1 server1
从库:172.25.33.2 server2

主库的操作如下:
<1>下载所需安装包并解包:

[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar 
[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm
mysql-community-test-5.7.24-1.el7.x86_64.rpm

在这里插入图片描述
<2>删除不需要的rpm包并安装剩余的rpm包:

[root@server1 ~]# rm -fr mysql-community-devel-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# rm -fr mysql-community-embedded-5.7.24-1.el7.x86_64.rpm mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm mysql-community-test-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# yum install -y *.rpm

在这里插入图片描述
<3>修改配置文件,启动数据库,并获得生成的初始密码:

[root@server1 ~]# vim /etc/my.cnf

 29 log-bin=mysql-bin
 30 server-id=1

[root@server1 ~]# systemctl start mysqld
[root@server1 ~]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
在这里插入图片描述
<4>数据库安全初始化,并使用新密码登陆:

mysql_secure_installation 
mysql -uroot -p     #登陆成功!

在这里插入图片描述
在这里插入图片描述
<5>创建用来主从复制的用户repl,查看主节点状态:


mysql> CREATE USER 'repl'@'172.25.33.%' IDENTIFIED BY 'Liuyan&123';  
Query OK, 0 rows affected (0.04 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.33.%';
Query OK, 0 rows affected (0.29 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)


mysql> show plugins;    #查看限制密码插件#######


mysql> show master status;   ##查看节点状态
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1323 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在这里插入图片描述

在这里插入图片描述
<6>真机测试,repl用户能否登陆:

[root@foundation72 ~]# mysql -h 172.25.33.1 -urepl -p

在这里插入图片描述
从库的操作如下:
<1>执行主库操作的1-4步,区别的是配置文件的修改:

##下载所需安装rpm包#####

 scp root@172.25.33.1:/root/*.rpm .
 yum install -y *

##修改配置文件#######

[root@server2 ~]# vim /etc/my.cnf

server-id=2

systemctl start mysqld


##查看密码并安全初始化#####

cat /var/log/mysqld.log | grep password
mysql_secure_installation 

在这里插入图片描述

<2>登陆数据库设置,并开启从节点:

mysql -uroot -p

mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.25.33.1',      #主节点ip
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='Liuyan&123',
    -> MASTER_LOG_FILE='mysql-bin.000002',   #所读数据目录
    -> MASTER_LOG_POS=1323;     #所读数据位置  同步数据的起始位置


mysql> start slave;
Query OK, 0 rows affected (0.08 sec)

mysql> show slave status\G    #查看从节点状态,
Slave_IO_Running: Yes         #这两行必须是yes,否则有问题
Slave_SQL_Running: Yes

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

这样,主从异步复制就已经实现了,进行测试
主节点的操作:

mysql -uroot -p
mysql> create database westos;    #创建westos库;
mysql> use westos;                #使用westos;

mysql> create table usertb (                #建表
    -> username varchar(10) not null,
    -> password varchar(20) not null);

mysql> desc usertb;    #查看表结构
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO   |     | NULL    |       |
| password | varchar(20) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

mysql> insert into usertb values ('user1','123');
Query OK, 1 row affected (0.09 sec)

mysql> select * from usertb;    #查看表中所有内容
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
1 row in set (0.00 sec)

在这里插入图片描述

从节点的操作:

mysql -uroot -p

mysql> show databases;   #可以看到westos库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westos             |
+--------------------+
5 rows in set (0.00 sec)

mysql> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from usertb;      #可以看到表中所有内容
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
1 row in set (0.00 sec)

mysql> exit

在这里插入图片描述

3、基于GTID的主从异步复制

(1) GTID的工作原理:

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、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

(2) GTID的优点:

1.一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次
2.GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置
3.减少手工干预和降低服务故障时间,当主机挂了之后通过软件从众多的备机中提升一台备机为主机

(3) GTID的主从异步复制实现:
在上一个基于二进制的主从异步服务的基础上实现,保证主从数据库的数据一致

<1>主库修改配置文件,开启gtid

gtid_mode=ON
enforce-gtid-consistency=true

systemctl restart mysqld           

在这里插入图片描述
<2>server2同样修改配置文件

gtid_mode=ON
enforce-gtid-consistency=true

systemctl restart mysqld  

在这里插入图片描述

<3>关闭从节点,更改复制策略

mysql> stop slave;
mysql> change master to master_host='172.25.33.1',master_user='repl',master_password='Liuyan&123',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G

  Auto_Position: 1   从第一个事物开始复制

在这里插入图片描述

在这里插入图片描述
<4>主节点操作:插入数据

mysql> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into usertb values('user2','123');
Query OK, 1 row affected (0.08 sec)

mysql> insert into usertb values('user3','123');
Query OK, 1 row affected (0.10 sec)

<4>查看从节点状态,与执行事务的信息

mysql> show slave status\G

 Retrieved_Gtid_Set: 39ed0b72-b025-11e9-bfb2-525400ca9499:1-2   接收到的事物
 Executed_Gtid_Set: 39ed0b72-b025-11e9-bfb2-525400ca9499:1-2    执行的事物

mysql> select * from mysql.gtid_executed;     查看执行的事务
+--------------------------------------+----------------+--------------+
| source_uuid                          | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 39ed0b72-b025-11e9-bfb2-525400ca9499 |              1 |            1 |
| 39ed0b72-b025-11e9-bfb2-525400ca9499 |              2 |            2 |
+--------------------------------------+----------------+--------------+
2 rows in set (0.00 sec)

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

4、Mysql的主从半同步复制(Semisynchronous replication)

(1) 半同步的解释:

1、逻辑上

是介于全同步复制与全异步复制之间的一种,主库只需要等待至少一个从库节点收到并且 Flush Binlog 到 Relay Log 文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全完成并且提交的反馈,如此,节省了很多时间。

2、技术上

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
所以说,半同步提高了数据完整性,至少存在两个地方。半同步失败,自动降级为异步,直到修复好

(2) 半同步的实现:
主节点的操作

主节点的操作,添加插件:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.11 sec)


mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS   #查看插件状态
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec)

mysql> SET GLOBAL  rpl_semi_sync_master_enabled=1;   ##激活插件

mysql> show VARIABLES LIKE 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |##是否开启半同步
| rpl_semi_sync_master_timeout              | 10000      |##切换复制的延迟时间为10s
| rpl_semi_sync_master_trace_level          | 32         |##开启半同步复制模式的调试级别默认32
| rpl_semi_sync_master_wait_for_slave_count | 1          |##至少有1个slave接收到日志
| rpl_semi_sync_master_wait_no_slave        | ON         |##是否允许master的每个事物提交后都等待slave的回复信号
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |#等待的point
+-------------------------------------------+------------+
6 rows in set (0.02 sec)

mysql> show status like '%rpl%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |##开启
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从节点的操作

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';    ##安装插件
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
+---------------------+---------------+
| PLUGIN_NAME         | PLUGIN_STATUS |
+---------------------+---------------+
| rpl_semi_sync_slave | ACTIVE        |
+---------------------+---------------+
1 row in set (0.01 sec)

mysql> SET GLOBAL  rpl_semi_sync_slave_enabled=1;  #激活插件

mysql> stop SLAVE IO_THREAD;      #关了再开 
Query OK, 0 rows affected (0.03 sec)

mysql> start SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like '%rpl%';
+---------------------------------+----------+
| Variable_name                   | Value    |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled     | ON       |    ##开启
| rpl_semi_sync_slave_trace_level | 32       |
| rpl_stop_slave_timeout          | 31536000 |
+---------------------------------+----------+
3 rows in set (0.01 sec)

在这里插入图片描述
在这里插入图片描述
半同步配置完成,此时,主节点会默认等待从节点十秒,若十秒之内没有反应,降级为异步
现在进行测试:
在server2上:

mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.33 sec)

在server1上:

mysql> use westos;

mysql> insert into usertb values('user4','123');

会等待10秒 

mysql> insert into usertb values('user5','123');

不会等待了 为异步复制了 

mysql> show status like '%rpl%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 2     |
| Rpl_semi_sync_master_status                | OFF   |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

在这里插入图片描述
在这里插入图片描述
此时在server2上,打开IO线程,数据同步过来了:

mysql> start SLAVE IO_THREAD;

mysql> show processlist;
+----+-------------+-----------+-------+---------+------+--------------------------------------------------------+------------------+
| Id | User        | Host      | db    | Command | Time | State                                                  | Info             |
+----+-------------+-----------+-------+---------+------+--------------------------------------------------------+------------------+
|  4 | root        | localhost | mysql | Query   |    0 | starting                                               | show processlist |
|  6 | system user |           | NULL  | Connect |   48 | Slave has read all relay log; waiting for more updates | NULL             |
|  8 | system user |           | NULL  | Connect |   20 | Waiting for master to send event                       | NULL             |
+----+-------------+-----------+-------+---------+------+--------------------------------------------------------+------------------+
3 rows in set (0.00 sec)

mysql> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 123      |
| user3    | 123      |
| user4    | 123      |
| user5    | 123      |
+----------+----------+
5 rows in set (0.00 sec)

在这里插入图片描述
参数的含义
id列:一个标识
user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句
host列:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户
db列:显示这个进程目前连接的是哪个数据库
command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)
time列:此这个状态持续的时间,单位是秒
state列:显示使用当前连接的sql语句的状态

在这里插入图片描述

5、Mysql的主从全同步复制(组复制)

(1) 全同步的解释:(Fully synchronous replication)

1、逻辑上

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

2、技术上

当主库提交事务之后,所有的从库节点必须收到、APPLY并且提交这些事务,然后主库线程才能继续做后续操作。但缺点是,主库完成一个事务的时间会被拉长,性能降低。

(2) 全同步的实现:
三个节点:172.25.33.1(发起组复制,只能由一个节点执行)
172.25.33.2    172.25.33.3
在进行操作之前,先查看server1的uuid,因为之后在server1的配置文件中,要写server1的uuid,然后在server1和server2中删掉之前的数据 ,server1和server2中做安全初始化重设密码登陆。最后server3安装mysql,同样进行安全初始化登陆。

(1)查看server1的uuid
[root@server1 mysql]# cat /var/lib/mysql/auto.cnf 
[auto]
server-uuid=db6e25ff-b049-11e9-84f5-525400ca9499

(2)在server1和server2中删掉之前的数据,保证数据一致
[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf         ibdata1           mysql-bin.000002    private_key.pem
ca-key.pem       ib_logfile0       mysql-bin.000003    public_key.pem
ca.pem           ib_logfile1       mysql-bin.index     server-cert.pem
client-cert.pem  ibtmp1            mysql.sock          server-key.pem
client-key.pem   mysql             mysql.sock.lock     sys
ib_buffer_pool   mysql-bin.000001  performance_schema  westos
[root@server1 mysql]# rm -fr *
[root@server1 ~]# systemctl start mysqld


(3)server3安装mysql

(4)server1 server2 sever3 都进行安全初始化登陆

 cat /var/log/mysqld.log | grep password
 mysql_secure_installation 

在这里插入图片描述
<1>修改三个节点的配置文件

vim /etc/my.cnf
systemctl restart mysqld

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
<2>server1的操作:

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Liuyan&123';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

mysql>  CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Liuyan&123'  FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';    ##下载插件
mysql> SET GLOBAL group_replication_bootstrap_group=ON;     ##激活全复制,只能在server1上做
 mysql>START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;    #激活后开启组复制之后关闭

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 15e9f6b3-b0b8-11e9-ac1d-5254003bfd24 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)

mysql> CREATE DATABASE test;         ##创建了test数据库
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+

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

在这里插入图片描述

<2>server2和server3的操作一致,和server1操作的区别只在与于不执行SET GLOBAL group_replication_bootstrap_group=ON;:

mysql> SET SQL_LOG_BIN=0;			##停止复制开始操作,不然会导致数据不同步
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Liuyan&123';		##创建一个用户来组同步使用
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;			##开启同步复制
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Liuyan&123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';		##安装模块
set global group_replication_allow_local_disjoint_gtids_join=on; 	##因为在server1上已经建立了一张表
mysql> START GROUP_REPLICATION;											##开启组服务
mysql> SELECT * FROM performance_schema.replication_group_members;		##查看节点状态

在server2执行完操作后,可以看到server1上的数据:
在这里插入图片描述
在server3执行完操作后,三个节点全部加入成功,组复制操作成功:
在这里插入图片描述
进行测试,任意库建立数据,其他库都应该可以看到
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
备注:可能出现的问题及解决方法:
(1)问题一:无法开启组复制
问题可能出在uuid上,发起的组复制的uuid和每个节点的uuid都必须不一样

(2)当节点加入后显示为recoverying时,(数据不一致)怎么解决:

一般都是数据不同步的问题,首先备份主节点上的内容 然后导入到从节点

cd /var/lib/mysql
mysqldump -all-databases --single-transaction --routines 
--events --host=127.0.0.1 --port=3306 --user=root --password=Liuyan&123 > dbdump.db

mv dbdump.db /root

scp dbdump.db server2:/root
scp dbdump.db server3:/root

导入的时候 将从节点 先关数据库 删掉全部数据 然后开启数据库

在server2上导入:mysql -p < dbdump.db

但是,从节点显示必须事物表为空才行 
所以 reset master;reset slvae;
然后再进行导入 就可以导入成功 保证节点存储内容一致,在从节点reset master;reset slvae;
会清空从节点和主节点的日志信息 

在从节点上进行组复制的操作,然后change master ,开启组复制

总结:先在从节点 reset master; reset slave;然后导入主库的东西 然后change master 然后开启组复制

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值