更新时间:2023年4月
文章目录
Redis Cluster 特点
Redis Cluster 使用的是 Gossip 协议进行节点间通信,该协议类似于 P2P 架构中的 Gossip 传播机制
Redis Cluster 特点文档:Redis cluster specification | Redis
Redis Cluster 主要有以下特点:
- 所有 Redis 节点使用 PING 机制互联
- 判断集群中某个节点是否生效,由整个集群中超过半数节点的监测决定。如果超过半数的节点监测都判定某节点失效,则认为某节点真正失效
- 客户端不需要 proxy 既可以直接连接 Redis,应用程序中需要配置有全部的 Redis 服务器 IP
- Redis Cluster 把所有的 Redis Node(Master)平均映射到 0-16383 槽位(slot)上,读写需要到指定的 Redis Node 上操作,因此有多少 Redis Node 相当于 Redis 并发横向扩展了多少倍,每个 Redis Node 承担 16384/N 个槽位
- Redis Cluster 预先分配 16384 个槽位(slot),当需要在 Redis 集群中写入一个 key-value 的时候,会使用
CRC16(key) mod 16384
进行运算,再决定将数据写入哪一个节点
部署 Redis Cluster
构建三主三从的 Redis Cluster
拓扑
Namespaces
$ vim ./ns-redis-demo.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: redis-demo
应用声明
$ kubectl apply -f ns-redis-demo.yaml
StorageClass
$ vim sc-nfs.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-nfs
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
# 回收策略此处使用 删除,实验环境方便测试
reclaimPolicy: Delete
mountOptions:
- soft
- nfsvers=4.2
- noatime # 访问文件时不更新文件 inode 中的时间戳,高并发环境可提高性能
parameters:
# 根据 PVC 的namespace 和 PVC 名称来生成路径
pathPattern: "${.PVC.namespace}/${.PVC.name}"
archiveOnDelete: "true"
应用声明
$ kubectl apply -f sc-nfs.yaml
Service
Headless Service
$ vim hs-redis-cluster
---
apiVersion: v1
kind: Service
metadata:
name: hs-redis-cluster
namespace: redis-demo
labels:
type: headless
spec:
clusterIP: None
selector:
app.kubernetes.io/name: redis-cluster
ports:
- name: client
port: 6379
targetPort: 6379
- name: gossip
port: 16379
targetPort: 16379
应用声明
kubectl apply -f hs-svc-redis-cluster
ConfigMap
$ vim configmap-redis.conf
---
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-redis
namespace: redis-demo