במאמר הזה מוסבר איך ליצור משבצות רפליקציה לוגיות ב-AlloyDB Omni. ב-PostgreSQL, רפליקציה לוגית היא שיטה להעתקת שינויים בנתונים ממסד נתונים של בעל תוכן דיגיטלי למנוי אחד או יותר, שיכולים להיות מסדי נתונים או אפליקציות אחרות. אתם יכולים להפעיל ולהגדיר שכפול לוגי באשכולות שאתם יוצרים באמצעות AlloyDB Omni Kubernetes Operator.
השינויים שמוזרמים יכולים להיות עדכונים, הוספות או מחיקות של שורות בודדות. המינויים מתחברים לבעל התוכן הדיגיטלי דרך משבצת שכפול ייחודית שמבטיחה חיבור קבוע. חיבור קבוע שומר על מצב הסטרימינג של הנתונים, כך שאם יש שיבוש, הסטרימינג ממשיך מהנקודה שבה הוא הופסק.
מידע נוסף על רפליקציה לוגית ב-PostgreSQL זמין במאמר רפליקציה לוגית.
קטעי הקוד בדף הזה הם דוגמאות שאפשר להשתמש בהן כמודלים. צריך להחליף את הערכים בערכים של משאבי 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: כמות הזיכרון לכל מופע של מסד נתונים באשכול מסדי הנתונים הזה. מומלץ להגדיר את הערך הזה ל-8GB לכל מעבד (CPU). לדוגמה, אם הגדרתם את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 של מנויים לרפליקציה לוגית.
אם אשכול מסד הנתונים שאליו מפנה אובייקט הרפליקציה מוגדר לזמינות גבוהה, משבצת הרפליקציה הלוגית נוצרת מחדש בגיבוי שהועלה אחרי יתירות כשל. אחרי שיוצרים מחדש את משבצת השכפול, המיקום של הסטרימינג במשבצת כבר לא זמין, וכל האפליקציות שמנויות לסטרימינג צריכות להתחבר מחדש ולהפעיל מחדש את הסטרימינג.