Python MySQL Replication ? python으로 MySQL binary log 이벤트를 가져올 수 있는 라이브러리 

 

MySQL 변수값 세팅

 

MySQL 8.0.14 이상 버전 : 글로벌 변수 binlog_row_metadata='FULL' 와 binlog_row_image='FULL'로 설정

    •  binlog_row_metadata : 행 기반 로깅을 사용할 때 바이너리 로그에 추가되는 테이블 메타데이터의 양을 구성
      • MINIMAL (default) :  SIGNED flags, column character set and geometry types와 관련된 메타데이터만 로깅
      • FULL :  column name, 열 이름 이나 문자열 값, ENUM or SET string values, PRIMARY KEY 정보 등과 같은 테이블에 대한 전체 메타데이터가 로깅
    • binlog_row_image : 행 이미지가 바이너리 로그에 기록되는 방식을 결정
      • full (default) : 모든 열을 기록
      • minimal : 변경된 열과 행을 식별하는 데 필요한 열만 기록
      • noblob : 불필요한 BLOB 및 TEXT 열을 제외한 모든 열을 기록

 

먼저, 변수 값 확인

mysql> show variables like 'binlog_row_image';
+---------------------+---------+
| Variable_name       | Value   |
+---------------------+---------+
| binlog_row_metadata | MINIMAL |
+---------------------+---------+
1 row in set (0.01 sec)

mysql> show variables like 'binlog_row_image';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| binlog_row_image | FULL  |
+------------------+-------+
1 row in set (0.00 sec)

 

 

'FULL' 이 아닌 변수는 세팅을 다시 해준다

mysql> SET GLOBAL binlog_row_metadata = 'FULL';
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL binlog_row_metadata = 'FULL';
Query OK, 0 rows affected (0.00 sec)

 

 

설치 

 

pip로 설치 가능 

pip install mysql-replication

 

 

 

사용 예제 

화면에서 binlog 출력 보기 

from pymysqlreplication import BinLogStreamReader
from pymysqlreplication import row_event
import configparser
import pymysqlreplication

parser = configparser.ConfigParser()
parser.read("pipeline.conf")

hostname = parser.get("mysql_config", "hostname")
port = parser.get("mysql_config", "port")
username = parser.get("mysql_config", "username")
password = parser.get("mysql_config", "password")

mysql_settings = {
    "host" : hostname,
    "port" : int(port),
    "user" : username,
    "passwd" : password
}

b_stream = BinLogStreamReader(
            connection_settings= mysql_settings,
            server_id=10,
            only_events=[row_event.DeleteRowsEvent,
                         row_event.WriteRowsEvent,
                         row_event.UpdateRowsEvent]
            ) 

for event in b_stream:
    event.dump()

b_stream.close()

 

  • BinlogStreamerReader() : Connect to replication stream and read event
    • connection_setting : Connection settings
    • server_id : a unique server ID for each replication server, in the range from 1 to 232 − 1
    • only_events: Array of allowed events
      • row event : This events are send by MySQL when data are modified
        • row_event.DeleteRowsEvent : This event is trigger when a row in the database is removed
        • row_event.WriteRowsEvent : This event is triggered when a row in database is added
        • row_event.UpdateRowsEvent : This event is triggered when a row in the database is changed

 

=== WriteRowsEvent ===
Date: 2025-03-20T11:21:47
Log position: 1856
Event size: 29
Read bytes: 12
Table: pipeline.orders
Affected columns: 3
Changed rows: 1
Column Name Information Flag: False
Values:
--
* OrderID : 1
* OrderStatus : Shipped
* LastUpdated : 2020-06-09 02:50:00

=== WriteRowsEvent ===
Date: 2025-03-20T11:21:47
Log position: 2171
Event size: 29
Read bytes: 12
Table: pipeline.orders
Affected columns: 3
Changed rows: 1
Column Name Information Flag: False
Values:
--
* OrderID : 3
* OrderStatus : Shipped
* LastUpdated : 2020-07-11 17:00:00

 

출력이 잘 되는 것을 확인할 수 있다~~ !

 

 

 


*  Binary Logging Options and Variables
https://dev.mysql.com/doc/refman/8.4/en/replication-options-binary-log.html

* Replication and Binary Logging Options and Variables
https://dev.mysql.com/doc/refman/8.4/en/replication-options.html

* python-mysql-replication
https://github.com/julien-duponchelle/python-mysql-replication/tree/main

* Python MySQL Replication’s documentation
https://python-mysql-replication.readthedocs.io/en/latest/index.html

 

'! > python' 카테고리의 다른 글

configparser 사용하기  (0) 2025.03.21
pymysql 사용하기  (0) 2025.03.20
python 문법 가이드  (0) 2025.03.14
python test  (2) 2024.09.26
[Error] ValueError: setting an array element with a sequence  (0) 2023.08.08

카프카 

  • 분산 이벤트 스트리밍 플랫폼 
  • 데이터를 중앙 한 곳에서 처리하도록 중앙집중화
  • 대용량 데이터를 수집하고 실시간 스트림으로 소비할 수 있게 만들어 줌 
  • High throuput message capacity : 짧은 시간 내에 많은 데이터를 컨슈머까지 전달
  • Scalability, Fault tolerant : 뛰어난 확장성, 복구하여 처리 가능 
  • Undeleted log : 카프카 토픽에 들어가 데이터는 컨슈머가 데이터를 가져가도 사라지지 않음

 

Topic 

  • 데이터가 들어가는 공간
  • 하나의 토픽은 여러개의 파티션으로 구성될 수 있음 

 

producer --> topic - patiotion .. --> consumer 

 

 

Producer : 데이터를 토픽에 넣음

Consumer : 데이터를 가져감

  • 카프카의 데이터 분석하고 시각화 하기 위해 --> elastic search에 저장
  • 카프카의 데이터 백업하기 위해 --> hadoop에 저장 

 

Patition

  • 큐처럼 동작
  • 키에 따라 나눠서 데이터 할당
    • 키==NULL, 기본 파티션: round robin으로 할당   
    • 키 있음, 기본 파티션: 키의 해시값을 구해 특정 파티션 할당
  • 늘릴 수는 있지만, 줄일 수 없음 
    • 파티션을 늘리면 컨슈머를 늘려서 데이터 분산 처리 가능 
  • 파티션 안의 레코드는 설정에 따라 값이 삭제됨

 

brocker 

  • 카프카가 설치되어 있는 서버 단위
  • 보통 3개 이상의 broker로 구성 사용 권장 

 

Replication 

  • 파티션의 복제 
  • 카프카 아키텍쳐의 핵심, 클러스터에서 서버가 장애가 생길 때 가용성을 보장
  • 브로커의 개수에 따라 개수가 제한됨
  • replication 개수가 많을 수록 brocker의 리소스 사용량 늘어남 

 

  • Leader patition: 원본 파티션, producer에게 데이터를 전달받음
  • Follower partition: 복제 파티션

 

  • Producer의 ack 옵션 
    • ack=0 : leader patition에 데이터 전송, 응답값 안받음 (속도 빠름, 데이터 유실 가능성)
    • ack=1 : leader patition에 데이터 전송, 잘 받았는지 응답값 받음 (데이터 유실 가능성)
    • ack=all : leader patition에 데이터 전송, 잘 받았는지 응답값 받음, 복제가 잘 이뤄졌는지 응답값 받음 (속도 느림, 유실 없음)

 

ISR (In Sunc Replica) 

  • leader patition + follower patition

 

 

 

Patitioner 

  • Producer가 데이터를 보낼때 파티셔너를 통해 브로커로 전송
  • 데이터를 토픽의 어떤 파티션에 넣을지 결정 (레코드의 메세지키 or 메시지 값에 따라) 

 

UniformStickyPatitioner (기본 파티셔너)

  • 메세지 키 O :
    • 해쉬값 기준으로 파티션 위치 결정,
    • 동일한 메세지 키의 레코드는 항상 동일한 파티션에 들어감 -> 순서를 지켜서 데이터 처리 가능 
  • 메세지 키 X :
    • RR처럼 배치 단위로 파티션에 적절히 분배 
  • 커스텀 파티셔너도 만들 수 있음

 

 

 

Consumer lag

  • 두 offset 간의 차이
    • 프로듀서가 마지막으로 넣은 offset
    • 컨슈머가 마지막으로 읽은 offset
  • 주로 컨슈머의 상태 볼 때 사용
  • 토픽에 여러 파티션이 존재하는 경우, lag도 여러개 존재 가능
  • recods-lag-max : 여러 lag 중 가장 높은 숫자

 

 

Burrow 

  • 카프카 컨슈머 lag 모니터링하기 위한 오픈소스 애플리케이션
  • 멀티 카프카 클러스터 지원
  • sliding window를 통한 컨슈머의 state 확인
  • HTTP API 제공 

 

  • 컨슈머 단위 lag 실시간 모니터링 
    • 데이터 -> Elasticsearch / InfluxDB -> Grafana 

 

 

메세징 플랫폼 

  • 메세지 브로커, (<) 이벤트 브로커 

 

메세지 브로커 

  • 대규모 메세지 기반 미들웨어 아키텍쳐에서 사용되어 옴 
  • 메세지 받아서 처리하고 즉시/짧은 시간 내에 삭제 
  • ex) 레디스 큐, 레빗엠큐

 

이벤트 브로커 

  • 이벤트/메세지 장부를 하나 보관하고 인덱스를 통해 개별 액세스 관리 
  • 업무상 필요한 시간 동안 이벤트 보존 가능 
  • 딱 한번 일어난 이벤트 데이터를 브로커에 저장하여 단일 진실 공급원으로 사용 
  • 장애 발생 시, 장애가 일어난 지점부터 재처리 가능 
  • 많은 양의 실시간 스트림 데이터를 효과적으로 처리 
  • 다양한 이벤트기반 MSA에서 중요한 역할 
  • ex) 카프카, aws 키네시스 

 

 

SaaS 카프카 

  • AWS의 MSK(Managed Streaming for Kafka)
  • Confluent의 Cloud kafka
    • cloud 종류 직접 선택 가능

 

 

빅데이터 플랫폼 아키텍처

  • 초기 : 엔드투엔드로 데이터를 배치로 모으는 구조
  • 람다 아키텍처
    • 배치 레이어: 배치 데이터를 모아서 일괄처리 ex)스파크 잡 
    • 서빙 레이어 : 데이터가 저장된 공간 ex)하둡 
    • 스피드 레이어 : 서비스에서 생성되는 원천 데이터를 실시간으로 분석 ex)카프카
    • 로직의 파편화, 디버깅, 배포, 운영에 대한 이슈 
  • 카파 아키텍처
    • 람다 아키텍처에서 배치레이어 제거, 서빙레이어와 스피드레이어만 존재 
    • 스피드 레이어에서 데이터를 모두 처리 
  • 스트리밍 데이터 레이크 
    • 카파 아키텍처에서 서빙레이어 제거, 스피드레이어만 존재 
    • 하둡을 카프카로 대체 
    • 아직 개선이 필요 

'! > Data' 카테고리의 다른 글

데이터 추출 (data extract)  (0) 2025.03.21
분할 압축 파일(.tar.gz00) 풀기  (0) 2023.06.30
Data Annotation  (0) 2023.04.07

AWS Identity and Access Management(IAM) : AWS 리소스에 대한 액세스를 안전하게 제어하는 ​​데 도움이 되는 웹 서비스

  • IAM을 사용하면 사용자가 액세스할 수 있는 AWS 리소스를 제어하는 ​​권한을 관리할 수 있음
  • IAM을 사용하여 리소스를 사용하도록 인증(로그인)되고 권한이 부여된(권한이 있음) 사람을 제어
  • IAM은 AWS 계정에 대한 인증 및 권한 부여를 제어하는 ​​데 필요한 인프라를 제공

 

IAM은 AWS에서 수행하는 작업에 따라 달라짐 

  • Service user : AWS 서비스를 사용하여 업무를 수행하는 경우
  • Service administrator – 서비스 사용자가 액세스해야 하는 IAM 기능과 리소스를 결정
  • IAM administrator – IAM ID를 관리하고 IAM에 대한 액세스를 관리하는 정책을 작성

 

 

IAM 콘솔을 사용하여 IAM 사용자를 생성 가능

  • 여기서는, AWS Management Consol에 접속이 가능한 관리자를 생성

 

 

[ IAM 사용자 생성 방법 ] 

1. AWS 계정의 루트 사용자로 로그인

 

2. IAM 콘솔 접속 

  • IAM 콘솔에 접속해서 
  • User (사용자) 탭 클릭 

 

3. IAM User 생성하기

 

  • Create user (사용자 생성) 버튼을 클릭 

 

 1단계) Specify user details - 사용자 세부 정보 지정

  • User name : 원하는 이름
  • AWS Management Console에 대한 사용자 액세스 권한 제공 : 선택
    •  IAM 사용자를 생성하고 싶음 : 선택 
  • 콘솔 비밀번호 : 콘솔 접속시 비밀번호  
    • 사용자 지정 암호 : 입력 
    • 다음 로그인 시 새 암호를 생성 : 미선택 

 

 2단계) Set permissions - 권한 설정 

  • Permissions options (권한 옵션) > Attach policies directly (직접 정책 연결) 선택 
  • Permissions policies (권한 정책) > AdministratorAccess 선택 

 

3단계) Review and create - 검토 및 생성 

  • Administrator1 사용자에 AdministratorAccess 관리형 정책이 추가된 것을 확인하고 
  • Create user (사용자 만들기)를 클릭

 

 4단계) Retrieve password

  • 사용자가 추가되면 Console sign-in URL(콘솔 로그인 URL)을 복사
    • https://<본인 AWS 계정의 고유 ID>.signin.aws.amazon.com/console
  • Download .csv file 클릭하여 .csv 파일 다운로드
    • User name Password Console sign-in URL
       포함된 csv 파일 
  • Return to users list 버튼을 눌러보면 방금 생성한 IAM을 확인할 수 있다 ~! 

 

끝! 

 

 

 

※ 번외 : IAM user 로그인하기 

루트 사용자에서 로그아웃하기 

 

복사한 URL로 접속해서 새로 생성한 Administrator1 사용자로 로그인

 

혹은 IAM 사용자 로그인 ->  본인 AWS 계정의 고유 ID, user ID, Password 로 로그인 

  •  본인 AWS 계정의 고유 ID 저장해놓으면 편하게 사용가능 

 

IAM 유저 로그인 완료 ~! 

 

 

 


* aws doc/ IAM
https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html

Binary log (binlog)

    • 테이블 생성 작업이나 테이블 데이터 변경과 같은 데이터베이스 변경 사항을 설명하는 이벤트가 들어 있음
    • 바이너리 로그 사용하는 목적 
      • 복제 (replication) : binlog를 통해 소스에서 수행된 것과 동일한 데이터 변경 사항을 수행하여 복제
      • 복구 (Point-in-Time Recovery, PITR) : 특정 시점의 백업을 복원한 후, 백업 이후의 트랜잭션을 binary log를 이용해 재적용

 

 

Binary Log의 파일 구조

  • Binary Format으로 저장
  • mysqlbinlog 유틸리티로 사람이 읽을 수 있는 형태로 변환 가능
  • 보통 MySQL의 데이터 디렉터리에 .000001, .000002 등과 같은 파일명으로 저장

 

 

Binary Log 활성화 확인

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

 

 

 

Binary Log 포맷 

    • binlog 포맷 종류
      • STATEMENT : SQL 문장을 그대로 기록 (예: INSERT INTO users VALUES (1, 'Alice'))
      • ROW : 변경된 각 행(row)을 기록 (예: 특정 행의 변경 사항만 기록) 
      • MIXED : Statement와 Row 기반 로깅을 혼합
    • binlog 포맷 확인
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

 

 

 

Binary Log 확인

  • 저장된 binlog 파일 목록 확인
mysql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000005 |       180 | No        |
| binlog.000006 |       180 | No        |
| binlog.000007 |       180 | No        |
| binlog.000008 |      2202 | No        |
+---------------+-----------+-----------+
4 rows in set (0.01 sec)

 

 

 

Binary Log 파일 읽기

  • 쉘에서 mysqlbinlog utility를 통해 읽을 수 있다
$ mysqlbinlog binlog.000005

 

 

 

 


* MySQL Manual / The Binary Log
https://dev.mysql.com/doc/refman/8.0/en/binary-log.html

*  MySQL Manual / mysqlbinlog
https://dev.mysql.com/doc/refman/8.4/en/mysqlbinlog.html

'! > DBMS' 카테고리의 다른 글

SQL  (0) 2025.01.09
[MySQL] Sample DB 다운 받기  (0) 2025.01.08
[MySQL] MySQL, MySQL Workbench 설치 (Mac OS)  (0) 2025.01.08
DBMS  (1) 2025.01.08

+ Recent posts