데이터 동기화 문제 중지 중지-이 안내서는 MySQL-to-PostgresQL 전송을 쉽게 만듭니다.

데이터 동기화 문제 중지 중지-이 안내서는 MySQL-to-PostgresQL 전송을 쉽게 만듭니다.

이 기사는 MySQL에서 PostgreSQL을 사용하여 전체 데이터 동기화를 달성하는 방법에 대한 자세한 연습을 제공합니다. Apache Seatunnel 2.3.9. 환경 설정에서 생산 검증에 이르기까지 전체 엔드 투 엔드 프로세스를 다룹니다. mysql-to-postgresql 동기화 시나리오로 뛰어 들자.

버전 요구 사항 :

  • mysql : MySQL 8.3
  • postgresql : Postgresql 13.2
  • Apache Seatunnel : Apache-Seatunnel-2.3.9

예비

버전 정보를 확인하십시오

버전을 확인하려면 다음 SQL 명령을 실행하십시오.

-- Check version information 
select version();

마스터 슬레이브 복제를 활성화하십시오

-- View replication-related variables
show variables where variable_name in ('log_bin', 'binlog_format', 'binlog_row_image', 'gtid_mode', 'enforce_gtid_consistency');

MySQL CDC 데이터 동기화의 경우 SeatUnnel은 MySQL을 읽어야합니다.binlogMySQL 클러스터에서 슬레이브 노드 역할을합니다.

참고 : MySQL 8.0+에서binlog기본적으로 활성화되지만 복제 모드는 수동으로 활성화되어야합니다.

-- Enable master-slave replication (execute in sequence)
-- SET GLOBAL gtid_mode=OFF;
-- SET GLOBAL enforce_gtid_consistency=OFF;
SET GLOBAL gtid_mode=OFF_PERMISSIVE;
SET GLOBAL gtid_mode=ON_PERMISSIVE;
SET GLOBAL enforce_gtid_consistency=ON;
SET GLOBAL gtid_mode=ON;

필요한 사용자 권한을 부여하십시오

사용자는 있어야합니다REPLICATION SLAVE그리고REPLICATION CLIENT특권 :

-- Grant privileges to the user
CREATE USER 'test'@'%' IDENTIFIED BY 'password';
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test';
FLUSH PRIVILEGES;

SEATUNNEL 클러스터 설정

클러스터 로깅

기본적으로 SeatUnnel은 출력을 단일 파일로 로그합니다. 생산의 경우 작업 당 별도의 로그 파일을 갖는 것이 좋습니다. 로깅 구성을 업데이트하십시오log4j2.properties:

############################ log output to file #############################
# rootLogger.appenderRef.file.ref = fileAppender
# Change log output to use independent log files for each job
rootLogger.appenderRef.file.ref = routingAppender
############################ log output to file #############################

클라이언트 구성

생산 클러스터의 경우 Seatunnel을/opt디렉토리와 포인트SEATUNNEL_HOME그에 따라 환경 변수.

여러 버전이 존재하는 경우 서버 배포 디렉토리와 정렬 할 기호 링크를 작성하십시오.

# Create a symlink
ln -s /opt/apache-seatunnel-2.3.9 /opt/seatunnel
# Set environment variable
export SEATUNNEL_HOME=/opt/seatunnel

환경 변수 구성

Linux 서버의 경우 다음 줄을 추가하십시오/etc/profile.d/seatunnel.sh:

echo 'export SEATUNNEL_HOME=/opt/seatunnel' >> /etc/profile.d/seatunnel.sh
echo 'export PATH=$SEATUNNEL_HOME/bin:$PATH' >> /etc/profile.d/seatunnel.sh
source /etc/profile.d/seatunnel.sh

작업 구성

참고 : 아래 구성은 모든 옵션을 다루는 것은 아니지만 일반적인 생산 설정을 보여줍니다.

env {
  job.mode = "STREAMING"
  job.name = "DEMO"
  parallelism = 3
  checkpoint.interval = 30000  # 30 seconds
  checkpoint.timeout = 30000   # 30 seconds
  
  job.retry.times = 3 
  job.retry.interval.seconds = 3  # 3 seconds
}

첫 번째 단계는 설정입니다env스트리밍 모드에서 작동하는 모듈. 따라서 구성 모드를 AS로 지정해야합니다STREAMING.

작업 명명 및 관리

작업 이름을 구성하는 것은 생산 환경에서 작업을 식별하고 관리하는 데 중요합니다. 데이터베이스 또는 테이블 이름을 기반으로 한 이름 지정 규칙은 모니터링 및 관리에 도움이 될 수 있습니다.

병렬주의 설정

여기서 우리는 병렬 처리를 설정했습니다3그러나이 값은 클러스터 크기 및 데이터베이스 성능에 따라 조정할 수 있습니다.

체크 포인트 구성

  • 체크 포인트 주파수: 설정30 초. 더 높은 정밀도가 필요한 경우, 이것은 감소 할 수 있습니다.10 초또는 더 적습니다.
  • 체크 포인트 타임 아웃: 체크 포인트가 너무 오래 걸리면 작업이 실패한 것으로 간주됩니다. 설정30 초.
  • 자동 재시도: 구성3 회복재 시도 간격으로3 초(시스템 요구 사항에 따라 조정 가능).
source {
  MySQL-CDC {
    base-url = "jdbc:mysql://192.168.8.101:3306/test?serverTimezone=Asia/Shanghai"
    username = "test"
    password = "123456"
    
    database-names = ["test"]
    # table-names = ["test.test_001","test.test_002"]
    table-pattern = "test\\.test_.*"  # The first dot is a literal character, requiring escaping; the second dot represents any single character.
    table-names-config = [
        {"table":"test.test_002","primaryKeys":["id"]}
        ]
    
    startup.mode = "initial" # First sync all historical data, then incremental updates
    snapshot.split.size = "8096" 
    snapshot.fetch.size = "1024"
    server-id = "6500-8500"
    connect.timeout.ms = 30000
    connect.max-retries = 3
    connection.pool.size = 20
    
    exactly_once = false   # In analytical scenarios, disabling exactly-once consistency allows some duplicates/losses for better performance.
    schema-changes.enabled = true # Enable schema evolution to avoid frequent modifications; supports add, rename, drop operations.
  }
}

주요 MySQL CDC 구성

  1. 시간대 구성: 추출시 불일치를 방지하기 위해 MySQL Connection Timezone을 지정하는 것이 좋습니다.datetime또는timestamp데이터.

  2. 사용자 자격 증명:

  • 그만큼 사용자 이름 그리고 비밀번호 있어야합니다 복제 권한 액세스 허용 bin_log 로그.
  • 계정은 지정된 데이터베이스에서 모든 테이블을 쿼리 할 수 ​​있어야합니다.

데이터베이스 및 테이블 선택

일반적으로 각 데이터베이스는 별도의 작업에 할당됩니다. 여기에서는 만 지정합니다testDatabase.TWO 방법을 사용할 수 있습니다.

  1. 직접 테이블 이름 선택
  2. 정규 표현식 기반 테이블 매칭(대형 데이터 세트 또는 전체 데이터베이스 동기화에 권장).

중요 : 사용할 때 정규 표현둘 다 데이터베이스 이름 그리고 테이블 이름 포함되어야합니다. 그만큼.그들을 분리시키는 캐릭터는 탈출해야합니다 (\\.).

예를 들어, 접두사와 일치합니다test_우리는 사용합니다 :

test\\.test_.*
  • 첫 번째 점 (.)는 문자 분리기를 나타내며, 이스케이프가 필요합니다 (\\.).
  • 두 번째 점 (.)단일 캐릭터Regex에서.

또한 테이블의 경우 기본 키없이데이터 동기화를 용이하게하기 위해 논리적 기본 키를 수동으로 지정할 수 있습니다.

시작 모드

기본 시작 모드는 “초기”입니다. 이는 다음을 의미합니다.

  1. 전체 과거 데이터 동기화첫 번째
  2. 증분 업데이트기후

샤딩 및 페치

  • 그만큼 기본값 ~을 위한 샤드 크기 그리고 배치 페치 크기 잘 작동합니다.
  • 서버가있는 경우 더 높은 성능이러한 값을 증가시킬 수 있습니다.

서버 ID

  • MySQL이 필요합니다 고유 한 서버 ID 복제 노드의 경우.
  • Apache Seatunnel이 있어야합니다 MySQL 복제품으로 가장 무도회.
  • 구성되지 않으면 기본값이 사용되지만 수동 사양이 권장됩니다 갈등을 피하기 위해.
  • 그만큼 서버 ID 범위는 병렬 처리 수준보다 커야합니다.또는 오류가 발생할 수 있습니다.

타임 아웃 및 리트리

  • 연결 시간 초과: 큰 데이터 세트의 경우이 값을 그에 따라 늘리십시오.
  • 자동 도리 간격: 많은 양의 테이블을 처리하는 경우 재 시도 간격을 확장하는 것을 고려하십시오.

정확히 일관성

을 위한 CDC 기반 데이터 동기화,,,정확히 일관성 종종 필요하지 않습니다 분석 시나리오에서.

  • 비활성화상당히 할 수 있습니다 성능 향상.
  • 그러나 엄격한 일관성이 필요한 경우 활성화 될 수 있습니다 성능 감소 비용으로.

스키마 진화

그것은 적극 권장됩니다 에게 스키마 진화를 활성화합니다어느:

  • 허용 자동 테이블 수정 (예 : 필드 추가/제거)

  • 필요를 줄입니다 수동 작업 업데이트 스키마가 변경 될 때

하지만,다운 스트림 작업 수정 된 필드에 의존하면 실패 할 수 있습니다. 지원 된 스키마 변경 : ✔️ADD COLUMN✔️DROP COLUMN✔️RENAME COLUMN✔️MODIFY COLUMN

메모: 스키마 진화 지원하지 않습니다CREATE TABLE또는DROP TABLE.

싱크 구성 (PostgreSQL)

그만큼 싱크대 구성은 데이터를 안에 삽입합니다 Postgresql.

sink {
  jdbc {
        url = "jdbc:postgresql://192.168.8.101:5432/test"
        driver = "org.postgresql.Driver"
        user = "postgres"
        password = "123456"
        
        generate_sink_sql = true
        database = "test"
        table = "${database_name}.${table_name}"
        schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
        data_save_mode = "APPEND_DATA"
        # enable_upsert = false
    }
}

주요 고려 사항 :

JDBC 연결:

  • PostgreSQL을 지정하십시오 드라이버, 사용자 및 비밀번호.

자동 SQL 생성:

  • 활성화 generate_sink_sql SeatUnnel이 자동으로 테이블을 생성하고 생성 할 수 있습니다 INSERT,,,DELETE그리고UPDATE진술.

스키마 처리:

  • Postgresql 사용 데이터베이스 → 스키마 → 테이블MySQL은 전용입니다 데이터베이스 → 테이블.
  • 확인하십시오 스키마가 올바르게 매핑되었습니다 데이터 불일치를 피하기 위해.

사용자 권한:

자세한 내용은 공식 문서를 참조하십시오.seatunnel mysql-cdc 커넥터 문서

싱크 구성에서 자리 표시 자 사용

Apache Seatunnel이 지원합니다 자리 소유자소스 데이터에 따라 테이블 이름을 동적으로 조정합니다.

예를 들어:

table = "${database\_name}.${table\_name}"
  • 각 테이블이없이 올바르게 동기화되도록합니다 수동 사양.
  • 지원합니다 연결 및 동적 형식.

스키마 저장 모드 및 데이터 부속 전략

그만큼schema_save_mode매개 변수는 중요한 역할을합니다 데이터베이스 전체 동기화. 프로세스를 단순화합니다 자동으로 테이블을 작성합니다 대상 데이터베이스에서 수동 테이블 생성 단계가 필요하지 않습니다.

또 다른 주요 구성입니다APPEND_DATA대상 데이터베이스에 이미 포함 된 경우 특히 유용합니다. 이전에 동기화 된 데이터. 이 설정 기존 레코드의 우연한 삭제를 방지합니다 그것을 만들기 더 안전합니다 대부분의 시나리오에 대한 선택. 그러나 사용 사례가 다른 접근법이 필요한 경우에 따라이 설정을 수정할 수 있습니다. 공식 문서 지침.

성능 최적화를위한 Upsert를 활성화하십시오

또 다른 중요한 매개 변수입니다enable_upsert. 당신이 소스 데이터에 중복 레코드가 포함되어 있지 않도록 보장 할 수 있습니다. 상향 비활성화 (enable_upsert = false) 할 수 있다 동기화 성능을 크게 향상시킵니다 . Upsert가 없으면 시스템이 새 레코드를 삽입하기 전에 기존 레코드를 확인할 필요가 없기 때문입니다.

그러나 소스 데이터에 중복 레코드의 가능성이있는 경우 강력하게 추천합니다 ** Upsert를 활성화하기 위해 (enable_upsert = true). 이를 통해 레코드가 기본 키 복제 문제 방지.

을 위한 자세한 매개 변수 설명 및 추가 사용자 정의 옵션 참조하십시오 공식 Apache Seatunnel 문서.

작업 제출 및 모니터링

구성 파일이 준비되면 SeatUnnel 명령 줄 도구를 사용하여 작업을 제출하십시오.

./bin/start-seatunnel.sh --config /path/to/config.yaml --async

주요 매개 변수 :

  • --config: 구성 파일의 경로를 지정합니다.
  • --async: 작업이 계속해서 작업을 계속하는 동안 명령 줄이 종료 될 수 있도록 작업을 비동기로 제출합니다.

제출 후 SeatUnnel의 클러스터 UI를 통해 작업을 모니터링 할 수 있습니다. 버전 2.3.9에서 SeatUnnel은 작업 로그, 실행 상태 및 데이터 처리량 세부 사항을 볼 수있는 시각적 인터페이스를 제공합니다.

데이터 동기화 데모

이 데모를 위해 두 개의 테이블을 만들었습니다.test_001그리고test_002) 및 샘플 데이터를 MySQL에 삽입했습니다. SeatUnnel의 동기화 작업을 사용하여 데이터는 PostgreSQL과 성공적으로 동기화되었습니다. 데모에는 삽입, 삭제, 업데이트 및 심지어 테이블 스키마 수정이 포함되었습니다.

핵심 사항 :

  • 스키마 동기화 : SeatUnnel은 자동 테이블 스키마 동기화를 지원합니다. Source MySQL 테이블 구조가 변경되면 대상 PostgreSQL 테이블이 자동으로 업데이트됩니다.
  • 데이터 일관성 : SeatUnnel은 대상 데이터베이스에 모든 삽입, 삭제 및 업데이트를 정확하게 동기화하여 데이터 일관성을 보장합니다.

SEATUNNEL에 대해

Apache Seatunnel은 데이터 통합 ​​및 동기화에 중점을 두어 다음과 같은 일반적인 문제를 해결합니다.

  • 다양한 데이터 소스 : 새로운 데이터 소스가 등장하더라도 수백 개의 데이터 소스를 지원합니다.
  • 복잡한 동기화 시나리오 : 전체, 증분, CDC, 실시간 및 전체-대사 동기화를 포함하여.
  • 높은 리소스 요구 : 기존 도구에는 종종 많은 작은 테이블의 실시간 동기화를 위해 광범위한 컴퓨팅 또는 JDBC 리소스가 필요합니다.
  • 모니터링 및 품질 : 동기화 프로세스는 데이터 손실 또는 복제로 어려움을 겪을 수 있으며 효과적인 모니터링이 필수적입니다.
  • 복잡한 기술 스택 : 다른 시스템에는 다중 동기화 프로그램이 필요할 수 있습니다.
  • 관리 문제 : 오프라인 및 실시간 동기화는 종종 개별적으로 개발되고 관리되므로 복잡성이 증가합니다.

출처 참조

Post Comment