Подключение к Redis Servier через StackExchange.Redis - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь создать тестовый проект, используя сервер Redis , установленный на виртуальной машине Linux Ubuntu, через виртуальный ящик.

Компьютер с Linux связан с локальной сетью через мостовой адаптер Virtual Box, который работает на моей машине с Windows 7.

Linux Machine - новый, только что созданный, я сделал

sudo ufw enable

и затем перезапустите сервер Redis (в Linux).

Теперь вот моя попытка из Windows

C:\Users\my-user>nmap -p 6379 10.14.30.51
Starting Nmap 7.70 ( https://nmap.org ) at ...
Nmap scan report for 10.14.30.51
Host is up (0.0010s latency).

PORT     STATE    SERVICE
6379/tcp filtered redis
MAC Address: 08:00:27:98:94:49 (Oracle VirtualBox virtual NIC)

Я создал новый проект .NET MVC с моей Visual Studio 2017, и вот код контроллера:

using StackExchange.Redis;
using System.Web.Mvc;

namespace RedisClient.Controllers
{
    public class HomeController : Controller
    {
        public struct Server {
            public const string IP = "10.14.30.51";
            public const int Port = 6379;
        }

        public ActionResult Index() { return View(); }

        public ActionResult About()
        {            
            ConnectionMultiplexer redis = 
                ConnectionMultiplexer.Connect($"{Server.IP}:{Server.Port}"); 

            IDatabase db = redis.GetDatabase();
            string value = "abcdefg";
            db.StringSet("mykey", value);
            value = db.StringGet("mykey");

            ViewBag.Message = $"The value is '{value}'";

            return View();
        }

        public ActionResult Contact() { return View(); }
    }
}

Итак, когда я нажимаю на ссылку «О программе», я получаю следующую ошибку в строке .Connect

Не удалось подключиться к серверу (-ам) redis. Невозможно подключиться 10.14.30.51:6379/Интерактивный, Инициализация / NotStarted, последний: НЕТ, origin: BeginConnectAsync, ожидающий: 0, последний раз прочитанный: 0s тому назад, last-write: 0s ago, keep-alive: 60s, состояние: подключение, мгр: 10 из 10 доступно, последнее сердцебиение: никогда, глобально: 0 с назад, v: 2.0.601.3402

- EDIT

Выход

var log = new StringWriter();

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(
    $"{Server.IP}:{Server.Port},abortConnect=False", log);
var logOutput = log.ToString();

является следующим:

10.14.30.51:6379,abortConnect=False

Connecting 10.14.30.51:6379/Interactive...
BeginConnect: 10.14.30.51:6379
1 unique nodes specified
Requesting tie-break from 10.14.30.51:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:05 to respond...
Awaiting task completion, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=1,Free=8190,Min=4,Max=8191)
Not all tasks completed cleanly (from ReconfigureAsync#1524, timeout 5000ms), IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=4,Free=8187,Min=4,Max=8191)
10.14.30.51:6379 did not respond
Waiting for tiebreakers...
Awaiting task completion, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=4,Free=8187,Min=4,Max=8191)
connection failed: 10.14.30.51:6379 (Subscription, UnableToConnect): UnableToConnect on 10.14.30.51:6379/Subscription, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 5s ago, last-write: 5s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402
connection failed: 10.14.30.51:6379 (Interactive, UnableToConnect): UnableToConnect on 10.14.30.51:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 5s ago, last-write: 5s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402
Finished awaiting tasks, IOCP: (Busy=2,Free=998,Min=4,Max=1000), WORKER: (Busy=4,Free=8187,Min=4,Max=8191)
10.14.30.51:6379 failed to nominate (Faulted)
> UnableToConnect on 10.14.30.51:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 5s ago, last-write: 5s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402
No masters detected
10.14.30.51:6379: Standalone v2.0.0, master; keep-alive: 00:01:00; int: Connecting; sub: Connecting; not in use: DidNotRespond
10.14.30.51:6379: int ops=0, qu=0, qs=0, qc=0, wr=0, socks=2; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=2
Circular op-count snapshot; int: 0 (0,00 ops/s; spans 10s); sub: 0 (0,00 ops/s; spans 10s)
Sync timeouts: 0; async timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
resetting failing connections to retry...
retrying; attempts left: 2...
1 unique nodes specified
Requesting tie-break from 10.14.30.51:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:05 to respond...
Awaiting task completion, IOCP: (Busy=1,Free=999,Min=4,Max=1000), WORKER: (Busy=2,Free=8189,Min=4,Max=8191)
Not all tasks completed cleanly (from ReconfigureAsync#1524, timeout 5000ms), IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=2,Free=8189,Min=4,Max=8191)
10.14.30.51:6379 did not respond
Waiting for tiebreakers...
Awaiting task completion, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=2,Free=8189,Min=4,Max=8191)
Not all tasks completed cleanly (from NominatePreferredMaster#1761, timeout 50ms), IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=2,Free=8189,Min=4,Max=8191)
10.14.30.51:6379 failed to nominate (WaitingForActivation)
No masters detected
10.14.30.51:6379: Standalone v2.0.0, master; keep-alive: 00:01:00; int: Disconnected; sub: Disconnected; not in use: DidNotRespond
10.14.30.51:6379: int ops=0, qu=0, qs=0, qc=0, wr=0, socks=2; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=2
Circular op-count snapshot; int: 0 (0,00 ops/s; spans 10s); sub: 0 (0,00 ops/s; spans 10s)
Sync timeouts: 0; async timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
resetting failing connections to retry...
retrying; attempts left: 1...
1 unique nodes specified
Requesting tie-break from 10.14.30.51:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:05 to respond...
Awaiting task completion, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=2,Free=8189,Min=4,Max=8191)
Not all tasks completed cleanly (from ReconfigureAsync#1524, timeout 5000ms), IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=5,Free=8186,Min=4,Max=8191)
10.14.30.51:6379 did not respond
Waiting for tiebreakers...
Awaiting task completion, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=5,Free=8186,Min=4,Max=8191)
Finished awaiting tasks, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=2,Free=8189,Min=4,Max=8191)
10.14.30.51:6379 failed to nominate (Faulted)
> UnableToConnect on 10.14.30.51:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 5s ago, last-write: 5s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 10s ago, v: 2.0.601.3402
No masters detected
10.14.30.51:6379: Standalone v2.0.0, master; keep-alive: 00:01:00; int: Disconnected; sub: Disconnected; not in use: DidNotRespond
10.14.30.51:6379: int ops=0, qu=0, qs=0, qc=0, wr=0, socks=3; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=3
Circular op-count snapshot; int: 0 (0,00 ops/s; spans 10s); sub: 0 (0,00 ops/s; spans 10s)
Sync timeouts: 0; async timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
Starting heartbeat...

== Ссылки

В моем файле .csproj, среди прочего,

<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
...
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
...
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>

Связанный вопрос SuperUser с другими подробностями находится здесь .

Windows: enter image description here

Linux: enter image description here

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Спасибо этому SF-ответу Мне удалось связать хост с Windows и виртуальные машины Linux.

Шаги, которые я сделал:

На компьютере Redis Server (Linux):

1) ss -tlnp 'sport == :6379' если вы обнаружите 127.0.0.1 или ::1 в этих строках, вам следует отредактировать файл redis.config, прокомментировать bind 127.0.0.1 ::1 в файле конфигурации (если еще не было) и удалить Не забудьте перезапустить redis после изменения конфигурации.
Если вы видите что-то вроде 0.0.0.0:6379, выполните следующий шаг.

2) Проверьте protected mode Redis в том же файле конфигурации, если он включен и вы хотите сохранить его, вы можете использовать requirepass <yourConnectionPassToUseOnClientConnectionString> в файле конфигурации Redis.

3) Проверьте IP-адрес вашего клиента (в моем случае клиентский компьютер с Windows). Добавьте его в Linux iptables:

iptables -A INPUT --src <clientIpAddress> -p tcp --dport 6379 -j ACCEPT

3 ') чтобы сделать эту добавленную запись постоянным , посмотрите, как сохранить iptables состояние здесь .

На компьютере клиента (Windows):

4) используйте указанный выше пароль в строке подключения для подключения к серверу Redis Linux

ConnectionMultiplexer redis = 
  ConnectionMultiplexer.Connect($"{Server.IP}:{Server.Port},resolvedns=1,abortConnect=False,password={Server.Password}");

5 *) при желании можно добавить сборку Windows от choco (установить ее в Windows), чтобы проверить соединение с клиентом Windows, используя cmd

redis-cli -h <LinuxServerIP> -p 6379 ping
1 голос
/ 10 мая 2019

Это, вероятно, лучше спросить в библиотеке github ; вопрос, который я задам , тогда : пожалуйста, сделайте:

var log = new StringWriter();

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(
    $"{Server.IP}:{Server.Port},abortConnect=False", log);
var logOutput = log.ToString();

и расскажите нам, что такое logOutput.

Я думаю, что либо:

  • нет доступа TCP из-за правила брандмауэра
  • есть проблема с привязкой сборки, часто если вы используете .NET Framework

Последний вариант, вероятно, более вероятен, и обычное исправление заключается в добавлении явных <PackageReference> ссылок на:

  • System.Buffers (> = 4.4.0)
  • System.Runtime.CompilerServices.Unsafe (> = 4.5.2)

т.е.

<PackageReference Include="System.Buffers" Version="4.5.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.5.2" />

и, вероятно, также (потому что ... причины)

<PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />

В основном, у nuget есть некоторые проблемы с транзитивными зависимостями и вышеуказанными библиотеками Microsoft . Это вне моего контроля.

...