MySQL的主从复制、基于GDIT的主从复制、半同步复制、并行复制、组复制

点击此处即可查看mysql的官方文档

实验环境:

server1:172.25.66.1  master(主库)
server2:172.25.66.2  slave (从库)

安装包:

mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

点击此处即可下载mysql

1.Mysql的主从复制

概述:

主从复制:是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

1.主从复制原理

图解:
在这里插入图片描述
原理:

1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据库的relay-log重做日志文件中再执行一次这些sql语句即可。
4.具体需要三个线程来操作:
(1).主库dump线程:每当有从库连接到主库的时候,主库都会创建一个dump线程然后发送binlog(二进制日志)内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
(2).从库IO线程:当START SLAVE语句在从库开始执行之后,从库创建一个IO线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库IO线程读取主库的binlog输出线程发送的更新并拷贝这些更新到 relay log 文件。
(3).从库的SQL线程:从库创建一个SQL线程,这个线程读取从库IO线程写到 relay log 的更新事件并执行。从而实现主从的操作一致,最终数据一致;

总结:

从结点slave是根据读取主结点master的binlog二进制日志(记录了对数据库的所有操作)完成复制的

2.主从复制用途

1、做数据的热备;作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。(实时灾备,用于故障切换)
2、架构的扩;业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发;在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度

3.主从复制存在的问题

1.主库宕机后,数据可能丢失
2.从库只有一个sql Thread线程,主库写压力大,复制很可能延时

4.解决方法

半同步复制---解决数据丢失的问题
并行复制-----解决从库复制延迟的问题

5.主从部署必要条件

1.主库开启binlog日志(二进制日志)
2.主从server-id不同
3.从库服务器能连通主库(远程登陆)

实验:

1.配置主结点

(1)下载并安装数据库

#1.在官网上下载mysql
[root@sever1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
#2.解压
[root@sever1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar 
[root@sever1 ~]# ls

在这里插入图片描述

#3.安装
[root@sever1 ~]# yum install -y 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 

在这里插入图片描述
(2).开启二进制日志并指定id

[root@sever1 ~]# vim /etc/my.cnf
################
log-bin=mysql-bin    #开启二进制日志
server-id=1          #指定id

在这里插入图片描述
(3).开启数据库

#1.开启数据库
[root@sever1 ~]# systemctl start mysqld
#2.查看端口
[root@sever1 ~]# netstat -anltp

在这里插入图片描述
(4)查看数据库初始密码

[root@sever1 ~]# cat /var/log/mysqld.log | grep password

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

发现虽然可以登陆,但实际上无法使用数据库,根据提示需要先更改数据库密码,才能使用数据库

#登陆数据库
[root@sever1 ~]# mysql -uroot -p'+t2q(Ci0(WRa'

在这里插入图片描述
(6)初始化

[root@sever1 ~]# mysql_secure_installation 

在这里插入图片描述
在这里插入图片描述
(7)登陆数据库并创建用户授权

[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases;        #查看年数据库
mysql> grant replication slave on *.* to repl@'172.25.66.%' identified by 'hym19970818HYM#';  #创建用户并授权

注释:
replication      #表示授权复制的权限
*.*              #表示所有数据库可以进行同步 
repl             #表示授权用户,可以随意填写
'172.25.66.%'    #表示授权172.25.66/24的网段所有服务器可以同步, %表示任意
hym19970818HYM#  #表示用户密码(我这里设定成root用户的密码是为了方便记忆)

在这里插入图片描述

#mysql-bin.000002表示当前正在使用的二进制日志文件,1003表示执行当前二进制日志位置,即从那里开始复制
mysql> show master status;    #查看master的状态
mysql> exit                   #退出
Bye

在这里插入图片描述
查看日志:

[root@sever1 ~]# cd /var/lib/mysql
[root@sever1 mysql]# ls
auto.cnf         ibdata1           mysql-bin.000002    public_key.pem
ca-key.pem       ib_logfile0       mysql-bin.index     server-cert.pem
ca.pem           ib_logfile1       mysql.sock          server-key.pem
client-cert.pem  ibtmp1            mysql.sock.lock     sys
client-key.pem   mysql             performance_schema
ib_buffer_pool   mysql-bin.000001  private_key.pem
[root@sever1 mysql]# cat mysql-bin.index 
./mysql-bin.000001
./mysql-bin.000002
[root@sever1 mysql]# file mysql-bin.index 
mysql-bin.index: ASCII text
#查看日志
[root@sever1 mysql]# mysqlbinlog ./mysql-bin.000002 

在这里插入图片描述
2.配置从结点

(1).下载并安装数据库

[root@sever1 ~]# scp 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 [email protected]:
[root@sever2 ~]# ls

在这里插入图片描述

[root@sever2 ~]# yum install -y *

在这里插入图片描述
(2).指定id

[root@sever2 ~]# vim /etc/my.cnf
################
server-id=2         #指定id

在这里插入图片描述
(3)开启数据库

[root@sever2 ~]# systemctl start mysqld
[root@sever2 ~]# netstat -antlp

在这里插入图片描述注意:如果开启数据库时,特别缓慢怎么办呢?

[root@server2 ~]#  systemctl start mysqld
^C
[root@server2 ~]# ps aux | grep mysql
mysql     2717  1.1 23.2 1119484 176448 ?      Sl   09:21   0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root      2747  0.0  0.1 112648   960 pts/0    R+   09:22   0:00 grep --color=auto mysql
#1.杀死进程
[root@server2 ~]# kill -9 2717
[root@server2 ~]# ps aux | grep mysql
mysql     2769 10.0 22.7 988412 172548 ?       Sl   09:22   0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root      2799  0.0  0.1 112648   960 pts/0    R+   09:22   0:00 grep --color=auto mysql
#2.重新启动
[root@server2 ~]# systemctl start mysqld

(4)查看数据库初始密码

[root@sever2 ~]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
(5)初始化

#将密码设定成与主库root用户密码一样是为了方便记忆,并不是必须
[root@sever2 ~]# mysql_secure_installation 

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

[root@sever2 ~]# mysql -uroot -phym19970818HYM#

在这里插入图片描述

测试远程登陆:

#发现可以远程登陆,说明主节点用户授权成功;-h表示主机的ip地址
[root@sever2 ~]# mysql -h 172.25.66.1 -u repl -p

在这里插入图片描述
(7).复制

[root@sever2 ~]# mysql -uroot -phym19970818HYM#
mysql> change master to master_host='172.25.66.1',master_user='repl',master_password='hym19970818HYM#',master_log_file='mysql-bin.000002',master_log_pos=1003;   #复制主库

注意:如果次参数设定错误,想要重新复制,必须先执行:stop slave 再重新执行即可

注释:
master_host:      复制主机 
master_user:      复制用户 
master_password:  用户密码  
master_log_file:  二进制日志名称
master_log_pos:   日志号

在这里插入图片描述

mysql> start slave;           #开启slave
mysql> show slave status\G;   #查看slave的状态

在这里插入图片描述

测试:

注意:主从复制只是实现了数据的单向同步,即只能从库同步主库的数据

在server1上:创建数据库test

[root@sever1 mysql]# mysql -uroot -phym19970818HYM#
mysql> create database test;    #创建数据库
mysql> show databases;          #查看数据库

在这里插入图片描述

在server2上:发现刚在server1上的创建的test数据库同步到了从结点上,即实现了主从复制

mysql> show databases;          #查看数据库

在这里插入图片描述
在server1上:创建表并插入数据

mysql> use test;                        #使用数据库
mysql> create table userlist (          #创建表
    -> username varchar(20) not null,
    -> password varchar(15) not null);
mysql> insert into userlist values ('user1','111');    #插入数据
mysql> insert into userlist values ('user2','222');
mysql> show tables;                     #查看表
mysql> select * from userlist;          #查看表数据

在这里插入图片描述
在这里插入图片描述
在server2上:查看到刚在server1上的插入的表数据,进一步验证实现了主从复制

mysql> use test;                 #使用数据库
mysql> show tables;              #查看表
mysql> select * from userlist;   #查看表数据

在这里插入图片描述
排错:

问题1:IO_Running NO

1.用户授权错误
2.防火墙未关闭
3.二进制日志未开启

问题2:SQL_Running NO

一般是回放数据不一致造成的

注意查看报错信息:

1.Errnor:错误信息
2.Timestamp:时间戳

在这里插入图片描述

2.基于GDIT的主从复制

概述:

1.简述GTID

GTID分成两部分,一部分是服务的UUID, UUID保存在mysql数据目录的auto.cnf文件中,这是一个非常重要的文件,不能删除,这一部分是不会变的。
另外一部分就是事务ID了,随着事务的增加,值一次递增。在整个复制架构中GTID 是不变化的,即使在多个连环主从中也不会变。

2.工作原理

图解:
在这里插入图片描述
原理:

1.master更新数据时,会在事务前产生GTID,一同记录到binlog(二进制日志)中。
2.每当有slave连接到master的时候,master都会创建一个dump线程然后发送binlog(二进制日志)内容到slave。
3.slave端的IO线程将变更的binlog,写入到本地的 relay log 中。
4.slave端的SQL线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
5.如果有记录,说明该GTID的事务已经执行,slave会忽略。
6.如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
7.在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

3.特点

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

4.总结

基于GTID的主从复制与传统的主从复制最大的区别在于:传统的是根据pos号来确定从哪开始复制,而GTID的会自动读取gtid_next变量,即告诉Slave,下一个要执行的GTID值

实验:

1.配置主库

(1)开启gtid

[root@sever1 ~]# vim /etc/my.cnf
################
gtid_mode=ON
enforce-gtid-consistency=true

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

[root@sever1 ~]# systemctl restart mysqld

(3)登陆数据库

当重启数据库的时候,发现日志名称和日志号会发生变更

[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show master status;
mysql> exit

在这里插入图片描述

[root@sever1 ~]# systemctl restart mysqld
[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show master status;
mysql> exit

在这里插入图片描述
查看GTID:

[root@server1 ~]#  mysql -uroot -phym19970818HYM#
mysql> show databases;
mysql> use mysql;
mysql> show tables;                   #查看到记录GTID的表
mysql> select * from gtid_executed;   #查看GTID信息,当前表中没有信息
mysql> exit

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看二进制日志文件:发现mysql-bin文件中记录了所有的sql操作语句

[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls

在这里插入图片描述

[root@server1 mysql]# mysqlbinlog mysql-bin.000002

在这里插入图片描述
在这里插入图片描述
查看UUID:

[root@server1 mysql]# cat auto.cnf 

在这里插入图片描述

2.配置从库

查看master的状态信息:

[root@server2 ~]# cd  /var/lib/mysql
[root@server2 mysql]# ls

在这里插入图片描述

#信息会发生变更
[root@server2 mysql]# cat master.info 

在这里插入图片描述
(1).开启gtid

[root@sever2 ~]# vim /etc/my.cnf
################
gtid_mode=ON
enforce-gtid-consistency=true 

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

[root@sever2 ~]# systemctl restart mysqld

(3)重新复制主库

[root@sever2 ~]# mysql -uroot -phym19970818HYM#
mysql> show slave status\G;

在这里插入图片描述

mysql> stop slave;    #关闭slave
Query OK, 0 rows affected (0.08 sec)

mysql> change master to master_host='172.25.66.1',master_user='repl',master_password='hym19970818HYM#',MASTER_AUTO_POSITION = 1;    #复制主库

mysql> start slave;   #开启slave

注释:
master_host                  #复制主机
master_user                  #复制用户
master_password              #复制用户密码
MASTER_AUTO_POSITION = 1 :  #使用基于GTID协议的复制

在这里插入图片描述

mysql> show slave status\G;     #查看slave的状态

在这里插入图片描述
测试:

在server1上:创建数据库linux

[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases;
mysql> create database linux;
mysql> show databases;

在这里插入图片描述
在server2上:发现刚在server1上的创建的linux数据库同步到了从结点上,即实现了基于GDIT的主从复制

mysql> show databases;

在这里插入图片描述
在server1上:创建表并插入数据

mysql> use linux;
mysql> create table student(
    -> name varchar(20) not null,
    -> id varchar(15) not null);
mysql> desc student;

在这里插入图片描述

mysql> insert into student values ('tom','07161032');
mysql> insert into student values ('lily','07161025');
mysql> select * from student;

在这里插入图片描述
在server2上:查看到刚在server1上的插入的表数据,进一步验证实现了基于GDIT的主从复制

mysql> use linux;
mysql> show tables;
mysql> select * from student;

在这里插入图片描述

3.半同步复制

概述:

1.半同步复制

在默认情况下,MySQL的复制是异步的,这意味着主服务器及其从服务器是独立的。异步复制可以提供最佳的性能,
因为主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等待验证更新数据是否已经复制到从服务器中,
就可以自由处理其它进入的事务处理请求。但这也同时带来了很高的风险,如果在主服务器或从服务器端发生故障,
会造成主从数据的不一致,甚至在恢复时造成数据丢失。
为了解决上述出现的问题,MySQL5.5开始引入了一种半同步复制功能,该功能可以确保主服务器和访问链中至少一台从服务器之间的数据一致性和冗余。
在这种配置结构中,一台主服务器和其许多从服务器都进行了配置,这样在复制拓扑中,至少有一台从服务器在父主服务器进行事务处理前,
必须确认更新已经收到并写入了其中继日志(Relay Log)。当出现超时,源主服务器必须暂时切换到异步复制模式重新复制,
直到至少有一台设置为半同步复制模式的从服务器及时收到信息。

2.解析异步复制、全同步复制、半同步复制

异步复制(Asynchronous replication),MySQL默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。原理最简单,性能最好,但是主从之间数据不一致的概率很大。
半同步复制(Semisynchronous replication),介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制牺牲了一定的性能,提高了数据的安全性。
全同步复制(Fully synchronous replication),指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

3.总结

半同步复制与主从复制(异步复制)最大的区别在于:主从复制无需等待验证更新数据是否已经复制到从库中就可以自由处理其它进入的事务请求,而半同步复制必须确认更新已经收到并写入了其中继日志(Relay Log)才进行事务请求处理。

实验:

1.配置主库

[root@sever1 ~]# mysql -uroot -phym19970818HYM#
#1.安装master的插件(模块)
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; 
#2.开启master半同步复制
mysql> set global rpl_semi_sync_master_enabled = 1;
#3.查看半同步的状态
mysql> select PLUGIN_NAME,PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME like '%semi%';
mysql> show status like '%rpl%';
mysql> show global variables like '%semi%';
mysql> show variables like '%rpl%';

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

在这里插入图片描述

2.配置从库

[root@sever2 ~]# mysql -uroot -phym19970818HYM#
#1.安装slave的插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#2.开启slave半同步复制
mysql> set global rpl_semi_sync_slave_enabled = 1;
#3.重启IO线程,使之生效
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
#4.查看半同步的状态
mysql> show global variables like '%semi%';
mysql> show variables like '%rpl%';

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

测试:

在server2上:关闭salve

[root@sever2 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases;
mysql> stop slave IO_THREAD;

在这里插入图片描述
在srever1上:删除linux数据库,发现会延迟10s执行

[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases;
mysql> drop database linux;        #删除数据库
mysql> show databases;
mysql> show status like '%rpl%';   #查看到同步失败的次数为1,因为从库IO线程关闭,无法同步数据

在这里插入图片描述
在这里插入图片描述
在server2上:当开启IO线程后,发现linux数据库被删除,即实现了数据同步

mysql> start slave IO_THREAD;
mysql> show databases;

在这里插入图片描述
在server1上:此时再创建数据库时,便没有延迟(因为IO线程已经开启)

mysql> create database westos;
mysql> show databases;

在这里插入图片描述
在server2上:依旧查看到数据同步

mysql> show databases;

在这里插入图片描述

4.并行复制

概述:

数据库的主从复制与半同步复制:slave的IO线程和SQL线程都是单线程的,而master却是多线程的,所以难免会有延迟,
为了解决延迟问题,并行复制应运而生了。也就是说,在半同步复制的基础上,直接将slave的SQL线程更改为多线程即可。
为何只是更改SQL线程呢,因为IO没必要多线程,它不是瓶颈 ,所以在一般只在SQL线程上实现多线程,从而提升slave的并发度 
是否能够并行,关键在于多事务之间是否有锁冲突,这是关键。所以并行复制的目的就是要让slave尽可能的多线程跑起来,当然基于库级别的多线程也是一种方式(不同库的事务,没有锁冲突)

实验:

默认以文件的形式存储:

[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# ls

在这里插入图片描述

[root@server2 mysql]# cat relay-log.info

在这里插入图片描述

[root@server2 mysql]# cat master.info

在这里插入图片描述
配置从库:

[root@server2 mysql]# vim /etc/my.cnf
#####################
slave-parallel-type=LOGICAL_CLOCK     
slave-parallel-workers=10
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

在这里插入图片描述
测试:

[root@server2 mysql]# systemctl restart mysqld
#发现文件消失;因为此时relay_log.info,master.info以表的形式存储
[root@server2 mysql]# ls

在这里插入图片描述

[root@server2 mysql]# mysql -uroot -phym19970818HYM#
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> select * from slave_master_info;        #查看表数据
mysql> select * from slave_relay_log_info;
mysql> show processlist;

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

5.组复制

概述:

1.简述组复制

异步复制模式下,如果 slave 全部宕机,则在 master 上的事务无法同步到 slave 上,存在一定的数据安全风险。
半同步复制解决了数据安全风险的问题,在半同步环境下要求至少有一台 slave 接收到 master 的binlog并成功写入到本地的 relaylog, master 上的事务才可以成功提交,这样对主库的事务提交速度会产生一定影响,半同步在数据安全和数据库性能两者之间做了一个中和。
在实际使用过程中,可以通过配置参数(rpl_semi_sync_master_timeout 单位是毫秒,默认为10000,即10s)设定若 slave 在多长时间没有ack返回,同步模式由半同步自动修改为异步同步模式。(mysql半同步工作原理和oracle dataguard的最大保护模式雷同) 
组复制分单主模式和多主模式,mysql 的复制技术仅解决了数据同步的问题,如果 master 宕机,意味着数据库管理员需要介入,
应用系统可能需要修改数据库连接地址或者重启才能实现。(这里也可以使用数据库中间件产品来避免应用系统数据库连接的问题,例如 mycat 和 atlas 等产品)。
组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用,也就是说3台服务器的集群,允许其中1台宕机。

2.原理

在mysql多主模式下,在组复制中通过Group Replication Protocol协议及Paxos协议,形成的整体高可用解决方案 同时增加了certify的概念,
负责检查事务是否允许提交,是否与其它事务存在冲突,Group Replication是由多个节点共同组成一个数据库集群,每个节点都可以单独执行事务,
但是read-write(rw)的操作只有在组内验证后才可以commit,Read-only (RO)事务是不需要验证可以立即执行,当一个事务在一个节点上提交之前,
会在组内自动进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务,然后为该事物建立一个全局的排序,
最终,这意味着所有的服务器都以相同的顺序接收相同的事务集。因此,所有服务器都按照相同的顺序应用相同的变更集,因此它们在组中保持一致

实验:

实验环境:

server1:  172.25.66.1    master
server2:  172.25.66.2    master,slave
server3:  172.25.66.3    slave
server1 <---- server2 <---- server3

server2结点同步server1结点的数据,server3同步server2结点的数据

1.配置server1结点

注意:3个结点都需要做好本地解析

(1).关闭数据库并删除数据

#1.关闭数据库
[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf         ib_buffer_pool  mysql-bin.000001    public_key.pem   westos
ca-key.pem       ibdata1         mysql-bin.000002    server-cert.pem
ca.pem           ib_logfile0     mysql-bin.index     server-key.pem
client-cert.pem  ib_logfile1     performance_schema  sys
client-key.pem   mysql           private_key.pem     test
#2.删除数据;必须先关闭数据库再删除数据,若是先删除数据再关闭数据库便又会产生数据
[root@server1 mysql]# rm -rf *
[root@server1 mysql]# ls

(2)更改配置文件

#1.查看UUID
[root@server1 mysql]# uuidgen
86d7178c-e704-48fb-8fc8-9017b42d3024
#2.更改文件
[root@server1 mysql]# vim /etc/my.cnf
#####################
server-id=1                #指定id;主从数据库的id不同即可(唯一标识号)
gtid_mode=ON               #打开gtid模式
enforce-gtid-consistency=ON      
      
master_info_repository=TABLE           #以表的方式存储master_info_repository
relay_log_info_repository=TABLE        #以表的方式存储relay_log_info_repository
binlog_checksum=NONE                   #不支持check校验
log_slave_updates=ON                   #开启日志更新
log_bin=binlog                         #开启二进制日志
binlog_format=ROW                      #指定二进制格式(ROW:基于行的格式)

transaction_write_set_extraction=XXHASH64                         #指示server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name='86d7178c-e704-48fb-8fc8-9017b42d3024'   #指定UUID(可以用uuidgen命令生成)
loose-group_replication_start_on_boot=off                         #插件在server启动时,不自动启动组复制
loose-group_replication_local_address="172.25.66.1:24901"         #绑定本地ip地址及端口,24901端口用于接受来自组中其他成员的传入连接(IP地址必须为其他组成员可正常访问)
loose-group_replication_group_seeds="172.25.66.1:24901,172.25.66.2:24901,172.25.66.3:24901"        #指定组成员
loose-group_replication_bootstrap_group=off                       #插件不自动引导组

loose-group_replication_single_primary_mode=off                   #设置组自动选择一个 server 来处理读/写工作。 这个 server 是主(PRIMARY),所有其他的都是从
loose-group_replication_enforce_update_everywhere_checks=on       #多主模式下为多主更新启用或禁用严格一致性检查。

loose-group_replication_ip_whitelist="127.0.0.1,172.25.66.0/24"   #开启白名单,认情况下只允许白名单连接到复制组,如果是其他IP则需要配置。

注意:加loose-前缀是指示Server启用时尚未加载复制插件也将继续启动(简言之,就是使得数据库可以正常启动)

在这里插入图片描述
(3).开启数据库

[root@server1 mysql]# systemctl start mysqld

(4).查看初始密码

[root@server1 mysql]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
(5)登陆数据库并更改密码

[root@server1 mysql]# mysql -uroot -p'b8(Gv9f%EEGp'

mysql> show databases;
mysql> alter user root@localhost identified by 'hym19970818HYM#';        #更改数据库超级用户密码
mysql> show databases;

在这里插入图片描述
(6)创建用户并授权

mysql> SET SQL_LOG_BIN=0;             #关闭二进制日志;防止创建用户并授权等操作同步了到了从库
mysql> create user rpl_user@'%'identified by 'hym19970818HYM#';          #创建rpl_user用户并设定用户密码
mysql> grant replication slave on *.* to rpl_user@'%';                   #用户授权;replication表示授权复制的权限,*.* 表示所有数据库可以进行同步,rpl_user表示授权用户,%表示所有主机 
mysql> flush privileges;              #刷新授权表

在这里插入图片描述
(7)配置组复制

mysql> SET SQL_LOG_BIN=1;             #开启二进制日志
mysql> CHANGE MASTER TO  MASTER_USER='rpl_user',MASTER_PASSWORD='hym19970818HYM#' FOR CHANNEL 'group_replication_recovery';        #配置组复制
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';   #安装插件(模块)
mysql> SHOW PLUGINS;                  #查看插件

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

mysql> SET GLOBAL group_replication_bootstrap_group=ON;                  #关闭所有组成员
mysql> START GROUP_REPLICATION;                                          #开启组复制
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;                 #开启所有组成员

在这里插入图片描述注意:仅当MEMBER_STATE的状态为ONLINE时,即位配置组复制成功

mysql> SELECT * FROM performance_schema.replication_group_members;         #查看组复制的成员

在这里插入图片描述
2.配置server2结点

(1).关闭数据库并删除数据

[root@server2 ~]# systemctl stop mysqld
[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# ls
auto.cnf         ibdata1             public_key.pem            sys
ca-key.pem       ib_logfile0         server2-relay-bin.000009  test
ca.pem           ib_logfile1         server2-relay-bin.000010  westos
client-cert.pem  mysql               server2-relay-bin.index
client-key.pem   performance_schema  server-cert.pem
ib_buffer_pool   private_key.pem     server-key.pem
[root@server2 mysql]# rm -rf *
[root@server2 mysql]# ls

(2)更改配置文件

#注意:UUID必须一样
[root@server2 mysql]# vim /etc/my.cnf

在这里插入图片描述
(3)开启数据库

[root@server2 mysql]# systemctl start mysqld

(4).查看初始密码

[root@server2 mysql]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
(5)登陆数据库并更改密码

[root@server2 mysql]# mysql -uroot -polGPl4i1<W==
mysql> show databases;
mysql> alter user root@localhost identified by 'hym19970818HYM#';   #更改数据库超级用户密码
mysql> show databases;

在这里插入图片描述
(6).创建用户并授权

mysql> SET SQL_LOG_BIN=0;        #关闭二进制日志;防止创建用户并授权等操作同步了到了从库
mysql> create user rpl_user@'%'identified by 'hym19970818HYM#';          #创建rpl_user用户并设定用户密码
mysql> grant replication slave on *.* to rpl_user@'%';                   #用户授权;replication表示授权复制的权限,*.* 表示所有数据库可以进行同步,rpl_user表示授权用户,%表示所有主机 
mysql> flush privileges;         #刷新授权表 

在这里插入图片描述
(7).配置组复制

mysql> SET SQL_LOG_BIN=1;         #开启二进制日志
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='hym19970818HYM#' FOR CHANNEL 'group_replication_recovery';       #配置组复制
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';   #安装插件(模块)
mysql> SHOW PLUGINS;              #查看插件

在这里插入图片描述

mysql> reset master;              #重置master
mysql> START GROUP_REPLICATION;   #开启组复制

在这里插入图片描述
注意:仅当MEMBER_STATE的状态均为ONLINE时,即位配置组复制成功

mysql> SELECT * FROM performance_schema.replication_group_members;    #查看组复制的成员

在这里插入图片描述
3.配置server3结点

(1).安装数据库

[root@server2 ~]# ls

在这里插入图片描述

[root@server2 ~]# scp * [email protected]:
[root@server3 ~]# ls
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@server3 ~]# yum install -y *

以下配置完全同server2结点;只需注意:更改文件时,仅本机ip和server-id不同

(2).更改配置文件

[root@server3 ~]# cd /var/lib/mysql
[root@server3 mysql]# ls
[root@server3 mysql]#  vim /etc/my.cnf

在这里插入图片描述
(3).开启数据库

[root@server3 mysql]# systemctl start mysqld

(4).查看初始密码

[root@server3 mysql]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
(3)登陆数据库并更改密码

[root@server3 mysql]# mysql -uroot  -p'l-LzV#>ln2ti'
mysql> show databases;
mysql> alter user root@localhost identified by 'hym19970818HYM#';
mysql> show databases;

在这里插入图片描述
(4).创建用户授权并配置组复制

mysql> SET SQL_LOG_BIN=0; 
mysql> create user rpl_user@'%'identified by 'hym19970818HYM#';
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='hym19970818HYM#' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在这里插入图片描述

mysql> SHOW PLUGINS;

在这里插入图片描述

mysql> reset master;
mysql> START GROUP_REPLICATION; 

在这里插入图片描述
注意:仅当MEMBER_STATE的状态均为ONLINE时,即位配置组复制成功

mysql> SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述测试:

1.在server1中:创建数据库和表并插入数据

[root@server1 mysql]# mysql -uroot -phym19970818HYM#
mysql> create database redhat;
mysql> show databases;
mysql> use redhat;
mysql> insert into test values ('alice',99);
mysql> insert into test values ('lily',87);
mysql> select * from test;

在这里插入图片描述
在这里插入图片描述
在server2中:查看表数据,发现数据同步

mysql> show databases;
mysql> use redhat;
mysql> show tables;
mysql> select * from test;

在这里插入图片描述
在这里插入图片描述
在server3中:查看表数据,发现数据同步

mysql> show databases;
mysql> use redhat;
mysql> show tables;
mysql> select * from test;

在这里插入图片描述
在这里插入图片描述
2.在server2中:插入数据

mysql> insert into test values ('tom',66);
mysql> select * from test;

在这里插入图片描述
在server1中:查看表数据,发现数据同步

mysql> select * from test;

在这里插入图片描述
在server3中:查看表数据,发现数据同步

mysql> select * from test;

在这里插入图片描述
3.在server3中:插入数据

mysql> insert into test values ('coco',66);
mysql> select * from test;

在这里插入图片描述
在server1中:查看表数据,发现数据同步

mysql> select * from test;

在这里插入图片描述
在server2中:查看表数据,发现数据同步

mysql> select * from test;

在这里插入图片描述
排错:

发现MEMBER_STATE显示ERROR

mysql> SELECT * FROM performance_schema.replication_group_members; 

在这里插入图片描述
查看日志:

[root@server2 mysql]# cat /var/log/mysqld.log 

在这里插入图片描述
这种错误一般是因为没有做解析或是解析错误导致的,只需在3个结点上都添加解析即可

[root@server1 ~]# cat /etc/hosts

在这里插入图片描述

[root@server2 ~]# cat /etc/hosts

在这里插入图片描述

[root@server3 ~]# cat /etc/hosts

在这里插入图片描述
检测:

#没有server3结点的状态,是因为server3结点还没有配置组复制
[root@server2 ~]# mysql -uroot -phym19970818HYM#
mysql> mysql> SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lilygg/article/details/87889765
今日推荐