不安分的黑娃
踏踏实实,坚持学习,慢慢就懂了~

参考资料

环境准备

  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

(2)启动 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)启动 s3 实例

新开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相关的包:
image
安装 2013 库之后就不再报错啦.

posted on 2023-07-30 16:28  不安分的黑娃  阅读(263)  评论(0编辑  收藏  举报