Featured image of post 16.7.4 복제 고급 설정 - 필터링된 복제(Filterd Replication)

16.7.4 복제 고급 설정 - 필터링된 복제(Filterd Replication)

Real MySQL 8.0

MySQL 복제에서는 소스 서버의 특정 이벤트들만 레플리카 서버에 적용될 수 있도록 필터링 기능을 제공한다.

필터링의 주체는 소스 서버와 레플리카 서버 둘 다 될 수 있다.

  • 레플리카 서버에서 좀 더 다양한 형태의 필터링을 사용할 수 있다.
  • 소스 서버에서는 발생한 이벤트들 중 특정 이벤트들만 바이너리 로그에 기록하거나 혹은 기록하지 않음으로써 복제에서 이벤트가 필터링 될 수 있게 한다.

소스 서버에서의 필터링은 데이터베이스 단위로만 가능하며, 옵션을 사용해 특정 데이터베이스에 대한 이벤트들만 바이너리 로그에 기록되게 하거나 혹은 기록되지 않게끔 설정할 수 있다.

  • binlog-do-db
    • 바이너리 로그에 기록할 데이터베이스명을 지정한다.
    • 지정된 데이터베이스에 대한 이벤트들만 바이너리 로그에 기록된다.
  • binlog-ignore-db
    • 바이너리 로그에 기록하지 않을 데이터베이스명을 지정한다.
    • 지정된 데이터베이스에 대한 이벤트들은 바이너리 로그에 기록되지 않는다.

두 옵션은 MySQL 서버를 시작할 때 커맨드 라인이나 설정 파일에 지정해서 사용 가능하며, 동적으로 변경할 수 없어 재시작이 필요하다.

1
2
3
4
binlog-do-db=production
binlog-do-db=db1
binlog-do-db=db2
binlog-ignore-db=test

레플리카 서버에서는 소스 서버에서보다 유연한 형태로 필터링 설정이 가능하며, 동적으로 필터링 설정을 변경할 수도 있다.

  • 레플리카 서버에서의 필터링은 릴레이 로그에 저장된 이벤트들을 실행하는 시점에 적용된다.
  • 소스 서버로부터 이벤트를 가져올 때 미리 필터링해서 이벤트들을 가져오는 것이 아니라 일단 모든 이벤트들을 가져온 다음 이벤트를 실행할 때 필터링을 적용한다.

사용자는 레플리카 서버를 시작할 때 커맨드 라인 혹은 설정 파일에 옵션을 지정하거나 현재 구동중인 레플리가 서버에서 CHANGE REPLICATION FILTER 구문으로 필터링을 설정할 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CHANGE REPLICATION FILTER filter[, filter, ...] [FOR CHANNEL channel_name]

filter:
    REPLICATE_DO_DB = (db_name[, db_name, ...])
    REPLICATE_IGNORE_DB = (db_name[, db_name, ...])
    REPLICATE_DO_TABLE = (db_name.table_name[, db_name.table_name, ...])
    REPLICATE_IGNORE_TABLE = (db_name.table_name[, db_name.table_name, ...])
    RELICATE_WILD_DO_TABLE = ('db_pattern.table_pattern'[, 'db_pattern.table_pattern', ...])
    REPLICATE_WILD_IGNORE_TABLE = ('db_pattern.table_pattern'[, 'db_pattern.table_pattern', ...])
    REPLICATE_REWRITE_DB = ((from_db, to_db) [, (from_db, to_db), ...])
옵션커맨드 라인 및 설정 파일 옵션설명
REPLICATE_DO_DBreplicate-do-db복제 대상 데이터베이스 지정
REPLICATE_IGNORE_DBreplicate-ignore-db복제에서 제외할 데이터베이스 지정
REPLICATE_DO_TABLEreplicate-do-table복제 대상 테이블을 지정
REPLICATE_IGNORE_TABLEreplicate-ignore-table복제에서 제외할 테이블을 지정
RELICATE_WILD_DO_TABLEreplicate-wild-do-table복제 대상 테이블을 와일드카드 패턴을 사용해 지정
REPLICATE_WILD_IGNORE_TABLEreplicate-wild-ignore-table복제에서 제외할 테이블을 와일드 카드 패턴으로 지정
REPLICATE_REWRITE_DBreplicate-rewrite-db특정 데이터베이스에 대한 이벤트들을 지정한 데이터베이스로 치환해서 적용

복제 필터링을 적용하려면 복제를 시작하기 전 해당 구문을 실행하거나 SQL 스레드를 멈춘 후 구문을 실행한 후 SQL 스레드를 재시작한다.


이미 설정된 필터링 옵션들을 해제하려면 CHANGE REPLICATION FILTER 구문에 해제하고자 하는 필터링 옵션들을 명시적으로 빈 값으로 설정해서 실행한다.

1
2
CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();

복제 필터링이 적용된 레플리카 서버에서는 복제된 이벤트 실행 시 다음 단계를 거친다.

  1. 데이터베이스 수준으로 설정된 필터링 옵션들을 바탕으로 1차적으로 필터링한다.
  2. 테이블 수준으로 설정된 필터링 옵션들을 체크해서 최종적으로 이벤트의 적용 여부를 결정한다.

데이터베이스 수준의 필터링 옵션들의 경우 복제되어 넘어온 이벤트의 바이너리 로그 포맷별로 해당 이벤트가 속한 데이터베이스를 식별하는 방식이 다르기 때문이다.

  • 이벤트가 Statement 포맷인 경우에는 USE 문에 의해 지정된 디폴트 데이터베이스를 바탕으로 필터링이 적용된다.
  • ROW 포맷인 경우 DML 이벤트들은 변경된 테이블이 속한 데이터베이스를 바탕으로 필터링이 적용된다.
  • DDL 이벤트들은 Row 포맷이라도 Statement 포맷으로 로깅되므로 USE 문에 의해 지정된 데이터 베이스가 필터링 기준이 된다.

바이너리 로그 포맷에 따라 데이터베이스 식별 방식이 달라지므로 사용자가 예상했던 것과는 다르게 필터링이 처리될 수 있다.

  • 사용자는 데이터베이스 수준의 필터링 옵션을 사용할 때 서버에 설정된 바이너리 로그 포맷이 무엇인지 확인해야 한다.
  • 데이터베이스를 직접 명시해서 사용하는 쿼리가 있는지 반드시 사전에 확인해야 한다.

테이블 수준의 필터링 옵션을 사용하는 경우에도 복제 대상 테이블과 복제 제외 대상 테이블을 함께 변경하는 형태의 쿼리를 사용하는 경우 바이너리 로그 포맷에 따라 필터링 결과가 달라질 수 있으므로 주의해야 한다.

  • ROW 포맷
    • DDL문에 의해서 USE 문을 사용해 디폴트 데이터베이스가 설정되게 하고 쿼리에서 데이터베이스명을 지정하지 않는다.
  • STATEMENT or MIXED
    • DML, DDL 모두 USE 문을 사용해 디폴트 데이터베이스가 설정되게 하고 쿼리에서 데이터베이스명을 지정하지 않는다.
    • 복제 대상 테이블과 복제 제외 대상 테이블을 모두 변경하는 DML을 사용하지 않는다.