Führende Routenplanung

Auf dieser Seite wird das Leader-spezifische Routing in Spanner und seine Verwendung beschrieben. Spanner verwendet das Leader-spezifische Routing, um Lese-/Schreibtransaktionen in Dual- und multiregionalen Instanzkonfigurationen dynamisch weiterzuleiten, um die Latenz zu reduzieren und die Leistung Ihrer Datenbank zu verbessern. Das Leader-spezifische Routing ist standardmäßig aktiviert.

Spanner-Routing für Lese-Schreib-Transaktionen

Spanner repliziert Daten, um für zusätzliche Datenverfügbarkeit und geografischer Standort zu sorgen. In Spanner-Konfigurationen mit zwei und mehreren Regionen wird eine Region in der Konfiguration der Dual- und Multi-Regionen als führende Region festgelegt und enthält die Leader-Replikate der Datenbank. Wenn Sie eine Konfiguration mit zwei oder mehreren Regionen verwenden und Ihr Client eine Lese-Schreib-Transaktion aus einer nicht führenden Region an Ihre Datenbank ausgibt, wird der Schreibvorgang immer in der führenden Region verarbeitet und dann zurück in die nicht führende Region gesendet. Daher sind für Lese-Schreib-Transaktionen, die aus einer Nicht-Leader-Region festgeschrieben werden, mehrere Umläufe zum Leader-Replikat erforderlich, damit ein Commit erfolgreich durchgeführt werden kann.

Das Leader-aware Routing ist ein Mechanismus, der die Latenz für Lese-Schreib-Transaktionen durch intelligentes Routing dieser Transaktionen verbessert. Wenn das Leader-spezifische Routing aktiviert ist, werden die Anfragen zur Sitzungserstellung an die führende Region weitergeleitet, um das Spanner-Front-End (SpanFE) an die führende Region auszurichten, auch wenn der Schreibvorgang nicht aus der führenden Region stammt. Dieser Routingmechanismus verbessert die Latenz für Lese-Schreib-Transaktionen, indem die Anzahl der erforderlichen Netzwerk-Roundtrips zwischen der nicht führenden Region (in der sich die Clientanwendung befindet) und der führenden Region auf zwei reduziert wird.

Screenshot eines Spanner-Routings mit aktiviertem Leader-aware-Routing Abbildung 1: Beispiel für ein Spanner-Routing mit aktiviertem Leader-aware-Routing

Wenn das Leader-spezifische Routing deaktiviert ist, leitet die Clientanwendung die Anfrage zuerst an einen SpanFE-Dienst innerhalb der Clientanwendungsregion (keine führende Region) weiter. Anschließend werden vom SpanFE in der Clientanwendungsregion drei oder mehr Umläufe zum Spanner-Server (SpanServer) in der führenden Region durchgeführt, um den Schreibvorgang festzuschreiben. Dadurch erhöht sich die Latenz. Diese zusätzlichen Umläufe sind erforderlich, um sekundäre Indexe, Einschränkungsprüfungen und das Lesen Ihrer Schreibvorgänge zu unterstützen.

Screenshot-Spanner-Routing mit deaktiviertem Leader-aware-Routing Abbildung 2: Beispiel für ein Spanner-Routing mit deaktiviertem Leader-aware-Routing

Anwendungsfälle

Durch die Verwendung von Leader-sensitivem Routing profitieren in folgenden Anwendungsfällen von einer geringeren Latenz:

  • Bulk-Aktualisierungen: Dataflow-Importe ausführen oder Hintergrundänderungen ausführen (z. B. Batch-DMLs) aus einer Region, die keine führende Region ist.
  • Notfalltoleranz und erhöhte Verfügbarkeit: Bereitstellung von Clientanwendungen sowohl in führenden als auch in nicht führenden Regionen, um regionale Ausfälle zu tolerieren und gleichzeitig Schreibvorgänge aus Regionen zu initiieren, die keine führenden Regionen sind.
  • Globale Anwendung: Globale Bereitstellung von Clientanwendungen mit weit verbreiteten regionalen Standorten, die Daten übergeben.

Beschränkungen

Wenn Ihre Clientanwendung außerhalb der Leader-Region bereitgestellt wird und Sie Werte schreiben, ohne die Daten zu lesen („blind Write“), kann es zu einer Latenzrückgang kommen, wenn das Leader-spezifische Routing aktiviert ist. Das liegt daran, dass bei aktiviertem Leader-gestützten Routing zwei interregionale Umläufe (beginTransaction und die commit-Anfrage) zwischen der Clientanwendung in der nicht führenden Region und dem SpanFE in der führenden Region stattfinden. Ist das Leader-spezifische Routing deaktiviert, erfordern Schreibvorgänge ohne Lesevorgänge jedoch nur einen interregionalen Umlauf für die commit-Anfrage (beginTransaction wird im lokalen SpanFE verarbeitet). Wenn Sie beispielsweise Dateidaten im Bulk in eine neu erstellte Tabelle laden, ist es unwahrscheinlich, dass die Transaktionen Daten aus der Tabelle lesen. Wenn Sie häufig Schreibvorgänge ausführen, ohne diese in Ihrer Anwendung zu lesen, sollten Sie erwägen, das Routing nach Führungsposition zu deaktivieren. Weitere Informationen finden Sie unter Leader-fähiges Routing deaktivieren.

Führende Routenplanung verwenden

Leader-aware-Routing ist in den Spanner-Clientbibliotheken standardmäßig aktiviert.

Wir empfehlen, Ihre Lese-/Schreibanfragen mit aktiviertem Routing-Erkennungssystem zu verarbeiten. Sie können sie deaktivieren, um Leistungsunterschiede zu vergleichen.

Führende Routenführung aktivieren

Mit den Spanner-Clientbibliotheken können Sie das Leader-fähige Routing manuell aktivieren.

C++

Konfigurieren Sie mithilfe der RouteToLeaderOption-Struktur Ihre Clientanwendung mit aktiviertem Routing, der Leader-fähig ist:

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#

Verwenden Sie EnableLeaderRouting, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

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

Einfach loslegen (Go)

Verwenden Sie ClientConfig, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

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

Verwenden Sie SpannerOptions.Builder, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

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

Node.js

Verwenden Sie SpannerOptions, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});

PHP

Verwenden Sie routeToLeader, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);

Python

Verwenden Sie route_to_leader_enabled, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

Verwenden Sie self.new, um Ihre Clientanwendung mit aktiviertem Routing-Erkennungssystem zu konfigurieren:

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

Routing auf Führungsebene deaktivieren

Sie können die Spanner-Clientbibliotheken verwenden, um das Leader-fähige Routing zu deaktivieren.

C++

Konfigurieren Sie mithilfe der RouteToLeaderOption-Struktur Ihre Clientanwendung mit deaktiviertem Leader-sensitivem Routing:

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#

Verwenden Sie EnableLeaderRouting, um Ihre Clientanwendung mit deaktiviertem Routing auf Führungsebene zu konfigurieren:

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

Einfach loslegen (Go)

Verwenden Sie ClientConfig, um Ihre Clientanwendung mit deaktiviertem Routing auf Führungsebene zu konfigurieren:

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

Verwenden Sie SpannerOptions.Builder, um eine Verbindung zu einer Spanner-Datenbank mit deaktiviertem Leader-aware-Routing zu erstellen:

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

Node.js

Verwenden Sie SpannerOptions, um Ihre Clientanwendung mit deaktiviertem Routing auf Führungsebene zu konfigurieren:

// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});

PHP

Verwenden Sie routeToLeader, um Ihre Clientanwendung mit deaktiviertem Routing-Erkennungssystem zu konfigurieren:

// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);

Python

Verwenden Sie route_to_leader_enabled, um Ihre Clientanwendung mit deaktiviertem Routing auf Führungsebene zu konfigurieren:

spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

Verwenden Sie self.new, um Ihre Clientanwendung mit deaktiviertem Routing auf Führungsebene zu konfigurieren:

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

Nächste Schritte