redis集群部署

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 正常!

部署 Redis 集群可以通过三种主要方式实现:主从复制、哨兵机制(Sentinel)以及 Redis Cluster 集群模式。每种方式适用于不同的场景和需求,下面将分别介绍它们的部署方法。 ### 一、主从复制(Master-Slave Replication) 主从复制是 Redis 最基础的高可用方案,其中一个节点作为主节点(Master),其他节点作为从节点(Slave)。从节点会复制主节点的数据,实现数据冗余。 #### 部署步骤: 1. 配置主节点:无需特殊配置,正常启动 Redis 即可。 2. 配置从节点:在从节点的配置文件中添加 `slaveof <master-ip> <master-port>`,指向主节点的地址和端口。 3. 启动所有节点,从节点将自动连接并复制主节点的数据。 这种方式适用于读写分离和数据备份,但不具备自动故障转移能力。 ### 二、哨兵机制(Sentinel) 哨兵机制是在主从复制的基础上增加了自动故障转移的功能。哨兵节点可以监控主节点的状态,并在主节点宕机时选举出一个新的从节点作为新的主节点。 #### 部署步骤: 1. 准备多个 Redis 实例,一个作为主节点,其余作为从节点。 2. 编写哨兵配置文件 `sentinel.conf`,内容如下: ```properties sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel can-failover mymaster yes ``` 其中 `mymaster` 是主节点的别名,`127.0.0.1:6379` 是主节点的地址和端口,`2` 表示至少需要两个哨兵同意才能进行故障转移。 3. 启动哨兵节点: ```bash redis-sentinel /path/to/sentinel.conf ``` 哨兵机制可以实现自动故障转移,适合对高可用性有一定要求的场景。 ### 三、Redis Cluster 集群 Redis Cluster 是 Redis 官方提供的分布式解决方案,支持数据分片和自动故障转移。它通过哈希槽(Hash Slot)将数据分布在多个节点上,每个节点负责一部分数据。 #### 部署步骤: 1. **准备节点**:每个节点运行一个 Redis 实例,并在配置文件中启用集群模式: ```properties cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 ``` 2. **启动所有节点**:确保所有节点都已启动,并且配置文件中正确设置了集群相关参数。 3. **创建集群**:使用 `redis-cli` 创建集群,命令如下: ```bash redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 --cluster-replicas 1 ``` 这里 `--cluster-replicas 1` 表示每个主节点有一个从节点,总共 6 个节点组成三主三从的集群结构。 4. **验证集群状态**:连接到集群节点并查看集群信息: ```bash redis-cli -c -p 6380 auth your_password cluster nodes ``` Redis Cluster 支持自动数据分片和故障转移,适合大规模、高可用的分布式缓存场景。 ### 部署建议 - **主从复制**:适用于简单的数据备份和读写分离,不推荐用于生产环境中的高可用需求。 - **哨兵机制**:适合需要自动故障转移的小型集群,配置相对简单。 - **Redis Cluster**:适合大规模分布式系统,支持自动数据分片和故障转移,是目前最推荐的部署方式。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值