במסמך הזה מוסבר איך ליצור משבצות שכפול לוגי ב-AlloyDB Omni. ב-PostgreSQL, שכפול לוגי הוא שיטה להעתקת שינויים בנתונים ממסד נתונים של מפרסם למנוי אחד או יותר, שיכולים להיות מסדי נתונים או אפליקציות אחרות. אפשר להפעיל ולהגדיר שכפול לוגי באשכולות שיוצרים באמצעות AlloyDB Omni Kubernetes Operator.
השינויים שמועברים בסטרימינג יכולים להיות עדכונים, הוספות או מחיקות של שורות ספציפיות. מנויים מתחברים לשרת באמצעות משבצת שכפול ייחודית שמבטיחה חיבור קבוע. חיבור קבוע שומר על מצב הסטרימינג של הנתונים, כך שאם יש שיבוש, הסטרימינג ממשיך מהמקום שבו הוא הפסיק.
מידע נוסף על רפליקציה לוגית ב-PostgreSQL זמין במאמר Logical Replication.
קטעי הקוד בדף הזה הם דוגמאות שאפשר להשתמש בהן כמודלים, ולהחליף את הערכים בערכים של משאבי AlloyDB Omni שלכם.
לפני שמתחילים
יצירת אשכול של בעלי אפליקציות
לפני שיוצרים את משבצות השכפול, צריך ליצור את אשכול השרתים של המפרסם עם שכפול לוגי מופעל. צריך להגדיר את הפרמטר wal_level לערך logical במניפסט DBCluster.
כדי ליצור אשכול של מסד נתונים של בעל תוכן דיגיטלי עם הפעלה של שכפול לוגי, מחילים את המניפסט הבא:
apiVersion: v1
kind: Secret
metadata:
name: db-pw-DB_CLUSTER_NAME
namespace: DB_CLUSTER_NAMESPACE
type: Opaque
data:
DB_CLUSTER_NAME: "ENCODED_PASSWORD"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
namespace: DB_CLUSTER_NAMESPACE
spec:
databaseVersion: "ALLOYDB_OMNI_VERSION"
spec:
availability:
numberOfStandbys: 1
primarySpec:
parameters:
wal_level: "logical"
adminUser:
passwordRef:
name: db-pw-DB_CLUSTER_NAME
resources:
cpu: CPU_COUNT
memory: MEMORY_SIZE
disks:
- name: DataDisk
size: DISK_SIZEמחליפים את מה שכתוב בשדות הבאים:
DB_CLUSTER_NAME: השם של אשכול מסד הנתונים הזה, לדוגמהpublisher.
DB_CLUSTER_NAMESPACE(אופציונלי): מרחב השמות שבו רוצים ליצור את אשכול מסד הנתונים – למשל,publisher-namespace.
ENCODED_PASSWORD: סיסמת הכניסה למסד הנתונים של תפקיד המשתמשpostgresשמוגדר כברירת מחדל, בקידוד base64. לדוגמה,Q2hhbmdlTWUxMjM=עבורChangeMe123.
ALLOYDB_OMNI_VERSION: גרסת AlloyDB Omni,15.7.0ואילך.
CPU_COUNT: מספר המעבדים הזמינים לכל מופע של מסד נתונים באשכול מסדי הנתונים הזה.
MEMORY_SIZE: כמות הזיכרון לכל מופע של מסד נתונים באשכול מסדי הנתונים הזה. מומלץ להגדיר את הערך הזה ל-8 גיגה-בייט לכל מעבד. לדוגמה, אם הגדרתם אתcpuל-2קודם במניפסט הזה, מומלץ להגדיר אתmemoryל-16Gi.
DISK_SIZE: גודל הדיסק לכל מופע של מסד נתונים, לדוגמה10Gi.
יצירת משבצת שכפול
אחרי שיוצרים את אשכול השרתים לפרסום, אפשר ליצור משבצת שכפול לוגי באמצעות משאב Replication באשכול השרתים לפרסום. כל משאב Replication משויך למשאב תואם של אשכול מסדי נתונים. לאשכול מסדי נתונים יכולים להיות משויכים כמה משאבים של שכפול לוגי.
כדי להגדיר משבצת שכפול באשכול של השרת הראשי, צריך להחיל את המניפסט הבא:
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: REPLICATION_NAME
namespace: NAMESPACE
spec:
dbcluster:
name: DB_CLUSTER_NAME
upstream:
logicalReplication:
pluginName: DECODER_PLUGIN
databaseName: DATABASE_NAME
applicationName: APPLICATION_NAME
replicationSlotName: REPLICATION_SLOT_NAME
synchronous: "REPLICATION_MODE"
username: APPLICATION_USER
password:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
EOFמחליפים את מה שכתוב בשדות הבאים:
- REPLICATION_NAME: שם למשאב
Replicationהזה, לדוגמהreplication-1. - NAMESPACE: מרחב השמות של Kubernetes עבור משאב
Replication. הוא חייב להיות זהה למרחב השמות של אשכול מסד הנתונים. - DB_CLUSTER_NAME: השם של אשכול מסד הנתונים שהקציתם לו כשנוצר.
- DECODER_PLUGIN: מוגדר לפלאגין הפענוח, כמו
pgoutput, שרוצים להשתמש בו לשכפול לוגי. מידע נוסף על פלאגינים שונים של פענוח זמין במאמר בנושא פלאגינים של פלט. - DATABASE_NAME: צריך להגדיר את השם של מסד הנתונים שרוצים להזרים את השינויים שלו אל משבצת השכפול. חשוב לוודא שמסד הנתונים כבר נוצר באשכול של השרת המפרסם.
- APPLICATION_NAME (אופציונלי): מגדירים את שם האפליקציה שתתחבר למיקום השכפול. חובה למלא את השדה הזה כשמצב הסטרימינג מוגדר לסינכרוני.
- REPLICATION_MODE (אופציונלי): מגדירים ל-
falseלשכפול אסינכרוני. אם רוצים להפעיל שכפול סינכרוני, אבל מוכנים להתפשר על המהירות, מגדירים את הערך הזה כ-true. ערך ברירת המחדל הואfalse, אם לא הוגדר ערך באופן מפורש. - REPLICATION_SLOT_NAME: השם של משבצת השכפול שתיצור המנוי ותשתמש בה – לדוגמה,
logicalrepltestslot. - REPLICATION_USER (אופציונלי): שם המשתמש שמתחבר למקום השכפול. אם מגדירים את משתמש השכפול, צריך להגדיר את שם הסוד, מרחב השמות והסיסמה.
- USER_PASSWORD_SECRET_NAME (אופציונלי): שם הסוד של משתמש האפליקציה ב-Kubernetes. חובה, אם משתמש האפליקציה מוגדר.
- USER_PASSWORD_SECRET_NAMESPACE (אופציונלי): מרחב השמות שבו נמצא הסוד של Kubernetes עבור משתמש האפליקציה. חובה, אם הוגדר משתמש באפליקציה.
הצגת סטטוס משבצת הרפליקציה
כדי לראות את הסטטוס של משבצות השכפול, מריצים את הפקודה הבאה:
kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml
התשובה כוללת את השדה status ופרטים נוספים:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: REPLICATION_NAME
namespace: NAMESPACE
...
...
status:
conditions:
- lastTransitionTime: "2025-01-25T06:49:25Z"
message: Ready for replication
reason: Ready
status: "True"
type: Ready
- lastTransitionTime: "2025-01-25T06:49:25Z"
message: Replication slot is not being used
reason: Unhealthy
status: "False"
type: Healthy
observedGeneration: 2
upstream:
host: DATABASE_ENDPOINT
password:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
port: DATABASE_PORT
replicationSlotName: REPLICATION_SLOT_NAME
username: APPLICATION_USERבDATABASE_ENDPOINT מוצגת כתובת ה-IP שמשמשת אתכם להתחברות למסד הנתונים. הסטטוס TRUE בעמודה READY מציין שהמשבצת מוכנה להזרמה. כש-DBCluster או אפליקציה של מנוי מתחברים למשבצת השכפול, הסטטוס בעמודה HEALTHY משתנה ל-TRUE.
הגדרת אשכול השרתים של המוציא לאור
מאתרים את הפוד הרצוי.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"מתחברים ל-pod הראשי באשכול של ספק התוכן באמצעות
psql:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAMEמחליפים את מה שכתוב בשדות הבאים:
- IP_ADDRESS: כתובת ה-IP של הפוד הראשי של אשכול השרתים של בעל התוכן הדיגיטלי.
- USERNAME: משתמש postgres של מסד הנתונים.
- DATABASE_NAME: מסד הנתונים שהמנוי רוצה להירשם אליו.
אם מסד הנתונים
DATABASE_NAMEשצוין במשאב השכפול לא קיים, צריך ליצור מסד נתונים.CREATE DATABASE DATABASE_NAME;אופציונלי: למטרות בדיקה, מוסיפים טבלה למסד הנתונים ומזינים נתונים. אפשר להשתמש בנתונים האלה כדי לצפות בשכפול הנתונים מהמוציא לאור אל המנוי.
$ psql -h localhost -U postgres DATABASE_NAME customer=# CREATE TABLE TABLE_NAME( customer(# ID INT PRIMARY KEY NOT NULL, customer(# NAME TEXT NOT NULL, customer(# AGE INT NOT NULL, customer(# SALARY REAL customer(# ); CREATE TABLE customer=# INSERT INTO TABLE_NAME (ID,NAME,AGE,SALARY) VALUES customer-# (1, 'Quinn', 25, 65000.00), customer-# (2, 'Kim', 22, 72250.00), customer-# (3, 'Bola', 31, 53000.00), customer-# (4, 'Sasha', 33, 105000.00), customer-# (5, 'Yuri', 27, 85000.00); INSERT 0 5 customer=# \dt List of relations Schema | Name | Type | Owner --------+---------+-------+---------- public | company | table | postgres (1 row) customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)מחליפים את TABLE_NAME בטבלה שבה רוצים לאחסן את הנתונים ושבה המנוי רשום.
נותנים את ההרשאות:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER; GRANT USAGE ON SCHEMA public TO REPLICATION_USER; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO REPLICATION_USER;כדי ליצור פרסום, מריצים את הפקודה הבאה:
CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;מחליפים את מה שכתוב בשדות הבאים:
- PUBLICATION_NAME: שם הפרסום שבו המנוי ישתמש כדי להירשם.
אחרי שיוצרים את הפרסום, אפשר להגדיר את אשכול המינויים לשכפול לוגי או להגדיר את האפליקציה כדי להתחיל בשכפול.
מגבלות
לא ניתן לעדכן את ההגדרות של משבצת השכפול. כדי לעדכן את ההגדרות, צריך להסיר את משבצת השכפול וליצור אותה מחדש עם ההגדרות המעודכנות.
כדי להסיר את משבצת השכפול, מריצים את הפקודה הבאה:
kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACEאפשר להגדיר את משבצת השכפול הלוגית רק במסד הנתונים של המפרסם. ה-API של השכפול לא תומך ב-DBCluster או באפליקציות של מנוי שכפול לוגי.
אם אשכול מסד הנתונים שאליו מפנה אובייקט השכפול מוגדר לזמינות גבוהה, משבצת השכפול הלוגית נוצרת מחדש בגיבוי הפעיל שקודם. אחרי שמשבצת השכפול נוצרת מחדש, המיקום של הזרם במשבצת כבר לא זמין, וכל האפליקציות שמנויות לזרם צריכות להתחבר מחדש ולהפעיל מחדש את הזרם.