Intro::
Redis Clusterμ λν μ 리본μ
λλ€.
Redis Cluster λ??
Redis ν΄λ¬μ€ν°λ Redisμ λΆμ° λ²μ μΌλ‘, λ°μ΄ν°λ₯Ό μ¬λ¬ λ
Έλμ λΆμ° μ μ₯νμ¬ κ³ κ°μ©μ±κ³Ό νμ₯μ±μ μ 곡νλ κΈ°λ₯μ
λλ€. Redis ν΄λ¬μ€ν°λ μ¬λ¬ Redis μΈμ€ν΄μ€λ₯Ό νλμ ν΄λ¬μ€ν°λ‘ ꡬμ±νμ¬ λ°μ΄ν°λ₯Ό μλμΌλ‘ μ€λ©νκ³ , λ
Έλ μ₯μ μ μλμΌλ‘ 볡ꡬν©λλ€.
νΉμ§
1.
μλ μ€λ©:
β’
Redis ν΄λ¬μ€ν°λ λ°μ΄ν°λ₯Ό μλμΌλ‘ μ¬λ¬ λ
Έλμ λΆμ° μ μ₯ν©λλ€. μ΄λ λ°μ΄ν°λ₯Ό κ· λ±νκ² λΆλ°°νμ¬ κ° λ
Έλμ λΆνλ₯Ό μ€μ
λλ€.
2.
κ³ κ°μ©μ±:
β’
ν΄λ¬μ€ν° λ΄μ κ° λ
Έλλ μ£Ό λ
Έλ(λ§μ€ν°)μ 보쑰 λ
Έλ(μ¬λ μ΄λΈ)λ‘ κ΅¬μ±λ©λλ€. λ§μ€ν° λ
Έλκ° μ₯μ λ₯Ό μΌμΌν€λ©΄ μ¬λ μ΄λΈ λ
Έλκ° μλμΌλ‘ μΉκ²©λμ΄ λ§μ€ν° μν μ μνν©λλ€.
3.
νμ₯μ±:
β’
λ
Έλλ₯Ό μΆκ°νκ±°λ μ κ±°νμ¬ ν΄λ¬μ€ν°λ₯Ό μ½κ² νμ₯ν μ μμ΅λλ€. μ΄λ ν΄λ¬μ€ν°μ μ μ₯ μ©λκ³Ό μ²λ¦¬ λ₯λ ₯μ μ μ°νκ² μ‘°μ ν μ μκ² ν©λλ€.
4.
λ
Έλ κ° ν΅μ :
β’
Redis ν΄λ¬μ€ν°μ λ
Έλλ€μ μλ‘ ν΅μ νλ©°, λ°μ΄ν° λΆμ°κ³Ό 볡μ λ₯Ό κ΄λ¦¬ν©λλ€.
5.
νν°μ
λ:
β’
λ°μ΄ν°λ₯Ό νν°μ
λνμ¬ κ° λ
Έλμ λΆλ°°ν©λλ€. Redis ν΄λ¬μ€ν°λ ν΄μ μ¬λ‘―μ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό 16384κ°μ μ¬λ‘―μ λ§€ννκ³ , μ΄λ₯Ό λ
Έλμ λΆλ°°ν©λλ€.
μ₯μ
1.
λμ κ°μ©μ±:
β’
λ
Έλ μ₯μ μ μλμΌλ‘ 볡ꡬλλ―λ‘ μλΉμ€μ κ°μ©μ±μ λμΌ μ μμ΅λλ€.
2.
μνμ νμ₯:
β’
λ
Έλλ₯Ό μΆκ°νμ¬ μ μ₯ μ©λκ³Ό μ²λ¦¬ μ±λ₯μ μ½κ² νμ₯ν μ μμ΅λλ€.
3.
μλ λ°μ΄ν° λΆλ°°:
β’
λ°μ΄ν°λ₯Ό μλμΌλ‘ λΆμ° μ μ₯νμ¬ κ° λ
Έλμ λΆνλ₯Ό μ€μ΄κ³ , μ±λ₯μ ν₯μμν΅λλ€.
4.
κ³ μ μ±λ₯:
β’
λΆμ°λ λ
Έλλ€μ΄ λ³λ ¬λ‘ μμ
μ μννλ―λ‘, λμ μ±λ₯μ μ μ§ν μ μμ΅λλ€.
λ¨μ
1.
볡μ‘ν μ€μ :
β’
ν΄λ¬μ€ν°λ₯Ό μ€μ νκ³ κ΄λ¦¬νλ κ³Όμ μ΄ λ¨μΌ μΈμ€ν΄μ€ Redisμ λΉν΄ 볡μ‘ν©λλ€.
2.
λ€νΈμν¬ μ€λ²ν€λ:
β’
λ
Έλ κ° ν΅μ μΌλ‘ μΈν΄ λ€νΈμν¬ μ€λ²ν€λκ° λ°μν μ μμ΅λλ€.
3.
μΌκ΄μ± λ¬Έμ :
β’
λ€νΈμν¬ λΆν λλ λ
Έλ μ₯μ μ μΌμμ μΈ μΌκ΄μ± λ¬Έμ κ° λ°μν μ μμ΅λλ€.
4.
μ νλ λ°μ΄ν° νμ
μ§μ:
β’
νΉμ λ°μ΄ν° νμ
μ΄λ λͺ
λ Ήμ΄λ ν΄λ¬μ€ν° λͺ¨λμμ μμ ν μ§μλμ§ μμ μ μμ΅λλ€.
Dockerfile.redis
FROM redis:latest
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
Bash
볡μ¬
Dockerfile.alpine
FROM alpine:latest
RUN apk add --no-cache redis
Bash
볡μ¬
redis.conf
port 6379
daemonize no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 3000
appendonly yes
requirepass λΉλ°λ²νΈ
masterauth λΉλ°λ²
Bash
볡μ¬
docker-compose.yml
services:
redis-master-1:
container_name: redis-master-1
build:
context: .
dockerfile: Dockerfile.redis
ports:
- "6379:6379"
volumes:
- redis-master-1-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-master-2:
container_name: redis-master-2
build:
context: .
dockerfile: Dockerfile.redis
ports:
- "6380:6379"
volumes:
- redis-master-2-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-master-3:
container_name: redis-master-3
build:
context: .
dockerfile: Dockerfile.redis
ports:
- "6381:6379"
volumes:
- redis-master-3-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-slave-1:
container_name: redis-slave-1
build:
context: .
dockerfile: Dockerfile.redis
ports:
- "6382:6379"
volumes:
- redis-slave-1-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-slave-2:
container_name: redis-slave-2
build:
context: .
dockerfile: Dockerfile.redis
ports:
- "6383:6379"
volumes:
- redis-slave-2-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-slave-3:
container_name: redis-slave-3
build:
context: .
dockerfile: Dockerfile.redis
ports:
- "6384:6379"
volumes:
- redis-slave-3-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-setup:
container_name: redis-setup
build:
context: .
dockerfile: Dockerfile.alpine
depends_on:
- redis-master-1
- redis-master-2
- redis-master-3
- redis-slave-1
- redis-slave-2
- redis-slave-3
environment:
- REDIS_PASSWORD=password
volumes:
- ./setup-redis-cluster.sh:/usr/local/etc/redis/setup-redis-cluster.sh
networks:
- redis-cluster-net
command: ["sh", "-c", "chmod +x /usr/local/etc/redis/setup-redis-cluster.sh && /usr/local/etc/redis/setup-redis-cluster.sh"]
volumes:
redis-master-1-data:
redis-master-2-data:
redis-master-3-data:
redis-slave-1-data:
redis-slave-2-data:
redis-slave-3-data:
networks:
redis-cluster-net:
Bash
볡μ¬
setup-redis-cluster.sh
#!/bin/sh
# Install redis-cli
apk add --no-cache redis
echo "Waiting for Redis nodes to start..."
sleep 10
echo "Creating Redis cluster with masters..."
yes yes | redis-cli --cluster create \
redis-master-1:6379 \
redis-master-2:6379 \
redis-master-3:6379 \
--cluster-replicas 0 \
-a ${REDIS_PASSWORD}
echo "Adding slaves to the cluster..."
redis-cli --cluster add-node redis-slave-1:6379 redis-master-1:6379 --cluster-slave -a ${REDIS_PASSWORD}
redis-cli --cluster add-node redis-slave-2:6379 redis-master-2:6379 --cluster-slave -a ${REDIS_PASSWORD}
redis-cli --cluster add-node redis-slave-3:6379 redis-master-3:6379 --cluster-slave -a ${REDIS_PASSWORD}
Bash
볡μ¬
λ°μ΄ν° νμΈ μμ
# 컨ν
μ΄λ μ μ
docker exec -it redis-master-1 sh
# ν΄λ¬μ€ν° λͺ¨λ λ λμ€ cli μ μ
redis-cli -c -a password
# key value μ μ₯
set key1 "Hello, Redis!"
# λ°μ΄ν° νμΈ
get key1
"Hello, Redis!"
# λ°μ΄ν°κ° μ€μ λ‘ μ μ₯λ ν€μ¬λ‘―νμΈ
CLUSTER KEYSLOT key1
(integer) 9189
# λ
Έλλ³ λ΄λΉ ν€μ¬λ‘―λ²μλ₯Ό νμΈνμ¬ μ΄λ λ
Έλκ° κ΄λ¦¬νκ³ μλμ§ νμ
κ°λ₯
CLUSTER NODES
2dc5480b5c9521c5d987d56136ef23cc4422cfa2 172.19.0.2:6379@16379 slave 3376c85cb33ca95be7a30ef980019e2c50da7afb 0 1721288671554 3 connected
3376c85cb33ca95be7a30ef980019e2c50da7afb 172.19.0.5:6379@16379 master - 0 1721288671554 3 connected 10923-16383
121edfec52734ec5d1d3c3e7fc4e6da91996d0f7 172.19.0.4:6379@16379 slave 6313f3c66d1e407140f9140e368fda08e3f3f10e 0 1721288671554 2 connected
1adf90a107637a3e45fdb9bd19fc55b8c4b0a423 172.19.0.7:6379@16379 slave 4b82b9e5bbf9676a52eab80dd17eea77a938aa9d 0 1721288671050 1 connected
6313f3c66d1e407140f9140e368fda08e3f3f10e 172.19.0.3:6379@16379 master - 0 1721288671000 2 connected 5461-10922
4b82b9e5bbf9676a52eab80dd17eea77a938aa9d 172.19.0.6:6379@16379 myself,master - 0 1721288670000 1 connected 0-5460
Bash
볡μ¬
ν€μ¬λ‘―μ λΆμ°λμ΄ ν€κ° μ μ₯λλ©°, ν€μ¬λ‘―μλ μ¬λ¬ ν€μ¬λ‘―μ΄ μ‘΄μ¬ν μ μμ΅λλ€.
Trouble Shooting
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
# λ‘컬μμ μ€μ
sudo sysctl vm.overcommit_memory=1
Bash
볡μ¬
컨ν
μ΄λμμλ μ€μ ν μ μλ λ°©λ²μ΄ μμ§λ§, 보μμ μΈ μ΄μ λ‘ κΆμ₯νμ§ μλλ€κ³ ν©λλ€.