企业级mysql数据库集群实战—— MySQL主从复制之全同步复制(单模式和多模式)
企业级mysql数据库集群实战—— MySQL主从复制之全同步复制(单模式和多模式)
目录:
一、mysql全同步复制(组复制)
- 1、理解组复制工作原理
二、搭建mysql全同步复制多主模式
1、在master(server1)上:
- 步骤一:在网上下载mysql安装包并安装
- 步骤二:打开mysqld 获取相应的uuid
- 步骤三:复制uuid
- 步骤四:删除数据库文件(然后重启生成新的库文件)
- 步骤五:修改配置文件/etc/my.cnf
- 步骤六:初始化数据库
- 步骤七:创建组复制使用的用户
- 步骤八:配置slave连接master的信息、所用用户,登陆密码及组插件
- 步骤九:安装组插件
- 步骤十:组复制发起
2、添加server2到组内
- 步骤一:安装数据库软件
- 步骤二:开启数据库、在关闭数据库、删除数据库信息
- 步骤三:修改配合文件/etc/my.cnf
- 步骤四:启动mysqld
- 步骤五:初始化数据库
- 步骤六:创建组权
- 步骤七:配置slave连接master的信息
- 步骤八:安装组插件
- 步骤九:开启组复制
3、添加server3到组内
- 步骤一:安装数据库软件
- 步骤二:开启数据库
- 步骤三:关闭数据库并删除数据库信息
- 步骤四:修改配合文件/etc/my.cnf
- 步骤五:启动mysqld
- 步骤六:初始化数据库
- 步骤七:创建组复制用户并授权
- 步骤八:配置slave连接master的信息
4、测试
- 步骤一:在server3上插入数据:
- 步骤二:在server3上插入表格
- 步骤三:在表格中写入数据发现没有键值发生报错
- 步骤四:在server2上写入数据并且查看
三、多主模式切换成单主模式目录:
四、单主模式切换成多主模式
总结
一、mysql全同步复制(组复制)
1、理解组复制工作原理
MySQL组复制是一个MySQL插件,它基于常规的MySQL复制,利用了基于行格式的二进制日志和GTID等特性。
MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能。它支持单主模型和多主模型两种工作方式(默认是单主模型)。
单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。
组由多个服务器构成,通过传递消息进行交互,通信层保证原子消息传递。MGR构建于此通信层抽象之上,并实现了多主更新复制协议。组中的每个服务器独立地执行事务,但是所有读写事务只有在得到组的批准后才会提交。只读事务在组内不需要协调,因此立即提交。对于任何读写事务,当事务准备好在始发服务器处提交时,服务器以原子方式广播写入值(更改的行)和对应的写入集(更新的行的唯一标识符),然后将该事务加入全局事务列表。最终所有服务器都以相同的顺序接收并应用相同的事务集,所以它们在组内保持一致。
二、搭建mysql全同步复制多主模式
实验环境
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.6.1 | master |
server2 | 172.25.6.2 | slave |
server3 | 172.25.6.3 | slave |
1、在master(server1)上:
步骤一:
在网上下载mysql安装包并安装
步骤二:
打开mysqld 获取相应的uuid
(开启之后关闭、不关闭的后边的实验一直在启动服务起不来!!)
-
[root@server1 ~]# systemctl start mysqld ##开启mysql
-
[root@server1 ~]# systemctl stop mysqld ##关闭mysql
步骤三:
复制uuid
[root@server1 ~]# cat /var/lib/mysql/auto.cnf
步骤四:
删除数据库文件(然后重启生成新的库文件)
步骤五:
修改配置文件/etc/my.cnf
-
[root@server1 ~]# vim /etc/my.cnf
-
-
server-id=1 ##matser的id
-
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="df082b59-6f75-11ea-8d69-52540036d818" #可以看/var/lib/mysql/auto.cnf
-
loose-group_replication_start_on_boot=off
-
loose-group_replication_local_address= "172.25.6.1:24901 ##本机的ip
-
loose-group_replication_group_seeds= "172.25.6.1:24901,172.25.6.2:24901,172.25.6.3:24901" ##master和slave主机的集合
-
loose-group_replication_bootstrap_group=off ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
-
loose-group_replication_ip_whitelist="127.0.0.1,172.25.6.0/24"
-
loose-group_replication_enforce_update_everywhere_checks=ON
-
loose-group_replication_single_primary_mode=OFF ##后两行是开启多主模式的参数
-
-
[root@server1 ~]# systemctl start mysqld ##开启mysql服务
(注:配置完成后一定要开启mysql服务!!!)
步骤六:
初始化数据库
-
[root@server1 ~]# cat /var/log/mysqld.log | grep password ##查看初始密码
-
[root@server1 ~]# mysql_secure_installation ##初始化数据库
-
Enter password for user root: ##在此写入初始密码
步骤七:
创建组复制使用的用户
-
[root@server1 ~]# mysql -uroot -pYang+123love ##登录数据库
-
mysql> SET SQL_LOG_BIN=0; #关闭二进制日志,防止传到其他server上
-
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yang+123love'; #创建用户
-
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='Yang+123love' 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
2、添加server2到组内
步骤一:
安装数据库软件
[root@server2 ~]# yum install -y *.rpm
步骤二:
开启数据库、在关闭数据库、删除数据库信息
-
[root@server2 ~]# systemctl start mysqld ##开启数据库服务
-
[root@server2 ~]# systemctl stop mysqld ##关闭数据库
-
[root@server2 ~]# rm -fr /var/lib/mysql/* ##删除数据库信息
-
步骤三:
修改配合文件/etc/my.cnf
-
server-id=2 ##slave的主机ip
-
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="df082b59-6f75-11ea-8d69-52540036d818" #注意:这里和server1的保持一致!!!
-
loose-group_replication_start_on_boot=off
-
loose-group_replication_local_address= "172.25.6.2:24901"
-
loose-group_replication_group_seeds= "172.25.6.1:24901,172.25.6.2:24901,172.25.6.3:24901"
-
loose-group_replication_bootstrap_group=off
-
loose-group_replication_ip_whitelist="127.0.0.1,172.25.6.0/24"
-
loose-group_replication_enforce_update_everywhere_checks=ON
-
loose-group_replication_single_primary_mode=OFF
-
步骤四:
启动mysqld
[root@server2 ~]# systemctl start mysqld ##开启服务
步骤五:
初始化数据库
-
[root@server2 ~]# cat /var/log/mysqld.log | grep password ##查看初始密码
-
[root@server2 ~]# mysql_secure_installation ##初始化数据库
-
Enter password for user root: ##在此写入初始密码
步骤六:
创建组权
- [root@server2 ~]# mysql -uroot -pYang+123love ##登录数据库
- mysql> SET SQL_LOG_BIN=0;
- mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yang+123love';
- 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='Yang+123love' FOR CHANNEL 'group_replication_recovery';
步骤八:
安装组插件
步骤九:
1、开启组复制
mysql> START GROUP_REPLICATION;
2、这里开启组复制可能会报错,查看mysql日志
cat /var/log/mysqld.log
3、日志中提示要开启变量group_replication_allow_local_disjoint_gtids_join
设置全局变量
-
mysql> STOP GROUP_REPLICATION;
-
mysql> set global group_replication_allow_local_disjoint_gtids_join=on;
4、开启组复制
mysql> START GROUP_REPLICATION;
5、在server1上查看:
SELECT * FROM performance_schema.replication_group_members;
(server2已经加入组!!)
3、添加server3到组内
与server2配置相同
步骤一:
安装数据库软件
步骤二:
开启数据库
[root@server3 ~]# systemctl start mysqld
步骤三:
关闭数据库并删除数据库信息
-
[root@server3 ~]# systemctl stop mysqld
-
[root@server3 ~]# 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="df082b59-6f75-11ea-8d69-52540036d818" ##与server1的uuid一致
-
loose-group_replication_start_on_boot=off
-
loose-group_replication_local_address= "172.25.6.3:24901"
-
loose-group_replication_group_seeds= "172.25.6.1:24901,172.25.6.2:24901,172.25.6.3:24901"
-
loose-group_replication_bootstrap_group=off
-
loose-group_replication_ip_whitelist="127.0.0.1,172.25.6.0/24"
-
loose-group_replication_enforce_update_everywhere_checks=ON
-
loose-group_replication_single_primary_mode=OFF
-
步骤五:
启动mysqld
[root@server3 ~]# systemctl start mysqld
步骤六:
初始化数据库
-
[root@server3 ~]# cat /var/log/mysqld.log | grep password ##查看初始密码
-
[root@server3 ~]# mysql_secure_installation ##初始化数据库
-
Enter password for user root: ##在此写入初始密码
步骤七:
创建组复制用户并授权
-
[root@server3 ~]# mysql -uroot -p Yang+123love ##登录数据库
-
mysql> SET SQL_LOG_BIN=0;
-
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yang+123love';
-
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
-
mysql> FLUSH PRIVILEGES;
-
mysql> SET SQL_LOG_BIN=1;
步骤八:
1、配置slave连接master的信息
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Westos+007' FOR CHANNEL 'group_replication_recovery';
2、此时在server1上查看:
mysql> SELECT * FROM performance_schema.replication_group_members;
看到3台都是online,表示正常,这时在任何一个节点都可以写入和查看数据
(server3已经添加到组中!!!)
4、测试
步骤一
在server3上插入数据:
mysql> create database yang;
步骤二:
在server3上插入表格
-
ysql> use yan;
-
mysql> create table test (
-
-> name varchar(10) not null,
-
-> age int(10) not null);
-
mysql> insert into test values ('user1','20');
步骤三:
在表格中写入数据发现没有键值发生报错
实验中出现的报错并改正:
- 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;
查看数据导入是否成功
步骤四:
在server2上写入数据并且查看
mysql> insert into test values ('user2','22');
select * from test;
(在server3上同理!!)
三、多主模式切换成单主模式
# 所有节点执行
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;
实现过程:
步骤一:
1、在master(server1上):
2、在server2上
3、在servre3上
步骤二:
执行完上边的操作
1、在master(server1上):
2、在server2上
3、在server3上
4、在master(server1上):
步骤三:
在server1(master)、server2(slave)、server3(slave)上进行读写操作
1、在server1上进行写的操作
2、在server2上进行写的操作
(写入失败只有读的权限)
3、在server3同理
四、单主模式切换成多主模式
# 停止组复制(所有节点执行):
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;
步骤一:
1、在server1上:
2、在server2上
3、在server3上
步骤二:
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
步骤三:
1、在server1、server3上执行如下步骤
2、在server1上查看
步骤四:
进行读写测试
1、在server1上、
2、在server2上
3、在server3上
4、在各个节点上查看
总结:
1、全同步模式全同步模式是指主节点和从节点全部执行了commit并确认才会向客户端返回成功。
问题:
2、在进行数据库数据的删除之前先关闭mysqld服务否则无法启动
3、在数据库中加入数据的没有键值的情况:
报错:
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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix