//
MySQL从库server-id相同会发生什么情况?
//
今天中午,尝试着将线上rds的一套主从复制架构重新给搭建成一主两从的架构,在搭建的过程中,遇到了一些有意思的问题,记录一下:
搭建主从复制的架构图如下:
步骤1,当前复制关系为线上rds和本地ECS的主从关系:
步骤2,由于数据量比较大,通过scp拷贝的方法将ECS上的数据拷贝到另外一台ECS上:
最终想要的结果:
按道理,由于两台ECS的数据是通过物理拷贝的方式进行的,所以他们的数据是一模一样的,包括复制的偏移量都是一样的,这2台ECS(右边的)和线上rds主从关系搭建应该没有问题才对,但是在实际操作的过程中,右侧的ECS没有问题,左侧的ECS出现一个错误,错误信息是:
Got fatal error 1236 from master when reading data from binary log: 'A slave with the same server_uuid/server_id as this slave has connected to the master; the first event '' at 4, the last event read from '/home/mysql/data3059/mysql/mysql-bin.001815' at 242534245
从错误信息中不难看出,是因为我们第2步中使用了拷贝的方式,导致两个ECS从库拥有相同的Server id和uuid,在MySQL5.7.16的版本中,Server-id是可以支持动态修改的,我们使用下面的SQL进行修改:
mysql> show variables like '%server_id%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| pseudo_server_id | 0 |
| server_id | |
| server_id_bits | 32 |
+------------------+-------+
rows in set (. sec)
mysql> set global server_id=;
Query OK, rows affected (. sec)
修改前后的情况如下:
修改前,右边的复制关系是最新的,是OK的,左侧原本的ECS主从关系断开了。
当我们使用set global的方法修改左侧的server-id为4610,并重新建立复制关系的时候,结果如下:
可以看到,左侧的server-id改成了4310,复制重新建立了,右侧的复制关系又断开了,报错内容跟左边的一致。
到这里,可能有朋友发现了,还有uuid没有改呢,二者的uuid是一样的,是的,实际情况也确实是这样。
于是我们又修改了右侧ECS的uuid值,然后重新启动右侧的ECS实例,搭建复制关系,发现问题已经解决了,实现了我们想要一主多从的结果。
在复制关系更改前后,在master上看slave的信息,如下:
mysql--dba_admin :(none) ::>>show slave hosts;
+------------+------+------+------------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+------------+------+------+------------+--------------------------------------+
| 4610 | | 4802 | xxxx46 | a22a5b8axxxxxxx-9c4b-00163xxxxxxxd21 |
+------------+------+------+------------+--------------------------------------+
rows in set (. sec)
mysql--dba_admin :(none) ::>>show slave hosts;
+------------+------+------+------------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+------------+------+------+------------+--------------------------------------+
| 4609 | | 4306 | xxxx46 | a22a5b8axxxxxxx-9c4b-00163exxxxxxd20 |
+------------+------+------+------------+--------------------------------------+
rows in set (. sec)
一点总结:
在MySQL中,搭建一主多从的时候,从库的server-id和uuid不能相同,如果新加入的从库设置的server-id或者uuid跟其他从库相同,MySQL并不会直接拒绝加入主从关系,而是将之前的Slave节点进行剔除掉,来保证show slave hosts中一个server-id只对应一个从节点。
有帮助的话还希望点下再看哈