Database Engineering

استفاده از PostgreSQL برای پالی‌گلات پرسیستنس

در معماری‌های میکروسرویس مدرن، رویکرد «یک پایگاه داده برای حکمرانی بر همه» به ندرت کافی است. سرویس‌های مختلف اغلب به مدل‌های داده‌ای متفاوتی نیاز دارند—برخی به تضمین‌های ACID داده‌های رابطه‌ای نیاز دارند، در حالی که دیگران به انعطاف‌پذیری اسکیما در انبارهای اسناد یا قابلیت‌های پیمایش گراف در موتورهای تخصصی نیاز دارند. این الگوی معماری که به عنوان پالی‌گلات پرسیستنس شناخته می‌شود، مشکلات خاص هر دامنه را حل می‌کند، اما پیچیدگی قابل توجهی در همگام‌سازی داده‌ها ایجاد می‌کند.

PostgreSQL به عنوان یک سیستم عصبی مرکزی و مستحکم برای این معماری‌ها ظهور کرده است. با ترکیب قابلیت‌های داخلی Logical Replication آن با قابلیت گسترش‌پذیری افزونه‌های سفارشی، مهندسان پایگاه داده می‌توانند پل‌های بی‌درز بین PostgreSQL و انبارهای داده متنوع بدون قربانی کردن پایداری یا عملکرد ایجاد کنند.

چالش همگام‌سازی داده

وقتی انبارهای داده خود را از هم جدا می‌کنید، اطمینان از اینکه تغییرات اعمال شده در یک پایگاه داده مبدا (معمولاً PostgreSQL) در سیستم‌های downstream (مانند Elasticsearch برای جستجو، Neo4j برای روابط، یا S3 برای دریاچه‌های داده) منعکس شود، حیاتی است. مکانیزم‌های سنتی polling ناکارآمد و مستعد انحراف داده هستند. علاوه بر این، اعمال تغییرات به اسکیماهای مختلف اغلب نیاز به اسکریپت‌های ETL پیچیده دارد که نگهداری آن‌ها دشوار است.

راه‌حل در معماری‌های رویدادمحور نهفته است. Write-Ahead Log (WAL) PostgreSQL حقیقت تمام تغییرات را در خود دارد. با دسترسی مستقیم به این لاگ، می‌توانیم تغییرات را در تقریباً زمان واقعی به سیستم‌های دیگر منتقل کنیم و اطمینان حاصل کنیم که اکوسیستم پالی‌گلات ما یکپارچه باقی می‌ماند.

پیاده‌سازی Logical Replication

Logical Replication با replication جریان فیزیکی متفاوت است، زیرا تغییرات را در سطح سطر تکثیر می‌کند و به شما اجازه می‌دهد جداول را فیلتر کرده و حتی داده‌ها را قبل از رسیدن به مشترک، تبدیل کنید. این ستون فقرات استراتژی همگام‌سازی ماست.

برای راه‌اندازی آن، ابتدا یک publication را در پایگاه داده اصلی تعریف می‌کنید:

-- Define a publication on the PostgreSQL primary node
CREATE PUBLICATION order_events FOR TABLE orders, order_items;

-- Create a slot for replication
SELECT pg_create_logical_replication_slot('order_slot', 'pgoutput');

در سمت مصرف‌کننده (که می‌تواند یک instance دیگر PostgreSQL یا یک برنامه باشد که slot را می‌خواند)، داده‌ها به عنوان یک جریان از رویدادهای تغییر استخراج می‌شوند. با این حال، Logical Replication خام فقط لایه حمل‌ونقل است. برای بهره‌برداری واقعی از پالی‌گلات پرسیستنس، ما نیاز داریم که این داده‌ها را به صورت زنده تبدیل کنیم.

گسترش PostgreSQL با افزونه‌های سفارشی

اینجاست که افزونه‌های سفارشی درخشش می‌کنند. PostgreSQL به شما اجازه می‌دهد افزونه‌ها را به زبان‌هایی مانند C، PL/pgSQL یا حتی Python (از طریق PL/Python) بنویسید. ما می‌توانیم یک افزونه سفارشی ایجاد کنیم که به عنوان شنونده برای رویدادهای Logical Replication عمل کرده و کارهای سنگین تبدیل داده و ارسال آن‌ها به سیستم‌های خارجی را انجام دهد.

تصور کنید افزونه‌ای که برای رویدادهای `INSERT` روی جدول `users` گوش می‌دهد، داده‌ها را با یک timestamp محاسبه‌شده غنی می‌کند و سپس یک تماس HTTP ناهمگام به یک instance Redis برای کش کردن نشست‌های کاربر انجام می‌دهد. این کار منطق تبدیل را نزدیک به منبع داده نگه می‌دارد و تاخیر را کاهش می‌دهد.

در اینجا یک مثال مفهومی از نحوه برخورد یک تابع درون یک افزونه سفارشی با یک رویداد replication آورده شده است:

CREATE OR REPLACE FUNCTION handle_user_event()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
    rec RECORD;
BEGIN
    -- Extract the row data from the replication stream
    -- This is pseudo-code for the complex JSON parsing logic
    FOR rec IN SELECT * FROM pg_logical_get_changes('order_slot')
    LOOP
        IF rec.operation = 'I' THEN
            -- Transform data for a NoSQL store
            PERFORM redis_set('user_cache:' || rec.id, jsonb_build_object(
                'name', rec.name,
                'updated_at', NOW()
            ));
        END IF;
    END LOOP;
END;
$$;

الگوی معماری عملی

یک پیاده‌سازی پالی‌گلات مستحکم معمولاً این جریان را دنبال می‌کند:

  1. منبع: برنامه‌ها به PostgreSQL می‌نویسند.
  2. ضبط: Logical Replication تغییرات را از WAL ضبط می‌کند.
  3. تبدیل: یک افزونه سفارشی یا یک کارگر متصل (مانند Debezium) داده‌ها را تبدیل می‌کند.
  4. ورودی: داده‌ها به انبارهای تخصصی (Elasticsearch، پایگاه داده گرافی و غیره) ارسال می‌شوند.

این الگو تضمین می‌کند که سیستم تراکنشی اولیه شما تمیز باقی می‌ماند در حالی که سایر سیستم‌ها فرمت داده خاص مورد نیاز خود را دریافت می‌کنند. این همچنین به شما اجازه می‌دهد از PostgreSQL به عنوان تنها منبع حقیقت استفاده کنید که بازیابی و حسابرسی را ساده می‌کند.

نتیجه‌گیری

پالی‌گلات پرسیستنس فقط درباره انتخاب ابزار مناسب برای کار نیست؛ بلکه درباره هماهنگی مؤثر آن ابزارهاست. PostgreSQL، با قابلیت‌های قدرتمند Logical Replication و عمق گسترش‌پذیری خود، پایه‌ای عالی برای این هماهنگی فراهم می‌کند. با فراتر رفتن از همگام‌سازی ساده پایگاه داده تا پایگاه داده و پذیرش افزونه‌های سفارشی، می‌توانید یک معماری داده بسازید که هم مقیاس‌پذیر و هم قابل نگهداری است، و اطمینان حاصل می‌کنید که داده‌های شما به طور کارآمد در منظره متنوع برنامه‌های مدرن جریان می‌یابند.

Share: