mysql组复制的实现
实验要求
让server1,server2,server3称为一个mysql的服务组一起提供服务
多主模式: server1,server2,server3上面任意一个都可以读和写,
三个中只要一个上面写,其他两个同步被写的那个的数据
mysql组复制官网教程
Mysql组复制的官方网站:
官方网站:
https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html
配置server1
清空实验环境
之前我们在server1和server2上做过
这时我们要将之前做的内容给它清空
将server1和server2上的mysql给关掉:
systemctl stop mysqld
cd /var/lib/mysql
rm -fr *
Server1:
将/var/lib/mysql中所有的操作删掉
对mysql配置文件做配置:
vim /etc/my.cnf
将之前做的配置删掉:
查看官网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 #基于行的复制
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
复制完了也要删了(现在还不删)
我们如果按照官网做的话,会发现这样做出来的不是多主模型,
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
启mysqld,初始化
然后开启server1的mysql
因为我们将server1的mysql的配置都删掉了,
所以我们从头做,
先找到mysql的安全初始化的密码:
systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation
我们设置新密码: Westos.123
登陆mysql查看
mysql -uroot -pWestos.123
然后我们就要看文档了
点击NEXT下一页
我们在进行下面的操作前要关闭二进制日志
(防止我们现在做的这些操作传到别的server上去)
关binlog日志,授权用户
关闭server1上的二进制日志
SET SQL_LOG_BIN=0;
我们将密码改成Westos.132
给这个用户授权所有权力
然后刷新数据库
CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos.123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
开binlog日志,指定master用户
这时打开我们的binlog二进制日志
接下来的操作就可以写在二进制日志中了,
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';
解决插件问题
然后点击官方文档的下一页:
然后让这个插件生效:
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
这里报错这个插件已经存在了,这是因为我们上面配置的/etc/my.cnf已经配置了这个插件
所以这里就不进行这一步了
然后查看这个插件:
SHOW PLUGINS;
可以看到这个插件的状态是ACTIVE
点击官网下一页:
开启组复制
开启组复制:
SET GLOBAL group_replication_bootstrap_group=ON; #只需要组复制的发起节点server1打开这个参数就可以了
START GROUP_REPLICATION; #启动组复制
SET GLOBAL group_replication_bootstrap_group=OFF; #让它上线成为里面的一员
查看server1是否在组中
然后查看server1是否在组中;:
SELECT * FROM performance_schema.replication_group_members;
在这个的过程中,我们/etc/hosts中IP对应的域名一定不能写错
这个信息是基于我们自己写的解析
配置server2
清理环境操作同server1
然后配置server2:
先将mysqld停止;
vim /etc/my.cnf
初始化后对server2做slave设置
初始化完成后我们要进行一个slave的一个设置:
如下图的操作先不做(做了会影响我们的主从复制)
我们先把slave配好后再插入数据
后面再做
点击下一页:
我们将instances加到组里:
Server ID不一样其他都一样
在server2行执行下列命令:
复制server1上用户进行授权
复制server1上的用户,因为它们是多主复制,彼此可以复制对方的信息,
它们就需要一个共同的用户来复制对方的信息
授权:
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';
开启组复制报错排错
做好后我们直接在server2中开启组复制
然后直接启动,发现有报错:
START GROUP_REPLICATION;
所以我们检查一下日志:
tail -f /var/log/mysqld.log
根据日志提示进行修复
我们登陆进数据库
我们之前打开的GROUP_REPLICATION给关掉
stop GROUP_REPLICATION;
根据日志提示设置group_replication_allow_local_disjoint_gtids_join=on
set global group_replication_allow_local_disjoint_gtids_join=on;
启动组复制成功
这时我们再次启动组复制:
查看组中的主机
这时看一下server1表中的server2上线了没有
Server1
配置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-proxy关掉
然后启动mysql失败,发现是server3之前做过mysql-proxy
所以这里的3306端口被占着
所以我们关掉mysql-proxy:
killall -9 mysql-proxy
看到mysql-proxy的所有进程结束后
再次启动mysqld,成功
启动成功
关掉mysql,删掉原配置,再启动
然后我们开始做:
将mysql给关掉:
再次启动mysqld
做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;
Server1:
进行测试
可以看到把三个组复制都做好了
这时我们去做测试:
我们去server2上进行测试:
回到浏览器上一页:
create database test;
use test;
create table t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
insert into values (1,'Luis');
去server1上看有没有这个数据库和表:
在server3上查看:
然后在server3上插入数据:
Server1上查看:
Server2查看:
然后在server1上插入:
查看2和3看数据是否同步:
三个即是彼此的主也是彼此的备