MySQL MGR搭建

MGR搭建 - 官方文档第一阶段练习

准备工作

  • 关闭firewalld

  • 关闭seLinux

  • 准备三台虚拟机:192.168.91.120(hostname=db20),192.168.91.121(hostname=db21),192.168.91.122(hostname=db22)

  • 修改三台机器的/etc/hosts文件

    vim /etc/hosts
    192.168.91.120 db20
    192.168.91.121 db21
    192.168.91.122 db22
    

必要的说明解释

此节不涉及安装,只是说明解释

存储引擎的禁用

在MGR中,必须使用InnoDB存储引擎,使用其他存储引擎可能会导致MGR发生错误。设置系统变量disabled_storage_engines以防止其他存储引擎被使用。

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

请注意,在禁用MyISAM存储引擎的情况下,仍使用mysql_upgrade进行MySQL升级时(在MySQL 8.0.16之前),mysql_upgrade可能会失败并显示错误。要解决此问题,您可以在运行mysql_upgrade时重新启用该存储引擎,升级之后重新启动服务器时并再次将其禁用。

基础的[mysqld]参数

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE #? 这个不太清楚,需要看文档学习
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

组复制的参数解释

一个组中的所有服务器的配置都非常相似。一般各个服务器需要修改(server_id,datadir,group_replication_local_address)这些参数。之后会有说明

# 在服务器启动时,将组复制插件加入插件列表中
plugin_load_add='group_replication.so'
# 
transaction_write_set_extraction=XXHASH64
# 1.告诉插件,正在加入或者正在创建的组(group)叫什么名字
# 2.名字的值必须是UUID,在二进制日志中GTID将使用这个值,可以使用SELECT UUID()生成一个
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
# 当这个变量设置为off时会告诉插件,在服务器启动时不要自动开始进行操作,这一步十分重要,可以确保在启动组复制之前,可以进行一些配置修改,配置完成后,正常后,可以改成on
group_replication_start_on_boot=off
# 1.MGR组内部进行沟通时使用的IP地址和端口,这个端口只能用于组内部通讯,不能开放给上层应用
# 2.IP地址和域名放到各自的/etc/hosts文件中
# 3.官方推荐端口为33061
group_replication_local_address= "s1:33061"
# 1.种子成员信息(我理解为初创成员信息),格式是hostanme:port,当新成员加入时,通过这个参数进行相关的连接,当连接成功建立时,可以在performance_schema.replication_group_members中看到成员信息
# 2.用于启动group的server不会应用这个选项,它将引导组的生成。换句话说,这个初始server(first)上的任何数据都将为下一个加入的组成员服务。当第二个组成员(second)加入时,second会缺少很多数据,此时会从初始server中请求(不知道是不是请求,大概是这个意思),成功请求到数据后,组完成一次扩张。当第三个成员(third)加入时,会请求first和second中的其中一个进行数据补偿,完成后,组完成扩张。以此类推
# 3.如果有多台服务器同时加入组,他们会请求种子成员要数据,请保证此时他们请求的成员已经完成了组连接,所以最好先让first成员完成组创建,然后慢慢的使其他成员称为种子成员
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
# 1.这个变量告诉插件是否开启“引导组”的功能。
# 2.一般来说一个组中需要有一个server将次参数设置为on,但是在搭建时,都先使用off,防止启动时出现脑裂的情况,所以,在第一个server启动上线后,再设置这个server的这个参数
group_replication_bootstrap_group=off

用户创建 & 配置同步规则

创建用户

组内使用异步复制协议进行分布式恢复(distributed recovery)。

分布式恢复依赖于一个复制channel:group_replication_recovery。这个channel需要特定的用户。

在第一台server上创建这个用户一次就可以了,创建用户的记录会记入binlog日志,其他server执行START GROUP_REPLICATION后,会自动复制过去。

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;

如果你想手动创建这个用户,也可以临时禁用二进制日志(SET SQL_LOG_BIN=0),然后在每个server成员上手动创建用户。创建完成后,再次开启二进制日志(SET SQL_LOG_BIN=1)

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> SET SQL_LOG_BIN=1;
mysql> FLUSH PRIVILEGES;
配置同步规则

Once the user has been configured, use the CHANGE MASTER TO statement to configure the server to use the given credentials for the group_replication_recovery replication channel the next time it needs to recover its state from another member. Issue the following, replacing rpl_user and password with the values used when creating the user.

分布式恢复(Distributed recovery)是每一个新加入组的成员所做的第一件事,如果这个用户配置不正确,没有创建同步规则认证信息,那么这个新成员家不能连接到其他成员从而获取数据,最终导致加入失败。

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

插件安装

当第一个实例配置完成并启动后,需要安装组复制插件。

如果配置文件中已经写了plugin_load_add=‘group_replication.so’,那么插件就不需要再手动安装了。

如果需要手动安装,执行以下命令:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

检查是否安装成功

mysql> SHOW PLUGINS;
# | Name                       | Status   |
# (...)
# | group_replication          | ACTIVE   |

引导组 - Bootstrapping the Group

开启组复制的第一步(start a group的第一步)被称为bootstrapping。

此时需要用到系统变量group_replication_bootstrap_group,这个变量只能被一个server使用,并且这个server应当是引导建立组的server,并且只能使用一次。

这也是为什么在配置文件中设置这个参数为off的原因,如果重启时,配置文件文件写的on,可能会导致产生两个组,但是相同的名字。

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;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 |   s1        |       3306  | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+

实践安装

添加成员 - First Server

  • 安装好mysql

  • 停止mysql

  • 修改配置文件(注意serve_id和group_replication_local_address)

    [mysqld]
    
    disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
    
    user=mysql
    basedir=/app/database/mysql/
    datadir=/data/3306/
    port=3306
    socket=/tmp/mysql.sock
    server_id=1
    gtid_mode=ON
    enforce_gtid_consistency=ON
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    binlog_checksum=NONE
    log_slave_updates=ON
    log_bin=binlog
    binlog_format=ROW
    
    
    plugin_load_add='group_replication.so'
    transaction_write_set_extraction=XXHASH64
    group_replication_group_name="ff149897-ed93-11ea-b1ea-000c29594aef"
    group_replication_start_on_boot=off
    group_replication_local_address= "192.168.91.120:33061"
    group_replication_group_seeds= "192.168.91.120:33061,192.168.91.121:33061,192.168.91.122:33061"
    group_replication_bootstrap_group=off
    
    
    [mysql]
    socket=/tmp/mysql.sock
    
  • 登录mysql

  • 创建用户 & 配置同步规则

    mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
    mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
    mysql> FLUSH PRIVILEGES;
    mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
    
  • 插件安装,配置文件已经写了插件信息,不需要手动安装,略

  • 检查是否安装成功

    mysql> SHOW PLUGINS;
    # | Name                       | Status   |
    # (...)
    # | group_replication          | ACTIVE   |
    
  • 开始引导生成组

    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;
    # 此时应该看到有一条记录
    
  • 插入一些数据,并生成了一些二进制日志

    mysql> CREATE DATABASE test;
    mysql> USE test;
    mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
    mysql> INSERT INTO t1 VALUES (1, 'Luis');
    mysql> SELECT * FROM t1;
    +----+------+
    | c1 | c2   |
    +----+------+
    |  1 | Luis |
    +----+------+
    mysql> SHOW BINLOG EVENTS;
    

添加成员 - Second Server

经历过上面的步骤,此时组中已经有一个成员了,并且这个成员中已经有了一些数据。

  • 安装好mysql ; 停止MySQL

  • 第二个实例的配置文件(与server1略有不同)

[mysqld]

#
# Disable other storage engines
#
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

#
# Replication configuration parameters
#
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

#
# Group Replication configuration
#
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s2:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group= off
  • 创建用户 & 配置同步规则

这一步与之前server1创建用户与注册同步规则很相似。

如果你在server1开启了binlog,并且binlog中记录了创建复制用户的二进制日志,当server2连接server1时,the replication user is relicated to s1,此时就不需要创建用户,执行START GROUP_REPLICATION会自动创建。

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

如果你没有记录创建复制用户的二进制日志,那么你需要手动创建。

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  • 插件安装,配置文件已经写了插件信息,不需要手动安装,略

  • 检查是否安装成功

mysql> SHOW PLUGINS;
# | Name                       | Status   |
# (...)
# | group_replication          | ACTIVE   |
  • 开启组复制
mysql> START GROUP_REPLICATION;

tips:可以设置super_read_only = on,当一个组加入失败时,那么它将不会接受事务

  • 检查是否成功加入
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 |   s1        |        3306 | ONLINE        |
| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 |   s2        |        3306 | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
  • 检查server2是否真正完成了复制,加入组,只有完成复制后,server2的状态才会被标记为online,可以检查之前创建的test表,并对比二进制日志是否一致
mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+
mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
mysql> SHOW BINLOG EVENTS;

添加其他实例

  • 添加其他实例的步骤大致相同,首先创建配置文件
[mysqld]

#
# Disable other storage engines
#
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

#
# Replication configuration parameters
#
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

#
# Group Replication configuration
#
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s3:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group= off
  • 启动,创建用户,创建同步规则
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password'  \\
FOR CHANNEL 'group_replication_recovery';
  • 安装插件并启动
# 配置文件如果写了插件信息,就不需要手动执行安装
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
START GROUP_REPLICATION;
  • 查询是否成功加入
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 |   s1        |       3306  | ONLINE        |
| group_replication_applier | 7eb217ff-6df3-11e6-966c-00212844f856 |   s3        |       3306  | ONLINE        |
| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 |   s2        |       3306  | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+
mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
mysql> SHOW BINLOG EVENTS;

关闭和重启MGR集群

如果需要关闭某一个节点,执行以下命令

mysql> stop group_replication

如果所有节点都关闭了,需要重启MGR集群,那么第一个节点需要执行

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值