debezium mysql connector DDL 분석
8307 단어 【Debezium】【kafka】Debezium시리즈
debezium
는 mysql ddl
문법 해석기를 실현하여 ddl
문장을 해석하는 데 사용한다.debezium
는 최근에 해석기를 최적화하고 mysql
문법 해석기를 교체한다.왜 debezium mysql connector
가 필요합니까?필요한 이유
ddl parser
DdlParser
개debeizum mysql connector
개2
가 있는데 각각 reader
와 증량 구독에 사용된다.그것들의 내부는 모두 사용되었다snapshot
는 해석기의 중요성을 충분히 설명했다.ddl parser
를 시작할 때 모든 테이블의 테이블 문구를 가져오고 SnapshotReader
로 모든 테이블 문구를 해석한다.DdlParser
는 BinlogReader
를 감청하고 ddl
가 발생하면 ddl
로 해석한다.DdlParser
가 없으면 DdlParser
감청표의 최신 dbz
을 얻을 수 없고 필드 형식을 얻을 수 없습니다.만약 우리가 최신 필드 형식을 얻을 수 없다면 schema
이상dbz
개2
를 통해 얻은 데이터를 정확한 reader
형식으로 변환할 수 없고 업무 측도 데이터를 정상적으로 처리할 수 없습니다.상술한
record
장면은 모두 reader
방법을 사용하고 이 방법은 내부에서 MysqlSchema.applyDdl
방법을 사용한다.DdlParser.parse
에 대응하는 해석기는 mysql
인데 다시 썼다MysqlDdlParser
방법@Override
protected void parseNextStatement(Marker marker) {
if (tokens.matches(DdlTokenizer.COMMENT)) {
parseComment(marker);
} else if (tokens.matches("CREATE")) {
parseCreate(marker);
} else if (tokens.matches("ALTER")) {
parseAlter(marker);
} else if (tokens.matches("DROP")) {
parseDrop(marker);
} else if (tokens.matches("RENAME")) {
parseRename(marker);
} else if (tokens.matches("USE")) {
parseUse(marker);
} else if (tokens.matches("SET")) {
parseSet(marker);
} else if (tokens.matches("INSERT")) {
consumeStatement();
} else if (tokens.matches("DELETE")) {
consumeStatement();
} else {
parseUnknownStatement(marker);
}
}
이 방법은 서로 다른 문장에 대해
parseNextStatement
각각 처리하였다.물론 어떻게 처리하든지 간에 마지막 목적은 MysqlDdlParser
유지보수된 테이블 구조와 데이터베이스의 테이블 구조가 일치하도록 하는 것이다(예를 들어 필드 유형).왜 표의 구조가 일치해야 합니까?
debezium
가 debezium
데이터를 얻었을 때 데이터와 대응하는 기록(mysql
을 만들고 그 내용은 이번 줄 변경 데이터이다.줄 데이터는 여러 개의 열로 구성되어 있으며, 각각의 열은 자신의 필드 형식을 가지고 있으며,
record
얻은 기록과 줄 형식은 형식 변환이 필요합니다.기록은 debezium
유지보수된 표 구조 필드 유형에 따라 정확한 유형 전환을 진행한다.구체적인 유형 전환기는 모두 debezium
클래스에 열거되어 있다.정확한 필드 유형은
MySqlValueConverters
유지보수된 표 구조와 debezium
표 구조가 일치해야 한다.이것이 바로 왜 mysql
해석기, 해석ddl
문법이 필요한가 하는 것이다.