首页 > 数据库 >企业级mysql数据库集群实战—— MySQL主从复制之全同步复制(单模式和多模式)

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

时间:2022-11-23 15:47:16浏览次数:38  
标签:主从复制 group ## 步骤 数据库 模式 企业级 replication 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

(开启之后关闭、不关闭的后边的实验一直在启动服务起不来!!)

  1.   [root@server1 ~]# systemctl start mysqld ##开启mysql
  2.   [root@server1 ~]# systemctl stop mysqld ##关闭mysql

 

步骤三:

复制uuid

[root@server1 ~]# cat /var/lib/mysql/auto.cnf 
 

 

步骤四:

删除数据库文件(然后重启生成新的库文件)

 

步骤五:

修改配置文件/etc/my.cnf

  1.   [root@server1 ~]# vim /etc/my.cnf
  2.    
  3.   server-id=1 ##matser的id
  4.   gtid_mode=ON
  5.   enforce-gtid-consistency=true
  6.   master_info_repository=TABLE
  7.   relay_log_info_repository=TABLE
  8.   binlog_checksum=NONE #关闭binlog校验
  9.   log_slave_updates=ON
  10.   log_bin=binlog
  11.   binlog_format=ROW ###组复制依赖基于行的复制格式
  12.    
  13.   transaction_write_set_extraction=XXHASH64
  14.   loose-group_replication_group_name="df082b59-6f75-11ea-8d69-52540036d818" #可以看/var/lib/mysql/auto.cnf
  15.   loose-group_replication_start_on_boot=off
  16.   loose-group_replication_local_address= "172.25.6.1:24901 ##本机的ip
  17.   loose-group_replication_group_seeds= "172.25.6.1:24901,172.25.6.2:24901,172.25.6.3:24901" ##master和slave主机的集合
  18.   loose-group_replication_bootstrap_group=off ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
  19.   loose-group_replication_ip_whitelist="127.0.0.1,172.25.6.0/24"
  20.   loose-group_replication_enforce_update_everywhere_checks=ON
  21.   loose-group_replication_single_primary_mode=OFF ##后两行是开启多主模式的参数
  22.    
  23.   [root@server1 ~]# systemctl start mysqld ##开启mysql服务
 

(注:配置完成后一定要开启mysql服务!!!)

 

步骤六:

初始化数据库

  1.   [root@server1 ~]# cat /var/log/mysqld.log | grep password ##查看初始密码
  2.   [root@server1 ~]# mysql_secure_installation ##初始化数据库
  3.   Enter password for user root: ##在此写入初始密码

 

步骤七:

创建组复制使用的用户

  1.   [root@server1 ~]# mysql -uroot -pYang+123love ##登录数据库
  2.   mysql> SET SQL_LOG_BIN=0; #关闭二进制日志,防止传到其他server上
  3.   mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yang+123love'; #创建用户
  4.   mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #授权
  5.   mysql> FLUSH PRIVILEGES; #刷新授权表
  6.   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> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
  2.   mysql> SHOW PLUGINS; ##查看插件

 

 

步骤十:

组复制发起

  1.   mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##组复制发起节点开启这个参数
  2.   mysql> START GROUP_REPLICATION; ##开启组复制
  3.   mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
  4.   mysql> SELECT * FROM performance_schema.replication_group_members; ##查看server1是否online

 

2、添加server2到组内

步骤一:

安装数据库软件

[root@server2 ~]#  yum install -y  *.rpm   
 

 

步骤二:

开启数据库、在关闭数据库、删除数据库信息

  1.   [root@server2 ~]# systemctl start mysqld ##开启数据库服务
  2.   [root@server2 ~]# systemctl stop mysqld ##关闭数据库
  3.   [root@server2 ~]# rm -fr /var/lib/mysql/* ##删除数据库信息
  4.    

 

步骤三:

修改配合文件/etc/my.cnf

  1.   server-id=2 ##slave的主机ip
  2.   gtid_mode=ON
  3.   enforce-gtid-consistency=true
  4.   master_info_repository=TABLE
  5.   relay_log_info_repository=TABLE
  6.   binlog_checksum=NONE
  7.   log_slave_updates=ON
  8.   log_bin=binlog
  9.   binlog_format=ROW
  10.    
  11.   transaction_write_set_extraction=XXHASH64
  12.   loose-group_replication_group_name="df082b59-6f75-11ea-8d69-52540036d818" #注意:这里和server1的保持一致!!!
  13.   loose-group_replication_start_on_boot=off
  14.   loose-group_replication_local_address= "172.25.6.2:24901"
  15.   loose-group_replication_group_seeds= "172.25.6.1:24901,172.25.6.2:24901,172.25.6.3:24901"
  16.   loose-group_replication_bootstrap_group=off
  17.   loose-group_replication_ip_whitelist="127.0.0.1,172.25.6.0/24"
  18.   loose-group_replication_enforce_update_everywhere_checks=ON
  19.   loose-group_replication_single_primary_mode=OFF
  20.    

 

步骤四:

启动mysqld

[root@server2 ~]# systemctl start mysqld      ##开启服务
 

 

步骤五:

初始化数据库

  1.   [root@server2 ~]# cat /var/log/mysqld.log | grep password ##查看初始密码
  2.   [root@server2 ~]# mysql_secure_installation ##初始化数据库
  3.   Enter password for user root: ##在此写入初始密码

 

步骤六:

创建组权


  1. [root@server2 ~]# mysql -uroot -pYang+123love ##登录数据库
  1. mysql> SET SQL_LOG_BIN=0;
  1. mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yang+123love';
  1. mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  1. mysql> FLUSH PRIVILEGES;
  1. 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
设置全局变量

  1.   mysql> STOP GROUP_REPLICATION;
  2.   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 
 

 

步骤三:

关闭数据库并删除数据库信息

  1.   [root@server3 ~]# systemctl stop mysqld
  2.   [root@server3 ~]# rm -fr /var/lib/mysql/*

 

步骤四:

修改配合文件/etc/my.cnf

  1.   server-id=3
  2.   gtid_mode=ON
  3.   enforce-gtid-consistency=true
  4.   master_info_repository=TABLE
  5.   relay_log_info_repository=TABLE
  6.   binlog_checksum=NONE
  7.   log_slave_updates=ON
  8.   log_bin=binlog
  9.   binlog_format=ROW
  10.    
  11.   transaction_write_set_extraction=XXHASH64
  12.   loose-group_replication_group_name="df082b59-6f75-11ea-8d69-52540036d818" ##与server1的uuid一致
  13.   loose-group_replication_start_on_boot=off
  14.   loose-group_replication_local_address= "172.25.6.3:24901"
  15.   loose-group_replication_group_seeds= "172.25.6.1:24901,172.25.6.2:24901,172.25.6.3:24901"
  16.   loose-group_replication_bootstrap_group=off
  17.   loose-group_replication_ip_whitelist="127.0.0.1,172.25.6.0/24"
  18.   loose-group_replication_enforce_update_everywhere_checks=ON
  19.   loose-group_replication_single_primary_mode=OFF
  20.    

 

步骤五:

启动mysqld

[root@server3 ~]# systemctl start mysqld
 

 

步骤六:

初始化数据库

  1.   [root@server3 ~]# cat /var/log/mysqld.log | grep password ##查看初始密码
  2.   [root@server3 ~]# mysql_secure_installation ##初始化数据库
  3.   Enter password for user root: ##在此写入初始密码

 

步骤七:

创建组复制用户并授权

  1.   [root@server3 ~]# mysql -uroot -p Yang+123love ##登录数据库
  2.   mysql> SET SQL_LOG_BIN=0;
  3.   mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yang+123love';
  4.   mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  5.   mysql> FLUSH PRIVILEGES;
  6.   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上插入表格

  1.   ysql> use yan;
  2.   mysql> create table test (
  3.   -> name varchar(10) not null,
  4.   -> age int(10) not null);
  5.   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;  

标签:主从复制,group,##,步骤,数据库,模式,企业级,replication,mysql
From: https://www.cnblogs.com/Lqdream/p/16918500.html

相关文章

  • 企业级mysql数据库集群实战—— MySQL数据库的读写分离(MySQL-proxy
    目录:一、MySQL数据库的读写分离简介  1、mysql数据库的读写分离的基础知识(为什么要进行读写分离)  2、读写分离的实现方式二、MySQL数据库读写分离实验(一)、......
  • 建造者模式
    某个对象的组件构成复杂,我们将组件的制造与装配分开来。组件的制造者叫做Builder组件的装配者叫做Director比如:手机由屏幕、电池、主板三个子组件构成,那我把制......
  • 企业级mysql数据库集群实战—— MySQL主从复制之半同步复制
    企业级mysql数据库集群实战(3)——MySQL主从复制之半同步复制目录:一、半同步复制简介(一)、掌握Mysql复制方式的区别及优缺点异步复制(Asynchronousreplicati......
  • 企业级mysql数据库集群实战—— MySQL主从复制之异步复制(传统复制Postion与Gtid)
    企业级mysql数据库集群实战(2)——MySQL主从复制之异步复制(传统复制Postion与Gtid)目录一. 主从复制简介   1、概念   2、原理   3、优点二......
  • java和设计模式(行为模式)
        和构建模式、结构模式相比较,行为模式的内容要多一些。在设计模式中,行为模式强调的是类和对象之间的交互关系。它更多强调的是,在特定的行为场景种,使用哪一种设计......
  • java和设计模式(结构模式)
        在设计模式中,有一类设计模式是比较有意思的,但是关注的人不多。这就是结构模式。如果说创建模式的重点是如何创建出实例对象,那么结构模式的特点就是利用类、示例......
  • java和设计模式(创建模式)
        有过软件开发经验的同学都知道,软件开发功能怎么都能完成。但是如果需要在软件上面不断做需求变更和重构,这就变得好复杂了。对于这些变更,如果只是硬编码去解决,那......
  • VMware 桥接 NAT host-only 模式区别和配置方法
    NAT:网络地址转换,虚拟机和物理机构建一个子网络,虚拟机可以上网,物理机可以连接虚拟机,但是物理机所在网络的其他设备不能直接连接子网络中的虚拟(通过网络地址下探也是可以的......
  • Composite 组合模式(结构型模式)
    意图:将对象组成树形结构以表示“部分——整体”的层次结构。Composite使得对单个对象和组合对象的使用具有一致性。要点:1、Composite模式采用树形结构来实现普遍存在的对象......
  • Bridge 桥接模式(结构型模式)
    意图:将抽象部分与实现部分分离,使它们都可以独立的变化。要点:1、Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度......