Intro::
Redis Cluster์ ๋ํ ์ ๋ฆฌ๋ณธ์ ๋๋ค.
ย
Redis Cluster ๋??
Redis ํด๋ฌ์คํฐ๋ Redis์ ๋ถ์ฐ ๋ฒ์ ์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋
ธ๋์ ๋ถ์ฐ ์ ์ฅํ์ฌ ๊ณ ๊ฐ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์
๋๋ค. Redis ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ Redis ์ธ์คํด์ค๋ฅผ ํ๋์ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ค๋ฉํ๊ณ , ๋
ธ๋ ์ฅ์ ์ ์๋์ผ๋ก ๋ณต๊ตฌํฉ๋๋ค.
ํน์ง
- ์๋ ์ค๋ฉ:
- Redis ํด๋ฌ์คํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐ ์ ์ฅํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํ์ฌ ๊ฐ ๋ ธ๋์ ๋ถํ๋ฅผ ์ค์ ๋๋ค.
- ๊ณ ๊ฐ์ฉ์ฑ:
- ํด๋ฌ์คํฐ ๋ด์ ๊ฐ ๋ ธ๋๋ ์ฃผ ๋ ธ๋(๋ง์คํฐ)์ ๋ณด์กฐ ๋ ธ๋(์ฌ๋ ์ด๋ธ)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ง์คํฐ ๋ ธ๋๊ฐ ์ฅ์ ๋ฅผ ์ผ์ผํค๋ฉด ์ฌ๋ ์ด๋ธ ๋ ธ๋๊ฐ ์๋์ผ๋ก ์น๊ฒฉ๋์ด ๋ง์คํฐ ์ญํ ์ ์ํํฉ๋๋ค.
- ํ์ฅ์ฑ:
- ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค. ์ด๋ ํด๋ฌ์คํฐ์ ์ ์ฅ ์ฉ๋๊ณผ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋ ธ๋ ๊ฐ ํต์ :
- Redis ํด๋ฌ์คํฐ์ ๋ ธ๋๋ค์ ์๋ก ํต์ ํ๋ฉฐ, ๋ฐ์ดํฐ ๋ถ์ฐ๊ณผ ๋ณต์ ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ํํฐ์ ๋:
- ๋ฐ์ดํฐ๋ฅผ ํํฐ์ ๋ํ์ฌ ๊ฐ ๋ ธ๋์ ๋ถ๋ฐฐํฉ๋๋ค. Redis ํด๋ฌ์คํฐ๋ ํด์ ์ฌ๋กฏ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ 16384๊ฐ์ ์ฌ๋กฏ์ ๋งคํํ๊ณ , ์ด๋ฅผ ๋ ธ๋์ ๋ถ๋ฐฐํฉ๋๋ค.
์ฅ์
- ๋์ ๊ฐ์ฉ์ฑ:
- ๋ ธ๋ ์ฅ์ ์ ์๋์ผ๋ก ๋ณต๊ตฌ๋๋ฏ๋ก ์๋น์ค์ ๊ฐ์ฉ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์ํ์ ํ์ฅ:
- ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ฌ ์ ์ฅ ์ฉ๋๊ณผ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
- ์๋ ๋ฐ์ดํฐ ๋ถ๋ฐฐ:
- ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋ถ์ฐ ์ ์ฅํ์ฌ ๊ฐ ๋ ธ๋์ ๋ถํ๋ฅผ ์ค์ด๊ณ , ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๊ณ ์ ์ฑ๋ฅ:
- ๋ถ์ฐ๋ ๋ ธ๋๋ค์ด ๋ณ๋ ฌ๋ก ์์ ์ ์ํํ๋ฏ๋ก, ๋์ ์ฑ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค.
๋จ์
- ๋ณต์กํ ์ค์ :
- ํด๋ฌ์คํฐ๋ฅผ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ด ๋จ์ผ ์ธ์คํด์ค Redis์ ๋นํด ๋ณต์กํฉ๋๋ค.
- ๋คํธ์ํฌ ์ค๋ฒํค๋:
- ๋ ธ๋ ๊ฐ ํต์ ์ผ๋ก ์ธํด ๋คํธ์ํฌ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ ๋ฌธ์ :
- ๋คํธ์ํฌ ๋ถํ ๋๋ ๋ ธ๋ ์ฅ์ ์ ์ผ์์ ์ธ ์ผ๊ด์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ ํ๋ ๋ฐ์ดํฐ ํ์ ์ง์:
- ํน์ ๋ฐ์ดํฐ ํ์ ์ด๋ ๋ช ๋ น์ด๋ ํด๋ฌ์คํฐ ๋ชจ๋์์ ์์ ํ ์ง์๋์ง ์์ ์ ์์ต๋๋ค.
ย
Dockerfile.redis
FROM redis:latest CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
Dockerfile.alpine
FROM alpine:latest RUN apk add --no-cache redis
redis.conf
port 6379 daemonize no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 3000 appendonly yes requirepass ๋น๋ฐ๋ฒํธ masterauth ๋น๋ฐ๋ฒ
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:
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}
๋ฐ์ดํฐ ํ์ธ ์์
# ์ปจํ ์ด๋ ์ ์ 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
ํค์ฌ๋กฏ์ ๋ถ์ฐ๋์ด ํค๊ฐ ์ ์ฅ๋๋ฉฐ, ํค์ฌ๋กฏ์๋ ์ฌ๋ฌ ํค์ฌ๋กฏ์ด ์กด์ฌํ ์ ์์ต๋๋ค.
ย
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
์ปจํ
์ด๋์์๋ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๋ณด์์ ์ธ ์ด์ ๋ก ๊ถ์ฅํ์ง ์๋๋ค๊ณ ํฉ๋๋ค.
ย
Loading Comments...