FILE+POS 方式 GreatSQL 主从复制架构给主节点磁盘扩容
FILE+POS 方式 GreatSQL 主从复制架构给主节点磁盘扩容
一、前提
在一套非常老的系统上,有一套 GreatSQL 主从集群(1 主 1 从),主从复制采用的是 FILE+POS 方式复制,磁盘使用紧张需要扩容,只能在该台机器上添加更大的磁盘,将原数据盘替换,也没有其他的机器资源替换。这套系统没有 VIP,没有高可用切换工具,业务读写直连主节点,从节点可供读,允许有一定的延迟,全程磁盘扩容需要手动操作,以下方案步骤是模拟最快的方式去进行磁盘扩容。
二、整体思路是
在主节点机器上挂载一块新磁盘,在新磁盘上搭建一个新的从节点,旧从节点的主变为新从节点,最后将主节点与新从节点准备好配置文件后,关闭主节点,将新从节点使用新的配置文件重启,端口号为旧主 port,新主实例顶替旧主成功。
三、模拟环境
主从架构
db01:master,172.17.135.81:3306
db02:slave02,172.17.134.225:3306
原主从 db01 master 复制数据到 db02 slave02,现在在 db01 上搭建新的从节点 slave01,并将 slave01 提升为新的主节点 master02
db01:IP 为 172.17.135.81
master :port 3306
slave01:port 3307
db02:IP 为 172.17.134.225
slave02:port 3306
四、以下操作为模拟切换流程
1).在 db01 上 master 数据放在磁盘 /data/
使用 xtrabackup 工具备份并搭建 db01 slave01 数据放在磁盘/data2/上
2).改变 db02 slave02 数据源为 db01 slave01(即 db02 slave02 从 db01-slave01 同步数据),后期切换数据库
操作过程
01.停掉 db02 slave02 复制线程
先停 slave02 目的是,slave02 获取执行的 binlog 比 db01 slave01 上的 binlog 少,方便后续 db02 slave02 追数据到 db01 slave01 指定的位点
![](https://static001.geekbang.org/infoq/51/516f1073020c81b18c806e9584837e74.png)
02.观察 db02 slave02(一定要小于 04 步骤的位置)
![](https://static001.geekbang.org/infoq/af/af7d4e2c445e11862225287443aeb774.png)
03.停掉 db01 slave01 主从线程
观察主从复制情况,确认 db01 slave01 获取主节点位点比 db02 slave02 大,然后停掉主从,方便方便获取 db01 slave01 上的 binlog 位置信息(show master status)
观察标记部分比 db02 slave02 大
![](https://static001.geekbang.org/infoq/31/310e4da8715d105516c39552c9e8b695.png)
停止复制
![](https://static001.geekbang.org/infoq/fa/faf17cccd151d35d47802f6a3c8ad22d.png)
04.观察 db01 slave01
![](https://static001.geekbang.org/infoq/f0/f03fdf11a9187aa8fa6c2b198fba3c9b.png)
05.观察 db01 slave01
与获取主节点过来的 binlog 位点信息与当前节点上 binlog 位点信息对应关系
![](https://static001.geekbang.org/infoq/24/24cd16a1a10ffd20cc0f4916848143d5.png)
06.开启 db01 slave01 主从线程
使 db01 slave01 正常追数据
07.db02 slave02 执行 until 的位置 为(04 步骤)得到的值
追 binlog 至指定位点,该位点对应着 db01 slave01 节点上show master status
获取的位点信息
![](https://static001.geekbang.org/infoq/40/404b2b2695b003c381f670afa475613e.png)
观察状态,是否到指定位点停止
![](https://static001.geekbang.org/infoq/94/945cdeeb017bf06dd2bb25e8df4d4414.png)
到指定位点停止后,停掉主从复制
![](https://static001.geekbang.org/infoq/f6/f6379396dbff6cea716361d1f0cb16d0.png)
08.db02 slave02 从 db01 slave01 获取数据源(即重新指定 db02 slave02 主库信息)
根据 04 、05 获取的主 binlog 位点与 db01 slave01 binlog 位点对应关系,将 db02 slave02 复制关系指定位从 db01 slave01 获取 binlog 数据,重启主从复制,并观察主从状态
在 db02 slave02 重新指定复制关系
![](https://static001.geekbang.org/infoq/f5/f515270c61ac9e7f1599194c0933b05f.png)
观察复制状态,等待复制正常之后在进行下一步,避免数据丢失
![](https://static001.geekbang.org/infoq/dd/dda4e1e885a492e17d74d506e04a8563.png)
09.通知将业务停止,避免数据更新,观察全部节点是否处于同一 binlog 位点状态
在 db01 master 节点上观察
![](https://static001.geekbang.org/infoq/31/311e127ac6abce63f960360a4847fb4b.png)
观察 db01 slave01 主从是否正常,且无延迟
![](https://static001.geekbang.org/infoq/bb/bbb9eaa287022618963ef360b57283ae.png)
![](https://static001.geekbang.org/infoq/3f/3fbbe15c5b06aa6666764e855077d257.png)
观察 db02 slave02
![](https://static001.geekbang.org/infoq/79/793bfef3d575d21df12f7ca7702ec9fe.png)
10.停止 db02 slave 02
11.在 db02 slave 02 观察
12.先后正常关闭 db01 master,然后关闭 db01 slave01
修改配置文件 db01 slave01 端口号为 3306
13.启动 db01 slave01(不要启动 db01 master)
登录 db01 slave01 清除复制信息
14.重置 db02 slave02 主从复制信息,从新的主节点拉取数据
![](https://static001.geekbang.org/infoq/b5/b5c04e67ac5f179fb5d18568961f4e45.png)
15、通知业务重连,磁盘扩容完成
五、案例总结
本案例主要是针对非 GTID 复制、无自动切换、无 VIP、无新机器、磁盘无法动态扩容的场景。
核心思想是找到对应的 binlog 位点信息,在重新指定主从信息,在重新指定主从信息之前,可以做准备工作,例如主节点上的新备主节点可以提前准备,配置文件可以提前准备,命令提前准备好,通过填补的方式将关键信息填到对应的命令中,尽量的去节省时间以及追数时间,促使业务宕机时间达到最短。
评论