redis部署可有主从模式、哨兵模式和集群模式,在k8s上部署DeepSeek推荐使用集群模式。关于集群模式下解决数据持久化的数据一致性和高可用问题,我也用DeepSeek做了以下对比,对比方案的内容有:
1. 使用StatefulSet部署redis, pod挂载宿主机的本地目录上;(起初认为集群模式分片存储没有备份机制,其中一个宿主机宕机会造成分片内容丢失,后来专门研究了以下:在一个Redis集群中,每个主节点可以有多个从节点。从节点会异步复制其主节点的全部数据。从节点拥有其主节点的全量数据,但不会拥有集群中其他主节点的数据。也就是这种挂载模式下,从节点宕机是有数据丢失风险的,不过,redis作为cache,和数据库还不大一样,这一点应该影响不大。不然就选用下面的6模式或使用哨兵模式(哨兵模式的可扩展性和规模都受限))
2.使用NFS作为pod的挂载点;
3. 使用宿主机的本地目录作为挂载点,glusterfs作为宿主机之间的数据同步;
4.使用本地目录 + lsyncd+inotify (最终一致性)实现数据同步;
5. 使用cephfs作为挂载点;
6.使用ceph GRW 即S3作为挂载点。
DeepSeek性能对比结果: 宿主机目录挂载> lsyncd+inotify > S3 >cephfs> nfs > glusterfs
小规模redis集群数据持久化建议使用宿主机目录挂载,大规模建议使用 S3。
这里面nfs因为数据是存在server节点其他节点作为client访问,其数据的高可用性没有根本解决。
lsyncd+inotify 不能解决数据的强实时性,切数据同步期间,性能会下降。
宿主机目录挂载,各个宿主机节点并没有实现数据的全量同步。对比主从模式和哨兵模式:
对比表格:与“全量复制”模式的区别
特性 | Redis Cluster + StatefulSet (推荐方案) | 全量复制模式 (如主从同步备用)
数据分布 | 数据分片:每个节点存储一部分数据 | 数据镜像:每个节点存储全部数据
存储空间 | 总存储空间 ≈ 每个节点存储空间 * 节点数 | 总存储空间 ≈ 单个节点存储空间 (所有节点数据相同)
设计目的 | 水平扩展:通过增加节点来提升整体数据容量和吞吐量 | 高可用/读写分离:备用节点在主节点故障时接管,或处理读请求
Kubernetes资源 | 每个Pod需要独立的PVC和PV | 所有Pod可以挂载同一个ReadWriteMany(RWX)存储卷(如NFS)(但Redis哨兵模式更复杂)
———————————————————————————————————————————
下面是k8s具体部署脚本:
1、创建redis-config
//创建空间
kubectl create ns redis
// redis-config.yaml
apiVersion: v1
data:
redis.conf: |
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /data
bind 0.0.0.0
protected-mode no
port 6379
cluster-announce-port 6379
cluster-announce-bus-port 16379
kind: ConfigMap
metadata:
name: redis-config
namespace: redis
kubectl apply -f redis-config.yaml
2、创建svc
// redis-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-headless
namespace: redis
labels:
app: redis
spec:
clusterIP: None
ports:
- name: redis
port: 6379
- name: cluster-bus
port: 16379
selector:
app: redis
3、部署statefulset
// 在要部署的宿主机节点打上标签,最好是集群中做了高可用的节点上,我这里部署在了master节点上(注意这里要去污),注意pod节点至少要达到3个,不然无法创建redis集群
kubectl label nodes <master节点名> node-type=redis
// redis-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cluster
namespace: redis
spec:
serviceName: redis-headless
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
nodeSelector:
node-type: redis
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: redis
image: docker.m.daocloud.io/redis:7.0.12
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
- name: host-time
mountPath: /etc/localtime
readOnly: true
volumes:
- name: redis-config
configMap:
name: redis-config
- name: host-time
hostPath:
path: /etc/localtime
- name: redis-data
hostPath:
path: /srv/redis-shared/data
type: DirectoryOrCreate
4、待部署完毕查看pod运行状态,都正常了,创建redis集群
kubectl exec -it redis-cluster-0 -n redis -- redis-cli --cluster create \
redis-cluster-0.redis-headless.redis.svc.cluster.local:6379 \
redis-cluster-1.redis-headless.redis.svc.cluster.local:6379 \
redis-cluster-2.redis-headless.redis.svc.cluster.local:6379 \
--cluster-replicas 0 --cluster-yes
5、查看集群状态
// kubectl exec -it redis-cluster-0 -n redis -- redis-cli cluster info
cluster_state:ok # 这里要是集群状态不正常会显示fail
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1268
cluster_stats_messages_pong_sent:1231
cluster_stats_messages_sent:2499
cluster_stats_messages_ping_received:1229
cluster_stats_messages_pong_received:1268
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:2499
total_cluster_links_buffer_limit_exceeded:0
// kubectl exec -it redis-cluster-2 -n redis -- redis-cli cluster nodes
20e6555ce1b3c33d8aa222ba72e8be8c110ae560 26.244.39.82:6379@16379 master - 0 1756280011754 1 connected 0-5460
4161d493386f3e61f97b94d66564f02b0c72d82f 26.244.157.74:6379@16379 myself,master - 0 1756280011000 3 connected 10923-16383
8add8bc49a2bedb6a7779d77eb61040525fdefd9 26.244.231.4:6379@16379 master - 0 1756280012757 2 connected 5461-10922
# 三个节点都运行起来了
6、 安装客户端
// redis-config.yaml
apiVersion: v1
data:
redis.conf: |
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /data
bind 0.0.0.0
protected-mode no
port 6379
cluster-announce-port 6379
cluster-announce-bus-port 16379
kind: ConfigMap
metadata:
name: redis-config
namespace: redis
部署完毕使用如下命令访问:
kubectl exec -it redis-client-deploy-856c97f7d5-vmjts -n redis -- redis-cli -h redis-headless.redis.svc.cluster.local -p 6379
# redis-client-deploy-856c97f7d5-vmjts为部署后的pod名称
测试:ping 回复 pong 正常!
653

被折叠的 条评论
为什么被折叠?



