Подключение к нешардированному кластеру Valkey™
К нешардированному кластеру Valkey™ можно подключиться:
-
С помощью Valkey™ Sentinel.
Valkey™ Sentinel — это система управления хостами Valkey™, позволяющая проводить мониторинг, отправлять уведомления о состояниях хостов, переключать мастер и передавать клиентам актуальные адреса хостов.
Поддерживается нешифрованное соединение через порт
26379
для кластеров с любой версией Valkey™.Если клиентское приложение не поддерживает подключение через Sentinel, подключитесь напрямую к мастеру. Если в прямом подключении нет необходимости, используйте Sentinel для более надежной работы с хостами кластера.
Подробнее о Sentinel см. в разделе Репликация и отказоустойчивость и документации Valkey™
. -
Напрямую к мастеру.
Поддерживаются шифрованное соединение через порт
6380
и нешифрованное через порт6379
.Важно
Используя SSL-соединение, можно подключаться только к кластерам с включенной настройкой Поддержка TLS.
Чтобы всегда подключаться к мастеру в нешардированном кластере, воспользуйтесь особым FQDN, который всегда указывает на мастер, либо отслеживайте роли всех хостов кластера самостоятельно.
Особые FQDN
Yandex Managed Service for Valkey™ предоставляет особые FQDN, которые можно использовать вместо обычных FQDN хостов для подключения к нешардированному кластеру.
Важно
Если при автоматической смене мастера новым мастером станет хост без публичного доступа, подключиться к нему из интернета будет невозможно. Чтобы этого избежать, включите публичный доступ для всех хостов кластера.
Текущий мастер
FQDN вида c-<идентификатор_кластера>.rw.mdb.yandexcloud.net
в нешардированном кластере всегда указывает на текущий хост-мастер. Идентификатор кластера можно запросить со списком кластеров в каталоге.
При подключении к этому FQDN разрешено выполнять операции чтения и записи.
Пример подключения с SSL-шифрованием к хосту-мастеру для кластера с идентификатором c9qash3nb1v9********
:
redis-cli -h c-c9qash3nb1v9********.rw.mdb.yandexcloud.net \
-p 6380 \
--tls \
--cacert ~/.redis/YandexInternalRootCA.crt \
-a <пароль_Valkey™>
Подключение из графических IDE
Подключение проверялось в следующем окружении:
- MacOS Big Sur 11.3.
- DBeaver Enterprise:
21.0
.
Подключаться из графических IDE к хостам кластера можно только через SSH-туннель с помощью созданной ВМ. Перед подключением подготовьте сертификат.
Чтобы избежать ошибок при подключении, сохраните сертификат
Поддержка подключения к кластеру Valkey™ доступна только в коммерческих редакциях DBeaver
Чтобы подключиться к кластеру:
- Создайте новое соединение с БД:
- Выберите в меню База данных пункт Новое соединение.
- Выберите из списка БД Valkey™.
- Нажмите кнопку Далее.
- Укажите параметры подключения на вкладке Главное:
- Хост — FQDN хоста-мастера или особый FQDN, всегда указывающий на текущий хост-мастер.
- Порт —
6379
для обычного кластера или6380
для кластера с включенным SSL-шифрованием. - В блоке Аутентификация укажите пароль от кластера.
- На вкладке SSH:
- Включите настройку Использовать туннель SSH.
- Укажите параметры SSH-туннеля:
- Хост/IP — публичный IP-адрес ВМ для подключения;
- Имя пользователя — логин для подключения к ВМ;
- Метод аутентификации —
Публичный ключ
; - Секретный ключ — путь к файлу закрытого ключа для подключения к ВМ;
- Passphrase — пароль от закрытого ключа.
- На вкладке SSL:
- Включите настройки Использовать SSL и Пропустить валидацию имени хоста.
- В блоке Параметры:
- Выберите Способ — Набор сертификатов.
- В поле Корневой сертификат укажите путь к сохраненному файлу SSL-сертификата.
- Нажмите кнопку Тест соединения ... для проверки соединения с БД. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
- Нажмите кнопку Готово, чтобы сохранить настройки соединения с БД.
Подготовка к подключению из Docker-контейнера
Чтобы подключаться к кластеру Yandex Managed Service for Valkey™ из Docker-контейнера, добавьте в Dockerfile строки:
# Собрать вручную утилиту redis-tools с поддержкой TLS.
RUN apt-get update && \
apt-get install make gcc libssl-dev --yes && \
wget https://download.redis.io/redis-stable.tar.gz && \
tar -xzvf redis-stable.tar.gz && \
cd redis-stable && \
make BUILD_TLS=yes MALLOC=libc && \
make install && \
cp ./src/redis-cli /usr/bin/
# Собрать вручную утилиту redis-tools с поддержкой TLS.
RUN apt-get update && \
apt-get install wget make gcc libssl-dev --yes && \
wget https://download.redis.io/redis-stable.tar.gz && \
tar -xzvf redis-stable.tar.gz && \
cd redis-stable && \
make BUILD_TLS=yes MALLOC=libc && \
make install && \
cp ./src/redis-cli /usr/bin/ && \
# Получить SSL-сертификат.
mkdir --parents ~/.redis && \
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \
--output-document ~/.redis/YandexInternalRootCA.crt && \
chmod 0655 ~/.redis/YandexInternalRootCA.crt
Примеры строк подключения
Примеры для Linux проверялись в следующем окружении:
- Виртуальная машина в Yandex Cloud с Ubuntu 20.04 LTS.
- Bash:
5.0.16
. - Python:
3.8.2
; pip3:20.0.2
. - PHP:
7.4.3
. - OpenJDK:
11.0.8
; Maven:3.6.3
. - Node.JS:
10.19.0
, npm:6.14.4
. - Go:
1.13.8
. - Ruby:
2.7.0p0
. - unixODBC:
2.3.6
.
Примеры для Windows проверялись в следующем окружении:
- Локальная машина с Windows 10 Pro build
19042.1052
. - PowerShell:
5.1.19041
. - cURL:
7.55.1 WinSSL
.
Примеры кода с заполненным FQDN хоста доступны в консоли управления
Bash
Перед подключением установите зависимости:
sudo apt update && sudo apt install -y redis-tools
Подключение с помощью Sentinel:
-
Получите адрес хоста-мастера, используя Sentinel и любой хост Valkey™:
redis-cli \ -h <FQDN_любого_хоста_Valkey™> \ -p 26379 \ sentinel \ get-master-addr-by-name <имя_кластера_Valkey™> | head -n 1
-
Подключитесь к хосту с этим адресом:
redis-cli \ -h <адрес_хоста-мастера_Valkey™> \ -a <пароль_Valkey™>
Подключение напрямую к мастеру:
redis-cli \
-h c-<идентификатор_кластера>.rw.mdb.yandexcloud.net \
-a <пароль>
Перед подключением установите зависимости:
Соберите утилиту redis-tools
с поддержкой TLS одним из двух способов::
-
Из репозитория
-
Подключите репозиторий:
sudo apt-add-repository ppa:redislabs/redis
Пакеты в этом репозитории уже собраны с флагом
BUILD_TLS=yes
. -
Установите утилиту:
sudo apt update && sudo apt install -y redis-tools
-
-
Вручную
Перейдите в директорию, куда хотите скачать дистрибутив. Скачайте стабильную версию утилиты и выполните сборку и установку:
wget https://download.redis.io/redis-stable.tar.gz && \ tar -xzvf redis-stable.tar.gz && \ cd redis-stable && \ make BUILD_TLS=yes && \ sudo make install && \ sudo cp ./src/redis-cli /usr/bin/
Подключение напрямую к мастеру:
redis-cli \
-h c-<идентификатор_кластера>.rw.mdb.yandexcloud.net \
-a <пароль> \
-p 6380 \
--tls \
--cacert ~/.redis/YandexInternalRootCA.crt
О том, как получить FQDN хоста, см. инструкцию.
После подключения к кластеру выполните команды:
SET foo bar
GET foo
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.
Go
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes golang git && \
go mod init github.com/go-redis/redis && \
go get github.com/go-redis/redis/v7
Пример кода для подключения с помощью Sentinel:
connect.go
package main
import (
"fmt"
"github.com/go-redis/redis/v7"
)
func main() {
conn := redis.NewUniversalClient(
&redis.UniversalOptions{
Addrs: []string{
"<FQDN_хоста_1_Valkey™>:26379",
...
"<FQDN_хоста_N_Valkey™>:26379"},
MasterName: "<имя_кластера_Valkey™>",
Password: "<пароль>",
ReadOnly: false,
},
)
err := conn.Set("foo", "bar", 0).Err()
if err != nil {
panic(err)
}
result, err := conn.Get("foo").Result()
if err != nil {
panic(err)
}
fmt.Println(result)
conn.Close()
}
Пример кода для подключения напрямую к мастеру:
connect.go
package main
import (
"fmt"
"github.com/go-redis/redis/v7"
)
func main() {
conn := redis.NewUniversalClient(
&redis.UniversalOptions{
Addrs: []string{"c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6379"},
Password: "<пароль>",
ReadOnly: false,
},
)
err := conn.Set("foo", "bar", 0).Err()
if err != nil {
panic(err)
}
result, err := conn.Get("foo").Result()
if err != nil {
panic(err)
}
fmt.Println(result)
conn.Close()
}
connect.go
package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"github.com/go-redis/redis/v7"
"io/ioutil"
)
const (
cert = "/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt"
)
func main() {
rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile(cert)
if err != nil {
panic(err)
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
panic("Failed to append PEM.")
}
conn := redis.NewUniversalClient(
&redis.UniversalOptions{
Addrs: []string{"c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6380"},
Password: "<пароль>",
ReadOnly: false,
TLSConfig: &tls.Config{
RootCAs: rootCertPool,
},
},
)
err = conn.Set("foo", "bar", 0).Err()
if err != nil {
panic(err)
}
result, err := conn.Get("foo").Result()
if err != nil {
panic(err)
}
fmt.Println(result)
conn.Close()
}
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
go run connect.go
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.
Java
Перед подключением:
-
Установите зависимости:
sudo apt update && sudo apt install --yes default-jdk maven
-
Создайте директорию для проекта Maven:
cd ~/ && mkdir --parents project/src/java/com/example && cd project/
-
Создайте конфигурационный файл для Maven:
pom.xml
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>app</artifactId> <packaging>jar</packaging> <version>0.1.0</version> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <sourceDirectory>src</sourceDirectory> <resources> <resource> <directory>src</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <goals> <goal>attached</goal> </goals> <phase>package</phase> <configuration> <descriptorRefs> <descriptorRef> jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
Актуальные версии зависимостей для Maven:
-
Для подключения с SSL:
-
Создайте защищенное хранилище сертификатов:
keytool -importcert \ -alias YARootCrt \ -file ~/.redis/YandexInternalRootCA.crt \ -keystore ~/.redis/YATrustStore \ -storepass <пароль_защищенного_хранилища> \ --noprompt && chmod 0655 ~/.redis/YATrustStore
Пример кода для подключения с помощью Sentinel:
src/java/com/example/App.java
package com.example;
import java.util.HashSet;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
public class App {
public static void main(String[] args) {
String redisName = "<имя_кластера_Valkey™>";
String redisPass = "<пароль>";
HashSet sentinels = new HashSet();
sentinels.add("<FQDN_хоста_1_Valkey™>:26379");
...
sentinels.add("<FQDN_хоста_N_Valkey™>:26379");
try {
JedisSentinelPool pool = new JedisSentinelPool(redisName, sentinels);
Jedis conn = pool.getResource();
conn.auth(redisPass);
conn.set("foo", "bar");
System.out.println(conn.get("foo"));
pool.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Пример кода для подключения напрямую к мастеру:
src/java/com/example/App.java
package com.example;
import redis.clients.jedis.Jedis;
public class App {
public static void main(String[] args) {
String redisHost = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net";
String redisPass = "<пароль>";
try {
Jedis conn = new Jedis(redisHost);
conn.auth(redisPass);
conn.set("foo", "bar");
System.out.println(conn.get("foo"));
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
src/java/com/example/App.java
package com.example;
import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import javax.net.ssl.SSLParameters;
public class App {
public static void main(String[] args) {
String redisHost = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net";
String redisPass = "<пароль_кластера>";
System.setProperty("javax.net.ssl.trustStore", "/home/<домашняя_директория>/.redis/YATrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "<пароль_защищенного_хранилища_сертификатов>");
SSLParameters sslParameters = new SSLParameters();
DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder().
password(redisPass).
ssl(true).
sslParameters(sslParameters).
build();
try {
Jedis conn = new Jedis(new HostAndPort(redisHost, 6380), jedisClientConfig);
conn.set("foo", "bar");
System.out.println(conn.get("foo"));
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
mvn clean package && \
java -jar target/app-0.1.0-jar-with-dependencies.jar
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.
Node.js
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes nodejs npm && \
npm install ioredis
Пример кода для подключения с помощью Sentinel:
app.js
"use strict";
const Redis = require("ioredis");
const conn = new Redis({
sentinels: [
{ host: "<FQDN_хоста_1_Valkey™>", port: 26379 },
...
{ host: "<FQDN_хоста_N_Valkey™>", port: 26379 },
],
name: "<имя_кластера_Valkey™>",
password: "<пароль>"
});
conn.set("foo", "bar", function (err) {
if (err) {
console.error(err);
conn.disconnect();
}
});
conn.get("foo", function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
conn.disconnect();
});
Пример кода для подключения напрямую к мастеру:
app.js
"use strict";
const Redis = require("ioredis");
const conn = new Redis({
host: "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net",
port: 6379,
password: "<пароль>"
});
conn.set("foo", "bar", function (err) {
if (err) {
console.error(err);
conn.disconnect();
}
});
conn.get("foo", function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
conn.disconnect();
});
app.js
"use strict";
const fs = require("fs");
const Redis = require("ioredis");
const conn = new Redis({
host: "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net",
port: 6380,
password: "<пароль>",
tls: {
ca: fs.readFileSync("/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt"),
}
});
conn.set("foo", "bar", function (err) {
if (err) {
console.error(err);
conn.disconnect();
}
});
conn.get("foo", function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
conn.disconnect();
});
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
node app.js
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.
PHP
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes php php-dev php-pear && \
sudo pear channel-discover pear.nrk.io && \
sudo pear install nrk/Predis
Пример кода для подключения с помощью Sentinel:
connect.php
<?php
require "Predis/Autoloader.php";
Predis\Autoloader::register();
$sentinels = [
"<FQDN_хоста_1_Valkey™>:26379>",
...
"<FQDN_хоста_N_Valkey™>:26379>",
];
$options = [
"replication" => "sentinel",
"service" => "<имя_кластера_Valkey™>",
"parameters" => [
"password" => "<пароль>",
],
];
$conn = new Predis\Client($sentinels, $options);
$conn->set("foo", "bar");
var_dump($conn->get("foo"));
$conn->disconnect();
?>
Пример кода для подключения напрямую к мастеру:
connect.php
<?php
require "Predis/Autoloader.php";
Predis\Autoloader::register();
$host = ["c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6379"];
$options = [
"parameters" => [
"password" => "<пароль>",
],
];
$conn = new Predis\Client($host, $options);
$conn->set("foo", "bar");
var_dump($conn->get("foo"));
$conn->disconnect();
?>
connect.php
<?php
require "Predis/Autoloader.php";
Predis\Autoloader::register();
$host = ["c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6380"];
$options = [
"parameters" => [
"scheme" => "tls",
"ssl" => [
"cafile" => "/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt",
"verify_peer" => true,
"verify_peer_name" => false,
],
"password" => "<пароль>",
],
];
$conn = new Predis\Client($host, $options);
$conn->set("foo", "bar");
var_dump($conn->get("foo"));
$conn->disconnect();
?>
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
php connect.php
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.
Python
Перед подключением установите зависимости:
sudo apt update && sudo apt install -y python3 python3-pip && \
pip3 install redis
Пример кода для подключения с помощью Sentinel:
connect.py
from redis.sentinel import Sentinel
sentinels = [
"<FQDN_хоста_1_Valkey™>",
...
"<FQDN_хоста_N_Valkey™>"
]
name = "<имя_кластера_Valkey™>"
pwd = "<пароль>"
sentinel = Sentinel([(h, 26379) for h in sentinels], socket_timeout=0.1)
master = sentinel.master_for(name, password=pwd)
slave = sentinel.slave_for(name, password=pwd)
master.set("foo", "bar")
print(slave.get("foo"))
Пример кода для подключения без использования SSL-соединения напрямую к мастеру:
connect.py
import redis
r = redis.StrictRedis(
host="c-<идентификатор_кластера>.rw.mdb.yandexcloud.net",
port=6379,
password="<пароль>",
)
r.set("foo", "bar")
print(r.get("foo"))
connect.py
import redis
r = redis.StrictRedis(
host="c-<идентификатор_кластера>.rw.mdb.yandexcloud.net",
port=6380,
password="<пароль>",
ssl=True,
ssl_ca_certs="/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt",
)
r.set("foo", "bar")
print(r.get("foo"))
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
python3 connect.py
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.
Ruby
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes ruby && \
sudo gem install redis
Пример кода для подключения с помощью Sentinel:
connect.rb
# coding: utf-8
require 'redis'
SENTINELS = [
{ host: '<FQDN_хоста_1_Valkey™>', port: 26379 },
...
{ host: '<FQDN_хоста_N_Valkey™>', port: 26379 }
]
conn = Redis.new(
host: '<имя_кластера_Valkey™>',
sentinels: SENTINELS,
role: 'master',
password: '<пароль>'
)
conn.set('foo', 'bar')
puts conn.get('foo')
conn.close
Пример кода для подключения без использования SSL-соединения напрямую к мастеру:
connect.rb
# coding: utf-8
require 'redis'
conn = Redis.new(
host: 'c-<идентификатор_кластера>.rw.mdb.yandexcloud.net',
port: 6379,
password: '<пароль>'
)
conn.set('foo', 'bar')
puts conn.get('foo')
conn.close
connect.rb
# coding: utf-8
require 'redis'
conn = Redis.new(
host: 'c-<идентификатор_кластера>.rw.mdb.yandexcloud.net',
port: 6380,
password: '<пароль>',
ssl: true,
ssl_params: { ca_file: '/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt' },
)
conn.set('foo', 'bar')
puts conn.get('foo')
conn.close
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
ruby connect.rb
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar
.