Docker ๊ธฐ๋ฐ˜ Redis Cluster์— Lettuce ์ ‘์†์ด ์‹คํŒจํ•œ ์ด์œ ?

Docker ๊ธฐ๋ฐ˜ Redis Cluster์— Lettuce ์ ‘์†์ด ์‹คํŒจํ•œ ์ด์œ ?

2025-07-29ยท
TechRedisDockerVM

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”,
ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘, Redis ํด๋Ÿฌ์Šคํ„ฐ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
JAVA ๊ธฐ๋ฐ˜ Spring ํ”„๋กœ์ ํŠธ์—์„œ Lettuce๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ์–ด์š”.

๊ธฐ๋ณธ์ ์ธ Standalone Redis๋Š” RedisClient๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์ง€๋งŒ,
Cluster Redis์˜ ๊ฒฝ์šฐ RedisClusterClient๋กœ, ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ž‘์—… PC ๋‚ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Redis ์ธ์Šคํ„ด์Šค๋ฅผ Docker๋กœ ๊ตฌ์„ฑํ•˜๊ณ ,
ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ Lettuce๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•ด๋ณด๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ... Docker๋กœ ๊ตฌ์„ฑํ•œ Redis Cluster๋Š” Lettuce ์—ฐ๊ฒฐ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์ด์œ ์™€ ํ•ด๊ฒฐ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์„  ๊ฒฐ๋ก  (Window ๊ธฐ์ค€)

๋ฐฉ์•ˆ ํด๋Ÿฌ์Šคํ„ฐ ๊ฒฐ์„ฑ Lettuce ์—ฐ๊ฒฐ ์ฃผ์š” ์‹คํŒจ ์›์ธ
Bridge network ๊ฐ€๋Šฅ ์‹คํŒจ ํด๋Ÿฌ์Šคํ„ฐ ํ† ํด๋กœ์ง€๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ IP๋กœ ๋…ธ์ถœ
Host network ๋ถˆ๊ฐ€ - Window Docker Desktop ์ œ์•ฝ
cluster-announce ๋ถˆ๊ฐ€ - ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ๋ถˆ๊ฐ€ (network: Bridge)
host.docker.internal ๋ถˆ๊ฐ€ - cluster-announce ์„ค์ • ๋ถˆ๊ฐ€
VM(๋ฆฌ๋ˆ…์Šค ํ˜ธ์ŠคํŠธ) ๊ฐ€๋Šฅ ์„ฑ๊ณต ๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ ์—†์ด host IP ์ง์ ‘ ์‚ฌ์šฉ

1. ๋ชฉํ‘œ ๋ฐ ๊ฐ€์„ค

๊ฐ€์šฉ ์ž์› ํŒŒ์•…

๋จผ์ € ํ˜„์žฌ ํ•˜๋“œ์›จ์–ด ์ƒํƒœ๋ฅผ ์ •๋ฆฌ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • PC 1๋Œ€
  • ๊ฐœ๋ฐœ ๋‚ด๋ถ€๋ง (์™ธ๋ถ€ ์ธํ„ฐ๋„ท ๋ถˆ๊ฐ€)
  • Docker, VMWare ์„ค์น˜ ๋˜์–ด์žˆ์Œ

์ตœ์ข… ๋ชฉํ‘œ

JAVA ์•ฑ์—์„œ Lettuce๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐ์ด ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„, RedisClusterCommand ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด CLUSTER INFO ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๊ฒŒ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

๋ชฉํ‘œ ์„ฑ์ทจ ๊ฐ€์„ค

  1. Docker-Compose๋ฅผ ํ†ตํ•ด Redis Container๋ฅผ 7๋Œ€ ์ƒ์„ฑ
  2. Redis์˜ Replica๋Š” 1๋กœ ์„ค์ •, Master Node 3, S 4๊ฐœ๋กœ ๊ตฌ์„ฑ
  3. ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” Bridge Network๋กœ ์—ฐ๊ฒฐ
  4. redis-cli --cluster create๋กœ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐ

์œ„์˜ ์ˆœ์„œ๋กœ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด,
๋ชจ๋“  Redis container๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด
ํ˜ธ์ŠคํŠธ์—์„œ ํŠน์ • ๋…ธ๋“œ์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ํ† ํด๋กœ์ง€๊ฐ€ ์ž๋™ ์—ฐ๊ฒฐ ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


2. ์ฒซ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ (Bridge Network ํ™œ์šฉ)

  • ํ•˜๋“œ์›จ์–ด: Windows ๋‹จ์ผ PC
  • Docker-compose๋กœ Redis ๋…ธ๋“œ 7๊ฐœ๋ฅผ ๊ตฌ์„ฑ(bridge/host ๋„คํŠธ์›Œํฌ ๋น„๊ต)

Docker-Compose ์…‹์—…

version: "3"
services:
  redis-node-1:
    image: redis:latest
    container_name: redis-node-1
    command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0
    ports:
      - "7001:6379"
    networks:
     - redis_cluster_net

  redis-node-2:
    image: redis:latest
    container_name: redis-node-2
    command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0
    ports:
     - "7002:6379"
    networks:
     - redis_cluster_net

  ... (redis-node-7๊นŒ์ง€ ๋ฐ˜๋ณต)

networks:
  redis_cluster_net:
    driver: bridge

์ถ”๊ฐ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ƒ์„ฑ์šฉ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

  redis-cluster-creator:
    image: redis:latest
    container_name: cluster-creator
    networks:
      - redis_cluster_net
    depends_on:
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
      - redis-node-5
      - redis-node-6
      - redis-node-7
    command: redis-cli --cluster create redis-node-1:6379 redis-node-2:6379
          ... (๋ฐ˜๋ณต)
          --cluster-replicas 1
          --cluster-yes

์ดํ›„, docker-compose up ์„ ํ†ตํ•ด ๋กœ๊ทธ์™€ ํ•จ๊ป˜ ๋‚ด์šฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Docker compose up ๋กœ๊ทธ ํ™”๋ฉด

๋‚ด๋ถ€ Bridge๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ node๋กœ์˜ ์—ฐ๊ฒฐ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
redis-cli -h 172.20.0.2 -p 6379 ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ, ์ ‘์†์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Lettuce JAVA ์•ฑ

์ด์ œ, Lettuce๊ธฐ๋ฐ˜ JAVA ์•ฑ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    public static void main(String[] args) {
        SpringApplication.run(LettuceApplication.class, args);

        RedisClusterClient clusterClient = RedisClusterClient.create(
                "redis://127.0.0.1:7001"
        );

        try (StatefulRedisClusterConnection<String, String> connection = clusterClient.connect()) {
            RedisClusterCommands<String, String> commands = connection.sync();
            StringListOutput<String,String> output = new StringListOutput<>(StringCodec.UTF8);

            CommandArgs<String, String> arg = new CommandArgs<>(StringCodec.UTF8).add("INFO");
            List<String> res = commands.dispatch(CommandType.CLUSTER, output, arg);

            System.out.println(res);
        }
        clusterClient.shutdown();
    }

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
redis์— ์—ฐ๊ฒฐํ•œ ํ›„, Cluster Info ๋ฉ”์‹œ์ง€๋ฅผ ๋‚ ๋ฆฝ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

connection failed ์˜ค๋ฅ˜ ์ด๋ฏธ์ง€

connection timed out after 10000 ms: /172.20.0.7:6379
์œ„ ๋กœ๊ทธ์ฒ˜๋Ÿผ, Unable to connect๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š”, Lettuce์—์„œ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ๋Œ€์ƒ์ด 172.20.0.7:6379 ์ธ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฃผ์†Œ๋Š” docker network inspect dca_redis_cluster_net ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด
Docker ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์ „์šฉ IP๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ง€์š”.

> docker network inspect dca_redis_cluster_net

  [
    {
      "Name": "dca_redis_cluster_net",

      ...(์ƒ๋žต)

      "IPAM": {
        "Driver": "default",
        "Options": null,
        "Config": [
          {
            "Subnet": "172.20.0.0/16",
            "Gateway": "172.20.0.1"
          }
        ]
      },

      ...(์ƒ๋žต)

      "Containers": {
        "17151efcca8b5e326536717daf4712edfd1d47eaa883accdca409b081a5eb730": {
          "Name": "redis-node-3",
          "EndpointID": "d7379693b4eea17d36e4988ae2ecc1dac606aa378021eaf26b49640965c1b672",
          "MacAddress": "02:42:ac:14:00:02",
          "IPv4Address": "172.20.0.2/16",
          "IPv6Address": ""
        },
        "47db6a380c842f091bd7bb726cf6ff1bcf560d58150a5a85f70101cb82302daf": {
          "Name": "redis-node-7",
          "EndpointID": "9829afd2d94f1d9e77e893582ff39f84018c8830b25a076bf092c64735815c36",
          "MacAddress": "02:42:ac:14:00:05",
          "IPv4Address": "172.20.0.5/16",
          "IPv6Address": ""
        },

      ... (์ดํ•˜ ์ƒ๋žต)

๊ทธ๋Ÿผ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์„œ, 172.20.0.x๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์„œ๋ธŒ๋„ท IP์ž…๋‹ˆ๋‹ค.
ํ˜ธ์ŠคํŠธ, ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์—์„  ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ฃผ์†Œ์ด์ฃ .

ํ˜ธ์ŠคํŠธ์—์„œ ์ ‘๊ทผํ•˜๋ ค๋ฉด localhost: ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋ฉฐ.
docker์—์„œ ports๋กœ ํฌํŠธํฌ์›Œ๋”ฉํ•œ ์œ„์น˜๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ด๋‹น ๋…ธ๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ, ์™œ Lettuce๋Š” ํ† ํด๋กœ์ง€ํƒ์ƒ‰์— ๋„์ปค ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์ฃผ์†Œ๋ฅผ ์“ธ๊นŒ?


3. Lettuce์˜ ํด๋Ÿฌ์Šคํ„ฐ ํƒ์ƒ‰ ๋ฐฉ์‹?

Lettuce๋Š” ์ตœ์ดˆ๋กœ ํ•œ ๋…ธ๋“œ์— ์ ‘์†ํ•˜๊ฒŒ ๋˜๋ฉด,
์ž๋™์œผ๋กœ CLSUTER SLOTS์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

127.0.0.1:6379> CLUSTER SLOTS

1) 1) (integer) 0
   2) (integer) 5460
   3) 1) "172.20.0.7"
      2) (integer) 6379
      3) "cdc471c93bff4771944f8c936c552be18ec7541c"
      4) (empty array)
   4) 1) "172.20.0.3"
      2) (integer) 6379
      3) "ff4793dd3ea08102af6a081df3e1ad7abc2c16c1"
      4) (empty array)
   5) 1) "172.20.0.6"

์—ฌ๊ธฐ์„œ ๊ฒ€์ƒ‰ ๋œ IP๋กœ LETTUCE์—์„œ ์ž๋™ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ,
๋ชจ๋‘ ๋„์ปค ๋‚ด๋ถ€ IP์ž„์„ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Lettuce๊ฐ€ ํ†ต์‹  ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
ํ˜ธ์ŠคํŠธ์—์„œ๋Š” ๋„์ปค ๋‚ด๋ถ€ IP๋กœ ์ ‘์†ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ง„ ๊ฒƒ์ด์ฃ ...


4. ๋‘๋ฒˆ์งธ ๋ฐฉ์•ˆ (Host Network ํ™œ์šฉ)

๊ฐ€์„ค

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ...
Docker-Bridge๋กœ ํ•˜๋ฉด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ ์žก์œผ๋‹ˆ,
Host ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ณ , ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค๋ฅธ ํฌํŠธ๋กœ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?
ํ•˜๋Š” ๊ฐ€์„ค์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.

  • Host ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ
  • ๊ฐ Redis Cluster ์‹คํ–‰ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝ

๊ฒฐ๊ณผ (ํ•œ๊ณ„)

Window Docker์—์„œ๋Š” network Host๋ฅผ ๋ณ„๋„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ PC์—์„œ๋Š” ๊ตฌ๋™์ค‘์ธ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์žˆ์–ด,
์ผ๊ด„ ๋ณ€๊ฒฝ๋˜๋Š” Docker Desktop์˜ Host ์„ค์ • ํ™œ์„ฑํ™”๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Linux ํ™˜๊ฒฝ์—์„œ๋Š” ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•˜๋‹ค ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด, linux์—์„œ host๋กœ REDIS๋“ค์„ ์‹คํ–‰์‹œํ‚จ ํ›„
ํŠน์ • ๋…ธ๋“œ์—์„œ redis-cli -h 127.0.0.1 -p <๋‹ค๋ฅธ REDIS ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ>๋กœ
์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋ฉด ์•„๋งˆ ๋ฌธ์ œ์—†์ด ๋  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ... ์ €๋Š” Window ํ™˜๊ฒฝ์ด๊ณ , ๋น ๋ฅธ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ฌผ๋ก , Docker-in-Docker๋กœ Rocky Linux ๋“ฑ์„ ์„ค์น˜ํ•ด์„œ redis๋ฅผ ๊ตฌ๋™์‹œํ‚ค๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด์ฃ .
๊ทธ๋ž˜๋„ ๊น”๋”ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์‹ถ์—ˆ์–ด์š”.


5. ์„ธ๋ฒˆ์งธ ๋ฐฉ์•ˆ (cluster-announce-ip ํ™œ์šฉ)

announce ์„ค์ • ์‹œ๋„

์ด๊ฒƒ๋„ Host-Network์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  redis-node-1:
    image: redis:latest
    container_name: redis-node-1
    command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --cluster-announce-ip 127.0.0.1 --cluster-announce-port 7001 
    ports:
      - "7001:6379"

์ด๋Ÿฐ์‹์œผ๋กœ, redis ์„œ๋ฒ„ ์ƒ์„ฑ ์‹œ cluster-announce-๋ฅผ ์ž…๋ ฅํ•˜์—ฌ
๋ณธ์ธ์˜ ์›๊ฒฉ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ... ์—ญ์‹œ ๋™์ผํ•˜์ฃ . ๋ธŒ๋ฆฟ์ง€๋กœ ๊ตฌ๋™๋˜๋Š” ์„œ๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์—,
container์— ๋“ค์–ด๊ฐ€์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค ํ•˜๋ฉด,

root@ddfabbf00ab4:/data# redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 --cluster-replicas 1
Could not connect to Redis at 127.0.0.1:7001: Connection refused

์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ฌ๊ฒ๋‹ˆ๋‹ค.
cluster-announce ์ž์ฒด๋Š” Redis ์„ค์ •์ƒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
Docker Bridge ๋„คํŠธ์›Œํฌ ํŠน์„ฑ์ƒ ํ˜ธ์ŠคํŠธ IP๋กœ์˜ ์—ฐ๊ฒฐ์€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ๋‹น์—ฐํ•˜๊ฒŒ๋„ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ, host.docker.internal์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š๋‚˜?

host.docker.internal์€ Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ƒ network ์„ค์ •์„ host๋กœ ์ž…๋ ฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅผ ๊ฒŒ ์—†์ฃ .

ํ•˜์ง€๋งŒ
Redis ํด๋Ÿฌ์Šคํ„ฐ์— ๋ณธ์ธ์œผ๋กœ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ IP๋ฅผ ์„ค์ •ํ•˜๋Š” cluster-announce-ip๋Š” IP ์ •๊ทœ์‹๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
--cluster-announce-ip host.docker.internal ์ž…๋ ฅ์„ ํ•ด ์ฃผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
host.docker.internal ์—๋Ÿฌ ์ด๋ฏธ์ง€

๊ทธ๋ ‡๋‹ค๊ณ  cluster-announce-ip๋ฅผ 127.0.0.1๋กœ ํ•˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ๋งˆ๋‹ค ๋„คํŠธ์›Œํฌ๊ฐ€ ๊ณ ๋ฆฝ๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋ฟ์ž…๋‹ˆ๋‹ค.


6. ๋งˆ์ง€๋ง‰ ๋ฐฉ์•ˆ (VM ํ™œ์šฉ)

์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ ๋ณ„๋„ OS ์„ค์ • ์—†์ด ์ง„ํ–‰ํ•˜๋ ค๋ฉด, ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ๋Š” ์–ด๋ ต๋‹ค๋Š” ํŒ๋‹จ์ด ์„ฐ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์ด๋ผ๋ฉด network - host ์„ค์ •์œผ๋กœ ๊ฐ€๋Šฅํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž„.

VM ๊ตฌ์„ฑ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์ด๋ฏธ์ง€

ํ™˜๊ฒฝ ์„ค์ •

  1. ์™ธ๋ถ€๋ง์—์„œ Rocky-Linux Container๋ฅผ ์ƒ์„ฑ.
  2. redis ์„ค์น˜์— ํ•„์š”ํ•œ rpm ์ถ”๊ฐ€. dnf download --resolve --arch=x86_64 redis
  3. ์ดํ›„ rpm ํŒŒ์ผ์„ ๊ฐœ๋ฐœ๋ง ๋‚ด๋ถ€ NAS ์„œ๋ฒ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‚ด๋ถ€ ๊ฐœ๋ฐœ๋ง, VMWare์—์„œ Linux๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ณต์œ  ํด๋”๋ฅผ ํ†ตํ•ด rpm์„ ์ „๋‹ฌํ•œ ํ›„, ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. dnf --disablerepo="*" localinstall *.rpm --nogpgcheck

ํด๋Ÿฌ์Šคํ„ฐ ์…‹์—…

  1. ๊ฐ VM์— ์ ‘์†ํ•˜์—ฌ /etc/redis.conf์˜ bind๊ฐ’์„ 0.0.0.0์œผ๋กœ ํ—ˆ์šฉ ์ฒ˜๋ฆฌ ํ•ด ์ค๋‹ˆ๋‹ค.
  2. ๊ฐ VM์˜ ๋ฐฉํ™”๋ฒฝ์— ์ ‘์†ํ•˜์—ฌ 6379์™€ 16379 ํฌํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. /var/lib/redis/nodes.conf๊ฐ€ VM๋ณ„๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ํ•œ VM์— ์ ‘์†ํ•˜์—ฌ redis-cli --cluster create <VM-IP>:6379 ~ ๋ฐ˜๋ณต ~ --cluster-replicas 1 --cluster-yes ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. CLUSTER INFO์—์„œ cluster state๊ฐ€ ON์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , CLUSTER NODES๊ฐ€ ์ •์ƒ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ (Lettuce ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ)

์ดํ›„, ํ˜ธ์ŠคํŠธ์—์„œ ๋‹ค์‹œ Lettuce๋ฅผ ํ†ตํ•ด create.connect.sync๋ฅผ ์‹คํ–‰ํ•˜๋ฉด,
์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

CLUSTER NODES ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€

Cluster INFO์— ๋Œ€ํ•œ ๊ฐ’๋„ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋„ค์š”.


๋งˆ๋ฌด๋ฆฌ

์—ฌ๋Ÿฌ๋ชจ๋กœ ์žฌ๋ฏธ์žˆ๋Š” ํ…Œ์ŠคํŠธ์˜€์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ๋„ ์ข€ ๋” REDIS๋ฅผ JAVA์—์„œ ํ•ธ๋“ค๋งํ•˜๊ธฐ ์œ„ํ•ด LETTUCE๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
spring-boot-Redis๋„ ๊ฐ€๋Šฅ์€ ํ•˜์ง€๋งŒ, ์ปค๋งจ๋“œ string์„ ์ง์ ‘ ๊ตฌ๋™์‹œํ‚ค๊ธฐ์—๋Š”
lettuce๊ฐ€ ๋” ์ข‹๋‹ค ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Docker Bridge๋กœ Redis Cluster๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด, ์™ธ๋ถ€์—์„œ Lettuce ์—ฐ๊ฒฐ์€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ํฐ ์›์ธ์€ CLUSTER SLOTS ๊ฒฐ๊ณผ๊ฐ€ ๋‚ด๋ถ€ IP๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • Windows Docker๋Š” Host ๋„คํŠธ์›Œํฌ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, VM ๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์‚ฌ์‹ค์ƒ ์œ ์ผํ•œ ๋Œ€์•ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜ OS์—์„œ ๋„์ปค๋ฅผ ์„ค์น˜ํ•œ ๋’ค, host ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฑด
์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์ง€๋งŒ, Linux ๊ธฐ๋ฐ˜์—์„œ๋Š” host network ์„ค์ •์ด ์ž์œ ๋กญ๊ธฐ ๋•Œ๋ฌธ์—
๋ธŒ๋ฆฟ์ง€ ๋„คํŠธ์›Œํฌ์˜ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ผ ๋‚ด์— ํ…Œ์ŠคํŠธํ•˜์—ฌ ๊ธ€ ์ˆ˜์ •์„ ํ•ด ๋‘๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š

ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ๋” ๋ณด์™„ํ• ๋งŒํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด,
๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.