שכפול נתונים בין AlloyDB ל-PostgreSQL לבין AlloyDB Omni

בחירת גרסת תיעוד:

במאמר הזה מוסבר איך להגדיר שכפול נתונים ב-AlloyDB Omni באמצעות התוסף pglogical. באמצעות התוסף הזה, אפשר לשנות את הפרמטרים של מסד הנתונים, ליצור משתמש שכפול, להגדיר את צמתי השכפול, להעתיק את סכימת מסד הנתונים וליצור את המינוי לשכפול.

סקירה כללית של pglogical ב-AlloyDB Omni, היתרונות והמגבלות שלו מפורטים במאמר מידע על התוסף pglogical.

הרכיבים העיקריים של pglogical

הרכיבים העיקריים של התוסף pglogical הם:

  • Node: הפניה שניתנה למסד הנתונים בתוך אשכול PostgreSQL. התוסף pglogical מותקן במספר כלשהו של מסדי נתונים באשכול, ופועל מול כל אחד מהם. כל מסד נתונים כזה פועל כצומת pglogical נפרד. כל צומת יכול להיות ספק, שנקרא גם מקור שכפול, או מנוי, שנקרא גם יעד שכפול, או שניהם בו-זמנית. מותר להשתמש רק בצומת אחד לכל מסד נתונים.
  • קבוצת שכפול: מוגדרת במסד הנתונים של הספק כקיבוץ לוגי של טבלאות ורצפים שצריך להעביר, ושל הצהרות SQL כמו INSERT, UPDATE, DELETE, TRUNCATE שצריך לשכפל. אפשר להקצות טבלאות ליותר מקבוצת שכפול אחת. כברירת מחדל, מסופקות שלוש קבוצות שכפול שהוגדרו מראש, כמו default, default_insert_only ו-ddl_sql, ואפשר להוסיף כל מספר של קבוצות שכפול נוספות בהתאם לצרכים שלכם.
  • מינוי: מספק פרטים על השינויים שמשוכפלים ממסדי נתונים של ספקים ושינויים שמשוכפלים ממסדי נתונים של ספקים, במסד הנתונים של המנוי. המינוי מציין את מסד הנתונים של הספק באמצעות מחרוזת חיבור, ואפשר גם לציין אילו קבוצות שכפול מהספק הזה צריך להעתיק. בנוסף, אפשר גם לציין אם להשתמש ב-apply delay כשיוצרים את המינוי.

בפריסה הזו, שירות AlloyDB ל-PostgreSQL הוא הספק ו-AlloyDB Omni המקומי הוא המנוי. חשוב לזכור שאפשר גם להגדיר את ההפך.

שיטות אימות נתמכות

לפני שמטמיעים את התוסף pglogical ב-AlloyDB Omni, צריך לקחת בחשבון את הרשת והאבטחה בין צמתי השכפול. שתי שיטות האימות העיקריות שבהן נעשה שימוש בתוסף pglogical הן שיטות אימות באמצעות סיסמה ואימות באמצעות אמון.

שיטת האימות המומלצת היא אימות מהימן, כי בשיטת האימות באמצעות סיסמה, הסיסמאות מאוחסנות בפורמט טקסט רגיל בטבלאות מסד נתונים שבבעלות pglogical. הסיסמאות האלה גלויות בטקסט פשוט לכל מי שיש לו הרשאות למסד הנתונים כדי לשלוח שאילתות לטבלאות האלה, בגיבויים לא בינאריים ובקובצי היומן של PostgreSQL.

אם אתם משתמשים בשיטת האימות של אמון, אתם צריכים להוסיף רשומות ספציפיות לקובץ האימות מבוסס-המארח, pg_hba.conf, כדי להשיג אבטחה מקסימלית. אתם יכולים להגביל את הגישה על ידי ציון מסדי הנתונים של היעד, מתן הרשאה רק לאפשרות השכפול או למסדי נתונים ספציפיים, למשתמש השכפול ורק מכתובת ה-IP הספציפית של המנוי.

לפני שמתחילים

אפשר להתקין את pglogical כתוסף במסד נתונים נתון.

לפני שמטמיעים את התוסף pglogical ב-AlloyDB Omni, צריך לוודא שאתם עומדים בדרישות המערכת הבאות:

  • אשכול AlloyDB ל-PostgreSQL, וגישת קריאה וכתיבה למכונה הראשית בתור אדמין של AlloyDB ל-PostgreSQL. הוראות להקצאת אשכול AlloyDB ל-PostgreSQL זמינות במאמר יצירה של מסד נתונים של AlloyDB ל-PostgreSQL וקישור אליו.
  • שרת AlloyDB Omni, מותקן ומוגדר. הוראות להתקנת AlloyDB Omni מופיעות במאמר התקנת AlloyDB Omni.
  • כתובות ה-IP של המכונה הראשית של AlloyDB ל-PostgreSQL ושל שרת המארח של AlloyDB Omni.
  • רשת מבוססת ומאובטחת בין AlloyDB ל-PostgreSQL לבין שרת המארח של AlloyDB Omni. נדרשת קישוריות TCP ביציאה הרגילה של PostgreSQL, מספר 5432.

שינוי פרמטרים בספק AlloyDB ל-PostgreSQL

התוסף pglogical דורש לבצע שינויים מינימליים בפרמטרים באשכול הספק של AlloyDB ל-PostgreSQL. צריך להגדיר את הפרמטר wal_level לערך logical, ולצרף את pglogical לפרמטר shared_preload_libraries בקובץ postgresql.conf.

cp postgresql.conf postgresql.bak
sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
sed -r -i "s|',|'|" postgresql.conf

בשירות AlloyDB ל-PostgreSQL, אפשר לשנות פרמטרים על ידי הגדרת הדגלים המתאימים לאשכול.

צריך לשנות את הפרמטרים של הדגלים הבאים ב-AlloyDB ל-PostgreSQL:

  • alloydb.enable_pglogical = on
  • alloydb.logical_decoding = on

מידע על הגדרת פלאגים של מסד נתונים ב-AlloyDB ל-PostgreSQL זמין במאמר בנושא הגדרת פלאגים של מסד נתונים במופע.

לגבי שאר הפרמטרים הנדרשים של מסד הנתונים של צומת הספק, צריך להגדיר את ערכי ברירת המחדל של AlloyDB ל-PostgreSQL באופן הבא:

  • max_worker_processes: אחד לכל מסד נתונים של ספק ולפחות אחד לכל צומת של מנוי. הערך הסטנדרטי של הפרמטר הזה הוא לפחות 10.
  • max_replication_slots: אחד לכל צומת בצמתים של הספק.
  • max_wal_senders: אחד לכל צומת בצמתים של הספק.
  • track_commit_timestamp: מוגדר כ-on אם נדרש פתרון של קונפליקט בעדכון האחרון או הראשון.
  • listen_addresses: צריך לכלול את כתובת ה-IP של AlloyDB Omni או לציין אותה באמצעות חסימת CIDR.

אפשר לבדוק את הפרמטרים האלה באמצעות כל כלי לשאילתות, כמו psql.

שינוי פרמטרים באשכול המנויים של AlloyDB Omni

התוסף pglogical דורש גם קבוצה מינימלית של התאמות פרמטרים במנוי AlloyDB Omni. צריך להוסיף את pglogical לפרמטר shared_preload_libraries בקובץ DATA_DIR/postgresql.conf. אם מסד נתונים כלשהו באשכול פועל כמסד נתונים של ספק, צריך לבצע את שינויי הפרמטרים הנדרשים למסדי נתונים של ספקים.

מחליפים את DATA_DIR בנתיב למערכת הקבצים של ספריית הנתונים, לדוגמה, /home/$USER/alloydb-data.

  1. משנים את הפרמטרים:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. מוודאים שהפרמטר מוגדר בצורה תקינה:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. מפעילים מחדש את AlloyDB Omni כדי שהשינוי בפרמטר ייכנס לתוקף:

    sudo systemctl restart alloydbomni18
  4. מגדירים את ערכי ברירת המחדל של AlloyDB Omni לפרמטרים אחרים של מסד נתונים של ספק:

    • max_worker_processes: אחד לכל מסד נתונים של ספק ואחד לכל צומת של מנוי.
    • track_commit_timestamp: מוגדר כ-on אם נדרש פתרון של קונפליקט בעקבות העדכון האחרון או הראשון.
  5. מוודאים שכל ערכי הפרמטרים מוגדרים בצורה נכונה:

    /usr/lib/postgresql/18/bin/psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;"

שינויים באימות מבוסס-מארח באשכול המנויים של AlloyDB Omni

pglogical יוצר חיבורי TCP מקומיים למסד הנתונים של המנוי ב-AlloyDB Omni. לכן, צריך להוסיף את כתובת ה-IP של שרת המארח של המנוי לקובץ DATA_DIR/pg_hba.conf של AlloyDB Omni.

  1. מוסיפים רשומה של אימות מהימן לשרת המקומי, ספציפית למשתמש חדש pglogical_replication, לקובץ DATA_DIR/pg_hba.conf:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
  2. מוודאים שהערך נכון:

    tail -2 DATA_DIR/pg_hba.conf
  3. מפעילים מחדש את AlloyDB Omni כדי שהשינוי באימות ייכנס לתוקף:

    sudo systemctl restart alloydbomni18

יצירת משתמש pglogical באשכולות של ספק ושל מנוי

צריך ליצור משתמש חדש גם באשכול הספק וגם באשכול המנוי. כדי להשתמש ב-pglogical, למשתמש צריכות להיות ההרשאות superuser ו-replication.

  1. באשכול ספק AlloyDB ל-PostgreSQL, יוצרים את המשתמש ומעניקים לו את התפקיד alloydbsuperuser:

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    GRANT alloydbsuperuser TO pglogical_replication;
    
  2. באשכול המנויים של AlloyDB Omni, יוצרים את המשתמש ומעניקים לו את המאפיינים replication ו-superuser:

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    

הוספת pglogical וצמתים למסד הנתונים של ספק AlloyDB ל-PostgreSQL

  1. מעניקים את ההרשאות הנדרשות.

    צריך להתקין את התוסף pglogical בכל מסד נתונים ולהעניק את ההרשאה usage למשתמש במסד הנתונים pglogical. ב-AlloyDB ל-PostgreSQL, צריך להעניק הרשאות בסכימה pglogical.

    לדוגמה, אם מסד הנתונים שלכם הוא my_test_db, מריצים את הפקודה הבאה מול מסד הנתונים של ספק AlloyDB ל-PostgreSQL:

    \c my_test_db;
    CREATE EXTENSION IF NOT EXISTS pglogical;
    GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    -- For AlloyDB for PostgreSQL you also need to manually grant privileges:
    GRANT ALL PRIVILEGES ON ALL tables IN SCHEMA pglogical TO pglogical_replication;
    
  2. יוצרים צומת pglogical למסדי הנתונים של הספק. הערך node_name הוא שרירותי, והמחרוזת dsn צריכה להיות חיבור TCP תקין בחזרה לאותו מסד נתונים. ב-AlloyDB ל-PostgreSQL, החלק של המארח dsn הוא כתובת ה-IP שסופקה למכונה הראשית.

    ב-AlloyDB ל-PostgreSQL, אימות באמצעות אמון לא מותר, וארגומנט הסיסמה חייב להיכלל ב-dsn. פרמטר.

    לדוגמה, כדי להגדיר את מסד הנתונים my_test_db, מריצים את הפקודה הבאה:

    SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS
    port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    

יצירת טבלה והוספה שלה לקבוצת השכפול שמוגדרת כברירת מחדל

יוצרים טבלה ומוסיפים אותה לקבוצת השכפול שמוגדרת כברירת מחדל במסד הנתונים של ספק AlloyDB ל-PostgreSQL.

  1. יוצרים טבלת בדיקה בשם test_table_1 במסד הנתונים של הספק:

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. נותנים הרשאת SELECT לטבלאות הנפרדות או מריצים את הפקודה GRANT SELECT ON ALL TABLES. לכל הטבלאות שרוצים לכלול בקבוצת השכפול צריך להעניק הרשאת שאילתה למשתמש השכפול, pglogical_replication.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  3. מוסיפים ידנית את טבלת הבדיקה לקבוצת השכפול שמוגדרת כברירת מחדל. אפשר ליצור קבוצות שכפול מותאמות אישית של pglogical, או להשתמש בקבוצות השכפול שמוגדרות כברירת מחדל. כשיוצרים את התוסף, נוצרות כמה קבוצות שכפול שמוגדרות כברירת מחדל, כמו default,‏ default_insert_only ו-ddl_sql. אפשר להוסיף טבלאות ורצפים לקבוצות השכפול בנפרד, או את כולם בבת אחת לסכימה שצוינה.

    -- Add the specified table to the default replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
  4. (אופציונלי) מוסיפים את כל הטבלאות בסכימה שצוינה, כמו public:

    -- Add all "public" schema tables to the default replication set:
    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
    -- Add all "public" schema sequences to the default replication:
    SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']);
    
     -- Check which sequences have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_seq;
    
  5. מסירים את הטבלה מdefault ערכת השכפול. אם יש ב-schema טבלאות ללא מפתח ראשי, אפשר להגדיר שכפול של INSERT בלבד או להגדיר את העמודות שמזהות באופן ייחודי את השורה באמצעות התכונה REPLICA IDENTITY שמשמשת עם הפקודה ALTER TABLE. אם הוספתם את הטבלאות האלה לdefault קבוצת השכפול באופן אוטומטי באמצעות הפונקציה replication_set_add_all_tables, תצטרכו להסיר אותן ידנית מקבוצת השכפול הזו ולהוסיף אותן לקבוצה default_insert_only.

    -- Remove the table from the **default** replication set:
    SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
    
    -- Manually add to the **default_insert_only** replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
    

    אופציונלי: אם רוצים להוסיף את הטבלאות החדשות שנוצרו לקבוצת השכפול באופן אוטומטי, מוסיפים את הטריגר pglogical_assign_repset כמו שמוצע במקור pglogical.

העתקת מסד הנתונים לאשכול המנויים של AlloyDB Omni

  1. יוצרים גיבוי של מסד הנתונים המקורי שכולל רק את הסכימה באמצעות כלי השירות pg_dump.

  2. מריצים את הפקודה pg_dump מהשרת שלכם ב-AlloyDB Omni, באמצעות כתובת ה-IP של המכונה הראשית ב-AlloyDB ל-PostgreSQL.

    pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
  3. מייבאים את הגיבוי למסד הנתונים של המנויים בשרת AlloyDB Omni של המנויים:

    sudo -u postgres psql -h localhost -U postgres < my_test_db.schema-only.sql

התעלמות משגיאות כמו alloydbsuperuser not existing. התפקיד הזה ספציפי ל-AlloyDB ל-PostgreSQL.

הפעולה הזו יוצרת את מסד הנתונים ואת הסכימה, בלי נתוני השורות. הנתונים בשורה משוכפלים על ידי התוסף pglogical. מעתיקים או יוצרים מחדש באופן ידני את כל המשתמשים או התפקידים האחרים שנדרשים.

יצירת צומת ומינוי במסד הנתונים של המנוי ב-AlloyDB Omni

  1. יוצרים צומת במסד הנתונים של המנויים ב-AlloyDB Omni:

    sudo -u postgres psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
  2. יוצרים מינוי במסד הנתונים של המנוי, שמפנה חזרה למכונה הראשית של מסד הנתונים של הספק AlloyDB ל-PostgreSQL.

    /usr/lib/postgresql/18/bin/psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
  3. בהתאם לגודל הטבלה ולנתונים שצריך לשכפל, זמן השכפול עשוי לנוע בין שניות לדקות. לאחר מכן, הנתונים הראשוניים אמורים להיות משוכפלים מהספק למנוי:

    /usr/lib/postgresql/18/bin/psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;"

    גם שורות נוספות שמוסיפים למסד הנתונים של הספק משוכפלות תוך שניות.

שיקולים נוספים לגבי פריסה של pglogical

לתוסף pglogical יש הרבה תכונות מתקדמות שלא מוסברות במסמך הזה. הרבה מהתכונות האלה רלוונטיות להטמעה שלכם. אפשר להשתמש בתכונות המתקדמות הבאות:

  • יישוב סכסוכים
  • שכפול דו-כיווני ורב-ראשי
  • הכללה של רצפים
  • הליכים של מעבר לגיבוי (failover) ומעבר חזרה (switchover)

המאמרים הבאים