k8s部署Redis部署Clister集群

1、Redis介绍

(1)Redis基于内存运行并支持持久化
(2)采用key-value(键值对)的存储形式
(3)优点
①具有极高的数据读写速度
②支持丰富的数据类型
③支持数据的持久化
④数据的操作都是原子性
⑤支持数据备份

2、Redis应用场景

(1)热点数据的缓存–时事热点新闻
(2)分布式架构,多个应用之间共享–做session共享
(3)计数器–利用string类型可以做常规计数,微博数,粉丝数
(4)限时业务的运用–优惠活动信息、手机验证码
(5)统计数据–在线用户统计

3、Redis集群介绍

(1)Redis集群即Redis Cluster,是Redis 3.0开始引入的分布式存储方案
(2)Redis集群是一个提供多个Redis节点间共享数据的程序集
(3)集群中的节点分别为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制
(4)Redis集群通过数据分区来提供一定程度的高可用,在实际环境中当某个节点宕机或者不可达的情况下,其他节点可继续提供服务

4、Redis集群的作用

(1)降低单台服务器宕机带来的业务灾难
(2)数据分区(或数据分片)是集群最核心的功能
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力
(3)服务高可用
集群支持主从复制和主节点的自动故障转移;当任意节点发生故障时,备用节点接替,集群仍然可以对外提供服务

5、Redis集群的实现方法

(1)客户端分片:由客户端决定key写入或者读取的节点
(2)代理分片:客户端发送请求一个代理,然后代理将请求转发到节点
(3)服务器端分片:由服务器端决定key的存储位置

6、Redis-Cluster数据分片

(1)Redis集群没有使用一致性hash算法,而是引入了哈希槽概念,一共有16384个哈希槽
(2)每个进入Redis的key通过hash运算得到结果,结果除以16384求余得到相应的哈希槽,然后存放在对应的节点中
(3)当数据库中的16384个槽都分配了节点时,集群处于上线状态(ok);如果任意节点没有分配一个槽,则集群处于下线状态(fail)
(4)集群的每个节点只负责一部分哈希槽,客户端可以请求任意一个节点,每个节点都保存了16384个slot中的一部分。

7、Redis-Cluster的主从复制模型

(1)为了保证高可用性,redis-cluster集群引入了主从模式
(2)假设集群中有A、B、C三个节点,如果节点B宕机了,整个集群就会因缺少5461-10922这个范围的槽而不可用
(3)为每个节点添加一个从节点A1、B1、C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1为新的主节点继续服务
(4)当B和B1节点都失败后,集群将不可用

8、集群模式的优缺点

(1)优点
①采用去中心化思想,数据按照slot存储分布在多个节点,节点间数据共享,可以动态调整数据分布
②可扩展性:可线性扩展到1000多个节点,节点可以动态添加或删除
③高可用性:部分节点不可用时,集群仍可用。通过增加slave做standby数据副本,能够实现故障自动failover,节点之间通过(gossip)协议交换状态信息,用投票机制完成clave到master的角色提升
④降低运维成本,提高系统的扩展性和可用性
(2)缺点
①数据通过异步复制,Redis集群不能保证数据的强一致性
②不支持多数据空间,集群模式只能使用1个数据库空间,即数据库0

总结:Redis和Memcached的对比:

(1)相同点:
①都属于NoSQL数据库,两者都使用键值对的方式存储数据;
②都使用内存来缓存数据;
(2)不同点:
①Redis可以支持更多的数据类型,比如string(key-value)、list、zset、hash、set等。memcached只支持string数据类型;
②Redis支持数据的复制备份,memcached不支持;
③Redis支持数据持久化,可以将内存中的数据保存在磁盘上,而memcached不支持;
④Redis在服务器端实现分布式存储,而memcached通过客户端实现分布式存储;
⑤Redis是单线程工作模式,而memcached属于多线程工作模式;

install

1、准备k8s集群
2、部署rook-ceph存储
3、部署(redis三主三从6.2.6)
创建statefulsets有状态应用
##配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster-config
  namespace: redis-cluster
data:
  redis-cluster.conf: |
    daemonize no
    supervised no
    protected-mode no
    bind 0.0.0.0
    port 6379
    cluster-announce-bus-port 16379
    cluster-enabled yes
    appendonly yes
    cluster-node-timeout 5000
    dir /data
    cluster-config-file /data/nodes.conf
    pidfile /data/redis.pid
    loglevel notice
    logfile /data/redis_log
---
apiVersion: v1
kind: Service
metadata:
  name: redis-cluster-service
  namespace: redis-cluster
spec:
  selector:
    app: redis-cluster
  clusterIP: None
  ports:
    - name: redis-6379
      port: 6379
    - name: redis-16379
      port: 16379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-cluster-service-access
  namespace: redis-cluster
spec:
  selector:
    app: redis-cluster
  type: NodePort
  sessionAffinity: None
  ports:
    - name: redis-6379
      port: 6379
      targetPort: 6379
      nodePort: 30202
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: redis-cluster
  name: redis-cluster
  namespace: redis-cluster
spec:
  serviceName: redis-cluster-service
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      terminationGracePeriodSeconds: 30
      containers:
        - name: redis
          image: redis:6.2.6
          imagePullPolicy: IfNotPresent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          command: [ "redis-server", "/etc/redis/redis-cluster.conf" ]
          args:
            - "--cluster-announce-ip"
            - "$(POD_IP)"
          env:
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: TZ
              value: "Asia/Shanghai"
          ports:
            - name: redis
              containerPort: 6379
              protocol: TCP
            - name: cluster
              containerPort: 16379
              protocol: TCP
          volumeMounts:
            - name: redis-conf
              mountPath: /etc/redis
            - name: pvc-data
              mountPath: /data
      volumes:
        - name: timezone
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
        - name: redis-conf
          configMap:
            name: redis-cluster-config
            items:
              - key: redis-cluster.conf
                path: redis-cluster.conf
  volumeClaimTemplates:
    - metadata:
        name: pvc-data
        namespace: redis-cluster
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 5G
        accessModes:
        - ReadWriteOnce                           #访问模式为RWO
        storageClassName: "rook-ceph-block"      #指定使用的存储类,实现动态分配pv
查看pod
[root@k8s-master-01 rbd]# kubectl get po -n redis-cluster
NAME              READY   STATUS    RESTARTS   AGE
redis-cluster-0   1/1     Running   0          113m
redis-cluster-1   1/1     Running   0          113m
redis-cluster-2   1/1     Running   0          112m
redis-cluster-3   1/1     Running   0          112m
redis-cluster-4   1/1     Running   0          112m
redis-cluster-5   1/1     Running   0          112m
查看pod和pvc
[root@k8s-master-01 rbd]# kubectl get svc,pvc -n redis-cluster
NAME                                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
service/redis-cluster-service          ClusterIP   None           <none>        6379/TCP,16379/TCP   113m
service/redis-cluster-service-access   NodePort    10.105.72.16   <none>        6379:30202/TCP       113m

NAME                                             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
persistentvolumeclaim/pvc-data-redis-cluster-0   Bound    pvc-2dafa607-4492-45be-9f8b-43344e5c6860   5Gi        RWO            rook-ceph-block   113m
persistentvolumeclaim/pvc-data-redis-cluster-1   Bound    pvc-fb032fcb-2dc1-447a-9307-0922d14d8b41   5Gi        RWO            rook-ceph-block   113m
persistentvolumeclaim/pvc-data-redis-cluster-2   Bound    pvc-51ca237c-ff32-43c1-9710-13b955365641   5Gi        RWO            rook-ceph-block   113m
persistentvolumeclaim/pvc-data-redis-cluster-3   Bound    pvc-2beed7b9-c537-4a95-bf38-5c4213268779   5Gi        RWO            rook-ceph-block   113m
persistentvolumeclaim/pvc-data-redis-cluster-4   Bound    pvc-4699194f-c231-4ebd-90e4-74a2b1dd27db   5Gi        RWO            rook-ceph-block   113m
persistentvolumeclaim/pvc-data-redis-cluster-5   Bound    pvc-11d717d2-6339-4a48-8fe6-1d1671c812ea   5Gi        RWO            rook-ceph-block   113m
初始化集群
kubectl exec -it redis-cluster-0 -n redis-cluster -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -n redis-cluster -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 {end}')

在这里插入图片描述

查看状态
[root@k8s-master-01 rbd]# kubectl get po -n redis-cluster
NAME              READY   STATUS    RESTARTS   AGE
redis-cluster-0   1/1     Running   0          116m
redis-cluster-1   1/1     Running   0          116m
redis-cluster-2   1/1     Running   0          116m
redis-cluster-3   1/1     Running   0          116m
redis-cluster-4   1/1     Running   0          116m
redis-cluster-5   1/1     Running   0          116m
插入数据

set name aaa #增加键值对
写入数据,在所有节点查看,删除节点在查看

删除pod验证
[root@k8s-master-01 rbd]# kubectl delete  po  redis-cluster-3  -n redis-cluster
pod "redis-cluster-3" deleted
[root@k8s-master-01 rbd]# kubectl get po -n redis-cluster
NAME              READY   STATUS              RESTARTS   AGE
redis-cluster-0   1/1     Running             0          122m
redis-cluster-1   1/1     Running             0          122m
redis-cluster-2   1/1     Running             0          122m
redis-cluster-3   0/1     ContainerCreating   0          1s
redis-cluster-4   1/1     Running             0          121m
redis-cluster-5   1/1     Running             0          121m


#检查redis集群信息
 
[root@k8s-master-01 rbd]# kubectl  exec -it redis-cluster-0   -n redis-cluster /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@redis-cluster-0:/data# redis-cli
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2146
cluster_stats_messages_pong_sent:2027
cluster_stats_messages_sent:4173
cluster_stats_messages_ping_received:2022
cluster_stats_messages_pong_received:2145
cluster_stats_messages_meet_received:5
cluster_stats_messages_fail_received:1
cluster_stats_messages_received:4173
127.0.0.1:6379> cluster nodes
afba122a5925350c3880c5548a93b01c9e339aea 10.244.151.140:6379@16379 slave 49ee575fa9904dea02e6ee060ef78343d748fde9 0 1716788126110 2 connected
4814f110f7b2cae0301cd316a0c87be29e048b96 10.244.154.232:6379@16379 myself,master - 0 1716788125000 1 connected 0-5460
76149705c9ae8d2bf8c9dfc40cc3bedb62ea4698 10.244.151.129:6379@16379 master - 0 1716788124608 3 connected 10923-16383
a58ad639640e9d7c61cdd92cfdb62292ad9b9702 10.244.44.241:6379@16379 slave 4814f110f7b2cae0301cd316a0c87be29e048b96 0 1716788126513 1 connected
49ee575fa9904dea02e6ee060ef78343d748fde9 10.244.44.240:6379@16379 master - 0 1716788125000 2 connected 5461-10922
e41aa482662fb70a5147c561fe5f9c325abd9691 10.244.154.234:6379@16379 slave 76149705c9ae8d2bf8c9dfc40cc3bedb62ea4698 0 1716788125908 3 connected
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐