앞써 블로그에서는 docker file 기반의 redis를 어떻게 띄우는지를 설명했었다.
하지만 실무에서는 이렇게 단일 redis 서버하나 띄워놓고 운용하기에는 리스크가 너무 크다.
가장 큰 리스크는 서버 하나가 유일한데 그게 뻗어버리면?
관련된 서비스가 마비될 것이다.
따라서, 원활한 서비스를 위해서는 2가지 중 하나를 선택해야 하는데 그중 하나가 Sentinel 이고 다른 하나가 Cluster 구성이다.
1. Sentinel
- HA 지원, Master & Slave 의 Replica 구성 가능
- 과반수의 투표체계를 사용하기 때문에 홀수개의 redis를 구성해야한다.(그중 하나가 Master 나머지 두개가 Slave)
- Sentinel 구성을 위해서는 기존 redis 와 별도의 추가 구성이 필요
[예시]
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
dir /data
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-sentinel-config
data:
sentinel.conf: |
port 26379
dir /tmp
sentinel monitor mymaster redis-0.redis 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
ports:
- port: 6379
name: redis
- port: 26379
name: sentinel
clusterIP: None
selector:
app: redis
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7
command: ["redis-server", "/etc/redis/redis.conf"]
volumeMounts:
- name: redis-config
mountPath: /etc/redis
- name: redis-data
mountPath: /data
- name: sentinel
image: redis:7
command: ["redis-sentinel", "/etc/sentinel/sentinel.conf"]
volumeMounts:
- name: sentinel-config
mountPath: /etc/sentinel
volumes:
- name: redis-config
configMap:
name: redis-config
- name: sentinel-config
configMap:
name: redis-sentinel-config
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
2. Cluster
- HA, Sharding 지원, Dataset을 자동으로 여러 노드에 분산해서 저장 및 사용 가능.
- Redis Cluster 전용 Client 를 사용필요
- Max Sharding 은 최대 1000개 까지 권장
- Sentinel과 마찮가지로 Replica가 master를 감지하고 자동으로 승격시키며, Master가 이후 복구되어도 replica로 편입됨(과반수 투표기준).
- 전체 16384 hash slot, 동일한 slot 범위안에서만 멀티 키 명령어 사용가능( MGET, MULTI), 최소 3개의 master 필요
- cluster 기본 port 16379, 내부는 cluster bus 사용
- 이외 master 추가 시 자동분산 안되며, 수동으로 rebalancing 필요
[예시]
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
clusterIP: None
selector:
app: redis
ports:
- name: redis
port: 6379
- name: cluster
port: 16379
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /data
protected-mode no
bind 0.0.0.0
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 30
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:latest
command: ["redis-server", "/etc/redis/redis.conf"]
ports:
- containerPort: 6379
name: redis
- containerPort: 16379
name: cluster
volumeMounts:
- name: redis-config
mountPath: /etc/redis
- name: redis-data
mountPath: /data
volumes:
- name: redis-config
configMap:
name: redis-config
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
'AMQP > redis' 카테고리의 다른 글
redis dockerfile 로 local에서 띄우기 (3) | 2024.11.01 |
---|---|
redis 어디까지 써봤나? feat. Goddis (6) | 2024.08.28 |