Leader-Aware-Routing

Auf dieser Seite wird das leiterbasierte Routing in Spanner und seine Verwendung beschrieben. Spanner verwendet das Leader-fähige Routing, um Lese-Schreib-Transaktionen in biregionalen und multiregionalen Instanzkonfigurationen dynamisch zu leiten, um die Latenz zu reduzieren und die Leistung Ihrer Datenbank zu verbessern. Das leiterbasierte Routing ist standardmäßig aktiviert.

Spanner-Routing für Lese-Schreib-Transaktionen

Spanner repliziert Daten, um die Datenverfügbarkeit und die geografische Nähe zu verbessern. In biregionalen und multiregionalen Instanzkonfigurationen von Spanner wird eine Region als führende Region festgelegt. Sie enthält die Leader-Replikate der Datenbank. Wenn Sie eine Instanzkonfiguration mit zwei oder mehr Regionen verwenden und Ihr Client eine Lese-/Schreibtransaktion von einer nicht führenden Region an Ihre Datenbank ausführt, wird der Schreibvorgang immer in der führenden Region verarbeitet und dann an die nicht führende Region zurückgesendet. Daher erfordern Lese-Schreib-Transaktionen, die von einer anderen Region als der Leader-Region ausgeführt werden, mehrere Hin- und Rückwege zum Leader-Replikat, um erfolgreich ausgeführt zu werden.

Das führerbasierte Routing ist ein Mechanismus, der die Latenz für Lese-Schreib-Transaktionen durch intelligentes Routing dieser Transaktionen verbessert. Wenn das leader-aware-Routing aktiviert ist, werden die Anfragen zur Sitzungserstellung an die Leader-Region weitergeleitet, um das Spanner Front End (SpanFE) mit der Leader-Region abzugleichen, auch wenn die Schreibvorgänge nicht aus der Leader-Region stammen. Dieser Routingmechanismus verbessert die Latenz für Lese-/Schreibtransaktionen, indem die Anzahl der erforderlichen Netzwerk-Roundtrips zwischen der nicht leitenden Region (in der sich die Clientanwendung befindet) und der leitenden Region auf zwei reduziert wird.

Screenshot des Spanner-Routings mit aktiviertem führerbasierten Routing Abbildung 1. Beispiel für das Spanner-Routing mit aktiviertem führungsbewussten Routing

Wenn das führerbasierte Routing deaktiviert ist, leitet die Clientanwendung die Anfrage zuerst an einen SpanFE-Dienst innerhalb der Region der Clientanwendung (nicht führende Region) weiter. Anschließend werden von der SpanFE in der Region der Clientanwendung drei oder mehr Rundreisen zum Spanner-Server (SpanServer) in der führenden Region durchgeführt, um den Schreibvorgang zu bestätigen. Dies erhöht die Latenz. Diese zusätzlichen Roundtrips sind erforderlich, um sekundäre Indizes, Einschränkungen zu prüfen und Ihre Schreibvorgänge zu lesen.

Screenshot des Spanner-Routings mit deaktiviertem führerbasierten Routing Abbildung 2. Beispiel für das Spanner-Routing mit deaktiviertem führungsbewussten Routing

Anwendungsfälle

Durch die Verwendung von leiterbasiertem Routing profitieren die folgenden Anwendungsfälle von einer geringeren Latenz:

  • Bulk-Updates: Ausführen von Dataflow-Importen oder Hintergrundänderungen (z. B. Batch-DMLs) aus einer anderen Region als der Hauptregion.
  • Fehlertoleranz und erhöhte Verfügbarkeit: Clientanwendungen werden sowohl in der Haupt- als auch in der nicht leitenden Region bereitgestellt, um regionale Ausfälle zu tolerieren und Schreibvorgänge von nicht leitenden Regionen aus zu initiieren.
  • Globale Anwendung: Bereitstellung von Clientanwendungen weltweit mit weit verbreiteten Standorten in Regionen, an denen Daten verbindlich festgelegt werden.

Beschränkungen

Wenn Ihre Clientanwendung außerhalb der führenden Region bereitgestellt wird und Sie Werte schreiben, ohne die Daten zu lesen („blinde Schreibvorgänge“), kann es bei aktiviertem führerbasierten Routing zu einer Latenzregression kommen. Das liegt daran, dass bei aktiviertem führerbasiertem Routing zwei regionenübergreifende Rundreisen (beginTransaction- und commit-Anfrage) zwischen der Clientanwendung in der nicht führenden Region und der SpanFE in der führenden Region stattfinden. Wenn das leader-aware Routing jedoch deaktiviert ist, ist für Schreibvorgänge ohne Lesevorgänge nur eine Umlaufkommunikation zwischen den Regionen für die commit-Anfrage erforderlich (beginTransaction wird in der lokalen SpanFE verarbeitet). Wenn Sie beispielsweise Dateidaten per Bulk-Ladevorgang 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 sie in Ihrer Anwendung zu lesen, sollten Sie das führerbasierte Routing deaktivieren. Weitere Informationen finden Sie unter Leiter-orientiertes Routing deaktivieren.

Leader-Aware-Routing verwenden

Das leiterbasierte Routing ist in den Spanner-Clientbibliotheken standardmäßig aktiviert.

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

Leader-Aware-Routing aktivieren

Mit den Spanner-Clientbibliotheken können Sie das führungsbewusste Routing manuell aktivieren.

C++

Verwenden Sie die Struktur RouteToLeaderOption, um Ihre Clientanwendung mit aktiviertem führerbasiertem Routing zu konfigurieren:

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 führerbasiertem Routing zu konfigurieren:

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

Go

Verwenden Sie ClientConfig, um Ihre Clientanwendung mit aktiviertem führerbasiertem Routing 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 führerbasiertem Routing 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 führerbasiertem Routing 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 führerbasiertem Routing 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 führerbasiertem Routing 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 führerbasiertem Routing 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

Leader-Aware-Routing deaktivieren

Sie können die Spanner-Clientbibliotheken verwenden, um das leiterbasierte Routing zu deaktivieren.

C++

Verwenden Sie die Struktur RouteToLeaderOption, um Ihre Clientanwendung mit deaktiviertem führerbasiertem Routing zu konfigurieren:

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 führerbasiertem Routing zu konfigurieren:

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

Go

Verwenden Sie ClientConfig, um Ihre Clientanwendung mit deaktiviertem führerbasiertem Routing 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 führungsbewussten Routing herzustellen:

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 führerbasiertem Routing 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 führerbasiertem Routing 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 führerbasiertem Routing 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 führerbasiertem Routing 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