ผู้เขียน Debezium ลิขสิทธิ์ ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2.0
Debezium เป็นโครงการโอเพ่นซอร์สที่ให้แพลตฟอร์มการสตรีมข้อมูลเวลาแฝงต่ำสำหรับการบันทึกการเปลี่ยนแปลงข้อมูล (CDC) ตัวเชื่อมต่อนี้จัดเตรียมการใช้งาน sink สำหรับการสตรีมการเปลี่ยนแปลงที่ Debezium ปล่อยออกมาในฐานข้อมูลเชิงสัมพันธ์
การใช้งานตัวเชื่อมต่อนี้คำนึงถึงแหล่งที่มาของ Debezium ซึ่งหมายความว่าตัวเชื่อมต่อสามารถใช้เหตุการณ์การเปลี่ยนแปลง Debezium ดั้งเดิมได้โดยไม่จำเป็นต้องใช้ ExtractNewRecordState
เพื่อทำให้โครงสร้างเหตุการณ์เรียบลง ซึ่งจะลดการกำหนดค่าที่จำเป็นเพื่อใช้ตัวเชื่อมต่อ sink JDBC นอกจากนี้ ยังหมายความว่าด้านซิงก์ของไปป์ไลน์สามารถใช้ประโยชน์จากเมตาดาต้า Debezium ได้ เช่น การแพร่กระจายประเภทคอลัมน์ เพื่อรองรับความละเอียดของประเภทคอลัมน์ที่เหมาะสมบนด้านตัวเชื่อมต่อซิงก์ของไปป์ไลน์ได้อย่างราบรื่น
ตัวเชื่อมต่อ sink JDBC เป็นตัวเชื่อมต่อ sink Kafka Connect แบบดั้งเดิม (หรือที่เรียกว่าผู้บริโภค) หน้าที่ของมันคือการอ่านบันทึกจากหัวข้อคาฟคาตั้งแต่หนึ่งหัวข้อขึ้นไป และสร้างคำสั่ง SQL ที่ดำเนินการบนฐานข้อมูลปลายทางที่กำหนดค่าไว้
SinkRecordDescriptor
เป็นอ็อบเจ็กต์ที่ได้รับการสร้างขึ้นจาก SinkRecord
ทุกตัว วิธีการส่วนใหญ่ที่อาจใช้ SinkRecord
จะใช้วัตถุ descriptor นี้แทน ตัวอธิบายมีผลกับเวอร์ชันที่ประมวลผลล่วงหน้าของ SinkRecord
ซึ่งช่วยให้เราทำการประมวลผลล่วงหน้านี้ได้เพียงครั้งเดียว จากนั้นจึงใช้ข้อมูลนี้ผ่านตัวเชื่อมต่อ เมื่อเพิ่มวิธีการใหม่ โดยทั่วไปคุณจะต้องการใช้ SinkRecordDescriptor
โดยทั่วไปฐานข้อมูล sink แต่ละรายการจะมีการใช้งาน DatabaseDialect
ของตัวเองซึ่งควรขยาย GeneralDatabaseDialect
ภาษาถิ่นเป็นหนึ่งในกลไกหลักที่ใช้โดยตัวเชื่อมต่อ sink JDBC เพื่อแก้ไขคำสั่ง SQL และคุณลักษณะฐานข้อมูลอื่นๆ สำหรับฐานข้อมูลที่ตัวเชื่อมต่อจะเขียนเหตุการณ์ที่ใช้ไป ตัวเชื่อมต่อ sink JDBC อาศัยความละเอียดภาษาถิ่นของ Hibernate เพื่อขับเคลื่อน wrapper ภาษาถิ่นที่ใช้โดยตัวเชื่อมต่อ
หากตรวจไม่พบการแม็ปภาษาสำหรับฐานข้อมูล sink ที่ใช้งานอยู่ ตัวเชื่อมต่อ sink JDBC จะมีค่าเริ่มต้นเป็นการใช้งาน GeneralDatabaseDialect
การใช้งานทั่วไปนี้ไม่รองรับทุกแง่มุมของตัวเชื่อมต่อ ตัวอย่างเช่น ไม่รองรับโหมดการแทรก UPSERT เมื่อเลือกภาษาถิ่นนี้ เนื่องจากโดยทั่วไปคำสั่ง UPSERT จะไม่ซ้ำกับฐานข้อมูลที่ใช้งานอยู่ โดยทั่วไปเป็นความคิดที่ดีที่จะเพิ่มการใช้งานภาษาถิ่นใหม่ หากฐานข้อมูลซิงก์ใหม่มีความเข้ากันได้อย่างสมบูรณ์กับพฤติกรรมมากมายของตัวเชื่อมต่อซิงก์ JDBC
ทุกช่องในข้อความ Kafka จะเชื่อมโยงกับประเภทสคีมา แต่ข้อมูลประเภทนี้ยังสามารถนำพาข้อมูลเมตาอื่นๆ เช่น ชื่อ หรือแม้แต่พารามิเตอร์ที่ได้รับจากตัวเชื่อมต่อต้นทาง ตัวเชื่อมต่อ sink JDBC ใช้ระบบประเภท ซึ่งอิงตามสัญญา io.debezium.connector.jdbc.type.Type
เพื่อจัดการกับการรวมค่า ความละเอียดของค่าเริ่มต้น และคุณลักษณะอื่นๆ ที่อาจเป็นแบบเฉพาะเจาะจง
การใช้งาน Type
ที่แตกต่างกันมีประสิทธิผลสามประเภท:
io.debezium.connector.jdbc.type.connect
io.debezium.connector.jdbc.type.debezium
io.debezium.connector.jdbc.dialect
ประเภทจะถูกบันทึกในรูปแบบลำดับชั้น โดยเริ่มจากประเภท Kafka Connect จากนั้นเป็นประเภท Debezium และสุดท้ายคือประเภทเฉพาะภาษาถิ่น ซึ่งจะทำให้ประเภท Debezium สามารถแทนที่ประเภท Kafka Connect ได้หากจำเป็น และสุดท้ายภาษาถิ่นจะแทนที่ประเภทอื่นๆ ที่สนับสนุน
ประเภทต่างๆ จะได้รับการแก้ไขโดยดูที่ชื่อสคีมาของ Kafka ก่อนแล้วจึงแมปสิ่งนี้กับการลงทะเบียนประเภท หากสคีมาไม่มีชื่อ ประเภทของสคีมาจะถูกนำมาใช้เพื่อแก้ไขประเภท ซึ่งช่วยให้ประเภท Kafka Connect พื้นฐานสามารถตัดสินใจขั้นสุดท้ายเกี่ยวกับวิธีการตีความข้อมูล หากตรวจไม่พบการใช้งานประเภทอื่นสำหรับภาคสนาม
มีสองกลยุทธ์การตั้งชื่อที่ใช้โดยตัวเชื่อมต่อ sink JDBC:
TableNamingStrategy
ColumnNamingStrategy
ตัวเชื่อมต่อ sink JDBC มาพร้อมกับการใช้งานดีฟอลต์ของทั้งสอง ซึ่งพบได้ในแพ็กเก io.debezium.connector.jdbc.naming
พฤติกรรมเริ่มต้นของทั้งสองกลยุทธ์มีดังนี้:
.
ด้วย _
และใช้ค่า table.name.format
ที่กำหนดค่าไว้เพื่อแก้ไขชื่อสุดท้ายของตาราง ดังนั้น สมมติว่าชื่อหัวข้อของเหตุการณ์คือ server.schema.table
โดยมี table.name.format=dbo.${topic}
เริ่มต้น ตารางปลายทางจะถูกสร้างขึ้นเป็น dbo.server_schema_table
กลยุทธ์ทั้งสองนี้สามารถแทนที่ได้โดยการระบุการอ้างอิงชื่อคลาสแบบเต็มในการกำหนดค่าตัวเชื่อมต่อ การกำหนดค่าตัวอย่าง:
table.naming.strategy=io.debezium.connector.jdbc.naming.DefaultTableNamingStrategy
column.naming.strategy=io.debezium.connector.jdbc.naming.DefaultColumnNamingStrategy
ตัวเชื่อมต่อ sink JDBC จะรักษาโมเดลเชิงสัมพันธ์ในหน่วยความจำ คล้ายกับตัวเชื่อมต่อต้นทาง Debezium คลาสโมเดลเชิงสัมพันธ์เหล่านี้สามารถพบได้ในแพ็คเกจ io.debezium.connector.jdbc.relational
จำเป็นต้องมีสิ่งต่อไปนี้เพื่อทำงานร่วมกับโค้ดฐานตัวเชื่อมต่อ Debezium JDBC sink และเพื่อสร้างในเครื่อง:
.mvnw
สำหรับคำสั่ง Maven) ชุดทดสอบจะขึ้นอยู่กับการใช้งาน TestContainer เป็นอย่างมาก และจะเริ่มฐานข้อมูลต้นทางและซิงก์ที่หลากหลายโดยอัตโนมัติ หากไม่มีสภาพแวดล้อมที่เข้ากันได้กับ Docker การทดสอบการรวมระบบจะไม่ทำงาน หากคุณไม่มีสภาพแวดล้อม Docker คุณสามารถข้ามการทดสอบการรวมได้โดยใช้อาร์กิวเมนต์บรรทัดคำสั่ง -DskipITs
ดังที่แสดงด้านล่าง:
$ ./mvnw clean verify -DskipITs
ชุดทดสอบมีสามประเภท:
ตามค่าเริ่มต้น การทดสอบหน่วยทั้งหมดจะดำเนินการโดยเป็นส่วนหนึ่งของบิลด์ การทดสอบการรวมแบบอิง Sink จะดำเนินการกับ MySQL, PostgreSQL และ SQL Server ตามค่าเริ่มต้นเท่านั้น ในขณะที่ไม่มีการดำเนินการการทดสอบแบบเมทริกซ์จากต้นทางถึงปลายทาง
เพื่อดำเนินการทดสอบการรวมแบบอิงซิงก์สำหรับ Oracle และ DB2 จะต้องระบุอาร์กิวเมนต์ -Dtest.tags
เพื่อรวมสิ่งเหล่านี้ไว้ในบิลด์ ในการดำเนินการนี้ ให้เพิ่มการทดสอบการรวมทั้งหมดที่จะดำเนินการ ดังที่แสดงด้านล่างสำหรับฐานข้อมูลทั้งหมด:
$ ./mvnw clean install -Dtest.tags=it-mysql,it-postgresql,it-sqlserver,it-oracle,it-db2
เพื่อดำเนินการทดสอบการรวมตาม sink ทั้งหมดสำหรับฐานข้อมูลทั้งหมด จะมีแท็กทางลัดให้ไว้:
$ ./mvnw clean install -Dtest.tags=it
ในทำนองเดียวกัน เพื่อเปิดใช้งานการทดสอบตั้งแต่ต้นจนจบ อาร์กิวเมนต์ -Dtest.tags
ยังสามารถมาพร้อมกับแท็กที่จำเป็นสำหรับฐานข้อมูล sink แต่ละประเภท:
$ ./mvnw clean install -Dtest.tags=e2e-mysql,e2e-postgresql,e2e-sqlserver,e2e-oracle,e2e-db2
เพื่อที่จะรันการทดสอบการรวมตั้งแต่ต้นจนจบทั้งหมด จะมีการจัดเตรียมแท็กทางลัดไว้ด้วย:
$ ./mvnw clean install -Dtest.tags=e2e
เพื่อรันการทดสอบทั้งหมดสำหรับชุดแหล่งที่มา/อ่างล้างจานทั้งหมด:
$ ./mvnw clean install -Dtest.tags=all
ชุมชน Debezium ยินดีต้อนรับทุกคนที่ต้องการช่วยเหลือไม่ว่าจะด้วยวิธีใดก็ตาม ไม่ว่าจะเป็นการรายงานปัญหา การช่วยเหลือด้านเอกสาร หรือการมีส่วนร่วมในการเปลี่ยนแปลงโค้ดเพื่อแก้ไขข้อบกพร่อง เพิ่มการทดสอบ หรือใช้คุณสมบัติใหม่ ดูเอกสารนี้สำหรับรายละเอียด
ขอบคุณมากสำหรับผู้มีส่วนร่วม Debezium JDBC sink ทุกคน!
โครงการนี้ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2