视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL数据库GroupReplication搭建踩到IP地址的坑
2020-11-09 09:12:22 责编:小采
文档


导读

MySQL 5.7.17版本的复制功能又迎来了新的特性,闪耀的明星级功能Group Replicatioin 。自然少不了搭建测试体验一番,但是在搭建期间遇到了主机名有关的坑。下文会说明如何搭建以及遇到这个坑的过程。

2

预期

在虚拟机192.168.56.102上搭建两个实例3306和3307,在192.168.56.105上搭建一个实例3308。根据特性,需要选择一个节点作为启动Group Replication的节点,本文选择3306作为启动节点。

3

搭建

实例192.168.56.102:3306

my.cnf关键内容:

[mysqld3306]
gtid-mode=on
enforce-gtid-consistency=on
 
master-info-repository=table
relay-log-info-repository=table
 
binlog-checksum=none
log-slave-updates=on
binlog-format=row
 
transaction_write_set_extraction=XXHASH
loose-group_replication_group_name="2dc52aec-cfea-11e6-95f3-0800272cfa"
loose-group_replication_start_on_boot=off # 开机启动OFF
loose-group_replication_local_address="192.168.56.102:33061"
loose-group_replication_group_seeds="192.168.56.102:33061,192.168.56.102:33071,192.168.56.105:33081"
loose-group_replication_bootstrap_group=off # 作为首个启动OFF

注意 :

1. 配置中列出的端口都是要求是没有使用的。

2. group_name 的格式是UUID,可以在MySQL 中执行 select uuid(); 来获得一个。

创建复制账户:

mysql> set sql_log_bin=0;
mysql> create user 'group_repl'@'%' identified by 'group_repl';
mysql> grant replication slave on *.* to 'group_repl'@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;

创建复制通道:

mysql> change master to master_user='group_repl',master_password='group_repl' for channel 'group_replication_recovery';


加载插件:

mysql> install plugin group_replication soname 'group_replication.so';

作为首个节点启动Group Replication:

mysql> set @@global.group_replication_bootstrap_group=1;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=0;
mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 4f987d01-cff0-11e6-9afa-0800272cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE

实例192.168.56.102:3307和192.168.56.105:3308

其余实例的操作大部分和102:3306是一样的,下文只列出不同部分:

1. 在my.cnf中,102:3307的参数:

loose-group_replication_local_address="192.168.56.102:33071",105:3308的参数:loose-group_replication_local_address="192.168.56.105:33081";

2. 在创建复制账户,复制通道和加载插件之后,102:3307和105:3308都只需执行:start group_replication; 即可。

4

查看

查看是否加入Group Replication,只需查询表performance_schema.replication_group_members就可以了。下文是102:3307加入编组的情况:

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 4f987d01-cff0-11e6-9afa-0800272cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: d8f7405d-cff1-11e6-b449-0800272cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

可以看到已经有两个节点形成编组了,分别是102:3306,102:3307。

5

问题

当开始加入105:3308的时候出问题了,可以发现3308一直无法加入编组:

mysql> select * from performance_schema.replication_group_members;
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 4f987d01-cff0-11e6-9afa-0800272cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 5aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: localhost
 MEMBER_PORT: 3308
MEMBER_STATE: RECOVERING
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: d8f7405d-cff1-11e6-b449-0800272cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

通过错误日志:

...
2017-01-02T17:35:02.123501Z 32 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. 
Previous state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''. 
New state master_host='localhost', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''.
...
2017-01-02T17:35:02.133661Z 34 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master 'group_repl@localhost:3306' - retry-time: 60
 retries: 1, Error_code: 2003
...

可以猜测问题出在MEMBER_HOST上,所以把主机名修改为IP地址。测试后发现是可行的:

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 4f987d01-cff0-11e6-9afa-0800272cfa
 MEMBER_HOST: 192.168.56.102
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 5aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: 192.168.56.105
 MEMBER_PORT: 3308
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: d8f7405d-cff1-11e6-b449-0800272cfa
 MEMBER_HOST: 192.168.56.102
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

但是实际情况不可能把主机名设置成IP。所以经过多次尝试后,发现可以使用以下方式解决此问题:

1. 为不同物理机(虚拟机)设置不同的主机名;

2. 修改 /etc/hosts使各物理机(虚拟机)之间可通过主机名ping 通。

做完上述工作后,最后再查询一下编组成员:

mysql> select * from performance_schema.replication_group_members
\G*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 4f987d01-cff0-11e6-9afa-0800272cfa
 MEMBER_HOST: local-102
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: 5aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: local-105
 MEMBER_PORT: 3308
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
 MEMBER_ID: d8f7405d-cff1-11e6-b449-0800272cfa
 MEMBER_HOST: local-102
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

问题解决。还需要注意的一点是,即使是一个物理机(虚拟机)下的实例也需要具有主机名和IP的映射关系才能形成编组。之所以上文localhost的情况同一个物理机下可以形成编组,是因为系统默认就有127.0.0.1到localhost的映射关系。

6

总结

出现上述问题是因为MySQL 直接使用了操作系统的hostname,而非以前大家配置复制时,常使用的IP地址,这应该是一个bug,且已有人比我早几天向官方提交Bug申请。建议大家在配置Group Replication的时候,且Bug未修复之前,最好先检查下是否设置了主机名称和IP地址的映射关系。

下载本文
显示全文
专题