关闭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时重新启用该存储引擎,升级之后重新启动服务器时并再次将其禁用。
一个组中的所有服务器的配置都非常相似。一般各个服务器需要修改(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 |开启组复制的第一步(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 | +---------------------------+--------------------------------------+-------------+-------------+---------------+安装好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;经历过上面的步骤,此时组中已经有一个成员了,并且这个成员中已经有了一些数据。
安装好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;如果需要关闭某一个节点,执行以下命令
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;