Prefer a specific availability zone
Below are examples of setting the "prefer availability zone" balancing algorithm in different YDB SDKs.
Go
C++
Python
Native SDK
database/sql
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)
// ...
}
Client-side balancing in the YDB database/sql driver happens only when opening a new connection (in database/sql terms), which maps to a YDB session on a specific node. After the session is created, all queries on that session go to that node. Queries on the same YDB session are not balanced across nodes.
Example for "prefer availability zone" balancing:
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()
// ...
}
The C++ SDK lets you pick only one availability zone as preferred.
#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;
}
This functionality is not currently supported.