释放双眼,带上耳机,听听看~!
当我们面对海量数据那么必然需要使用Redis Cluster集群,同时还需要具有高可用(主从复制和哨兵机制)能力,即每个master分片节点还需要有slave节点,这是分布式系统中典型的纵向扩展(Redis集群分片技术)的架构
文章目录
🤖 由 ChatGPT 生成的文章摘要
软件 | 版本 | 注解 | |
---|---|---|---|
helm | v3.4.0 | ||
Kubernetes | v1.24.0 | ||
Redis Cluster | 7.0.11 | ||
Chart | 8.6.4 |
添加Helm chart
[root@k8s-01 ~]]# helm repo add bitnami https://charts.bitnami.com/bitnami
查询 Redis 资源
[root@k8s-01 ~]# helm search repo redis
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/redis 17.11.6 7.0.11 Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster 8.6.4 7.0.11 Redis(R) is an open source, scalable, distribut...
拉取 chart 到本地
#拉取最新
helm pull bitnami/redis-cluster
#选择版本拉取
helm pull bitnami/redis-cluster --version 8.6.4
- 默认拉取完毕就是
redis-cluster-8.6.4.tgz
解压helm包
tar xf redis-cluster-8.6.4.tgz
数据存储需要创建sc,我这里有默认的sc就不创建,例子如下
[root@k8s-01 nfs]# cat sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "true"
name: nfs-storage
provisioner: nfs-provisioner
volumeBindingMode: Immediate
#我这里是nfs的sc,我们将nfs sc设置为默认存储后,后面就不需要在修改value.yaml中的sc
如果不想使用nfs sc,就自行创建其它存储类型的sc
[root@k8s-01 ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage (default) nfs-provisioner Delete Immediate false 48d
修改Values.yaml
cd redis-cluster/
vim values.yaml
storageClass: "" #前面设置了默认的sc,如果不想使用默认sc,这里可以额外填写
redis:
password: "redis123" #Redis密码
service:
## @param service.ports.redis Kubernetes Redis service port
##
ports:
redis: 6379 # 定义Cluster redis 服务端口
#下面的探测时间不修改,第一次启动的时候会让Redis Cluster自动重启
redis:
livenessProbe: # 修改了 livenessProbe 的探测时间
enabled: true
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 10
successThreshold: 1
failureThreshold: 5
readinessProbe: # 修改了 readinessProbe 的探测时间
enabled: true
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 10
successThreshold: 1
failureThreshold: 5
startupProbe: # 修改了 startupProbe 的探测时间
enabled: false
path: /
initialDelaySeconds: 300
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 6
successThreshold: 1
metrics: #redis metrics,可以选择开启,会自动为我们创建一个Export
## @param metrics.enabled Start a side-car prometheus exporter
##
enabled: false
cluster:
## nodes:是包括副本在内的节点总数。
## 这意味着将有 3 个主节点和 3 个副本节点
##(由于 replicas 默认设置为 1,每个主节点将有 1 个副本)。
## 因此,nodes = numberOfMasterNodes + numberOfMasterNodes * replicas
nodes: 6
replicas: 1
...
#其它参数可以自行修改
创建Redis Cluster集群
[root@k8s-01 redis-cluster]# cd redis-cluster
[root@k8s-01 redis-cluster]# kubectl create ns redis
[root@k8s-01 redis-cluster]# helm install redis-cluster -n redis .
NAME: redis-cluster
LAST DEPLOYED: Tue Jun 27 14:31:38 2023
NAMESPACE: redis
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis-cluster
CHART VERSION: 8.6.4
APP VERSION: 7.0.11** Please be patient while the chart is being deployed **
To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace "redis" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d)
You have deployed a Redis® Cluster accessible only from within you Kubernetes Cluster.INFO: The Job to create the cluster will be created.To connect to your Redis® cluster:
1. Run a Redis® pod that you can use as a client:
kubectl run --namespace redis redis-cluster-client --rm --tty -i --restart='Never' \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image docker.io/bitnami/redis-cluster:7.0.11-debian-11-r21 -- bash
2. Connect using the Redis® CLI:
redis-cli -c -h redis-cluster -a $REDIS_PASSWORD
创建完成后可以使用下面的命令查看helm集群
[root@k8s-01 ~]# helm -n redis list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
redis-cluster redis 1 2023-06-27 14:31:38.202235845 +0800 CST deployed redis-cluster-8.6.4 7.0.11
检查Pod状态
[root@k8s-01 ~]# kubectl get pod -n redis
NAME READY STATUS RESTARTS AGE
redis-cluster-0 1/1 Running 1 (102m ago) 103m
redis-cluster-1 1/1 Running 1 (102m ago) 103m
redis-cluster-2 1/1 Running 1 (102m ago) 103m
redis-cluster-3 1/1 Running 1 (102m ago) 103m
redis-cluster-4 1/1 Running 1 (102m ago) 103m
redis-cluster-5 1/1 Running 1 (102m ago) 103m
检查svc
[root@k8s-01 ~]# kubectl get svc -n redis
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-cluster ClusterIP 10.96.64.112 <none> 6379/TCP 103m
redis-cluster-headless ClusterIP None <none> 6379/TCP,16379/TCP 103m
[root@k8s-01 ~]#
集群内部访问
默认 redis-cluster-0 和 redis-cluster-1 为主从,0主1从
默认 redis-cluster-2 和 redis-cluster-3 为主从,0主1从
默认 redis-cluster-4 和 redis-cluster-5 为主从,0主1从
所以集群主节点为:redis-cluster-0 redis-cluster-2 redis-cluster-4
所以集群从节点为:redis-cluster-1 redis-cluster-3 redis-cluster-5
访问测试
我这里直接在node节点上使用redis-cli测试,当然也可以像上面那样启动一个容器来测试
[root@k8s-node2 ~]# redis-cli -c -h 10.96.64.112 -p 6379 -a redis123
#这里的IP我采用的是Cluster IP
10.96.64.112 :6379> KEYS *
1) "ab"
2) "jjj"
查看集群信息
cluster info
cluster nodes
创建Redisinsight
RedisInsight 是一个直观且高效的 Redis GUI,允许您与数据库交互并管理数据 - 内置对 Redis 模块的支持。
RedisInsight 亮点:
- 浏览、过滤、可视化您的键值 Redis 数据结构并查看不同格式的键值(包括 JSON、Hex、ASCII 等)
- 对列表、哈希、字符串、集合、排序集和流的 CRUD 支持
- RedisJSON的 CRUD 支持
- Profiler - 实时分析发送到 Redis 的每条命令
- SlowLog - 基于Slowlog命令分析Redis实例中的慢操作
- Pub/Sub - 支持Redis pub/sub,支持订阅频道并向频道发布消息
- 批量操作 - 根据浏览器或树视图中设置的过滤器批量删除键
- Workbench 简介 - 先进的命令行界面,具有智能命令自动完成、复杂数据可视化和对原始模式的支持
- 命令自动完成支持RediSearch、RedisJSON、RedisGraph、RedisTimeSeries、RedisAI
- RediSearch索引、查询和聚合的可视化
- 能够构建自己的数据可视化插件
- Redis 功能的内置点击指南
- 正式支持Redis OSS、Redis Cloud。可与 Microsoft Azure Redis 缓存配合使用(即将推出官方支持)。
- 适用于 macOS(包括 M1)、Windows 和 Linux
使用Redisinsight来快速管理Redis集群
cat >>RedisInsight.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: redisinsight
namespace: redis
spec:
replicas: 1
selector:
matchLabels:
app: redisinsight
template:
metadata:
labels:
app: redisinsight
spec:
containers:
- name: redisinsight
image: redislabs/redisinsight:1.12.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8001
volumeMounts:
- name: db
mountPath: /db
volumes:
- name: db
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: redisinsight-service
namespace: redis
spec:
type: NodePort
ports:
- port: 80
targetPort: 8001
nodePort: 31888
selector:
app: redisinsight
EOF
创建redisinsight
kubectl apply -f RedisInsight.yaml
如果需要持久化自行添加即可
默认 http://nodeport IP:31888 访问
redis-cluster-headless.redis.svc.cluster.local
#redis-cluster-headless svc名称
#redis namespace名称
[…] […]