בדף הזה מוסבר על ניתוב שמודע למובילים ב-Spanner ואיך משתמשים בו. Spanner משתמש בניתוב שמודע ל-leader כדי לנתב באופן דינמי טרנזקציות של קריאה וכתיבה בהגדרות של מופעים עם שני אזורים ועם כמה אזורים, כדי לצמצם את זמן האחזור ולשפר את הביצועים במסד הנתונים. ניתוב שמודע למוביל מופעל כברירת מחדל.
ניתוב ב-Spanner לעסקאות קריאה וכתיבה
Spanner משכפל נתונים כדי לספק זמינות נוספת של נתונים ומיקום גיאוגרפי. ב-Spanner, בהגדרות של מופעים בשני אזורים ובמספר אזורים, אחד האזורים בהגדרות של מופעים בשני אזורים ובמספר אזורים מוגדר כאזור הראשי, והוא מכיל את הרפליקות הראשיות של מסד הנתונים. כשמשתמשים בהגדרת מופע בשני אזורים או במספר אזורים, והלקוח מנפיק טרנזקציית קריאה-כתיבה למסד הנתונים מאזור שאינו האזור הראשי, פעולת הכתיבה תמיד מעובדת באזור הראשי ואז נשלחת בחזרה לאזור שאינו האזור הראשי. לכן, כדי לאשר טרנזקציות של קריאה וכתיבה שהתבצעו מאזור שאינו האזור הראשי, צריך לבצע כמה סבבים של שליחת נתונים אל העותק הראשי.
ניתוב מודע-למנהיג הוא מנגנון שמשפר את זמן האחזור של טרנזקציות קריאה-כתיבה על ידי ניתוב חכם של הטרנזקציות האלה. אם מופעל ניתוב שמודע לאזור הראשי, גם אם הכתיבה לא מגיעה מאזור הראשי, הבקשות ליצירת סשן מנותבות לאזור הראשי כדי להתאים את הקצה הקדמי של Spanner API לאזור הראשי. מנגנון הניתוב הזה משפר את זמני האחזור של טרנזקציות קריאה-כתיבה על ידי צמצום מספר הטיולים הלוך ושוב ברשת שנדרשים בין האזור שאינו הראשי (שבו נמצאת אפליקציית הלקוח) לבין האזור הראשי לשני טיולים.
איור 1. דוגמה לניתוב ב-Spanner עם ניתוב מודע-למנהיג מופעל.
אם ניתוב שמודע ל-Leader מושבת, אפליקציית הלקוח מנתבת קודם את הבקשה לשירות קצה קדמי של Spanner API באזור של אפליקציית הלקוח (אזור שאינו אזור ראשי). לאחר מכן, מהקצה הקדמי של Spanner API באזור של אפליקציית הלקוח, מתבצעות שלוש או יותר פעולות הלוך ושוב לשרת Spanner (SpanServer) באזור הראשי כדי לבצע את פעולת הכתיבה, מה שמגדיל את זמן האחזור. המסעות הנוספים הלוך ושוב נדרשים כדי לתמוך באינדקסים משניים, בבדיקות אילוצים ובקריאת הכתיבות.
איור 2. דוגמה לניתוב ב-Spanner עם השבתה של ניתוב שמודע ל-leader.
תרחישים לדוגמה
כתוצאה מהשימוש בניתוב שמודע לשרת הראשי, תרחישי השימוש הבאים נהנים מזמן אחזור נמוך יותר:
- עדכונים בכמות גדולה: ביצוע ייבוא של Dataflow או הפעלת שינויים ברקע (לדוגמה, batch DMLs) מאזור שאינו אזור ראשי.
- עמידות בפני אסונות וזמינות גבוהה יותר: פריסת אפליקציות לקוח באזורים מובילים ובאזורים לא מובילים כדי להתמודד עם הפסקות חשמל אזוריות, תוך הפעלת פעולות כתיבה מאזורים לא מובילים.
- אפליקציה גלובלית: פריסת אפליקציות לקוח באופן גלובלי עם מיקומים אזוריים נרחבים שבהם הנתונים נשמרים.
מגבלות
אם אפליקציית הלקוח שלכם נפרסת מחוץ לאזור הראשי ואתם כותבים ערכים בלי לקרוא את הנתונים ("כתיבות עיוורות"), יכול להיות שתבחינו ברגרסיה בזמן האחזור אם מופעל ניתוב שמודע לנתונים הראשיים. הסיבה לכך היא שכשהניתוב מודע-ל-leader מופעל, יש שני סיבובי הלוך ושוב בין אזורים (beginTransaction והבקשה commit) בין אפליקציית הלקוח באזור שאינו leader לבין חזית ה-API של Spanner באזור ה-leader. עם זאת, אם השבתתם את הניתוב שמודע ללידר, פעולות כתיבה ללא קריאה דורשות רק הלוך ושוב אחד בין אזורים עבור בקשת (בקשת מעובדת בחזית של Spanner API המקומי).commitbeginTransaction לדוגמה, אם טוענים נתונים בכמות גדולה לטבלה חדשה שנוצרה, סביר להניח שהעסקאות לא יקראו נתונים מהטבלה. אם אתם מבצעים לעיתים קרובות פעולות כתיבה בלי לקרוא אותן באפליקציה, כדאי להשבית את הניתוב שמודע לצומת הראשי. מידע נוסף מופיע במאמר בנושא השבתת ניתוב עם מודעות למוביל.
שימוש בניווט עם התחשבות במובילים
ניתוב שמודע ל-Leader מופעל כברירת מחדל בספריות הלקוח של Spanner.
מומלץ לעבד את בקשות הקריאה והכתיבה עם ניתוב שמודע לצומת הראשי. אפשר להשבית את ההגדרה כדי להשוות את ההבדלים בביצועים.
הפעלת ניתוב שמודע למובילים
אפשר להשתמש בספריות הלקוח של Spanner כדי להפעיל ניתוב עם מודעות ל-Leader באופן ידני.
C++
משתמשים במבנה RouteToLeaderOption כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;
// Create a client with RouteToLeaderOption enabled.
auto client = spanner::Client(
spanner::MakeConnection(
spanner::Database(project_id, instance_id, database_id)),
google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
spanner::true));
C#
משתמשים בפקודה EnableLeaderRouting כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;
Go
משתמשים בפקודה ClientConfig כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
type ClientConfig struct {
// DisableRouteToLeader specifies if all the requests of type read-write
// and PDML need to be routed to the leader region.
// Default: false
DisableRouteToLeader false
}
Java
משתמשים בפקודה SpannerOptions.Builder כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
משתמשים בפקודה SpannerOptions כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});
PHP
משתמשים ב-routeToLeader כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע למוביל:
// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);
Python
משתמשים בפקודה route_to_leader_enabled כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
משתמשים בפקודה self.new כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע ל-leader:
def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
lib_name: nil, lib_version: nil, enable_leader_aware_routing: true) ->
Google::Cloud::Spanner::Project
השבתת ניתוב שמודע למוביל
אפשר להשתמש בספריות הלקוח של Spanner כדי להשבית ניתוב שמודע ל-Leader.
C++
משתמשים במבנה RouteToLeaderOption כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;
// Create a client with RouteToLeaderOption disabled.
auto client = spanner::Client(
spanner::MakeConnection(
spanner::Database(project_id, instance_id, database_id)),
google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
spanner::false));
C#
משתמשים בפקודה EnableLeaderRouting כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;
Go
משתמשים בפקודה ClientConfig כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
type ClientConfig struct {
// DisableRouteToLeader specifies if all the requests of type read-write
// and PDML need to be routed to the leader region.
// Default: false
DisableRouteToLeader true
}
Java
כדי ליצור חיבור למסד נתונים של Spanner עם ניתוב מודע ל-leader מושבת:
משתמשים ב-SpannerOptions.Builder
SpannerOptions options = SpannerOptions.newBuilder().disableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
משתמשים בפקודה SpannerOptions כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});
PHP
משתמשים בפקודה routeToLeader
כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);
Python
משתמשים בפקודה route_to_leader_enabled כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
משתמשים בפקודה self.new כדי להגדיר את אפליקציית הלקוח עם ניתוב מודע-למנהיג מושבת:
def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
lib_name: nil, lib_version: nil, enable_leader_aware_routing: false) ->
Google::Cloud::Spanner::Project
המאמרים הבאים
- מידע נוסף על הגדרות אזוריות, הגדרות של שני אזורים והגדרות של כמה אזורים
- מידע על שכפול
- איך משנים את האזור הגיאוגרפי הראשי של מסד נתונים