במאמר הזה מוסבר איך ליצור מחבר Generic PostgreSQL Source.
מחבר גנרי של מקור PostgreSQL הוא מופע של מחבר Debezium PostgreSQL. הוא קורא שינויים ברמת השורה ממסד נתונים של PostgreSQL וכותב אותם לנושאים באשכול של שירות מנוהל ל-Apache Kafka.
תרחישי שימוש במחבר הזה כוללים:
- מעקב בזמן אמת אחרי שינויים במסד נתונים ברמת השורה.
- שילוב של אירועים של שינויים במסד נתונים בארכיטקטורה מבוססת-אירועים.
- להגיב לאירועים במסד הנתונים, כמו הוספה או מחיקה של שורות.
- העתקת שינויים במסד הנתונים למערכות אחרות.
- שכפול או שחזור של טבלאות PostgreSQL.
לפני שמתחילים
לפני שיוצרים מחבר Generic PostgreSQL Source, צריך לוודא שיש לכם את הדברים הבאים:
מסד נתונים של PostgreSQL.
אשכול Connect שמשויך לאשכול Kafka.
יוצרים סוד ב-Secret Manager שבו מאוחסנת הסיסמה של מסד הנתונים. אם ההגדרה שלכם משתמשת ב-SSL של מסד נתונים, צריך גם ליצור סוד לסיסמת ה-SSL של מסד הנתונים. מגדירים את אשכול Connect עם הסודות. מידע נוסף זמין במאמר בנושא משאבים ב-Secret Manager.
תפקידים והרשאות נדרשים
כדי לקבל את ההרשאות שנדרשות ליצירת מחבר, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד עורך מחברים מנוהלים של Kafka (roles/managedkafka.connectorEditor) בפרויקט.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות ליצירת מחבר. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי ליצור מחבר, צריך את ההרשאות הבאות:
-
יצירת מחבר:
managedkafka.connectors.create
יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
הענקת הרשאות גישה לסודות ב-Secret Manager
לחשבון השירות של שירות Kafka המנוהל צריכה להיות הרשאה לצפייה בסודות ששמורים ב-Secret Manager ולגישה אליהם. מקצים לחשבון השירות את התפקידים הבאים ב-IAM:
- צפייה ב-Secret Manager (
roles/secretmanager.viewer) - Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor)
חשבון השירות המנוהל של Kafka הוא בפורמט הבא:
service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com,
כאשר PROJECT_NUMBER הוא מספר הפרויקט של אשכול Connect.
אם אשכול Connect נמצא בפרויקט אחר מאשכול השירות המנוהל ל-Apache Kafka, אפשר לעיין במאמר בנושא יצירת אשכול Connect בפרויקט אחר.
הגדרת מסד הנתונים של PostgreSQL
כדי לאפשר למחבר לקרוא אירועים של שינוי נתונים ממסד הנתונים, צריך להגדיר את ההגדרות הבאות.
מגדירים את
wal_levelשל השרת לערךlogical.ALTER SYSTEM SET wal_level = logical;מפעילים מחדש את השרת כדי שההגדרה תחול.
יוצרים משתמש במסד הנתונים כדי שהמחבר יוכל לבצע אימות ב-PostgreSQL. משתמש מסד הנתונים צריך להיות תפקיד שכפול, כדי שיוכל להתחבר לשרת במצב שכפול.
CREATE ROLE ROLE_NAME WITH REPLICATION LOGIN PASSWORD 'ROLE_PASSWORD';מחליפים את מה שכתוב בשדות הבאים:
-
ROLE_NAME: שם המשתמש, לדוגמהdebezium_user. -
ROLE_PASSWORD: הסיסמה של המשתמש.
-
יוצרים פרסום לטבלאות שרוצים לצלם. המחבר נרשם לפרסום כדי לקבל אירועים של שינוי נתונים.
CREATE PUBLICATION dbz_publication FOR TABLE "SCHEMA_NAME"."TABLE_NAME";מחליפים את מה שכתוב בשדות הבאים:
SCHEMA_NAME: הסכימה של הטבלה.
TABLE_NAME: שם הטבלה.
מומלץ להוסיף מרכאות כפולות לשמות הסכימה והטבלה, כמו בדוגמה, כדי למנוע שגיאות תחביר אם השמות מכילים תווים מיוחדים או אותיות רישיות.
אפשרות אחרת היא ליצור פרסום שמשכפל שינויים לכל הטבלאות במסד הנתונים:
CREATE PUBLICATION dbz_publication FOR ALL TABLES;בהתאם להגדרה של
publication.autocreate.modeהמחבר, אפשר ליצור את הפרסום באופן ידני או לאפשר למחבר ליצור אותו באופן אוטומטי. מידע נוסף זמין במאמר בנושא מצב פרסום.לכל טבלה, מעניקים הרשאות
SELECTלמשתמש במסד הנתונים.GRANT SELECT ON TABLE "SCHEMA_NAME"."TABLE_NAME" TO ROLE_NAME;לחלופין, אפשר להעניק הרשאת SELECT לכל הטבלאות בסכימה:
GRANT SELECT ON ALL TABLES IN SCHEMA "SCHEMA_NAME" TO ROLE_NAME;לכל טבלה, מעניקים הרשאות
USAGEבסכימת הטבלה למשתמש במסד הנתונים. אפשר לדלג על השלב הזה אם הטבלה נמצאת בסכימהpublicשמוגדרת כברירת מחדל.GRANT USAGE ON SCHEMA "SCHEMA_NAME" TO ROLE_NAME;
יצירת מחבר Generic PostgreSQL Source
כדי ליצור מחבר Generic PostgreSQL Source, מבצעים את השלבים הבאים.
כשהמחבר מאותחל, הוא מבצע את הפעולות הבאות:
- יוצר קובץ snapshot ראשוני של מסד הנתונים.
- יוצר נושא Kafka לכל טבלה שיש בה שורות.
- לכל שורה במסד הנתונים, נשלח אירוע שינוי לנושא המתאים.
בזמן שהמחבר פועל, הוא ממשיך לשלוח אירועי שינוי לנושאים. מידע נוסף על תמונת המצב הראשונית זמין במאמר Snapshots במסמכי Debezium.
המסוף
נכנסים לדף Connect Clusters במסוף Google Cloud .
לוחצים על אשכול החיבורים שבו רוצים ליצור את המחבר.
לוחצים על יצירת מחבר.
בשדה 'שם המחבר', מזינים מחרוזת.
הנחיות לשמות של מחברים זמינות במאמר הנחיות לשמות של משאבים בשירות מנוהל ל-Apache Kafka.
בקטע Connector plugin (פלאגין של מחבר), בוחרים באפשרות Generic PostgreSQL Source (מקור PostgreSQL כללי).
בשדה Database hostname, מזינים את שם המארח או את כתובת ה-IP של שרת PostgreSQL.
בשדה Database name, מזינים את שם מסד הנתונים.
בשדה משתמש במסד הנתונים, מזינים את השם של תפקיד הרפליקה. המחבר מאמת את השרת של PostgreSQL באמצעות התפקיד הזה.
בשדה Topic prefix, מזינים קידומת שתשמש לשמות של נושאי Kafka.
ברשימה סוד, בוחרים את הסוד שמכיל את סיסמת מסד הנתונים.
אופציונלי: בתיבה Configurations, מוסיפים מאפייני הגדרה או עורכים את מאפייני ברירת המחדל. מידע נוסף מופיע במאמר בנושא הגדרת המחבר.
אופציונלי: בוחרים את מדיניות ההפעלה מחדש של המשימה. מידע נוסף זמין במאמר בנושא מדיניות הפעלה מחדש של משימות.
לוחצים על יצירה.
gcloud
-
במסוף Google Cloud , מפעילים את Cloud Shell.
בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
מריצים את הפקודה
gcloud managed-kafka connectors create:gcloud managed-kafka connectors create CONNECTOR_ID \ --location=LOCATION \ --connect-cluster=CONNECT_CLUSTER_ID \ --config-file=CONFIG_FILEמחליפים את מה שכתוב בשדות הבאים:
CONNECTOR_ID: המזהה או השם של המחבר. הנחיות לשמות של מחברים זמינות במאמר הנחיות לשמות של משאבים בשירות מנוהל ל-Apache Kafka. אי אפשר לשנות את השם של מחבר.
LOCATION: המיקום שבו יוצרים את מחבר. המיקום הזה צריך להיות זהה למיקום שבו יצרתם את אשכול Connect.
CONNECT_CLUSTER_ID: המזהה של אשכול Connect שבו נוצר המחבר.
CONFIG_FILE: הנתיב לקובץ ההגדרות של המחבר בפורמט YAML.
דוגמה לקובץ הגדרות למחבר Generic PostgreSQL Source:
connector.class: io.debezium.connector.postgresql.PostgresConnector database.dbname: DATABASE_NAME database.hostname: HOSTNAME database.password: CREDENTIALS database.user: DATABASE_USER key.converter: org.apache.kafka.connect.json.JsonConverter key.converter.schemas.enable: "false" plugin.name: pgoutput topic.prefix: TOPIC_PREFIX value.converter: org.apache.kafka.connect.json.JsonConverter value.converter.schemas.enable: "true"מחליפים את מה שכתוב בשדות הבאים:
HOSTNAME: שם המארח של מסד הנתונים של PostgreSQL שממנו מתבצעת הקריאה.
DATABASE_NAME: השם של מסד הנתונים של PostgreSQL שממנו רוצים לקרוא.
DATABASE_USER: המשתמש במסד הנתונים של PostgreSQL שבו יש להשתמש לאימות במסד הנתונים.CREDENTIALS: נתיב לסוד ב-Secret Manager שמכיל את הסיסמה למסד הנתונים. מציינים את הסוד בפורמט הבא:
${directory:/var/secrets:PROJECT_ID-SECRET_NAME-SECRET_VERSION}
TOPIC_PREFIX: קידומת לשימוש בשמות של נושאי Kafka.
הגדרת המחבר
בקטע הזה מתוארים כמה מאפייני הגדרה שאפשר להגדיר במחבר. רשימה מלאה זמינה במאמר Debezium connector for PostgreSQL במסמכי Debezium.
הגדרות סיסמה וסיסמת SSL
רק נתיבים של סודות נתמכים בהגדרות database.password ו-database.sslpassword. הקצה העורפי מצפה שההגדרות האלה יהיו בפורמט הבא:
${directory:/var/secrets:PROJECT_ID-SECRET_NAME-SECRET_VERSION}.
סוגים של כתובות IP
המאפיין driver.ipTypes מציין את סוג כתובת ה-IP שבה משתמש המחבר כדי להתחבר למסד הנתונים:
-
PRIVATE: כתובת IP פרטית -
PSC: Private Service Connect -
PUBLIC: כתובת IP ציבורית
המאפיין driver.ipTypes מכיל רשימה מופרדת בפסיקים של סוגי IP בסדר מועדף. לדוגמה, driver.ipTypes=PRIVATE,PUBLIC.
מצב פרסום
מחבר Generic PostgreSQL Source מעביר בסטרימינג אירועי שינוי מפרסום במסד הנתונים. אתם יכולים ליצור את הפרסום באופן ידני, או לאפשר לכלי החיבור ליצור אותו באופן אוטומטי.
ההגדרה publication.autocreate.mode
קובעת איך המחבר צריך ליצור פרסום, ואם הוא צריך לעשות זאת.
filtered. אם הפרסום לא קיים, המחבר יוצר פרסום חדש שכולל רק את הטבלאות שנתפסו. למשתמש במסד הנתונים צריכות להיות הרשאותCREATEבמסד הנתונים, והוא צריך להיות הבעלים של הטבלאות הכלולות.אם הפרסום כבר קיים, המחבר משנה אותו כך שיכלול את הטבלאות שנתפסו. כדי לשנות פרסום קיים, משתמש מסד הנתונים צריך להיות הבעלים של הפרסום ושל הטבלאות הכלולות בו.
all_tables. אם הפרסום לא קיים, המחבר יוצר פרסום חדש באמצעות הפרמטרFOR ALL TABLES. למשתמש במסד הנתונים צריכה להיות הרשאת סופר-אדמין.תפקידי סופר-משתמש עוקפים את כל בדיקות ההרשאות במסד נתונים, ולכן לא מומלץ להעניק את ההרשאה
SUPERUSERלמשתמש במסד הנתונים. במקום זאת, אפשר ליצור את אתר החדשות באופן ידני או להגדיר אתpublication.autocreate.mode=filtered.
disabled. אם אתר החדשות לא קיים, מתרחשת שגיאה. המחבר לא יוצר אתר חדשות חדש.
ערך ברירת המחדל הוא all_tables.
שם אתר החדשות
כברירת מחדל, המחבר מנסה להזרים מפרסום בשם dbz_publication.
כדי לציין פרסום אחר, מוסיפים
publication.name=PUBLICATION_NAME להגדרה, כאשר
PUBLICATION_NAME הוא שם הפרסום. לדוגמה:
publication.name=my_publication.
משבצות שכפול
PostgreSQL משתמש במשבצות שכפול כדי להזרים שינויים בטבלאות של מסד הנתונים. כברירת מחדל, המחבר יוצר משבט שכפול בשם debezium. כדי להשתמש בשם משבצת אחר,
מגדירים את המאפיין slot.name.
אם יוצרים שני מופעים של המחבר לאותו מסד נתונים, צריך לציין שם ייחודי של משבצת לכל מחבר.
כברירת מחדל, המחבר מגדיר את הנכס
slot.drop.on.stop לערך false כדי למנוע אובדן נתונים. כשמוחקים מחבר באופן סופי, צריך להפיל ידנית את משבצת השכפול שבה המחבר השתמש. שם יחידת הקיבולת לשכפול הוא debezium כברירת מחדל, אלא אם הוגדר אחרת באמצעות המאפיין slot.name.
מומלץ להגדיר התראות כדי לעקוב אחרי השימוש בדיסק של WAL בשרת מסד הנתונים של PostgreSQL במקור, ולמחוק משבצות שכפול שלא נעשה בהן שימוש.
מסנן טבלה
כברירת מחדל, המחבר מתעד נתוני שינויים מכל טבלה שאינה טבלת מערכת במסד הנתונים. כדי לסנן את הטבלאות שמתועדות, מציינים אחת או יותר מההגדרות הבאות:
-
schema.include.list. רשימה של סכימות שרוצים לכלול. schema.exclude.list. רשימה של סכימות להחרגה. אי אפשר להשתמש ב-schema.include.list.-
table.include.list. רשימה של טבלאות שרוצים לכלול. -
table.exclude.list. רשימה של טבלאות להחרגה. אי אפשר להשתמש ב-table.include.list.
שמות הנושאים
כברירת מחדל, המחבר יוצר נושאי Kafka לפי מוסכמת השמות הבאה: topic_prefix.schema.table_name, כאשר topic.prefix הוא הערך של ההגדרה topic.prefix.
מידע נוסף זמין במאמר שמות של נושאים במסמכי התיעוד של Debezium.
המאמרים הבאים
- פתרון בעיות במחבר של מקור PostgreSQL
- פתרון בעיות בחיבור של אשכולות ומחברים
- יצירת מחבר של מקור Cloud SQL ל-PostgreSQL