Avatar
임호현
좋아요
댓글
[장애사례보고](MairaDB) #0001 - binary format 변경 후 replication 중단

 

장애 현상

  • binary log의 format을 MIXED에서 ROW로 변경 후 아래의 오류에 의해 replication이 중단됨
  • 존재 하지 않는 레코드 이므로 해당 이벤트를 skip 하여도 하루에 한번 이상 주기적으로 발생하고 있음
 Last_SQL_Error: Could not execute Delete_rows_v1 event on table OSMDB.INSTALLER_APKLIST; Can't find record in 'INSTALLER_APKLIST', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql11-bin.000834, end_log_pos 26480423

 

영향받은 서비스

  • 8 Sync(CDC 솔루션)
  • MariaDB replication

 

환경 정보

OS 버전 : RHEL 7.4

DB 버전 : MariaDB 10.3

 

 

장애 원인

 

현재 DB의 구성은 아래와 같음

 

db_architecture.png

  1. slave(10.3)에 gtid=0-7307-222367401 인 트랜잭션이 수행(트랜잭션은 Delete_rows_v1 이벤트로 데이터를 삭제하는 트랜잭션임)
  2. 8sync가gtid=0-7307-222367401인 트랜잭션을 binary log에서 읽어서 gtid=0-62622-219704698인 트랜잭션으로 master(10.0)에 반영
  3. master(10.0)은 8 sync에서 받은 트랜잭션을 자신의 binary log에 write
  4. master(10.0)의 dump thread는 binary에 기록된 이벤트(Delete_rows_v1)를 읽어 slave(10.3)으로 전달
  5. slave(10.3)의 replication IO Thread가 다시 0-62622-219704698인 트랜잭션을 relay log에 복사
  6. slave(10.3)의 replication SQL Thread가 해당 트랜잭션을 수행
  7. 복제된 이벤트(Delete_rows_v1)를 위해 인덱스에서 해당 레코드 검색을 수행
  8. 1번에서 이마 삭제된 데이터이므로 해당 레코드는 인덱스에 존재 하지 않음  ---------> 오류 발생

 

이 오류가 발생 binlog_format을 ROW로 변경 한 후 발생한 이유는 기존에 MIXED를 쓸때는 복제가 STATEMENT 기반으로 복제 되었을 것으로 추측됨

STATEMENT로 복제되면 아래의 Replicate_Do_DB 필터에 의해 필터링되어 반영이 되지 못했을 수 있음(ROW포멧에 비해 STATEMENT로 복제되면 필터를 타는 것이 좀 까다로워짐)

따라서 기존에 오류가 없는 상황이 비정상이고 ROW format으로 변경 후 오류가 난 것이 정상인 상황(설정을 잘못한 케이스)

root@localhost:(none) 08:16:45>show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event

.............. 생략 .............. 

         Relay_Master_Log_File: mysql11-bin.000834
              Slave_IO_Running: Yes
             Slave_SQL_Running: No
               Replicate_Do_DB: ODVDB,OFDDB,OSMDB
           Replicate_Ignore_DB:
.............. 생략 .............. 

 

해결 방법

Workaround

  1. slave(10.3)의 Replication 필터에 ignore_server_id=62622로 설정하여 복제되는 트랜잭션을 무시
  2. 8sync 타겟 프로세스가 sql_log_bin=0을 설정하여 10.0 binary log에 이벤트를 기록하지 않는 방법(이 방법은 현재 불가능하다고 함)

 

1번 방법으로 적용함