mysql组复制的实现

mysql组复制的实现

实验要求

让server1,server2,server3称为一个mysql的服务组一起提供服务
多主模式: server1,server2,server3上面任意一个都可以读和写,
三个中只要一个上面写,其他两个同步被写的那个的数据

mysql组复制官网教程

Mysql组复制的官方网站:
官方网站:

https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html

mysql组复制的实现

mysql组复制的实现

配置server1

清空实验环境

之前我们在server1和server2上做过
这时我们要将之前做的内容给它清空
将server1和server2上的mysql给关掉:

systemctl stop mysqld
cd /var/lib/mysql
rm -fr *

mysql组复制的实现
mysql组复制的实现

Server1:
将/var/lib/mysql中所有的操作删掉
mysql组复制的实现

对mysql配置文件做配置:

vim /etc/my.cnf

将之前做的配置删掉:
mysql组复制的实现

查看官网my.cnf配置

然后根据官方文档:

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE     #关闭binlog校验
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW     #基于行的复制    

mysql组复制的实现
mysql组复制的实现

plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64   #一个校验信息
group_replication_group_name="d157e15d-db4b-11ea-92d1-52540005e3b7"  #表示我们信息的UUID
group_replication_start_on_boot=off   #插件是否自动引导,组复制插件是否要引导
group_replication_local_address= "172.25.21.1:33061"
group_replication_group_seeds= "172.25.21.1:33061,172.25.221.2:33061,172.25.21.3:33061" #33061是一个表示,一个组的标识是一样的
group_replication_bootstrap_group=off

获取UUID,配置my.cnf

UUID的获取方式: #因为我们刚才将server1的/var/lib/mysql给删了,所以我们从server2中复制一份
Server2
mysql组复制的实现

复制完了也要删了(现在还不删)

我们如果按照官网做的话,会发现这样做出来的不是多主模型,
Server1是我们组复制的发起节点,只有server1能写,其他两个是不能写的,
所以还需要加入下面三行配置,这样每个节点就都可以读写了

sever1

vim /etc/my.cnf
loose-group_replication_ip_whitelist="127.0.0.1,172.25.21.0/24"  #这里写自己和自己所在的网段
后两行是开启多主模式的参数:
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF

mysql组复制的实现

启mysqld,初始化

然后开启server1的mysql
因为我们将server1的mysql的配置都删掉了,
所以我们从头做,
先找到mysql的安全初始化的密码:

systemctl start mysqld
cat /var/log/mysqld.log | grep password

mysql组复制的实现

mysql_secure_installation
我们设置新密码: Westos.123

mysql组复制的实现

登陆mysql查看

mysql -uroot -pWestos.123

mysql组复制的实现

然后我们就要看文档了
点击NEXT下一页
我们在进行下面的操作前要关闭二进制日志
(防止我们现在做的这些操作传到别的server上去)
mysql组复制的实现

关binlog日志,授权用户

关闭server1上的二进制日志

SET SQL_LOG_BIN=0;

mysql组复制的实现

我们将密码改成Westos.132
给这个用户授权所有权力
然后刷新数据库

CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos.123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;

mysql组复制的实现

开binlog日志,指定master用户

这时打开我们的binlog二进制日志
接下来的操作就可以写在二进制日志中了,

SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';

mysql组复制的实现
mysql组复制的实现

解决插件问题

然后点击官方文档的下一页:
mysql组复制的实现

然后让这个插件生效:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

mysql组复制的实现

这里报错这个插件已经存在了,这是因为我们上面配置的/etc/my.cnf已经配置了这个插件
mysql组复制的实现

所以这里就不进行这一步了
然后查看这个插件:

SHOW PLUGINS;

mysql组复制的实现

mysql组复制的实现

可以看到这个插件的状态是ACTIVE
点击官网下一页:
mysql组复制的实现

开启组复制

开启组复制:

SET GLOBAL group_replication_bootstrap_group=ON;   #只需要组复制的发起节点server1打开这个参数就可以了
START GROUP_REPLICATION;   #启动组复制
SET GLOBAL group_replication_bootstrap_group=OFF;    #让它上线成为里面的一员

mysql组复制的实现

查看server1是否在组中

然后查看server1是否在组中;:

SELECT * FROM performance_schema.replication_group_members;

mysql组复制的实现

在这个的过程中,我们/etc/hosts中IP对应的域名一定不能写错
这个信息是基于我们自己写的解析

配置server2

清理环境操作同server1

然后配置server2:
先将mysqld停止;
mysql组复制的实现

vim /etc/my.cnf

mysql组复制的实现
mysql组复制的实现
mysql组复制的实现
mysql组复制的实现

初始化后对server2做slave设置

初始化完成后我们要进行一个slave的一个设置:
如下图的操作先不做(做了会影响我们的主从复制)
mysql组复制的实现

我们先把slave配好后再插入数据
后面再做
点击下一页:

我们将instances加到组里:

Server ID不一样其他都一样
在server2行执行下列命令:
mysql组复制的实现

复制server1上用户进行授权

复制server1上的用户,因为它们是多主复制,彼此可以复制对方的信息,
它们就需要一个共同的用户来复制对方的信息
授权:
mysql组复制的实现

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';

mysql组复制的实现

开启组复制报错排错

做好后我们直接在server2中开启组复制
然后直接启动,发现有报错:

START GROUP_REPLICATION;

mysql组复制的实现

所以我们检查一下日志:

tail -f /var/log/mysqld.log

mysql组复制的实现

根据日志提示进行修复

我们登陆进数据库
我们之前打开的GROUP_REPLICATION给关掉

stop GROUP_REPLICATION;
根据日志提示设置group_replication_allow_local_disjoint_gtids_join=on
set global group_replication_allow_local_disjoint_gtids_join=on;

mysql组复制的实现

启动组复制成功

这时我们再次启动组复制:
mysql组复制的实现

查看组中的主机

这时看一下server1表中的server2上线了没有
Server1
mysql组复制的实现

配置server3

安装mysql,配置my.cnf

然后配置server3:
Server3:

yum install -y mysql-community-client-5.7.28-1.el7.x86_64.rpm mysql-community-common-5.7.28-1.el7.x86_64.rpm mysql-community-libs-5.7.28-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm mysql-community-server-5.7.28-1.el7.x86_64.rpm
vim /etc/my.cnf

mysql组复制的实现

清空环境,将mysql-proxy关掉

然后启动mysql失败,发现是server3之前做过mysql-proxy
所以这里的3306端口被占着
mysql组复制的实现

所以我们关掉mysql-proxy:

mysql组复制的实现

mysql组复制的实现

killall -9 mysql-proxy

mysql组复制的实现

看到mysql-proxy的所有进程结束后

再次启动mysqld,成功

mysql组复制的实现

启动成功

关掉mysql,删掉原配置,再启动

然后我们开始做:
将mysql给关掉:
mysql组复制的实现
mysql组复制的实现

再次启动mysqld

mysql组复制的实现

做mysql的初始化

mysql组复制的实现
mysql组复制的实现

mysql组复制的实现
mysql组复制的实现
mysql组复制的实现

登陆mysql,设置 server3组复制

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos.123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;

mysql组复制的实现

Server1:

mysql组复制的实现
mysql组复制的实现

进行测试

可以看到把三个组复制都做好了
这时我们去做测试:
我们去server2上进行测试:
回到浏览器上一页:

create database test;
use test;
create table t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
insert into values (1,'Luis');

mysql组复制的实现

去server1上看有没有这个数据库和表:
mysql组复制的实现
mysql组复制的实现

在server3上查看:

mysql组复制的实现
mysql组复制的实现

然后在server3上插入数据:
mysql组复制的实现

Server1上查看:
mysql组复制的实现

Server2查看:
mysql组复制的实现

然后在server1上插入:
mysql组复制的实现
查看2和3看数据是否同步:

mysql组复制的实现
mysql组复制的实现

三个即是彼此的主也是彼此的备

上一篇:AUTOSAR R20-11 发布会中文视频来啦!


下一篇:折半插入排序 之通俗易懂,图文+代码详解-java编程