Redisson master slave config

Konfigurace master slave Redis klienta (Redisson) s konfigurací pro docker-compose.

redisson.json

{
  "masterSlaveServersConfig": {
    "idleConnectionTimeout": 10000,
    "connectTimeout": 10000,
    "timeout": 3000,
    "retryAttempts": 3,
    "retryInterval": 1500,
    "failedSlaveReconnectionInterval": 3000,
    "failedSlaveCheckInterval": 60000,
    "password": null,
    "subscriptionsPerConnection": 5,
    "clientName": null,
    "subscriptionConnectionMinimumIdleSize": 1,
    "subscriptionConnectionPoolSize": 50,
    "slaveConnectionMinimumIdleSize": 24,
    "slaveConnectionPoolSize": 64,
    "masterConnectionMinimumIdleSize": 24,
    "masterConnectionPoolSize": 64,
    "readMode": "SLAVE",
    "subscriptionMode": "SLAVE",
    "slaveAddresses": [
      "redis://127.0.0.1:32781",
      "redis://127.0.0.1:32782",
      "redis://127.0.0.1:32783"
    ],
    "masterAddress": "redis://127.0.0.1:32780",
    "database": 0
  },
  "threads": 16,
  "nettyThreads": 32,
  "transportMode": "NIO"
}

docker-compose.yml

version: '2'services:
  redis-master:
    image: 'bitnami/redis:latest'
    ports:
      - '6379'
    environment:
      - REDIS_REPLICATION_MODE=master
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - '/home/vitfo/Redis/volume'  redis-replica:
    image: 'bitnami/redis:latest'
    ports:
      - '6379'
    depends_on:
      - redis-master
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - ALLOW_EMPTY_PASSWORD=yes

docker-compose up –scale redis-master=1 –scale redis-replica=3 vytvoří:

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                     NAMES
dbb2a6f2bdae        bitnami/redis:latest   "/opt/bitnami/script…"   13 seconds ago      Up 11 seconds       0.0.0.0:32781->6379/tcp   redis_redis-replica_3
44adb500c854        bitnami/redis:latest   "/opt/bitnami/script…"   13 seconds ago      Up 10 seconds       0.0.0.0:32782->6379/tcp   redis_redis-replica_2
72e8bdc566b0        bitnami/redis:latest   "/opt/bitnami/script…"   13 seconds ago      Up 9 seconds        0.0.0.0:32783->6379/tcp   redis_redis-replica_1
c4b64430a2ca        bitnami/redis:latest   "/opt/bitnami/script…"   14 seconds ago      Up 12 seconds       0.0.0.0:32780->6379/tcp   redis_redis-master_1

Zdroje:

Redis health check

Většinou není problém s připojením k redis databázi. Ani když používáte docker image a contejner s redisem zastavíte. Po jeho spuštění se aplikace zase korektně připojí do redis databáze. Měl jsem ale problém v případě kubernetu, kdy po znovu nasazení a spuštění docker kontejneru s redisem se aplikace nemohla sama připojit. Řešením bylo udělat health actuator a v případě, že je down, aplikaci restartovat. Jako klienta používám redisson.

import org.redisson.api.RedissonClient
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.actuate.health.Health
import org.springframework.boot.actuate.health.ReactiveHealthIndicator
import org.springframework.stereotype.Component
import reactor.core.publisher.Mono

@Component
class RedisHealthChecker : ReactiveHealthIndicator {
    private val log = LoggerFactory.getLogger(RedisHealthChecker::class.java)

    @Autowired
    lateinit var redissonClient: RedissonClient

    override fun health(): Mono {
        return try {
            val bucket = redissonClient.getBucket("healthBucket")
            bucket.set("Ok")
            Mono.just(Health.Builder().up().build())
        } catch (e: Exception) {
            log.error("Error in redis connection", e)
            Mono.just(Health.Builder().down().build())
        }
    }
}

Získání klíčů Redis databáze

Pro získání klíčů v rámci Redisu při použítí redis-cli existuje příkaz KEYS pattern. Pokud chcete všechny klíče použijete KEYS *, pokud pouze klíče začínající na ‚my‘ použijete KEYS my*. Typ hodnoty klíče zjistíte příkazem TYPE nazev-klice.

Dokumentace nedoporučuje používat KEYS v produkční databázi nebo u velkých databází, neboť KEYS vrací všechny klíče a to může mít vliv na výkonnost. Místo KEYS se doporučuje použití SCAN. Scan vrací na každý dotaz jen omezené množství záznamů a požaduje cursor (ukazatel). V rámci odpovědi vrací nalezené klíče a další ukazatel. Dokud není vrácený ukazatel rovný 0, stále existují klíče, které ještě nebyly vráceny. Výchozí nastavení pro scan vrací 10 záznamů. To možné změnit volbou COUNT.

Číst dálZískání klíčů Redis databáze

Datové typy Redisu

Redis podporuje 5 datových typů.

  • Strings (textové řetězce) – posloupnost bytů
  • Hashes (heše) – kolekce hodnot klíč-hodnota
  • Lists (seznamy) – seznamy řetězců seřazené podle pořadí vložení
  • Sets (množiny) – neseřazená kolekce řetězců, každý řetězec je jedinečný
  • Sorted Sets (seřazená množina) – seřazená, neopakující se kolekce řetězců

Strings

127.0.0.1:6379> set string-key-1 "string-value-1"
OK
127.0.0.1:6379> set string-key-2 "string-value-2"
OK
127.0.0.1:6379> get string-key-1
"string-value-1"

Číst dálDatové typy Redisu

Redis v Dockeru

V nedávném příspěvku jsem se věnoval PostgreSQL v Dockeru. V tomto příspěvku se zaměřím na Redis v Dockeru.

Redis v Dockeru si spustíte příkazem docker run -d -p 6379:6379 --name redis1 redis.

docker run -d -p 6379:6379 --name redis1 redis
Pokud image redis nemáte na svém počítači, provedes se stažení (pull). Zároveň se redis spustí na pozadí
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
bc51dd8edc1b: Pull complete
37d80eb324ee: Pull complete
392b7748dfaf: Pull complete
48df82c3534d: Pull complete
2ec2bb0b4b0e: Pull complete
1302bce0b2cb: Pull complete
Digest: sha256:7b84b346c01e5a8d204a5bb30d4521bcc3a8535bbf90c660b8595fad248eae82
Status: Downloaded newer image for redis:latest
b44ab2740c8349b7bcfbff65f197855f6fd734ece4df71d81830bcb2eb7482a4

Tento výpis uvidíte pouze v případě, že jste zatím redis na svém počítači nikdy nespouštěli. Pokud již image redisu máte, výpis bude výrazně kratší.

Číst dálRedis v Dockeru

Změna portu Redisu

Konfigurační soubor Redisu redis.conf lze na Linuxu najít ve složce /etc/redis. V tomto souboru je definován také port, na kterém Redis běží:

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

Ve výchozím nastavení se používá port 6379. Pokud port změníte, je třeba restartovat redis server.

sudo service redis-server restart

Připojení můžete vyzkoušet pomocí redis-cli.

redis-cli ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused

Pokud východí port 6379 změníte, musíte redis-cli říct, na který port se má připojit (přepínač -p). V tomto případě jsem port změnil na 6378.

redis-cli -p 6378 ping
PONG