데이터 동기화 문제 중지 중지-이 안내서는 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을 읽어야합니다.binlog
MySQL 클러스터에서 슬레이브 노드 역할을합니다.
참고 : 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 구성
-
시간대 구성: 추출시 불일치를 방지하기 위해 MySQL Connection Timezone을 지정하는 것이 좋습니다.
datetime
또는timestamp
데이터. -
사용자 자격 증명:
- 그만큼 사용자 이름 그리고 비밀번호 있어야합니다 복제 권한 액세스 허용 bin_log 로그.
- 계정은 지정된 데이터베이스에서 모든 테이블을 쿼리 할 수 있어야합니다.
데이터베이스 및 테이블 선택
일반적으로 각 데이터베이스는 별도의 작업에 할당됩니다. 여기에서는 만 지정합니다test
Database.TWO 방법을 사용할 수 있습니다.
- 직접 테이블 이름 선택
- 정규 표현식 기반 테이블 매칭(대형 데이터 세트 또는 전체 데이터베이스 동기화에 권장).
중요 : 사용할 때 정규 표현둘 다 데이터베이스 이름 그리고 테이블 이름 포함되어야합니다. 그만큼
.
그들을 분리시키는 캐릭터는 탈출해야합니다 (\\.
).
예를 들어, 접두사와 일치합니다test_
우리는 사용합니다 :
test\\.test_.*
- 첫 번째 점 (
.
)는 문자 분리기를 나타내며, 이스케이프가 필요합니다 (\\.
). - 두 번째 점 (
.
)단일 캐릭터Regex에서.
또한 테이블의 경우 기본 키없이데이터 동기화를 용이하게하기 위해 논리적 기본 키를 수동으로 지정할 수 있습니다.
시작 모드
기본 시작 모드는 “초기”입니다. 이는 다음을 의미합니다.
- 전체 과거 데이터 동기화첫 번째
- 증분 업데이트기후
샤딩 및 페치
- 그만큼 기본값 ~을 위한 샤드 크기 그리고 배치 페치 크기 잘 작동합니다.
- 서버가있는 경우 더 높은 성능이러한 값을 증가시킬 수 있습니다.
서버 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