PHP로 만들어진 MySQL/MariaDB 복제 프로토콜 라이브러리를 이용한, MariaDB Binlog 기반의 변경사항 수집 응용 어플리케이션으로 분석 범위를 분할하는 Partitioner와 실제 변경사항 데이터를 수집하는 Worker로 구성되어 있습니다.
주요 사용 라이브러리: php-mysql-replication
- Composer 사용
composer require ridibooks/php-binlog-collector
- 직접 Github 사용
git clone https://github.com/ridi/php-binlog-collector.git
composer install -o
php-mysql-replication 와 동일합니다.
TARGET_DB는 binlog-format: row 로 설정되어 운영중이여야 합니다.
TARGET_DB 접근 권한은 REPLICATION SLAVE, REPLICATION CLIENT, SELECT 가 필요합니다.
.env.local는 아래와 같습니다.
BINLOG_MYSQL_TARGET는 분석할 DB, BINLOG_MYSQL_HISTORY_WRITE는 분석 위치 및 이력 데이터를 저장할 DB 입니다.
BINLOG_ENABLE_SENTRY=0
BINLOG_SENTRY_KEY=
BINLOG_MYSQL_TARGET_HOST=127.0.0.1
BINLOG_MYSQL_TARGET_USER=repl
BINLOG_MYSQL_TARGET_PORT=3307
BINLOG_MYSQL_TARGET_PASSWORD=1234
BINLOG_MYSQL_TARGET_DBNAME=php_mysql_replication
BINLOG_MYSQL_TARGET_DRIVER=pdo_mysql
BINLOG_MYSQL_TARGET_CHARSET=utf8
BINLOG_MYSQL_HISTORY_WRITE_HOST=127.0.0.1
BINLOG_MYSQL_HISTORY_WRITE_USER=testUser
BINLOG_MYSQL_HISTORY_WRITE_PORT=3308
BINLOG_MYSQL_HISTORY_WRITE_PASSWORD=testUser
BINLOG_MYSQL_HISTORY_WRITE_DBNAME=platform
BINLOG_MYSQL_HISTORY_WRITE_DRIVER=pdo_mysql
BINLOG_MYSQL_HISTORY_WRITE_CHARSET=utf8
해당 설정 정보는 demo에 docker 기반 환경에 들어 있는 기본 연결 정보입니다.
만약 .env 파일이 있으면 해당 파일로 교체됩니다.
default 설정정보이며, 외부에서 설정을 변경할 수 있습니다.
설정 정보 | 디폴트 값 | 사용 | 설명 |
---|---|---|---|
gtid_partition_max_count | 1000 | Partitioner | 파티션 최대 개수 |
jump_offset_for_next_partition | 10000 | Partitioner | 파티션을 나누기 위한 값 |
tables_only | X | Worker | 타겟 테이블명들 |
databases_only | X | Worker | 타겟 데이터베이스명들 |
child_process_max_count | 10 | Worker | 동시에 실행할 워커 수 |
once_processed_max_event_count_in_gtid | 100 | Worker | 한 트랜잭션에 한 번에 저장할 이벤트 수 |
gtid_count_for_persist_per_partition | 500 | Worker | 분석시 위치 갱신을 위한 Gtid 갯수 |
is_all_print_event | false | ALL | 디버깅 사용여부 |
- Binlog Collector Partitioner에서 최초에 분석을 시작할 위치를 입력하여 분석할 범위를 나눕니다.
php [every]binlog_collect_partitioner.php change_pos [binLogFileName] [binLogPosition]
'ex) php [every]binlog_collect_partitioner.php change_pos mariadb-bin.000003 36755'
- 이미 분석을 시작했다면, 아래 명령어로 DB에 저장된 위치로부터 계속 분석 범위를 나눕니다.
php [every]binlog_collect_partitioner.php continue
- Partitioner가 나눈 범위에 대해서 Binlog Collector Worker가 병렬적으로 처리합니다.
php [every]binlog_collector_worker.php
모든 데모들은 demo directory 에서 이용할 수 있고, docker 기반의 mariadb 환경 및 실제 구동은 travis-ci를 통해서 테스트 해볼 수 있습니다. MariaDB Binlog을 이용한 변경사항 추적 에서 설계 내용을 확인 할 수 있습니다.