אזורים¶
Provisa נותנת לכם שני אבני יסוד למיקום נתונים: אזור, ושיוך לאזור, כלומר יצירת אזור ושיוך טבלה אליו. אף אחד מהם אינו מדיניות כשלעצמו. מה שתעשו בהם מתחלק לשלוש קבוצות:
- ביצועים. ההשהיה אל הקוראים, עד כמה העותק שלהם עדכני, והתאמת המנוע: היכן מרכז הנתונים שלו, איזה סוג אחסון הוא קורא, כמה מעבד וזיכרון יש לו.
- עלות. היכן העבודה רצה ועל מה: חומרה בבעלותכם או ענן, מנוע גדול או קטן, ומה עולה העברת נתונים בין מקומות (egress).
- ריבונות. מי שולט בנתונים ולאן מותר להם להגיע: כללי השהייה של החוק (היכן מותר לעבד נתונים אישיים והיכן מותר לאחסן אותם), וקווי השליטה של הארגון עצמו, כמו יחידה עסקית או חברת בת ששומרת את הנתונים והתשתית שלה בשליטתה.
המכניקה זהה לשלושתן. רק הכללים שאתם כותבים מעליה שונים.
אזור הוא מנוע ומאגריו במקום אחד¶
אזור הוא מקום שבו Provisa עובדת ושומרת את מה שהעבודה משאירה. לכל אזור יש מנוע משלו ומאגרים משלו.
| מאגר | מה הוא מחזיק |
|---|---|
engine |
מנוע הפדרציה שמריץ הצהרות באזור הזה |
replicas |
עותקים של טבלאות המשויכות לכאן, ושל טבלאות ללא אזור שהאזור הזה מעתיק |
views |
העותקים של תצוגות ממומשות באזור הזה |
cache |
תגובות שמורות במטמון |
state |
מצב הבנייה והרענון |
record |
הרשומה של כל בקשה שנענתה כאן |
מודל אחד מנהל כל אזור. מקורות, טבלאות, קשרים, תפקידים, כללי שורה ועמודה, תצוגות והגדרות עדכניות מוצהרים פעם אחת, במאגר מודל אחד, וכל אזור מגיש את אותו מודל, כך שהגדרות אינן יכולות להתפצל בין אזורים. שינוי מגיע לכל אזור באותה חותמת, וכל אזור מתכנס אליו לאחר מכן.
הפלטפורמה מצהירה על האזורים הפיזיים שבהם הצמתים שלה רצים, עם הכתובת שבה כל אזור עונה. המודל של כל ארגון בוחר באילו מאזורים אלה הוא משתמש ונוקב במאגר משלו לכל תפקיד בכל אזור. צומת מופעל באזור עם provisa run --region <id> ומשרת את האזור הזה עבור כל ארגון שבוחר בו. כשאזורים מוצהרים, צומת שהופעל בלי --region מסרב לעלות ומפרט את האזורים שהוא יכול לשרת.
platform:
regions:
- { id: eu, address: "https://eu.provisa.example" }
- { id: us, address: "https://us.provisa.example" }
stores:
- { id: eu_engine, url: "${secret:eu-trino-url}", kind: trino }
- { id: us_engine, url: "${secret:us-trino-url}", kind: trino }
- { id: eu_data, url: "${secret:eu-pg-url}" }
- { id: us_data, url: "${secret:us-pg-url}" }
- { id: eu_cache, url: "${secret:eu-redis-url}" }
- { id: us_cache, url: "${secret:us-redis-url}" }
regions:
- { id: eu, engine: eu_engine, replicas: eu_data, views: eu_data, cache: eu_cache, state: eu_data, record: eu_data }
- { id: us, engine: us_engine, replicas: us_data, views: us_data, cache: us_cache, state: us_data, record: us_data }
בטעינה, הקונפיגורציה נדחית, תוך ציון הסיבה, כשהאזורים אינם מתיישבים זה עם זה. אזור חייב לנקוב במאגר מוצהר לכל תפקיד. ה-replicas וה-views שלו חייבים להיות אותו מאגר, ומאגר המנוע שלו חייב לנקוב ב-kind של מנוע. כשלפלטפורמה יותר מאזור אחד, קובץ מנוע מוטמע נדחה, כי האזורים האחרים אינם יכולים להגיע אליו.
כמה אזורים יכולים לחלוק מופע מסד נתונים אחד, Redis אחד או bucket אחסון אובייקטים אחד. כל מה שאזור שומר נושא את האזור בשמו, כך שהמאגרים שלהם אינם מתנגשים.
פריסה שאינה מצהירה על אזורים יש לה אזור מובלע אחד, והיא אינה מציגה אזור בשום מקום. אין שדה אזור ואין דגל --region, וקונפיגורציה שנוקבת באזור נדחית.
שיוך לאזור: טבלה נוקבת באזור הבית שלה¶
טבלה יכולה לנקוב באחד מאזורי הארגון שלה כאזור הבית שלה. אזור הבית הוא האזור היחיד שבונה ומרענן את העותק שלה, והיחיד שרשאי להחזיק אותה חמה. כל אזור אחר קורא את הטבלה מהעותק של אזור הבית, במקומו, בכתובת שהמודל נותן. כללי השורה והעמודה של הקורא נכנסים להצהרה הזו, כך שהסינון קורה באזור הבית ורק מה שהקורא רשאי לראות חוצה את הגבול.
כמה השלכות:
- אף אזור אחר אינו קורא את המקור של הטבלה; הם קוראים רק את העותק של אזור הבית. מקור שאתם משכפלים כדי להגן עליו מעומס נשאר מוגן.
- אם העותק לא נבנה, או שאזור הבית אינו נגיש, הבקשה נדחית תוך ציון אזור הבית. המקור אינו נקרא ישירות במקומו.
- טבלה משויכת שאינה משוכפלת, עם
replicateNever או הגדרה שעדיין לא דרשה עותק, נקראת ישירות מהמקור שלה בכל אזור, כמו כל טבלה שאינה משוכפלת. - מונה החום של טבלה הוא התעבורה של אזור הבית שלה בלבד.
- גם תצוגה ממומשת יכולה לנקוב באזור. אז היא נבנית רק שם, וכל אזור אחר קורא את העותק הזה, בדיוק כמו בטבלה משויכת.
אזור שקורא עותק של אזור אחר צריך מנוע שמסוגל לקרוא אותו: duckdb, motherduck, pg, trino או trino-byo. מאגר ה-replicas של אזור הבית חייב להיות שרת PostgreSQL. הקונפיגורציה נוקבת בשניהם כשהם אינם מתאימים.
גם מקור יכול לנקוב באזור, אבל האזור הזה רק ממלא מראש את הטופס כשאתם רושמים טבלה חדשה של המקור. הוא אינו מחליט דבר על היכן הנתונים נמצאים, ושינויו מאוחר יותר אינו מעביר שום טבלה.
טבלאות ללא אזור מועתקות היכן שהן נקראות¶
טבלה שאינה נוקבת באזור רשאית להיות מועתקת לכל אזור. כשהגדרת ה-replicate שלה דורשת עותק, האזור שהקורא התחבר אליו בונה אחד במאגר שלו. תצוגה ממומשת שאינה נוקבת באזור נבנית בכל אזור, כל עותק באחסון התצוגות של אותו אזור.
הוספת אזור פירושה לכן יותר עותקים ויותר עבודת רענון. לעולם לא יותר ממשל. מודל אחד מנהל כל עותק, ובכל אזור חלים אותם כללי שורה ועמודה. בניית תצוגה באזור מנוהלת כמנהל הארגון הפועל באותו אזור, כך שהעותק של כל אזור מחזיק את מה שמותר לשמור שם.
שלוש סיבות להשתמש באזורים¶
ביצועים¶
אזורים שמשמשים לביצועים בלבד אינם מצהירים על כללים בין אזורים. הטבלאות, התפקידים והכללים הם אלה שהייתם כותבים לאזור יחיד, והשיוך לאזור מחליט היכן העבודה קורית:
- השהיה. קוראים מתחברים לאזור הקרוב אליהם, והמנוע, המטמון והעותקים שלו מקומיים עבורם.
- עדכניות. טבלה המשויכת למקום שבו היא משתנה מתרעננת שם, קרוב למקור שלה.
- התאמת המנוע. כל אזור מריץ מנוע משלו, כך שאפשר להתאים מנוע למקום: למרכז הנתונים שבו הוא יושב, לאחסון שהוא קורא, ולמעבד ולזיכרון שיש לו.
דוגמה: שני אזורים זהים. הצהירו על east ו-west בשני מרכזי נתונים, כל אחד עם אותו סוג מנוע ואותם סוגי מאגרים, ואל תשייכו אף טבלה. כל אזור משרת את הקוראים הקרובים אליו: הוא בונה עותקים משלו של מה שהם קוראים ושומר את התגובות שלהם במטמון. השניים יכולים לעמוד מאחורי מאזן עומסים אחד ולחלוק את העומס. יש לוח זמנים אחד לרענון, זה של המודל, ושני האזורים מתחילים לרענן את העותקים שלהם לפיו, אך ייתכן שהמנועים שלהם לא יסיימו באותו זמן. לכן ברגע נתון אין ערובה ששניהם באותו מצב, וקורא שעובר מאזור אחד לאחר עשוי לראות נתונים בעדכניות שונה. Provisa אינה מעבירה לקוח לאזור האחר כשאחד נעצר; לאן לקוח נשלח מחליט מאזן העומסים.
עלות¶
גם אזורי עלות אינם מצהירים על כללים בין אזורים. הם מציבים את העבודה היכן שהכי זול להריץ אותה:
- חומרה בבעלותכם וענן. החזיקו אזור באתר, על חומרה שכבר בבעלותכם, עבור הטבלאות והקוראים שנמצאים שם, והריצו אזור אחר בענן עבור השאר.
- גודל המנוע. הריצו מנוע גדול באזור אחד לעבודה כבדה מזדמנת, ומנוע קטן באזור אחר לקריאות היומיומיות. הקוראים בוחרים את האזור לפי הכתובת שלו.
- Egress. קוראים באזורים אחרים מקבלים רק את השורות המסוננות מהעותק של טבלה משויכת, וטבלה גדולה המשויכת לאזור אחד אינה מועתקת לכל אזור.
ריבונות¶
אזורים לריבונות כן מצהירים על כללים בין אזורים, בין אם הסיבה היא החוק ובין אם הארגון: חברת בת שמשייכת את הטבלאות שלה לאזור שלה מעבדת ומאחסנת אותן על התשתית שלה, ומחליטה באמצעות הכללים האלה מה שאר הקבוצה קוראת. אלה כללי שורה ועמודה רגילים, הכתובים על תכונות שאומרות היכן נמצא הקורא, או הצומת שעושה את העבודה:
current_setting('provisa.region')הוא האזור של הצומת שעונה לבקשה, כשהפלטפורמה מצהירה על אזורים. מסנן שורות שנכתב עליו שומר את השורות של אזור בתוך אותו אזור.- התכונה
regionשל חבר גורמת לו להחזיק בתפקידים הנגזריםregionו-region__<value>, כך שרשומת מסכה או הענקה יכולה לנקוב ב-analyst+region__eu. עבודת הרקע של הצומת עצמו נושאת את האזור שלו באותו אופן. ראו תפקידים: מוענקים, נגזרים ומטא.
יחד עם השיוך, הכללים האלה מחליטים מה חוצה גבול. הנתונים האישיים של טבלה משויכת מאוחסנים ומעובדים באזור הבית שלה, וקורא במקום אחר מקבל רק את מה שהכללים שלו מתירים, מסונן בבית. תצוגה ללא אזור הנבנית בכל אזור מחזיקה את מה שמנהל באותו אזור רשאי לראות, כך שהעותק באזור אחד עשוי לכלול שורות שהעותק באזור אחר משמיט.
מי רשאי לשייך טבלה¶
קביעה, שינוי או הסרה של האזור של טבלה, מקור או תצוגה ממומשת מעבירים נתונים דרך גבול. הדבר דורש את הזכות data_residency בנוסף לבעלות על האובייקט דרך התחום שלו. ההענקה נוקבת בערכים שהיא מכסה: אזורי הארגון ו"ללא אזור". העברת אובייקט בין שני אזורים דורשת הענקה שמכסה את שניהם. שמירה מחוץ להענקה נדחית, תוך ציון הערך שאינו מכוסה.
הזכות קיימת רק כשהפלטפורמה מצהירה על אזורים. בעלות התחום עדיין מחליטה מי רשאי לערוך את כל השאר באובייקט. אזור אינו מקנה זכות משלו; ארגון שרוצה שהטבלאות של אזור ינוהלו בידי אנשי אותו אזור נותן להם תחומים משלהם.
אפשר גם להגדיר טבלה או תצוגה כטיוטה. טיוטה היא מחוץ לשירות, ואינה מוצעת לשום קורא. טבלה שנרשמת דרך הניהול מתחילה כטיוטה. האחראי עליה יכול להציג אותה בתצוגה מקדימה רק בצמתים של האזור שהיא מציינת, או, כשהיא לא מציינת אזור, היכן שהאחראי נמצא. העותק שהתצוגה המקדימה מנחיתה נשאר באותו אזור, מוכן לשחרור הטבלה. כל עותק שאזור אחר מחזיק מלפני שהאזור של הטבלה הוגדר או שונה מוצא משירות ונמחק, כמו בטבלה מפורסמת. טיוטה גם נותנת למעבר בין אזורים מרווח נקי, שבו הטבלה לא מוגשת בשום מקום: הצד של האזור הראשון מגדיר אותה כטיוטה, והמחזיק באזור השני תובע אותה על ידי הגדרת האזור שלו.
ראו גם את ההדגמה עם שני אזורים.