Подключение к нешардированному кластеру Redis
К нешардированному кластеру Redis можно подключиться:
-
С помощью Redis Sentinel.
Redis Sentinel — это система управления хостами Redis, позволяющая проводить мониторинг, отправлять уведомления о состояниях хостов, переключать мастер и передавать клиентам актуальные адреса хостов.
Поддерживается нешифрованное соединение через порт
26379
для кластеров с любой версией Redis.Если клиентское приложение не поддерживает подключение через Sentinel, подключитесь напрямую к мастеру. Если в прямом подключении нет необходимости, используйте Sentinel для более надежной работы с хостами кластера.
Подробнее о Sentinel см. в разделе Репликация и отказоустойчивость и документации Redis
. -
Напрямую к мастеру.
Поддерживаются шифрованное соединение через порт
6380
и нешифрованное через порт6379
.Важно
Используя SSL-соединение, можно подключаться только к кластерам с включенной настройкой Поддержка TLS.
Чтобы всегда подключаться к мастеру в нешардированном кластере, воспользуйтесь особым FQDN, который всегда указывает на мастер, либо отслеживайте роли всех хостов кластера самостоятельно.
Особые FQDN
Managed Service for Redis предоставляет особые 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 <пароль_Redis>
Подключение из графических IDE
Подключение проверялось в следующем окружении:
- MacOS Big Sur 11.3.
- DBeaver Enterprise:
21.0
.
Подключаться из графических IDE к хостам кластера можно только через SSH-туннель с помощью созданной ВМ. Перед подключением подготовьте сертификат.
Чтобы избежать ошибок при подключении, сохраните сертификат
Поддержка подключения к кластеру Redis доступна только в коммерческих редакциях DBeaver
Чтобы подключиться к кластеру:
- Создайте новое соединение с БД:
- Выберите в меню База данных пункт Новое соединение.
- Выберите из списка БД Redis.
- Нажмите кнопку Далее.
- Укажите параметры подключения на вкладке Главное:
- Хост — FQDN хоста-мастера или особый FQDN, всегда указывающий на текущий хост-мастер.
- Порт —
6379
для обычного кластера или6380
для кластера с включенным SSL-шифрованием. - В блоке Аутентификация укажите пароль от кластера.
- На вкладке SSH:
- Включите настройку Использовать туннель SSH.
- Укажите параметры SSH-туннеля:
- Хост/IP — публичный IP-адрес ВМ для подключения;
- Имя пользователя — логин для подключения к ВМ;
- Метод аутентификации —
Публичный ключ
; - Секретный ключ — путь к файлу закрытого ключа для подключения к ВМ;
- Passphrase — пароль от закрытого ключа.
- На вкладке SSL:
- Включите настройки Использовать SSL и Пропустить валидацию имени хоста.
- В блоке Параметры:
- Выберите Способ — Набор сертификатов.
- В поле Корневой сертификат укажите путь к сохраненному файлу SSL-сертификата.
- Нажмите кнопку Тест соединения ... для проверки соединения с БД. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
- Нажмите кнопку Готово, чтобы сохранить настройки соединения с БД.
Подготовка к подключению из Docker-контейнера
Чтобы подключаться к кластеру Managed Service for Redis из 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 и любой хост Redis:
redis-cli \ -h <FQDN_любого_хоста_Redis> \ -p 26379 \ sentinel \ get-master-addr-by-name <имя_кластера_Redis> | head -n 1
-
Подключитесь к хосту с этим адресом:
redis-cli \ -h <адрес_хоста-мастера_Redis> \ -a <пароль_Redis>
Подключение напрямую к мастеру:
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_Redis>:26379",
...
"<FQDN_хоста_N_Redis>:26379"},
MasterName: "<имя_кластера_Redis>",
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 = "<имя_кластера_Redis>";
String redisPass = "<пароль>";
HashSet sentinels = new HashSet();
sentinels.add("<FQDN_хоста_1_Redis>:26379");
...
sentinels.add("<FQDN_хоста_N_Redis>: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_Redis>", port: 26379 },
...
{ host: "<FQDN_хоста_N_Redis>", port: 26379 },
],
name: "<имя_кластера_Redis>",
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_Redis>:26379>",
...
"<FQDN_хоста_N_Redis>:26379>",
];
$options = [
"replication" => "sentinel",
"service" => "<имя_кластера_Redis>",
"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_Redis>",
...
"<FQDN_хоста_N_Redis>"
]
name = "<имя_кластера_Redis>"
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_Redis>', port: 26379 },
...
{ host: '<FQDN_хоста_N_Redis>', port: 26379 }
]
conn = Redis.new(
host: '<имя_кластера_Redis>',
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
.