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.
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.
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
- Weitere Informationen zu regionalen, Dual-Region- und Multi-Region-Konfigurationen
- Weitere Informationen zur Replikation
- Weitere Informationen zum Ändern der führenden Region einer Datenbank