
تجربه با Debezium و همگامسازی دیتابیسها
چرا سراغ Debezium رفتیم؟
ما یه دیتابیس قدیمی MySQL داشتیم با ورژنی پایین که بهطور مستقیم نمیخواستیم تغییرش بدیم. در کنار اون، یک سرویس میکروسرویسی داشتیم که روی آخرین نسخه PostgreSQL پیادهسازی شده بود.
نیاز داشتیم توی این سرویس، یک Shadow Table از اطلاعات کاربران داشته باشیم؛ یعنی یک نسخه بهروز از دادههای جدول یوزر در دیتابیس MySQL.
اما مشکل اینجا بود که:
- اگر تغییرات رو مستقیم روی مدلهای یوزر اعمال میکردیم، هزینه توسعه و نگهداری خیلی بالا میرفت.
- بررسی صحت تغییرات هم یه کار فرسایشی و غیرمنطقی میشد.
اینجا بود که تصمیم گرفتیم از Debezium استفاده کنیم.
Debezium چطور کار میکنه؟
Debezium در اصل یه ابزار CDC (Change Data Capture) هست. یعنی تغییرات دیتابیس رو تشخیص میده و به صورت event روی یه Message Broker مثل Kafka منتشر میکنه.
مرحله ۱ – گرفتن تغییرات از MySQL
Debezium برای تشخیص تغییرات توی MySQL، از Binary Logs (binlog) استفاده میکنه.
هر تغییر روی رکوردها (INSERT, UPDATE, DELETE) توی binlog ذخیره میشه و Debezium همین رو میخونه تا event بسازه.
- مثلاً:
- INSERT → اطلاعات رکورد جدید ارسال میشه
- UPDATE → اطلاعات قبل و بعد تغییر ارسال میشه
- DELETE → فقط primary key رکورد ارسال میشه
پیامها معمولاً ساختار JSON دارن و چیزی شبیه این هستن:
{
"schema": { ... },
"payload": { ... }
}
مرحله ۲ – ارسال به Kafka
این پیام همراه با یک Key (که مهمترینش همون primary key رکورد هست) به Kafka ارسال میشه.
این کلید کمک میکنه که در مقصد، رکورد درست آپدیت یا ساخته بشه.
در اینجا کار MySQL Connector به پایان میرسه.
مرحله ۳ – Transform روی پیامها
خیلی وقتها لازم داریم پیامها قبل از مصرف، تغییر کنن. اینجاست که Transforms وارد میشن.
کارهایی مثل:
- تغییر نوع دادهها
- تغییر مقدارها
- فیلتر کردن دادهها
این عملیاتها معمولاً با Kafka Streams انجام میشه.
مرحله ۴ – ذخیره در دیتابیس مقصد
در نهایت، پیامها توسط Connector مقصد (مثلاً PostgreSQL Sink Connector) مصرف میشن و بر اساس primary key روی دیتابیس مقصد درج یا آپدیت میشن.
به این ترتیب دیتابیس مقصد همیشه با دیتابیس منبع همگام میمونه.
چرا Debezium انتخاب خوبی بود؟
- نیاز نبود مستقیم به مدلهای دیتابیس قدیمی دست بزنیم
- تغییرات به صورت real-time به دیتابیس مقصد منتقل میشدن
- کنترل بیشتری روی دادهها قبل از ورود به سیستم جدید داشتیم
برای اینکه کار با Debezium راحتتر بشه، کانفیگ کانکتورهایی که استفاده کردیم رو اینجا قرار دادم: