Auf dieser Seite wird das Leader-bewusste Routing in Spanner beschrieben und es wird erläutert, wie Sie es verwenden. Spanner verwendet Leader-fähiges Routing, um Lese-/Schreibtransaktionen in biregionalen und multiregionalen Instanzkonfigurationen dynamisch weiterzuleiten. So werden Latenz reduziert und die Leistung Ihrer Datenbank verbessert. Das leader-bewusste Routing ist standardmäßig aktiviert.
Spanner-Routing für Lese-Schreib-Transaktionen
Cloud Spanner repliziert Daten, um zusätzliche Datenverfügbarkeit und geografische Präsenz zu bieten. Bei biregionalen und multiregionalen Instanzkonfigurationen von Spanner wird eine Region in der biregionalen und multiregionalen Instanzkonfiguration 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 für Ihre Datenbank aus einer nicht führenden Region ausgibt, wird der Schreibvorgang immer in der führenden Region verarbeitet und dann an die nicht führende Region zurückgesendet. Daher sind für Lese-/Schreibtransaktionen, die aus einer Region ohne Leader ausgeführt werden, mehrere Roundtrips zum Leader-Replikat erforderlich, damit sie erfolgreich ausgeführt werden können.
Das leader-aware routing ist ein Mechanismus, der die Latenz für Lese-/Schreibtransaktionen durch intelligentes Weiterleiten dieser Transaktionen verbessert. Wenn das Leader-bewusste Routing aktiviert ist, werden die Anfragen zur Sitzungserstellung an die Leader-Region weitergeleitet, um das Spanner API-Frontend mit der Leader-Region abzugleichen, auch wenn der Schreibvorgang nicht aus der Leader-Region stammt. Dieser Routingmechanismus verbessert die Latenz für Lese-/Schreibtransaktionen, indem die Anzahl der erforderlichen Netzwerk-Roundtrips zwischen der Nicht-Leader-Region (in der sich die Clientanwendung befindet) und der Leader-Region auf zwei reduziert wird.
Abbildung 1. Beispiel für Spanner-Routing mit aktivierter Option „Leader-aware-Routing“.
Wenn das leader-bewusste Routing deaktiviert ist, leitet die Clientanwendung die Anfrage zuerst an einen Spanner API-Frontend-Dienst in der Region der Clientanwendung (Nicht-Leader-Region) weiter. Anschließend werden vom Spanner API-Frontend in der Region der Clientanwendung drei oder mehr Roundtrips zum Spanner-Server (SpanServer) in der führenden Region ausgeführt, um den Schreibvorgang zu committen, was die Latenz erhöht. Diese zusätzlichen Roundtrips sind erforderlich, um sekundäre Indexe, Einschränkungsprüfungen und das Lesen Ihrer Schreibvorgänge zu unterstützen.
Abbildung 2. Beispiel für Spanner-Routing mit deaktiviertem Leader-Aware-Routing.
Anwendungsfälle
Durch die Verwendung von Leader-bewusstem Routing profitieren die folgenden Anwendungsfälle von einer geringeren Latenz:
- Bulk-Aktualisierungen: Dataflow-Importe ausführen oder Hintergrundänderungen (z. B. Batch-DMLs) aus einer Nicht-Leader-Region ausführen.
- Toleranz gegenüber Notfällen und erhöhte Verfügbarkeit: Clientanwendungen werden sowohl in Leader- als auch in Nicht-Leader-Regionen bereitgestellt, um regionale Ausfälle zu tolerieren und gleichzeitig Schreibvorgänge aus Nicht-Leader-Regionen zu initiieren.
- Globale Anwendung: Bereitstellung von Clientanwendungen weltweit mit weit verbreiteten Regionen, in denen Daten gespeichert werden.
Beschränkungen
Wenn Ihre Clientanwendung außerhalb der Leader-Region bereitgestellt wird und Sie Werte schreiben, ohne die Daten zu lesen („Blind Writes“), kann es zu einer Latenzregression kommen, wenn Leader-Aware Routing aktiviert ist. Das liegt daran, dass bei aktiviertem Leader-basierten Routing zwei regionsübergreifende Roundtrips (beginTransaction und die commit-Anfrage) zwischen der Clientanwendung in der Nicht-Leader-Region und dem Spanner API-Frontend in der Leader-Region stattfinden. Wenn das Leader-bewusste Routing jedoch deaktiviert ist, sind für Schreibvorgänge ohne Lesevorgänge nur eine regionsübergreifende Umlaufkommunikation für die commit-Anfrage erforderlich (beginTransaction wird im lokalen Spanner API-Frontend verarbeitet). Wenn Sie beispielsweise Daten 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 die Daten in Ihrer Anwendung zu lesen, sollten Sie das Leader-basierte Routing deaktivieren. Weitere Informationen finden Sie unter Leader-aware Routing deaktivieren.
Leader-aware Routing verwenden
Leader-aware Routing ist in den Spanner-Clientbibliotheken standardmäßig aktiviert.
Wir empfehlen, Ihre Lese-/Schreibanfragen mit aktiviertem Leader-Aware Routing zu verarbeiten. Sie können sie deaktivieren, um Leistungsunterschiede zu vergleichen.
Leader-Aware Routing aktivieren
Sie können die Spanner-Clientbibliotheken verwenden, um das leader-bewusste Routing manuell zu aktivieren.
C++
Verwenden Sie die Struktur RouteToLeaderOption, um Ihre Clientanwendung mit aktiviertem Leader-Aware 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 Leader-Aware 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 Leader-Aware 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 Leader-Aware 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 Leader-Aware 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 Leader-Aware-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 Leader-Aware 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 Leader-Aware 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 Leader-basierte Routing zu deaktivieren.
C++
Verwenden Sie die Struktur RouteToLeaderOption, um Ihre Clientanwendung mit deaktiviertem Leader-Aware 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 Leader-basierten 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 Leader-basierten 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 zu erstellen, bei der das Leader-bewusste Routing deaktiviert ist:
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 Leader-basierten 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 Leader-basierten 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 Leader-basierten 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 Leader-basierten 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, biregionalen und multiregionalen Konfigurationen
- Weitere Informationen zur Replikation
- Führende Region einer Datenbank ändern