Предпочитать конкретную зону доступности
Ниже приведены примеры кода установки опции алгоритма балансировки "предпочитать зону доступности" в разных YDB SDK.
В C++ SDK можно выбрать только одну зону доступности в качестве предпочитаемой.
#include <ydb-cpp-sdk/client/driver/driver.h>
int main() {
auto connectionString = std::string(std::getenv("YDB_CONNECTION_STRING"));
auto driverConfig = NYdb::TDriverConfig(connectionString)
.SetBalancingPolicy(NYdb::TBalancingPolicy::UsePreferableLocation("datacenter1"));
NYdb::TDriver driver(driverConfig);
// ...
driver.Stop(true);
return 0;
}
Функциональность на данный момент не поддерживается.
package main
import (
"context"
"os"
"github.com/ydb-platform/ydb-go-sdk/v3"
"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
db, err := ydb.Open(ctx,
os.Getenv("YDB_CONNECTION_STRING"),
ydb.WithBalancer(
balancers.PreferLocations(
balancers.RandomChoice(),
"a",
"b",
),
),
)
if err != nil {
panic(err)
}
defer db.Close(ctx)
// ...
}
Клиентская балансировка в database/sql драйвере для YDB осуществляется только в момент установления нового соединения (в терминах database/sql), которое представляет собой сессию YDB на конкретной ноде. После того, как сессия создана, все запросы на этой сессии направляются на ту ноду, на которой была создана сессия. Балансировка запросов на одной и той же сессии YDB между разными нодами YDB не происходит.
Пример кода установки алгоритма балансировки "предпочитать зону доступности":
package main
import (
"context"
"database/sql"
"os"
"github.com/ydb-platform/ydb-go-sdk/v3"
"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
nativeDriver, err := ydb.Open(ctx,
os.Getenv("YDB_CONNECTION_STRING"),
ydb.WithBalancer(
balancers.PreferLocations(
balancers.RandomChoice(),
"a",
"b",
),
),
)
if err != nil {
panic(err)
}
defer nativeDriver.Close(ctx)
connector, err := ydb.Connector(nativeDriver)
if err != nil {
panic(err)
}
db := sql.OpenDB(connector)
defer db.Close()
// ...
}
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
Функциональность на данный момент не поддерживается.
В Java SDK предпочтение зоны доступности задаётся в настройках gRPC-транспорта.
import tech.ydb.common.transaction.TxMode;
import tech.ydb.core.grpc.BalancingSettings;
import tech.ydb.core.grpc.GrpcTransport;
import tech.ydb.query.QueryClient;
import tech.ydb.query.result.ResultSetReader;
import tech.ydb.query.tools.QueryReader;
import tech.ydb.query.tools.SessionRetryContext;
import tech.ydb.table.query.Params;
public class PreferLocationExample {
public static void main(String[] args) {
String connectionString = System.getenv().getOrDefault(
"YDB_CONNECTION_STRING", "grpc://localhost:2136/local");
// Имя предпочитаемой зоны доступности (например, VLA, SAS, MYT)
String zone = System.getenv().getOrDefault("YDB_PREFER_LOCATION", "VLA");
try (GrpcTransport transport = GrpcTransport.forConnectionString(connectionString)
.withBalancingSettings(BalancingSettings.fromLocation(zone))
.build();
QueryClient queryClient = QueryClient.newClient(transport).build()) {
SessionRetryContext retryCtx = SessionRetryContext.create(queryClient).build();
QueryReader reader = retryCtx.supplyResult(session -> QueryReader.readFrom(
session.createQuery("SELECT 1 AS value", TxMode.NONE, Params.empty())
)).join().getValue();
ResultSetReader rs = reader.getResultSet(0);
if (rs.next()) {
System.out.println("SELECT 1 = " + rs.getColumn("value").getInt32());
}
}
}
}
Аналог BalancingSettings.fromLocation() — свойство localDatacenter в JDBC URL (см. свойства JDBC-драйвера).
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcPreferLocationExample {
public static void main(String[] args) throws SQLException {
String jdbcUrl = System.getenv().getOrDefault(
"YDB_JDBC_URL", "jdbc:ydb:grpc://localhost:2136/local");
// Имя предпочитаемой зоны доступности (например, VLA, SAS, MYT)
String zone = System.getenv().getOrDefault("YDB_PREFER_LOCATION", "VLA");
try (Connection connection = DriverManager.getConnection(
jdbcUrl + (jdbcUrl.contains("?") ? "&" : "?") + "localDatacenter=" + zone);
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("SELECT 1 AS value")) {
if (rs.next()) {
System.out.println("SELECT 1 = " + rs.getInt("value"));
}
}
}
}
В Spring Boot, ORM и прочих сторонних фреймворках вокруг JDBC передайте те же JDBC URL и параметры зоны доступности, что и при прямом подключении (например, в spring.datasource.url или свойствах пула).
Функциональность на данный момент не поддерживается.
Отслеживать прогресс или проголосовать за поддержку в Rust SDK: ydb-rs-sdk#238
Функциональность на данный момент не поддерживается.