MySQL 主从架构在线热迁移MGR 方案

目录

 

迁移拓扑图

业务方案沟通

相关知识传送门

准备工作

MGR数据迁移


迁移拓扑图

例子中的场景是 M-S 3305 转到 G-R 3306

业务方案沟通

1、迁移前检查 

 a. 表必须使用Innodb引擎 

 b. 表必须有主键或者唯一索引

 c.自增ID非连续,自增列的起始值和步长不是1,业务逻辑不能依赖自增

 d. 不使用 CREATE TABLE … SELECT语法

 e. 在一个事务中 CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE 

 f. 在一个事务中或语句中同时更新事务和非事务表,比如在一个事务中更新 innodb表和myisam表。要更新的所有非事务表是临时表除外

 g.对MGR集群多机房部署

 h.不使用 select xxx for update 语法

 

2、版本升级到MySQL 5.7

 a. 升级MySQL从库实例,通知业务上线 (DBA)

 b. 观察一周高版本从库是否正常使用 (业务)

 c. MySQL 主库切换到高版本实例。验证写,并观察一段时间 (DBA &业务)

 d. 验证没问题后,端口全部实例升级 (DBA)

 e. GTID 开启(DBA) 

注:

 a. 升级将使用滚动升级的方式,5.5升级到5.6,5.6升级到5.7

 b. 升级时会保留老版本MySQL实例并保持同步。若遇到不兼容或者其他问题可以快速回滚

 c. 升级时若发现语法不兼容,联系DBA修改语法限制

 

3、MGR 迁移

 a.主从集群与MGR集群搭建双向同步(DBA)

 b.将读切至新集群验证是否正常(业务方)

 c.将写切至新集群(业务方)

 d.观察一段时间,确认所有业务迁移至新集群(DBA&业务)

 e.断开双向复制 (DBA)

注:

 1. 需要将数据库域名配置为新集群域名

 2. 做数据迁移时,会保证两个集群为双向复制,老集群若有写入会同步到新集群中,且有任何问题可以回滚至老集群,但双向复制为中间状态,一旦开始写迁移,不可长久保持双主状态,需尽快把所有业务迁移。

 3.3305迁移MGR 方案图如上

 4.业务逻辑尽量不使用select xxx for update,由于锁不在组员内共享,很可能会导致死锁

 

 

相关知识传送门

限制与环境要求

https://blog.csdn.net/nicolevv/article/details/90716555

GITD 开启

https://blog.csdn.net/nicolevv/article/details/90716607

准备工作

1、主键检查

select table_schema,table_name from information_schema.tables where (table_schema,table_name) not in(select distinct table_schema,table_name from information_schema.columns where COLUMN_KEY='PRI' ) and table_schema not in ('sys','mysql','information_schema','performance_schema');

2、innodb 引擎检查

select table_schema,table_name from tables where table_schema not in ('information_schema','mysql','performance_schema') and ENGINE != 'innodb'; 

3、语法确认

  • 业务逻辑不能依赖自增
  • 不使用 select xxx for update 语法
  • 不使用 CREATE TABLE … SELECT语法
  • 在一个事务中 CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE 
  • 在一个事务中或语句中同时更新事务和非事务表,比如在一个事务中更新 innodb表和myisam表。要更新的所有非事务表是临时表除外

4、参数修改,在下面的流程里的参数修改部分有写

MGR数据迁移

1、规划自增ID以及端口号

  • 这里步长不要小于节点个数
    • offset 1-~5 
    • 步长 7
    • 老主库也要修改自增
  • 确认没有冲突端口
    • netstat -anltp|grep -E "$por|$slave_port"
    • port_status.py $port  /  port_status.py $slave_port 
    • 端口号 3306 复制端口号 13306
IP auto_increment_offset auto_increment_increment 角色 机房

x.x.x.1

1 7 M-S主库 A
x.x.x.2 2 7 双向节点 C
x.x.x.3 3 7 GR组员 A
x.x.x.4 4 7 GR组员 A
x.x.x.5 5 7 GR组员 B
x.x.x.6 6 7 GR组员 B

 

2、停mb从库实例(在这之前可以先做数据一致性校验)  (这个从库上的gtid_set 一定要与主库保证一致,为了后面做双主的时候不修改gtid_purged值,自动找位点)

3、从规划中的五个节点的机器上拷贝

rsync --password-file=/etc/rsyncd.secrets.passfile -avP --progress  --exclude auto.cnf [email protected]::data1/mysql3306_expanding /data1/

4、修改配置文件

# Group Replication

#server-id 修改
transaction-isolation = READ-COMMITTED
binlog_checksum = NONE
master_info_repository = TABLE
relay_log_info_repository = TABLE
plugin-load = group_replication.so
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = "05bf1a54-82d3-11e9-b604-c81f66d12345"
loose-group_replication_start_on_boot = OFF
loose-group_replication_local_address = 'x.x.x.2:13306'
loose-group_replication_group_seeds = 'x.x.x.2:13306,x.x.x.3:13306,x.x.x.4:13306,x.x.x.5:13306;x.x.x.6:13306,'
group_replication_ip_whitelist = '10.0.0.0/8'
loose-group_replication_bootstrap_group = OFF
loose-group_replication_single_primary_mode = OFF # Trun off Single primary
loose-group_replication_enforce_update_everywhere_checks = ON # Multi-Primary Mode
loose-group_replication_transaction_size_limit = 52428800 # 5.7.19 Configures the maximum transaction size in bytes which the group accepts
# loose-group_replication_unreachable_majority_timeout
report_host = 'x.x.x.2'
report_port = 3306

# Multi Primary Mode
auto_increment_offset = 2
auto_increment_increment = 7

5、授权

mv mysql3305/ mysql3306

useradd  -r -g mysql -M -s /sbin/nologin my3306

chown -R my3306: /data1/mysql3306/

6、启动实例

7、其他机器重复步骤 3、4(修改参数)、5、6

8、做拷贝的mb节点起来,回归M-S集群

9、双向复制实例,x.x.x.2

start slave ; #打开主从的复制通道

10、GR开启

第一个实例:

SET GLOBAL group_replication_bootstrap_group = ON ;

START GROUP_REPLICATION;

SET GLOBAL group_replication_bootstrap_group = OFF ;

新加入成员:

change master to master_user = 'xxxxxx',master_password='xxxxxx' for channel 'group_replication_recovery';

START GROUP_REPLICATION;

11、搭建双主(M-S 主库指向 GR 双向复制节点,gtid点位一致

change master to master_host='x.x.x.1',master_port=3306,master_auto_position =1;

12、做数据一致性校验,验证复制pt-table-sync --print --sync-to-master h=x.x.x.2,u=root,p='123',P=3306 --verbose --wait=10 --transaction --engines=innodb  --recursion-method=processlist --check-triggers --foreign-key-checks -unique-checks --charset=utf8 >3306.log

SELECT * FROM performance_schema.replication_group_members;

Amazing!

你可能感兴趣的:(MySQL)