Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
© 2022 ООО «Яндекс.Облако»
Yandex Managed Service for Redis
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Информация об имеющихся кластерах
    • Создание кластера
    • Изменение настроек кластера и базы данных
    • Подключение к базе данных
      • Подготовка к подключению
      • Подключение к нешардированному кластеру
      • Подключение к шардированному кластеру
    • Остановка и запуск кластера
    • Обновление версии Redis
    • Управление хостами кластера
    • Управление шардами
    • Управление резервными копиями
    • Переключение мастера
    • Мониторинг состояния кластера и хостов
    • Просмотр логов кластера
    • Удаление кластера
  • Практические руководства
    • Хранение сессий PHP в Managed Service for Redis
    • Миграция базы данных в Managed Service for Redis
  • Концепции
    • Взаимосвязь ресурсов сервиса
    • Классы хостов
    • Сеть в Managed Service for Redis
    • Шардирование
    • Резервные копии
    • Репликация и отказоустойчивость
    • Поддерживаемые клиенты
    • Управление памятью в Managed Service for Redis
    • Доступные команды Managed Service for Redis
    • Квоты и лимиты
    • Типы хранилища
    • Техническое обслуживание
    • Настройки Redis
  • Управление доступом
  • Правила тарификации
    • Действующие правила
    • Архив
      • До 1 февраля 2020 года
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • BackupService
      • ClusterService
      • ResourcePresetService
      • OperationService
    • REST (англ.)
      • Overview
      • Backup
        • Overview
        • get
        • list
      • Cluster
        • Overview
        • addHosts
        • addShard
        • backup
        • create
        • delete
        • deleteHosts
        • deleteShard
        • get
        • getShard
        • list
        • listBackups
        • listHosts
        • listLogs
        • listOperations
        • listShards
        • move
        • rebalance
        • rescheduleMaintenance
        • restore
        • start
        • startFailover
        • stop
        • streamLogs
        • update
        • updateHosts
      • ResourcePreset
        • Overview
        • get
        • list
      • Operation
        • Overview
        • get
  • История изменений
  • Вопросы и ответы
    • Общие вопросы
  1. Пошаговые инструкции
  2. Подключение к базе данных
  3. Подключение к шардированному кластеру

Подключение к шардированному кластеру

Статья создана
Yandex Cloud
  • Подключение из графических IDE
  • Примеры строк подключения
    • Bash
    • Go
    • Java
    • Node.js
    • PHP
    • Python
    • Ruby

Для подключения к шардированному кластеру Redis в строках подключения укажите IP-адреса или FQDN хостов-мастеров в каждом шарде.

Поддерживаются шифрованное соединение через порт 6380 и нешифрованное через порт 6379.

Важно

Используя SSL-соединение, можно подключаться только к кластерам с включенной настройкой Поддержка TLS.

Подключение из графических IDE

Подключение проверялось в следующем окружении:

  • MacOS Big Sur 11.3.
  • DBeaver Enterprise: 21.0.

Подключаться из графических IDE к хостам кластера можно только через SSH-туннель с помощью созданной ВМ. Перед подключением подготовьте сертификат.

DBeaver

Поддержка подключения к Redis-кластеру доступна только в коммерческих редакциях DBeaver.

Чтобы подключиться к кластеру:

  1. Создайте новое соединение с БД:
    1. Выберите в меню База данных пункт Новое соединение.
    2. Выберите из списка БД Redis.
    3. Нажмите кнопку Далее.
    4. Укажите параметры подключения на вкладке Главное:
      • Хост — укажите через запятую FQDN хостов-мастеров каждого шарда.
      • Порт — 6379 для обычного кластера или 6380 для кластера с включенным SSL-шифрованием.
      • В блоке Аутентификация укажите пароль от кластера.
    5. На вкладке SSH:
      1. Включите настройку Использовать туннель SSH.
      2. Укажите параметры SSH-туннеля:
        • Хост/IP — публичный IP-адрес ВМ для подключения;
        • Имя пользователя — логин для подключения к ВМ;
        • Метод аутентификации — Публичный ключ;
        • Секретный ключ — путь к файлу закрытого ключа для подключения к ВМ;
        • Passphrase — пароль от закрытого ключа.
    6. На вкладке SSL:
      1. Включите настройки Использовать SSL и Пропустить валидацию имени хоста.
      2. В блоке Способ:
        1. Включите настройку Набор сертификатов.
        2. В поле Корневой сертификат укажите путь к файлу SSL-сертификата для подключения.
  2. Нажмите кнопку Тест соединения ... для проверки соединения с БД. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
  3. Нажмите кнопку Готово, чтобы сохранить настройки соединения с БД.

Примеры строк подключения

Примеры для Linux проверялись в следующем окружении:

  • Виртуальная машина в Yandex Cloud c 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

Примечание

Для подключения к кластеру с поддержкой TLS скачайте архив с исходным кодом утилиты и выполните ее сборку с TLS командой make BUILD_TLS=yes.

Подключение без SSL
Подключение с SSL

Укажите FQDN хоста-мастера в нужном шарде:

redis-cli \
    -c \
    -h <FQDN хоста-мастера в нужном шарде> \
    -a <пароль>

Укажите FQDN хоста-мастера в нужном шарде:

redis-cli \
    -c \
    -h <FQDN хоста-мастера в нужном шарде> \
    -a <пароль> \
    -p 6380 \
    --tls \
    --cacert ~/.redis/YandexCA.crt \

После подключения к кластеру выполните команды:

SET foo bar
GET foo

Если запрос GET возвращает значение nil, значит, запись для ключа foo была перемещена на другой шард. Подключитесь к нему и повторите запрос — он вернет значение bar.

Go

Перед подключением установите зависимости:

sudo apt update && sudo apt install -y golang git && \
  go mod init github.com/go-redis/redis && \
  go get github.com/go-redis/redis/v7
Подключение без SSL
Подключение с SSL

connect.go

package main

import (
	"fmt"
	"github.com/go-redis/redis/v7"
	"time"
)

func main() {
	hostports := []string{
		"<FQDN хоста-мастера в шарде 1>:6379",
		...
		"<FQDN хоста-мастера в шарде N>:6379",
	}
	options := redis.UniversalOptions{
		Addrs:       hostports,
		DB:          0,
		ReadOnly:    false,
		DialTimeout: 5 * time.Second,
		Password:    "<пароль>",
	}
	client := redis.NewUniversalClient(&options)

	err := client.Set("foo", "bar", 0).Err()
	if err != nil {
		panic(err)
	}

	result, err := client.Get("foo").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println(result)

	client.Close()
}

connect.go

package main

import (
	"context"
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"github.com/go-redis/redis/v7"
	"io/ioutil"
	"net"
	"strings"
	"time"
)

func main() {
	caCert, err := ioutil.ReadFile("/home/<домашняя директория>/.redis/YandexCA.crt")
	if err != nil {
		panic(err)
	}
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)

	hostports := []string{
		"<FQDN хоста-мастера в шарде 1>:6380",
		...
		"<FQDN хоста-мастера в шарде N>:6380",
	}
	options := redis.UniversalOptions{
		Addrs:        hostports,
		MaxRedirects: 1,
		Password:     "<пароль>",
		DB:           0,
		ReadOnly:     false,
		DialTimeout:  5 * time.Second,
		TLSConfig: &tls.Config{
			RootCAs:            caCertPool,
			InsecureSkipVerify: true,
			VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
				certs := make([]*x509.Certificate, len(rawCerts))
				for i := 0; i < len(rawCerts); i++ {
					cert, err := x509.ParseCertificate(rawCerts[i])
					if err != nil {
						return fmt.Errorf("error parsing certificate: %+v", err)
					}
					certs[i] = cert
				}

				opts := x509.VerifyOptions{
					Roots:         caCertPool,
					CurrentTime:   time.Now(),
					DNSName:       "",
					Intermediates: x509.NewCertPool(),
				}

				for i := range certs {
					if i == 0 {
						continue
					}
					opts.Intermediates.AddCert(certs[i])
				}
				_, err := certs[0].Verify(opts)
				return err
			},
		},
	}
	options.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
		parts := strings.Split(addr, ":")
		newAddr := addr
		if len(parts) > 1 && !strings.HasPrefix(parts[0], "[") {
			newAddr = "[" + strings.Join(parts[:len(parts)-1], ":") + "]:" + parts[len(parts)-1]
		}

		netDialer := &net.Dialer{
			Timeout:   options.DialTimeout,
			KeepAlive: 5 * time.Minute,
		}
		return tls.DialWithDialer(netDialer, network, newAddr, options.TLSConfig)
	}
	client := redis.NewUniversalClient(&options)
	err = client.Set("foo", "bar", 0).Err()
	if err != nil {
		panic(err)
	}

	get := client.Get("foo")
	if get.Err() != nil {
		panic(err)
	}
	fmt.Println(get.String())
}

Подключение:

go run connect.go

При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.

Java

Перед подключением:

  1. Установите зависимости:

    sudo apt update && sudo apt install -y default-jdk maven
    
  2. Создайте директорию для проекта Maven:

    cd ~/ && mkdir --parents project/src/java/com/example && cd project/
    
  3. Создайте конфигурационный файл для 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:

    • jedis
    • slf4j-simple
  4. Для подключения с SSL:

    1. Получите SSL-сертификат.

    2. Создайте защищенное хранилище сертификатов:

      keytool -importcert \
              -alias YARootCrt \
              -file ~/.redis/YandexCA.crt \
              -keystore ~/.redis/YATrustStore \
              -storepass <пароль защищенного хранилища> \
              --noprompt && chmod 0655 ~/.redis/YATrustStore
      
Подключение без SSL
Подключение с SSL

src/java/com/example/App.java

package com.example;

import java.util.HashSet;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

public class App {
  public static void main(String[] args) {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

    HashSet<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    jedisClusterNodes.add(new HostAndPort("<FQDN хоста мастера в шарде 1>", 6379));
    ...
    jedisClusterNodes.add(new HostAndPort("<FQDN хоста мастера в шарде N>", 6379));

    DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder().
            password("<пароль>").
            build();

    try {
      JedisCluster jc = new JedisCluster(jedisClusterNodes, jedisClientConfig, 5, jedisPoolConfig);

      jc.set("foo", "bar");
      System.out.println(jc.get("foo"));
      jc.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.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import javax.net.ssl.SSLParameters;
import java.util.HashSet;
import java.util.Set;

public class App {
  public static void main(String[] args) {
    System.setProperty("javax.net.ssl.trustStore", "/home/<домашняя директория>/.redis/YATrustStore");
    System.setProperty("javax.net.ssl.trustStorePassword", "<пароль защищенного хранилища сертификатов>");

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    SSLParameters sslParameters = new SSLParameters();
    jedisClusterNodes.add(new HostAndPort("<FQDN хоста-мастера в шарде 1>", 6380));
    ...
    jedisClusterNodes.add(new HostAndPort("<FQDN хоста-мастера в шарде N>", 6380));

    DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder().
            password("<пароль кластера>").
            ssl(true).
            sslParameters(sslParameters).
            build();

    try {
      JedisCluster jc = new JedisCluster(jedisClusterNodes, jedisClientConfig, 5, jedisPoolConfig);

      jc.set("foo", "bar");
      System.out.println(jc.get("foo"));
      jc.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

Подключение:

mvn clean package && \
  java -jar target/app-0.1.0-jar-with-dependencies.jar

При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.

Node.js

Перед подключением установите зависимости:

sudo apt update && sudo apt install -y nodejs npm && \
  npm install ioredis
Подключение без SSL
Подключение с SSL

app.js

"use strict";

const Redis = require("ioredis");

const cluster = new Redis.Cluster(
    [
        {
            host: "<FQDN хоста-мастера в шарде 1>",
            port: 6379
        },
        ...
        {
            host: "<FQDN хоста-мастера в шарде N>",
            port: 6379
        }
    ],
    {
        redisOptions: {
            password: "<пароль>"
        }
    }
);

cluster.on("ready", () => {
    Promise.all([
        cluster.set("foo", "bar"),
        cluster.get("foo")
    ]).then(
        (result) => {
            console.log(result[1]); // result == ["OK", "bar"]
            cluster.disconnect();
        },
        (reject) => {
            console.log(reject);
            cluster.disconnect();
        }
    );
});

app.js

"use strict";

const Redis = require("ioredis");
const fs = require("fs");

const cluster = new Redis.Cluster(
    [
        {
            host: "<FQDN хоста-мастера в шарде 1>",
            port: 6380
        },
        ...
        {
            host: "<FQDN хоста-мастера в шарде N>",
            port: 6380
        },
    ],
    {
        redisOptions: {
            password: "<пароль>",
            tls: {
                ca: [fs.readFileSync("/home/<домашняя директория>/.redis/YandexCA.crt")],
                checkServerIdentity: () => {
                    return null;
                }
            }
        }
    }
);

cluster.on("ready", () => {
    Promise.all([
        cluster.set("foo", "bar"),
        cluster.get("foo")
    ]).then(
        (result) => {
            console.log(result[1]); // result == [ "OK", "bar"]
            cluster.disconnect();
        },
        (reject) => {
             console.log(reject);
             cluster.disconnect();
        }
    );
});

Подключение:

node app.js

При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.

PHP

Перед подключением установите зависимости:

sudo apt update && sudo apt install -y php php-dev php-pear && \
    sudo pear channel-discover pear.nrk.io && \
    sudo pear install nrk/Predis
Подключение без SSL
Подключение с SSL

connect.php

<?php

require "Predis/Autoloader.php";
Predis\Autoloader::register();

$hosts = [
    "tcp://<FQDN хоста-мастера в шарде 1>:6379",
    ...
    "tcp://<FQDN хоста-мастера в шарде N>:6379",
];

$options = [
    "cluster" => "redis",
    "parameters" => [
        "password" => "<пароль>",
    ],
];

$conn = new Predis\Client($hosts, $options);
$conn->set("foo", "bar");

var_dump($conn->get("foo"));

$conn->disconnect();
?>

connect.php

 <?php

 require "Predis/Autoloader.php";
 Predis\Autoloader::register();

 $hosts = [
     'tls://<FQDN хоста-мастера в шарде 1>:6380?ssl[cafile]=/home/<домашняя директория>/.redis/YandexCA.crt',
     ...
     'tls://<FQDN хоста-мастера в шарде N>:6380?ssl[cafile]=/home/<домашняя директория>/.redis/YandexCA.crt',
 ];

 $options = [
     'cluster' => 'predis',
     'parameters' => [
         'password' => '<пароль>',
     ],
 ];

 $conn = new Predis\Client($hosts, $options);
 $conn->set('foo', 'bar');

 var_dump($conn->get("foo"));

 $conn->disconnect();
 ?>

Подключение:

php connect.php

При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.

Python

Перед подключением установите зависимости:

sudo apt update && sudo apt install -y python3 python3-pip python3-venv && \
    python3 -m venv env && \
    source env/bin/activate && \
    pip install pip -U && \
    pip install pyopenssl redis-py-cluster setuptools_rust
Подключение без SSL
Подключение с SSL

connect.py

from rediscluster import RedisCluster

startup_nodes = [
    {"host": "<FQDN хоста-мастера в шарде 1>", "port": 6379},
    ...
    {"host": "<FQDN хоста-мастера в шарде N>", "port": 6379},
]

rc = RedisCluster(
    startup_nodes=startup_nodes,
    decode_responses=True,
    skip_full_coverage_check=True,
    password="<пароль>",
)

rc.set("foo", "bar")

print(rc.get("foo"))

connect.py

import OpenSSL
from rediscluster import RedisCluster

startup_nodes = [
    {"host": "<FQDN хоста-мастера в шарде 1>", "port": 6380},
    ...
    {"host": "<FQDN хоста-мастера в шарде N>", "port": 6380},
]

rc = RedisCluster(
    startup_nodes=startup_nodes,
    decode_responses=True,
    skip_full_coverage_check=True,
    password="<пароль>",
    ssl=True,
    ssl_ca_certs="/home/<домашняя директория>/.redis/YandexCA.crt",
)

rc.set("foo", "bar")

print(rc.get("foo"))

Подключение:

python3 connect.py

При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.

Ruby

Перед подключением установите зависимости:

sudo apt update && sudo apt install -y ruby && \
  sudo gem install redis
Подключение без SSL
Подключение с SSL

connect.rb

# coding: utf-8

require 'redis'

nodes = [
  { host: '<FQDN хоста-мастера в шарде 1>', port: 6379 },
  ...
  { host: '<FQDN хоста-мастера в шарде N>', port: 6379 }
]

conn = Redis.new(
   cluster: nodes,
   password: '<пароль>'
)

conn.set('foo', 'bar')
puts conn.get('foo')

conn.close

connect.rb

# coding: utf-8

require 'redis'

nodes = [
  { host: '<FQDN хоста-мастера в шарде 1>', port: 6380 },
  ...
  { host: '<FQDN хоста-мастера в шарде N>', port: 6380 }
]

conn = Redis.new(
  cluster: nodes,
  password: '<пароль>',
  ssl: true,
  ssl_params: {
    ca_file: '/home/<домашняя директория>/.redis/YandexCA.crt',
    verify_hostname: false
  }
)

conn.set('foo', 'bar')
puts conn.get('foo')

conn.close

Подключение:

ruby connect.rb

При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.

Была ли статья полезна?

Language / Region
© 2022 ООО «Яндекс.Облако»
В этой статье:
  • Подключение из графических IDE
  • Примеры строк подключения
  • Bash
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby