ניתוב שמודע למובילים

בדף הזה מוסבר על ניתוב שמודע למובילים ב-Spanner ואיך משתמשים בו. ‫Spanner משתמש בניתוב שמודע למוביל כדי לנתב באופן דינמי טרנזקציות של קריאה וכתיבה בהגדרות של מופעים עם שני אזורים ועם כמה אזורים, כדי לצמצם את זמן האחזור ולשפר את הביצועים במסד הנתונים. ניתוב שמודע למוביל מופעל כברירת מחדל.

ניתוב ב-Spanner לעסקאות קריאה-כתיבה

מערכת Spanner משכפלת נתונים כדי לספק זמינות נוספת של נתונים ומיקום גיאוגרפי. ב-Spanner, בתצורות של אינסטנסים בשני אזורים ובמספר אזורים, אזור אחד בתצורת האינסטנס בשני אזורים ובמספר אזורים מוגדר כאזור הראשי, והוא מכיל את הרפליקות הראשיות של מסד הנתונים. כשמשתמשים בהגדרת מופע בשני אזורים או במספר אזורים, והלקוח מנפיק טרנזקציית קריאה-כתיבה למסד הנתונים מאזור שאינו האזור הראשי, פעולת הכתיבה תמיד מעובדת באזור הראשי ואז נשלחת בחזרה לאזור שאינו האזור הראשי. לכן, כדי לאשר טרנזקציות של קריאה וכתיבה שהתבצעו מאזור שהוא לא האזור הראשי, צריך לבצע כמה סבבים של שליחת נתונים אל העותק המשוכפל של האזור הראשי.

ניתוב שמודע למוביל הוא מנגנון שמשפר את זמן האחזור של טרנזקציות קריאה-כתיבה על ידי ניתוב חכם של הטרנזקציות האלה. אם מופעל ניתוב שמודע לאזור הראשי, גם אם הפעולה לא מגיעה מאזור הראשי, הבקשות ליצירת סשן מנותבות לאזור הראשי כדי להתאים את הקצה הקדמי של Spanner API לאזור הראשי. מנגנון הניתוב הזה משפר את זמני האחזור של עסקאות קריאה-כתיבה על ידי צמצום מספר הלוך ושוב ברשת שנדרש בין האזור שאינו האזור הראשי (שבו נמצאת אפליקציית הלקוח) לבין האזור הראשי לשנייה.

צילום מסך של ניתוב ב-Spanner עם ניתוב שמודע לצומת הראשי. איור 1. דוגמה לניתוב ב-Spanner עם ניתוב שמודע ל-leader.

אם ניתוב שמודע ל-Leader מושבת, אפליקציית הלקוח מנתבת קודם את הבקשה לשירות קצה קדמי של Spanner API באזור של אפליקציית הלקוח (אזור שאינו Leader). לאחר מכן, מהקצה הקדמי של Spanner API באזור של אפליקציית הלקוח, מתבצעות שלוש או יותר פעולות הלוך ושוב לשרת Spanner ‏ (SpanServer) באזור הראשי כדי לשמור את פעולת הכתיבה, מה שמגדיל את זמן הטעינה. ההלוך ושוב הנוספים האלה נדרשים כדי לתמוך באינדקסים משניים, בבדיקות אילוצים ובקריאת הכתיבות.

צילום מסך של ניתוב ב-Spanner עם השבתה של ניתוב שמודע למוביל. איור 2. דוגמה לניתוב ב-Spanner עם השבתה של ניתוב שמודע ל-leader.

תרחישים לדוגמה

כתוצאה מהשימוש בניתוב שמודע לשרת הראשי, תרחישי השימוש הבאים נהנים מזמן אחזור נמוך יותר:

  • עדכונים בכמות גדולה: ביצוע ייבוא של Dataflow או הפעלת שינויים ברקע (לדוגמה, DMLs באצווה) מאזור שאינו אזור ראשי.
  • עמידות בפני אסונות וזמינות גבוהה יותר: פריסת אפליקציות לקוח באזורים מובילים ובאזורים לא מובילים כדי להתמודד עם הפסקות חשמל אזוריות, תוך הפעלת פעולות כתיבה מאזורים לא מובילים.
  • אפליקציה גלובלית: פריסת אפליקציות לקוח באופן גלובלי עם מיקומים אזוריים נרחבים ששומרים נתונים.

מגבלות

אם אפליקציית הלקוח שלכם נפרסת מחוץ לאזור הראשי ואתם כותבים ערכים בלי לקרוא את הנתונים ("כתיבות עיוורות"), יכול להיות שתבחינו בהחמרה בבעיות השהיה אם מופעל ניתוב שמודע לשרת הראשי. הסיבה לכך היא שכשהניתוב שמודע לאזור הראשי מופעל, יש שני סיבובי הלוך ושוב בין אזורים (בקשת beginTransaction ובקשת commit) בין אפליקציית הלקוח באזור שאינו האזור הראשי לבין הקצה הקדמי של ה-API של Spanner באזור הראשי. עם זאת, אם השבתתם את הניתוב שמודע ל-Leader, פעולות כתיבה ללא קריאה דורשות רק הלוך ושוב בין אזורים עבור בקשת commit (בקשת beginTransaction מעובדת בחלק הקדמי של Spanner API המקומי). לדוגמה, אם טוענים נתונים בכמות גדולה לטבלה חדשה שנוצרה, סביר להניח שהעסקאות לא יקראו נתונים מהטבלה. אם אתם מבצעים לעיתים קרובות פעולות כתיבה בלי לקרוא אותן באפליקציה, כדאי להשבית את הניתוב שמודע לצומת הראשי. מידע נוסף מופיע במאמר בנושא השבתת ניתוב שמודע למוביל.

שימוש בהעברה שמודעת למוביל

ניתוב שמודע ל-Leader מופעל כברירת מחדל בספריות הלקוח של Spanner.

מומלץ לעבד את בקשות הקריאה והכתיבה עם ניתוב שמודע לצומת הראשי. אפשר להשבית את ההגדרה כדי להשוות את ההבדלים בביצועים.

הפעלת ניתוב שמודע למוביל

אפשר להשתמש בספריות הלקוח של 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 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 כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע למוביל:

// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;

המשך

משתמשים בפקודה 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 false
}

Java

משתמשים בפקודה SpannerOptions.Builder כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע למוביל:

SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";

Node.js

משתמשים בפקודה SpannerOptions כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע למוביל:

// 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 כדי להגדיר את אפליקציית הלקוח עם ניתוב שמודע למוביל:

spanner_client = spanner.Client(
route_to_leader_enabled=true
)
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: true) ->
    Google::Cloud::Spanner::Project

השבתת ניתוב שמודע למוביל

אפשר להשתמש בספריות הלקוח של 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 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;

המשך

משתמשים בפקודה 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

משתמשים ב-SpannerOptions.Builder כדי ליצור חיבור למסד נתונים של Spanner עם ניתוב מודע ל-leader מושבת:

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

המאמרים הבאים