首页 > 数据库 >MySQL Group Replication 搭建

MySQL Group Replication 搭建

时间:2023-07-30 16:33:19浏览次数:46  
标签:Group 5.7 replication 31 MySQL Replication mysql group root

目录

参考资料

环境准备

  1. mysql 5.7 下载地址
  2. MySQL安装

说在前面

  • MySQL 5.7 文档中介绍了 “Group Replication”,那么“Group Replication”从 5.7.17 开始支持的。
  • Group Replication 是以插件的方式提供的,所以组内的每个服务器必须安装和配置此插件。
  • Group Replication 官方介绍了2种部署方式:多服务器部署(Single-Primary)和单服务器(Locally)部署。我这里使用单服务器部署方案。

单服务器部署

1 windows

效果图:
image

说明

  1. 同一台机器部署 3个 MySQL 实例:s1,s2,s3
  2. s1 为主节点,支持数据库写入操作;s2 和 s3 是从节点,仅支持数据库读取操作。

要求与限制

Group Replication Requirements: https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements.html

要求:

1. 仅支持 InnoDB 存储引擎
2. 每个表必须有主键
3. 仅支持 IPv4 网络
4. 性能受到网络延迟和网络带宽影响

限制:

1. 单个组最大服务器数量:9
2. Group Replication对并发事务的认证过程不考虑间隙锁和表锁
3. 不支持 Replication Event Checksums
4. 不支持 SERIALIZABLE 事务隔离级别 
5. multi-primary 模式下不支持 并发 DDL 和 DML

1.1 下载并解压 mysql5.7.31

本地解压到 : C:\work\soft\mysql-5.7.31-winx64 ,如下图所示:
image

1.2 创建数据库文件保存目录 data

image

然后再 data 下分别创建 : s1、 s2 、s3 文件夹用于存储不同 MySQL 实例的数据文件:
image

1.3 添加配置文件

在 C:\work\soft\mysql-5.7.31-winx64 目录下新建 3 个配置文件:

  • my-s1.ini: 实例 s1 使用的配置文件
  • my-s2.ini: 实例 s2 使用的配置文件
  • my-s3.ini: 实例 s3 使用的配置文件

my-s1.ini

[mysqld]
# 设置端口
port=33061
# 安装目录
basedir=C:\\work\\soft\\mysql-5.7.31-winx64
# 数据文件存放路径
datadir=C:\\work\\soft\\mysql-5.7.31-winx64\\data\\s1

# 时区
default-time_zone=+8:00
# 编码
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

#################### Group Replication option ##################################
# 当前服务器ID,必须唯一且是整数
server_id=1
# 组复制仅支持 InnoDB 存储引擎,因此将其他类型都禁掉
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 激活 binlog(使用 bin log 进行复制的)
log_bin=binlog
# 【从服务器】记录收到的更新,便于其他节点进行复制
log_slave_updates=ON
# 按行记录日志
binlog_format=ROW
# 组复制不支持 binlog checksum
binlog_checksum=NONE

# 开启全局事务ID(组复制使用全局事务ID跟踪哪个服务器的事务提交了。。)
gtid_mode=ON
enforce_gtid_consistency=ON

# 复制相关的元信息存储到  mysql.slave_master_info 和 mysql.slave_relay_log_info 系统表
master_info_repository=TABLE
relay_log_info_repository=TABLE

# 事务写操作集合提取
transaction_write_set_extraction=XXHASH64
# 所有表名全部自动转为小写(组内必须设置同样的值)
lower-case-table-names=1

# 多线程 Applier 设置(非0值,最大 1024)
#slave_parallel_workers = 2
# 【从服务器】保存提交顺序(当 slave_parallel_workers 不等于 0 生效)
#slave_preserve_commit_order=1
# 【从服务器】并行类型,决定哪个事务允许执行(当 slave_parallel_workers 不等于 0 生效)
#slave_parallel_type=LOGICAL_CLOCK

## 加载 group_replication 插件(如果是 linux 环境 group_replication.dll 换为 group_replication.so)
plugin_load_add='group_replication.dll'
# group_replication_group_name 必须是 UUID格式
group_replication_group_name="c38018df-2e17-11ee-a6b1-7c5758617af1"
group_replication_local_address="127.0.0.1:24901"
group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
# 是否在 MySQL 服务启动时开启 group 复制
group_replication_start_on_boot=OFF
# 这个实例是否引导 group(必须设置为 OFF,自行选择最多事务的服务实例进行引导 group)
group_replication_bootstrap_group=OFF
## group_replication_single_primary_mode 指定模式:ON 表示 Single-Primary Mode;OFF 表示 Multi-Primary Mode
group_replication_single_primary_mode=OFF

## 更多参数:https://dev.mysql.com/doc/refman/5.7/en/group-replication-options.html
#################### Group Replication option ##################################

my-s2.ini

[mysqld]
# 设置端口
port=33062
# 安装目录
basedir=C:\\work\\soft\\mysql-5.7.31-winx64
# 数据文件存放路径
datadir=C:\\work\\soft\\mysql-5.7.31-winx64\\data\\s2

# 时区
default-time_zone=+8:00
# 编码
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

#################### Group Replication option ##################################
# 主机地址
report_host=127.0.0.1
# 当前服务器ID,必须唯一且是整数
server_id=1
# 组复制仅支持 InnoDB 存储引擎,因此将其他类型都禁掉
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 激活 binlog(使用 bin log 进行复制的)
log_bin=binlog
# 【从服务器】记录收到的更新,便于其他节点进行复制
log_slave_updates=ON
# 按行记录日志
binlog_format=ROW
# 组复制不支持 binlog checksum
binlog_checksum=NONE

# 开启全局事务ID(组复制使用全局事务ID跟踪哪个服务器的事务提交了。。)
gtid_mode=ON
enforce_gtid_consistency=ON

# 复制相关的元信息存储到  mysql.slave_master_info 和 mysql.slave_relay_log_info 系统表
master_info_repository=TABLE
relay_log_info_repository=TABLE

# 事务写操作集合提取
transaction_write_set_extraction=XXHASH64
# 所有表名全部自动转为小写(组内必须设置同样的值)
lower-case-table-names=1

## 加载 group_replication 插件(如果是 linux 环境 group_replication.dll 换为 group_replication.so)
plugin_load_add='group_replication.dll'
# group_replication_group_name 必须是 UUID格式,必须使用相同组名
group_replication_group_name="c38018df-2e17-11ee-a6b1-7c5758617af1"
group_replication_local_address="127.0.0.1:24902"
group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
# 是否在 MySQL 服务启动时开启 group 复制
group_replication_start_on_boot=OFF
# 这个实例是否引导 group(必须设置为 OFF,自行选择最多事务的服务实例进行引导 group)
group_replication_bootstrap_group=OFF
## group_replication_single_primary_mode 指定模式:ON 表示 Single-Primary Mode;OFF 表示 Multi-Primary Mode
group_replication_single_primary_mode=ON

## 更多参数:https://dev.mysql.com/doc/refman/5.7/en/group-replication-options.html
#################### Group Replication option ##################################

my-s3.ini

[mysqld]
# 设置端口
port=33063
# 安装目录
basedir=C:\\work\\soft\\mysql-5.7.31-winx64
# 数据文件存放路径
datadir=C:\\work\\soft\\mysql-5.7.31-winx64\\data\\s3

# 时区
default-time_zone=+8:00
# 编码
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

#################### Group Replication option ##################################
# 主机地址
report_host=127.0.0.1
# 当前服务器ID,必须唯一且是整数
server_id=1
# 组复制仅支持 InnoDB 存储引擎,因此将其他类型都禁掉
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 激活 binlog(使用 bin log 进行复制的)
log_bin=binlog
# 【从服务器】记录收到的更新,便于其他节点进行复制
log_slave_updates=ON
# 按行记录日志
binlog_format=ROW
# 组复制不支持 binlog checksum
binlog_checksum=NONE

# 开启全局事务ID(组复制使用全局事务ID跟踪哪个服务器的事务提交了。。)
gtid_mode=ON
enforce_gtid_consistency=ON

# 复制相关的元信息存储到  mysql.slave_master_info 和 mysql.slave_relay_log_info 系统表
master_info_repository=TABLE
relay_log_info_repository=TABLE

# 事务写操作集合提取
transaction_write_set_extraction=XXHASH64
# 所有表名全部自动转为小写(组内必须设置同样的值)
lower-case-table-names=1

## 加载 group_replication 插件(如果是 linux 环境 group_replication.dll 换为 group_replication.so)
plugin_load_add='group_replication.dll'
# group_replication_group_name 必须是 UUID格式,必须使用相同组名
group_replication_group_name="c38018df-2e17-11ee-a6b1-7c5758617af1"
group_replication_local_address="127.0.0.1:24903"
group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
# 是否在 MySQL 服务启动时开启 group 复制
group_replication_start_on_boot=OFF
# 这个实例是否引导 group(必须设置为 OFF,自行选择最多事务的服务实例进行引导 group)
group_replication_bootstrap_group=OFF
## group_replication_single_primary_mode 指定模式:ON 表示 Single-Primary Mode;OFF 表示 Multi-Primary Mode
group_replication_single_primary_mode=ON

## 更多参数:https://dev.mysql.com/doc/refman/5.7/en/group-replication-options.html
#################### Group Replication option ##################################

1.4 初始化数据

打开 CMD 命令窗口,依次输入以下命令,进行初始化:

cd  C:\work\soft\mysql-5.7.31-winx64\bin
mysqld.exe --defaults-file=C:\work\soft\mysql-5.7.31-winx64\my-s1.ini --initialize --console
mysqld.exe --defaults-file=C:\work\soft\mysql-5.7.31-winx64\my-s2.ini --initialize --console 
mysqld.exe --defaults-file=C:\work\soft\mysql-5.7.31-winx64\my-s3.ini --initialize --console

image

记得保存 root 用户密码!

初始化完成后的数据目录下文件清单:
image

1.5 依次启动 3 个实例

(1)启动 s1 实例

新开CMD 窗口执行下面命令:

cd C:\work\soft\mysql-5.7.31-winx64\bin
# defaults-file 必须紧跟 mysqld.exe
mysqld.exe --defaults-file=C:\work\soft\mysql-5.7.31-winx64\my-s1.ini --console

(1)启动 s2实例

新开CMD 窗口执行下面命令:

cd C:\work\soft\mysql-5.7.31-winx64\bin
# defaults-file 必须紧跟 mysqld.exe
mysqld.exe --defaults-file=C:\work\soft\mysql-5.7.31-winx64\my-s2.ini --console

(3启动 s2实例

新开CMD 窗口执行下面命令:

cd C:\work\soft\mysql-5.7.31-winx64\bin
# defaults-file 必须紧跟 mysqld.exe
mysqld.exe --defaults-file=C:\work\soft\mysql-5.7.31-winx64\my-s3.ini --console

1.6 调整 root 用户名密码

  1. 调整实例 s1 root 用户名密码
cd C:\work\soft\mysql-5.7.31-winx64\bin
mysql.exe -u root -P 33061 -p
# 必须关闭 binlog
SET SQL_LOG_BIN=0;
# 设置 root@localhost 密码为 root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
# 创建'root'@'%',方便远程客户端使用root登录数据库
create user 'root'@'%' identified by 'root';
grant all on *.* to 'root'@'%';
FLUSH PRIVILEGES;
# 必须开启 binlog
SET SQL_LOG_BIN=1;

image

  1. 调整实例 s2 root 用户名密码
cd C:\work\soft\mysql-5.7.31-winx64\bin
mysql.exe -u root -P 33062 -p
# 必须关闭 binlog
SET SQL_LOG_BIN=0;
# 设置 root@localhost 密码为 root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
# 创建'root'@'%',方便远程客户端使用root登录数据库
create user 'root'@'%' identified by 'root';
grant all on *.* to 'root'@'%';
FLUSH PRIVILEGES;
# 必须开启 binlog
SET SQL_LOG_BIN=1;
  1. 调整实例 s3 root 用户名密码
cd C:\work\soft\mysql-5.7.31-winx64\bin
mysql.exe -u root -P 33063 -p
# 必须关闭 binlog
SET SQL_LOG_BIN=0;
# 设置 root@localhost 密码为 root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
# 创建'root'@'%',方便远程客户端使用root登录数据库
create user 'root'@'%' identified by 'root';
grant all on *.* to 'root'@'%';
FLUSH PRIVILEGES;
# 必须开启 binlog
SET SQL_LOG_BIN=1;

1.7 创建复制使用的用户凭证

  1. 实例 s1 创建用户 rpl_user
# 如果部署在不同服务器,请将localhost 替换为 %
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'localhost' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'localhost';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

image

  1. 实例 s2 创建用户 rpl_user
# 如果部署在不同服务器,请将 localhost 替换为 %
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'localhost' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'localhost';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  1. 实例 s3 创建用户 rpl_user
# 如果部署在不同服务器,请将localhost 替换为 %
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'localhost' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'localhost';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

1.8 引导组复制

  1. 实例 s1 引导组复制
SET GLOBAL group_replication_bootstrap_group=ON;
# 启动 GROUP REPLICATION(停止命令:STOP GROUP_REPLICATION;)
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

image

# 查看当前 group 内成员信息
SELECT * FROM performance_schema.replication_group_members;

image

  1. 实例 s2 仅启动 group replication
START GROUP_REPLICATION;
# 查看当前 group 内成员信息
SELECT * FROM performance_schema.replication_group_members;

image

  1. 实例 s3 仅启动 group replication
START GROUP_REPLICATION;
# 查看当前 group 内成员信息
SELECT * FROM performance_schema.replication_group_members;

image

1.9 验证

  1. 在 实例 s1 创建数据库 replicadb ,并创建表 t1 之后插入1条记录
cd C:\work\soft\mysql-5.7.31-winx64\bin
mysql.exe -u root -P 33061 -proot
create database replicadb;
use replicadb;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'black1');

image
查看 binlog 事件信息:

# 查看使用哪个bin log 文件
show master status;
# 查看文件中的 binlog 事件
SHOW BINLOG EVENTS in 'binlog.000002';

image

  1. 在实例 s2 查看表
cd C:\work\soft\mysql-5.7.31-winx64\bin
mysql.exe -u root -P 33062 -proot
select * from replicadb.t1;

image

尝试插入数据

INSERT INTO replicadb.t1 VALUES (2, 'black2');

image

single_primary mode 只有1个节点允许写入数据,其他只能查看

  1. 在实例 s3 查看表并尝试插入数据
cd C:\work\soft\mysql-5.7.31-winx64\bin
mysql.exe -u root -P 33063 -proot
select * from replicadb.t1;
INSERT INTO replicadb.t1 VALUES (3, 'black3');

image

注:配置文件中 group_replication_single_primary_mode=OFF 时,可变为多 主节点模式,支持每个节点都能写入数据,但是注意此模式下的各种限制条件。

验证结束,配置结束。

报错

  1. “由于找不到 MSVCP120.dll,无法继续执行代码。重新安装程序可能会解决此问题”

image
原因:缺少 C++ 环境。

解决方案:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 下载 VS相关的包
安装 2013 库之后就不再报错啦:
image

标签:Group,5.7,replication,31,MySQL,Replication,mysql,group,root
From: https://www.cnblogs.com/lihw-study/p/17590265.html

相关文章

  • mysql 简单进阶 ———— 多列索引[一]
    前文整理一下mysql的一些简单进阶技巧,来源于高性能mysql,但不是根据书的序列来的。正文有一个问题,那就是我们为什么要创建多列索引呢?这是要思考的一个问题。为什么创建多列索引,而不是创建多个单列索引。需要弄明白这个问题,那么就需要知道索引是如何工作的。为什么有索引这个......
  • Mysql数据库中数据量特别大,读取特别慢,已经做了索引,怎么优化
    当MySQL数据库中的数据量特别大,读取操作变得特别慢,即使已经添加了索引,仍然需要进一步优化。下面是一些建议以及示例代码来优化这种情况:使用合适的索引:确保为频繁查询的列添加了合适的索引。可以使用EXPLAIN语句来分析查询的执行计划,检查是否正确使用了索引。示例代码:sqlCopycodeE......
  • MySQL学习-DML(Data Manipulation Language)数据--select语句02
    表连接:分为内连接和外连接,常用内连接。当需要同时显示多个表中字段时,就可以用表连接。内连接:仅选出两张表中互相匹配的记录外连接:还会选出其他不匹配的记录外连接包含左连接和右连接左连接: ......
  • 6、Mysql创建用户以及授权
    文件夹就是数据库文件就是表数据行就是行 data下的mysql这个数据库里有张User表,里面保存了用户信息 showdatabases;查看所有数据库 usemysql;使用这个use数据库(进入这个文件夹) showtables;查看这个数据库下所有的表(文件)文件最后有个user,我们登陆mysql服务器......
  • PYTHON mysql形成分割文件
    importrandom,string,re,time,sys,hashlib,pymysql,requestsf=open("aa.txt","w")connect=pymysql.connect(user='root',password='123456',db='new',host......
  • 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES
    MySQL的加解密及压缩函数许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这避免了删除尾随空格或转换字符集可能改变数据值的潜在问题,例如使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)时可能发......
  • MySQL慢查询解析
    文档课题:MySQL慢查询解析.数据库:mysql5.7.211、建测试表1.1、建表结构.mysql>usebooksDB;ReadingtableinformationforcompletionoftableandcolumnnamesYoucanturnoffthisfeaturetogetaquickerstartupwith-ADatabasechangedCREATETABLE`t_user......
  • MYSQL的安全模式:sql_safe_updates介绍
    查看当前mysqlsession会话下的sql_safe_updatesselect@@sql_safe_updates;查看全局的配置参数sql_safe_updatesselect@@global.sql_safe_updates set[global]sql_safe_updates=1; 在update操作中:当where条件中列(column)没有索引可用且无limit限制时会拒绝更新。whe......
  • PythonNote042---pymysql使用
      简单介绍pymysql的一些操作,增改删查增先建表,再写数据至表中除查询操作外,增改删都需要commit操作,具体原理看ref.1importpandasaspdimportpymysqlimporttimeimportwarningswarnings.filterwarnings("ignore")建表con=pymysql.connect(host='localhost',......
  • mysql之find_in_Set函数
    1.语法#查询出在list中包含column2的所有行。此处list可以是字段或常量selectcolumn1fromtable_namewhereFIND_IN_SET(column2,list)2.与in的区别in后面只能跟常量,find_in_set()函数可以使用常量或字段。in是完全匹配,find_in_set()函数是精确匹配,字段值以英文”,”分隔。3.举......