MySQL数据库集群实战(4)——MySQL主从复制之全同步复制(单主模式和多主模式)

好久不见. 提交于 2020-02-08 00:23:12

一、mysql全同步复制(组复制)

1、理解组复制工作原理

MySQL组复制是一个MySQL插件,它基于常规的MySQL复制,利用了基于行格式的二进制日志和GTID等特性。

MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能。它支持单主模型和多主模型两种工作方式(默认是单主模型)

  • 单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
  • 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。

组由多个服务器构成,通过传递消息进行交互,通信层保证原子消息传递。MGR构建于此通信层抽象之上,并实现了多主更新复制协议。组中的每个服务器独立地执行事务,但是所有读写事务只有在得到组的批准后才会提交。只读事务在组内不需要协调,因此立即提交。对于任何读写事务,当事务准备好在始发服务器处提交时,服务器以原子方式广播写入值(更改的行)和对应的写入集(更新的行的唯一标识符),然后将该事务加入全局事务列表。最终所有服务器都以相同的顺序接收并应用相同的事务集,所以它们在组内保持一致。

2、搭建mysql全同步复制多主模式
实验环境
主机名 ip 服务
server1 172.25.1.1 master
server2 172.25.1.2 slave
server3 172.25.1.3 slave
实验

在master(server1)上
步骤一:在网上下载mysql安装包并安装
在这里插入图片描述
步骤二:打开mysqld

systemctl start mysqld

在这里插入图片描述
步骤三:关闭mysqld

systemctl stop mysqld

在这里插入图片描述
步骤四:复制uuid

cat /var/lib/mysql/auto.cnf

在这里插入图片描述
步骤五:删除数据库文件

rm -fr /var/lib/mysql/*

在这里插入图片描述
步骤六:修改配置文件/etc/my.cnf

server-id=1
gtid_mode=ON
enforce-gtid-consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE #关闭binlog校验
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW #组复制依赖基于行的复制格式

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="508e830d-4983-11ea-9103-525400a1ffb6" #可以看/var/lib/mysql/auto.cnf
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.1.1:24901"
loose-group_replication_group_seeds= "172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"
loose-group_replication_bootstrap_group=off ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
loose-group_replication_ip_whitelist="127.0.0.1,172.25.1.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON 
loose-group_replication_single_primary_mode=OFF #后两行是开启多主模式的参数

在这里插入图片描述
步骤七:启动mysqld

systemctl start mysqld

在这里插入图片描述
步骤八:初始化数据库

查看初始密码

grep password /var/log/mysqld.log

在这里插入图片描述
方式一:安全初始化

mysql_secure_installation 

方式二:登录数据库,修改密码

mysql> alter user root@localhost identified by 'Westos+007';

在这里插入图片描述
步骤九:创建组复制使用的用户

mysql> SET SQL_LOG_BIN=0;	#关闭二进制日志,防止传到其他server上
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos+007'; #创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #授权
mysql> FLUSH PRIVILEGES; #刷新授权表
mysql> SET SQL_LOG_BIN=1;	##开启日志

在这里插入图片描述
步骤八:配置slave连接master的信息
所用用户,登陆密码及组插件

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos+007' 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;
mysql> SELECT * FROM performance_schema.replication_group_members;	##查看server1是否online

在这里插入图片描述
在slave(server2)上:

添加server2到组内
步骤一:安装数据库软件
在这里插入图片描述
步骤二:开启数据库

systemctl start mysqld

在这里插入图片描述
步骤三:关闭数据库并删除数据库信息

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

在这里插入图片描述
步骤四:修改配合文件/etc/my.cnf

server-id=2
gtid_mode=ON
enforce-gtid-consistency=true
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="508e830d-4983-11ea-9103-525400a1ffb6" #注意:这里和server1的保持一致!!!!!!
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.1.2:24901"
loose-group_replication_group_seeds= "172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.1.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF

在这里插入图片描述
步骤三:启动mysqld

systemctl start mysqld

在这里插入图片描述
步骤四:修改登陆密码

grep password /var/log/mysqld.log

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

mysql_secure_installation

在这里插入图片描述
步骤五:创建组复制用户并授权

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

在这里插入图片描述
步骤六:配置slave连接master的信息

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos+007' FOR CHANNEL 'group_replication_recovery';

在这里插入图片描述
步骤七:安装组插件

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在这里插入图片描述
步骤八:开启组复制

mysql> START GROUP_REPLICATION;

在这里插入图片描述
这里开启组复制可能会报错,查看mysql日志

cat /var/log/mysqld.log

在这里插入图片描述
日志中提示要开启变量group_replication_allow_local_disjoint_gtids_join
设置全局变量

mysql> STOP GROUP_REPLICATION;
mysql> set global group_replication_allow_local_disjoint_gtids_join=on;

在这里插入图片描述
开启组复制

mysql> START GROUP_REPLICATION;

在这里插入图片描述
此时在server1上查看:

SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述
在(slave)server3上
与server2配置相同

添加server3到组内
步骤一:安装数据库软件
在这里插入图片描述
步骤二:开启数据库

systemctl start mysqld

在这里插入图片描述
步骤三:关闭数据库并删除数据库信息

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

在这里插入图片描述
步骤四:修改配合文件/etc/my.cnf

server-id=3
gtid_mode=ON
enforce-gtid-consistency=true
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="508e830d-4983-11ea-9103-525400a1ffb6" #注意:这里和server1的保持一致!!!!!!
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.1.3:24901"
loose-group_replication_group_seeds= "172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.1.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF

步骤三:启动mysqld

systemctl start mysqld

步骤四:修改登陆密码

grep password /var/log/mysqld.log

在这里插入图片描述
安全初始化

mysql_secure_installation 

在这里插入图片描述

步骤五:创建组复制用户并授权

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

在这里插入图片描述
步骤六:配置slave连接master的信息

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos+007' FOR CHANNEL 'group_replication_recovery';

在这里插入图片描述
步骤七:安装组插件

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在这里插入图片描述
步骤八:开启组复制

设置全局变量

mysql> set global group_replication_allow_local_disjoint_gtids_join=on;

在这里插入图片描述
开启组复制

mysql> START GROUP_REPLICATION;

在这里插入图片描述
此时在server1上查看:

mysql> SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述
看到3台都是online,表示正常
这时在任何一个节点都可以写入和查看数据

测试:
在server3上插入数据

mysql> create database yan;

在这里插入图片描述
在server2上查看数据

mysql> show databases;

在这里插入图片描述
在server1上查看数据并写入数据

mysql> show databases;

在这里插入图片描述
写入数据

mysql> use yan;
mysql> create table test (   
    -> name varchar(10) not null,
    -> age  int(10) not null);
mysql> insert into test values ('user1','18'); 

在这里插入图片描述
在这里插入图片描述
在server2上查看数据

mysql> use yan;
mysql> show tables;
mysql> select * from test;

在这里插入图片描述
此时,证明了在任何一个节点都可以写入和查看数据。

3、多主模式切换成单主模式
# 所有节点执行
mysql> stop group_replication;
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;

# 主节点(server1)执行
SET GLOBAL group_replication_bootstrap_group=ON; 
START GROUP_REPLICATION; 
SET GLOBAL group_replication_bootstrap_group=OFF;


# 从节点(server2 server3)执行
START GROUP_REPLICATION; 

# 主节点(server1)查看MGR组信息
mysql> SELECT * FROM performance_schema.replication_group_members;

实现过程:
在master(server1上)
在这里插入图片描述
在slave(server2)
在这里插入图片描述
在slave(server3)
在这里插入图片描述
在master(server1上)
在这里插入图片描述
在slave(server2)
在这里插入图片描述
在slave(server3)
在这里插入图片描述
在master(server1上)
在这里插入图片描述
测试:
在slave(server2)上写入数据
在这里插入图片描述
在slave(server3)上写入数据
在这里插入图片描述
报错,证明slave无写入功能

在master(server1上)写入数据
在这里插入图片描述
在这里插入图片描述
正常写入并查看

在slave(server2)上查看数据

在这里插入图片描述
以上可得出,单主模式配置成功。master节点可以写入和读出,slave节点只能读出不能写入。

4、单主模式切换成多主模式
# 停止组复制(所有节点执行)
mysql> stop group_replication;
mysql> set global group_replication_single_primary_mode=OFF;
mysql> set global group_replication_enforce_update_everywhere_checks=ON;

# 随便选择某个节点执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON; 
mysql> START GROUP_REPLICATION; 
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

# 其他节点执行
mysql> START GROUP_REPLICATION; 

# 查看组信息,所有节点的online
mysql> SELECT * FROM performance_schema.replication_group_members;

总结:
实验中出现的报错并改正
mysql> insert into test values (‘user1’,‘18’);
ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.
改正方法

给表添加主键

mysql> alter table test modify age int  primary key;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!