Skip to main content

[snt] problemy z redis sentinel

Maxime avatar
Written by Maxime
Updated over 3 months ago

redis sentinel dostarczony w snt_62690_20220407.1, instrukcja do niego w https://banqware.zendesk.com/hc/en-us/articles/5337497164444-Releases-wydania-po%C5%9Brednie- pod headerem snt_62690_20220407.1, plik readme_redis_HA.md

często zgłaszają problemy z redis sentinelem (np. https://195.20.111.142:9999/browse/TEET-164329), głównie przez brak poprawnie wystawionego certyfikatu. W załączniku instrukcja jak wygenerować certyfikat pod tls. W sekcji #TESTY jest m. in. sprawdzenie statusu replikacji

Kiedy pojawia się taki problem:

    {
      "name": "redis",
      "duration": "0:00:00:00.0068171",
      "status": "Unhealthy",
      "error": "System.NotImplementedException: The ConnectionMultiplexer is not a Sentinel connection.\n   at StackExchange.Redis.ConnectionMultiplexer.GetSentinelMasterConnection(ConfigurationOptions config, TextWriter log) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 2357\n   at StackExchange.Redis.ConnectionMultiplexer.SentinelMasterConnectAsync(ConfigurationOptions configuration, TextWriter log) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 1133\n   at HealthChecks.Redis.RedisHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken)"
    },

to wtedy problem jest z połączeniem aplikajci do redis-sentinel przez jeden z dwóch powodów: sieć albo certyfikat (tls)

Żeby certyfikat działał to musi być w alt_names w certyfikacie, w którym jest IP + DNS każdego z hostów z redis-sentinelem i certyfikat root (CA) musi byc dodany do trusted w aplikacji

ze zgłoszenia TEET-164329:

Odtworzyliśmy ten błąd na 2 sposoby:

1. zly connection string RedisConfig__ConnectionString, tj hostname np.
s1slp0002553.centrala.bzwbk:26380 - nie jest osiągalny z kontenera apirest
2. kontener apirest - nie zawiera root certyfikatu uzytego do podpisu certyfikatu tls

odp od administratorów:

1) connection string jest budowany osobno dla każdego node w oparciu o zmienna hostname, dlatego dla nodów 4 i 5 dodałem sentinele bo ich tam w pierwotnej konfiguracji nie było, nie zmieniło to sytuacji, apirest na node 3,4 i 5 nie umie podłaczyć sie do sentinela.

2) certyfikaty są wrzucone do tej samej ścieżki na wszystkich 5 nodach
HOST_REDIS_TLS_DIR=/etc/pki/ca-trust/source/anchors
konf apirest:
apirest: image: bankup-docker-dev.ewsi.centrala.bzwbk/${CONTAINER_REPO}/apirest:20220728.1 container_name: apirest restart: unless-stopped healthcheck: test: ["CMD-SHELL", "timeout 5 /app/healthcheck.sh"] interval: 60s timeout: 10s start_period: 60s volumes: - /app/logs/apirest:/app/Logs:z - /etc/localtime:/etc/localtime:ro - ${HOST_REDIS_TLS_DIR}/${REDIS_CA_CERT}:/usr/local/share/ca-certificates/redis/${REDIS_CA_CERT}:z

certyfikat był tworzony dla 3 node, aktualnie sentinele są na 5 nodach, logi pochodziły z noda który nie jest podany w alt names.

Natomiast nie rozwiązuje to problemu dlaczego aplikacja z node3 także się nie łączy do redisa

Jeżeli na 3. node są też błędy jak w logi_sentinel_s1slp0002374 (logi z redis-sentinel z serwera, na ktorym nie laczy sie apirest do sentinela) - 1:X 11 Aug 2022 23:22:35.014 # Error accepting a client connection: (null) - to wtedy jest błąd tls handshake. Albo certyfikat jest źle utworzony (np. nie ma poprawnie wypełnionego alt names) albo nie ma certyfikatu w apirest w trusted

Did this answer your question?