MySQL MGR搭建

tech2023-02-09  89

文章目录

MGR搭建 - 官方文档第一阶段练习准备工作必要的说明解释存储引擎的禁用基础的[mysqld]参数组复制的参数解释用户创建 & 配置同步规则创建用户配置同步规则 插件安装引导组 - Bootstrapping the Group 实践安装添加成员 - First Server添加成员 - Second Server添加其他实例 关闭和重启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)