> 데이터 베이스 > MySQL 튜토리얼 > MySQL 계단식 복제에서 대규모 테이블의 필드를 확장하는 방법

MySQL 계단식 복제에서 대규모 테이블의 필드를 확장하는 방법

WBOY
풀어 주다: 2023-05-29 23:13:39
앞으로
809명이 탐색했습니다.

MySQL 캐스케이드 복제 시 대형 테이블의 필드 확장

1. 배경

고객의 비즈니스에는 약 4억 행의 테이블이 있습니다. 비즈니스 확장으로 인해 테이블의 open_id varchar(50)을 varchar(500)로 확장해야 합니다. ) ).
변경하는 동안 메인 라이브러리에 미치는 영향을 최소화하도록 노력하세요(영향을 주지 않는 것이 바람직합니다 -> 결국 4시간의 창구 기간을 위해 노력했습니다).

2. 데이터베이스 테이블 정보

환경: Mysql 8.0.22
1 Gtid 기반의 마스터 1 슬레이브 복사본

1. 첫 번째 질문입니다. 네, 이 테이블의 ibd를 보세요

파일이 280G + 카운트가 오랫동안 반환되지 않았습니다 + 대기 데이터베이스를 사용하여 행 수가 > 4억

以下语句也可以查看:
show table status from dbname like 'tablename'\G # Rows 的值不准,有时误差有2倍

SELECT a.table_schema,a.table_name,concat(round(sum(DATA_LENGTH/1024/1024)+sum(INDEX_LENGTH/1024/1024),2) ,'MB')total_size,concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') AS data_size,concat(round(sum(INDEX_LENGTH/1024/1024),2),'MB') AS index_size FROM information_schema.TABLES a WHERE a.table_schema = 'dbname' AND a.table_name = 'tablename'; #看下此表的数据量
로그인 후 복사

큰 테이블이므로 어떤 방법을 사용하여 만들어야 합니까? 변화?

3. 아래 솔루션 선택

M은 메인 라이브러리를 나타내며, S1은 슬레이브 1, S2는 슬레이브 2

Method장점단점타당성
온라인DDL 네이티브, 중간 임시 테이블ALGORITHM=COPY 사용 시 DML이 차단됩니다. 권장 버전 >MySQL5.7별 5개
Gh-ost트리거 대신 binlog + 재생 스레드를 사용하세요 파티 도구는 다양한 매개변수에 따라 실행 시간이 길어집니다별 4개
Pt-osc트리거를 사용하여 기본 테이블과 보조 테이블의 일관성을 유지하는 우수한 버전 호환성타사 도구 및 추가 사용 제한 별 3개
M-S1-S2시간 추정 가능캐스케이드 복제, 수동 조작별 1개

처음 3개 옵션을 선택하지 않은 이유 ?

실제 상황 평가에 따르면 이번 비즈니스 측 수요는 이 테이블에는 24시간 비즈니스 트래픽이 있으며, 4시간 이상의 비즈니스 비가용 시간은 허용되지 않습니다.

OnlineDDL 방식, ALGORITHM =COPY, 해당 기간은 DDL이 완료될 때까지 기본 및 보조 테이블의 최종 이름 바꾸기 작업 동안(읽기 및 쓰기 불가능) DML(읽기 전용)이 차단됩니다(필요한 시간은 불확실함).

변환을 위해 슬레이브 라이브러리에 Gh-ost 모드로 연결하는 것이 좋습니다. 이 모드는 메인 라이브러리에 미치는 영향이 가장 적으며 매개변수를 통해 흐름 제어를 설정할 수 있습니다. 이 도구의 치명적인 약점은 4억 개의 데이터가 포함된 테이블의 경우 테스트 환경에서 변경 시간이 70시간이 걸린다는 것입니다. 마지막으로 전환 명령을 실행하고 중간 테이블 *_del을 수동으로 삭제해야 합니다. 이 솔루션의 장점은 슬레이브 데이터베이스가 있어 데이터 보안을 보장하므로 1마스터 2슬레이브 아키텍처를 사용하는 경우 더욱 권장됩니다.

Pt-osc와 Gh-ost는 모두 제3자에 속합니다. Pt-osc의 대형 테이블 운영과 OnlineDDL에는 실패 시 롤백 비용이 매우 높다는 공통적인 단점이 있습니다.

MySQL <5.7 등 하위 버전이라면 사용 가능합니다. 이론적으로 OnlineDDL은 MySQL 5.6.7부터 지원되기 시작하는데 초반에는 지원이 별로 좋지 않으니 적절히 선택하시면 됩니다.

결국 우리는 M-S1-S2 캐스케이드 복제에서 수행되는 DBA가 선호하는 (xin ku) 방법을 선택했습니다.

4. 작동 방법

  • 새로운 S1 슬레이브 라이브러리를 생성하고 M-S1-S2 캐스케이드 복제를 구축하세요

  • OnlineDDL을 사용하여 S2에서 분야를 확장하세요(장점은 해당 기간 동안 M-S1은 영향을 받지 않음)

  • 확장 완료 후 M-S1-S2의 지연된 동기화를 기다립니다(S2와 M의 데이터 차이를 줄이고 데이터 검증 수행)

  • S1을 제거하고 설정합니다. M-S2의 마스터-슬레이브 관계(S2가 M의 데이터를 계속 동기화하도록 함)

  • S2 백업 및 S1 복원, M-S2-S1 계단식 복제 설정

  • 애플리케이션이 중지되고 마스터-슬레이브 데이터를 기다립니다. 일관성을 유지하는 것(차등 데이터 볼륨의 동기화 시간이 매우 짧다는 장점)

  • 결국 S2는 마스터 라이브러리가 되고 S1은 슬레이브 라이브러리가 됩니다(애플리케이션은 프런트엔드 연결을 수정해야 함) 안내)

  • 회귀검증을 위해 적용하는 작업입니다

위 내용이 굉장히 복잡해 보이지만 본질적으로는 백업과 복구입니다. 독자들은 이것을 대안으로 생각할 수 있다. 특정 단계를 공유하시겠습니까?

环境装备:开启Gtid,注意M,S1 binlog保存时长,磁盘剩余空间大于待变更表的2倍
show global variables like &#39;binlog_expire_logs_seconds&#39;; # 默认604800
set global binlog_expire_logs_seconds=1209600; # 主库和级联主库都需要设置
1.搭建 1主2从的级联复制,M -> S1 -> S2 ,安装MySQL注意本次环境lower_case_table_names = 0 
2.在S2 上做字段扩容。 预估 10个小时
`参数设置:`
set global slave_type_conversions=&#39;ALL_NON_LOSSY&#39;; # 防止复制报错SQL_Errno: 13146,属于字段类型长度不一致无法回放
set global interactive_timeout=144000;set global wait_timeout =144000;
`磁盘IO参数设置:`
set global innodb_buffer_pool_size=32*1024*1024*1024;# 增加buffer_pool 防止Error1206The total number of locks exceeds the lock table size 资源不足
set global sync_binlog=20000;set global innodb_flush_log_at_trx_commit=2;
set global innodb_io_capacity=600000;set global innodb_io_capacity_max=1200000; # innodb_io_capacity需要设置两次
show variables like &#39;%innodb_io%&#39;; # 验证以上设置
screen 下执行:
time mysql -S /data/mysql/3306/data/mysqld.sock -p&#39;&#39; dbname -NBe "ALTER TABLE tablename MODIFY COLUMN open_id VARCHAR(500) NULL DEFAULT NULL COMMENT &#39;Id&#39; COLLATE &#39;utf8mb4_bin&#39;;"
查看DDL进度:
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED  FROM performance_schema.events_stages_current;
3.扩容完成后,等待延迟同步M-S1-S2 
数据同步至主从一致,对比主从Gtid
4.移除S1,建立M-S2的主从关系
S1 (可选)
stop slave;
reset slave all;
systemctl stop mysql_3306
S2
stop slave;
reset slave all;
# MASTER_HOST=&#39;M主机IP&#39;  
CHANGE MASTER TO
  MASTER_HOST=&#39;&#39;,
  MASTER_USER=&#39;&#39;,
  MASTER_PASSWORD=&#39;,
  MASTER_PORT=3306,
  MASTER_AUTO_POSITION=1,
  MASTER_CONNECT_RETRY=10;
start slave; (flush privileges;# 验证数据可正常同步)
5.备份S2恢复S1,建立M-S2-S1级联复制
物理备份S2,重做S2->S1 级联主从
rm -rf binlog/*
rm -rf redolog/*
xtrabackup --defaults-file=/data/mysql/3306/my.cnf.3306 --move-back --target-dir=/data/actionsky/xtrabackup_recovery/data
chown -R mysql. data/
chown -R mysql. binlog/*
chown -R mysql. redolog/*
systemctl start mysql_3306
set global gtid_purged=&#39;&#39;;
reset slave all;
# MASTER_HOST=&#39;S2主机IP&#39;  ,已扩容变更完的主机
CHANGE MASTER TO
  MASTER_HOST=&#39;&#39;,
  MASTER_USER=&#39;&#39;,
  MASTER_PASSWORD=&#39;&#39;,
  MASTER_PORT=3306,
  MASTER_AUTO_POSITION=1,
  MASTER_CONNECT_RETRY=10;
`MySQL8.0版本需要在上面语句中添加 GET_MASTER_PUBLIC_KEY=1; #防止 Last_IO_Errno: 2061 message: Authentication plugin &#39;caching_sha2_password&#39; reported error: Authentication requires secure connection.`
start slave;
6.应用停服,等待主从数据一致
主库停服+可设置read_only+flush privileges,对比主从Gtid
7.最终S2成为主库,S1为从库
应用更改配置连接新主库。
S2上:
stop slave;reset slave all;
set global read_only=0;set global super_read_only=0;
`show master status\G 观察是否有新事务写入`

收尾:还原第2步的参数设置。
set global interactive_timeout=28800;set global wait_timeout =28800;
set global innodb_buffer_pool_size=8*1024*1024*1024;
set global slave_type_conversions=&#39;&#39;;
set global sync_binlog=1;set global innodb_flush_log_at_trx_commit=1;
set global innodb_io_capacity=2000;set global innodb_io_capacity_max=4000;
로그인 후 복사

추가 시나리오: 디스크 IO 기능을 기반으로 테스트

메인 라이브러리에서 직접 수정하고 트래픽이 없습니다.
시나리오 1, 디스크는 NVME 물리적 머신, 4억 데이터 약 5시간 정도 소요됩니다(디스크 성능 1G/s).
시나리오 2, 디스크가 기계식 디스크인 가상 머신의 경우 이 데이터 양은 약 40시간이 걸립니다(디스크 성능 100M/s).

위 내용은 MySQL 계단식 복제에서 대규모 테이블의 필드를 확장하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿