KubeSphere 最佳实战:K8s 构建高可用、高性能 Redis 集群实战指南

首发:运维有术。

本指南将逐步引导您完成以下关键任务:

  1. 安装 Redis:使用 StatefulSet 部署 Redis。
  2. 自动或手动配置 Redis 集群:使用命令行工具初始化 Redis 集群。
  3. Redis 性能测试:使用 Redis 自带的 Benchmark 工具进行性能测试。
  4. Redis 图形化管理:安装并配置 RedisInsight。

通过本指南,您将掌握在 K8s 上部署和管理 Redis 集群的必备技能。让我们开始这场 Redis 集群部署之旅。

实战服务器配置(架构1:1复刻小规模生产环境,配置不同)

主机名IPCPU内存系统盘数据盘用途
ksp-registry192.168.9.904840200Harbor 镜像仓库
ksp-control-1192.168.9.914840100KubeSphere/k8s-control-plane
ksp-control-2192.168.9.924840100KubeSphere/k8s-control-plane
ksp-control-3192.168.9.934840100KubeSphere/k8s-control-plane
ksp-worker-1192.168.9.9481640100k8s-worker/CI
ksp-worker-2192.168.9.9581640100k8s-worker
ksp-worker-3192.168.9.9681640100k8s-worker
ksp-storage-1192.168.9.974840400+ElasticSearch/Longhorn/Ceph/NFS
ksp-storage-2192.168.9.984840300+ElasticSearch/Longhorn/Ceph
ksp-storage-3192.168.9.994840300+ElasticSearch/Longhorn/Ceph
ksp-gpu-worker-1192.168.9.10141640100k8s-worker(GPU NVIDIA Tesla M40 24G)
ksp-gpu-worker-2192.168.9.10241640100k8s-worker(GPU NVIDIA Tesla P100 16G)
ksp-gateway-1192.168.9.1032440自建应用服务代理网关/VIP:192.168.9.100
ksp-gateway-2192.168.9.1042440自建应用服务代理网关/VIP:192.168.9.100
ksp-mid192.168.9.1054840100部署在 k8s 集群之外的服务节点(Gitlab 等)
合计15681526002100+

实战环境涉及软件版本信息

  • 操作系统:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • Redis: 7.2.6
  • RedisInsight:2.60

1. 部署方案规划

1.1 部署架构图

1.2 准备持久化存储

本实战环境使用 NFS 作为 K8s 集群的持久化存储,新集群可以参考探索 Kubernetes 持久化存储之 NFS 终极实战指南 部署 NFS 存储。

1.3 前提说明

Redis 集群所有资源部署在命名空间 opsxlab内。

2. 部署 Redis 服务

2.1 创建 ConfigMap

  1. 创建 Redis 配置文件

请使用 vi 编辑器,创建资源清单文件 redis-cluster-cm.yaml,并输入以下内容:

apiVersion: v1
kind: ConfigMap
metadata:name: redis-cluster-config
data:redis-config: |appendonly yesprotected-mode nodir /dataport 6379cluster-enabled yescluster-config-file /data/nodes.confcluster-node-timeout 5000masterauth PleaseChangeMe2024requirepass PleaseChangeMe2024

说明: 配置文件仅启用了密码认证,未做优化,生产环境请根据需要调整。

  1. 创建资源

执行下面的命令,创建 ConfigMap 资源。

kubectl apply -f redis-cluster-cm.yaml -n opsxlab
  1. 验证资源

执行下面的命令,查看 ConfigMap 创建结果。

$ kubectl get cm -n opsxlab
NAME                   DATA   AGE
kube-root-ca.crt       1      100d
redis-cluster-config   1      115s

2.2 创建 Redis

本文使用 StatefulSet 部署 Redis 服务,需要创建 StatefulSet 和 HeadLess 两种资源。

  1. 创建资源清单

请使用 vi 编辑器,创建资源清单文件 redis-cluster-sts.yaml,并输入以下内容:

---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redis-clusterlabels:app.kubernetes.io/name: redis-cluster
spec:serviceName: redis-headlessreplicas: 6selector:matchLabels:app.kubernetes.io/name: redis-clustertemplate:metadata:labels:app.kubernetes.io/name: redis-clusterspec:affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: app.kubernetes.io/nameoperator: Invalues:- redis-clustertopologyKey: kubernetes.io/hostnamecontainers:- name: redisimage: 'redis:7.2.6'command:- "redis-server"args:- "/etc/redis/redis.conf"- "--protected-mode"- "no"- "--cluster-announce-ip"- "$(POD_IP)"env:- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIPports:- name: redis-6379containerPort: 6379protocol: TCPvolumeMounts:- name: configmountPath: /etc/redis- name: redis-cluster-datamountPath: /dataresources:limits:cpu: '2'memory: 4Girequests:cpu: 50mmemory: 500Mivolumes:- name: configconfigMap:name: redis-cluster-configitems:- key: redis-configpath: redis.confvolumeClaimTemplates:- metadata:name: redis-cluster-dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "nfs-sc"resources:requests:storage: 5Gi---
apiVersion: v1
kind: Service
metadata:name: redis-headlesslabels:app.kubernetes.io/name: redis-cluster
spec:ports:- name: redis-6379protocol: TCPport: 6379targetPort: 6379selector:app.kubernetes.io/name: redis-clusterclusterIP: Nonetype: ClusterIP

注意: POD_IP 是重点,如果不配置会导致线上的 POD 重启换 IP 后,集群状态无法自动同步。

  1. 创建资源

执行下面的命令,创建资源。

kubectl apply -f redis-cluster-sts.yaml -n opsxlab
  1. 验证资源

执行下面的命令,查看 StatefulSet、Pod、Service 创建结果。

$ kubectl get sts,pod,svc -n opsxlab
NAME                             READY   AGE
statefulset.apps/redis-cluster   6/6     72sNAME                  READY   STATUS    RESTARTS   AGE
pod/redis-cluster-0   1/1     Running   0          72s
pod/redis-cluster-1   1/1     Running   0          63s
pod/redis-cluster-2   1/1     Running   0          54s
pod/redis-cluster-3   1/1     Running   0          43s
pod/redis-cluster-4   1/1     Running   0          40s
pod/redis-cluster-5   1/1     Running   0          38sNAME                     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/redis-headless   ClusterIP   None         <none>        6379/TCP   36s

2.3 创建 k8s 集群外部访问服务

我们采用 NodePort 方式在 Kubernetes 集群外发布 Redis 服务,指定的端口为 31379

请使用 vi 编辑器,创建资源清单文件 redis-cluster-svc-external.yaml,并输入以下内容:

kind: Service
apiVersion: v1
metadata:name: redis-cluster-externallabels:app: redis-cluster-external
spec:ports:- protocol: TCPport: 6379targetPort: 6379nodePort: 31379selector:app.kubernetes.io/name: redis-clustertype: NodePort
  1. 创建资源

执行下面的命令,创建 Service 资源。

kubectl apply -f redis-cluster-svc-external.yaml -n opsxlab
  1. 验证资源

执行下面的命令,查看 Service 创建结果。

$ kubectl get svc -o wide -n opsxlab
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE     SELECTOR
redis-cluster-external   NodePort    10.233.22.96   <none>        6379:31379/TCP   14s     app.kubernetes.io/name=redis-cluster
redis-headless           ClusterIP   None           <none>        6379/TCP         2m57s   app.kubernetes.io/name=redis-cluster

3. 创建 Redis 集群

Redis POD 创建完成后,不会自动创建 Redis 集群,需要手工执行集群初始化的命令,有自动创建和手工创建两种方式,二选一,建议选择自动

3.1 自动创建 Redis 集群

执行下面的命令,自动创建 3 个 master 和 3 个 slave 的集群,中间需要输入一次 yes。

  • 执行命令
kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster create --cluster-replicas 1 $(kubectl get pods -n opsxlab -l app.kubernetes.io/name=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 {end}')
  • 正确执行后,输出结果如下 :
$ kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster create --cluster-replicas 1 $(kubectl get pods -n opsxlab -l app.kubernetes.io/name=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 {end}')
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.233.96.17:6379 to 10.233.94.214:6379
Adding replica 10.233.68.250:6379 to 10.233.96.22:6379
Adding replica 10.233.94.231:6379 to 10.233.68.251:6379
M: da376da9577b14e4100c87d3acc53aebf57358b7 10.233.94.214:6379slots:[0-5460] (5461 slots) master
M: a3094b24d44430920f9250d4a6d8ce2953852f13 10.233.96.22:6379slots:[5461-10922] (5462 slots) master
M: 185fd2d0bbb0cd9c01fa82fa496a1082f16b9ce0 10.233.68.251:6379slots:[10923-16383] (5461 slots) master
S: 9ce470afe3490662fb1670ba16fad2e87e02b191 10.233.94.231:6379replicates 185fd2d0bbb0cd9c01fa82fa496a1082f16b9ce0
S: b57fb0717160eab39ccd67f6705a592bd5482429 10.233.96.17:6379replicates da376da9577b14e4100c87d3acc53aebf57358b7
S: bed82c46554a0ebf638117437d884c01adf1003f 10.233.68.250:6379replicates a3094b24d44430920f9250d4a6d8ce2953852f13
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 10.233.94.214:6379)
M: da376da9577b14e4100c87d3acc53aebf57358b7 10.233.94.214:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 9ce470afe3490662fb1670ba16fad2e87e02b191 10.233.94.231:6379slots: (0 slots) slavereplicates 185fd2d0bbb0cd9c01fa82fa496a1082f16b9ce0
S: b57fb0717160eab39ccd67f6705a592bd5482429 10.233.96.17:6379slots: (0 slots) slavereplicates da376da9577b14e4100c87d3acc53aebf57358b7
M: a3094b24d44430920f9250d4a6d8ce2953852f13 10.233.96.22:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: bed82c46554a0ebf638117437d884c01adf1003f 10.233.68.250:6379slots: (0 slots) slavereplicates a3094b24d44430920f9250d4a6d8ce2953852f13
M: 185fd2d0bbb0cd9c01fa82fa496a1082f16b9ce0 10.233.68.251:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

3.2 手动创建 Redis 集群

手动配置 3 个 Master 和 3 个 Slave 的集群(此步骤只为了记录手动配置集群的过程,实际环境建议用自动创建的方式)。

一共创建了 6 个 Redis pod,集群主-> 从配置的规则为 0->3,1->4,2->5。

由于命令太长,配置过程中,没有采用自动获取 IP 的方式,使用手工查询 pod IP 并进行相关配置。

  • 查询 Redis pod 分配的 IP
$ kubectl get pods -n opsxlab -o wide | grep redis
redis-cluster-0   1/1     Running   0          18s   10.233.94.233   ksp-worker-1   <none>           <none>
redis-cluster-1   1/1     Running   0          16s   10.233.96.29    ksp-worker-3   <none>           <none>
redis-cluster-2   1/1     Running   0          13s   10.233.68.255   ksp-worker-2   <none>           <none>
redis-cluster-3   1/1     Running   0          11s   10.233.94.209   ksp-worker-1   <none>           <none>
redis-cluster-4   1/1     Running   0          8s    10.233.96.23    ksp-worker-3   <none>           <none>
redis-cluster-5   1/1     Running   0          5s    10.233.68.4     ksp-worker-2   <none>           <none>
  • 创建 3 个 Master 节点的集群
# 下面的命令中,三个 IP 地址分别为 redis-cluster-0 redis-cluster-1 redis-cluster-2 对应的IP, 中间需要输入一次yes$ kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster create 10.233.94.233:6379 10.233.96.29:6379 10.233.68.255:6379Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 1f4df418ac310b6d14a7920a105e060cda58275a 10.233.94.233:6379slots:[0-5460] (5461 slots) master
M: bd1a8e265fa78e93b456b9e59cbefc893f0d2ab1 10.233.96.29:6379slots:[5461-10922] (5462 slots) master
M: 149ffd5df2cae9cfbc55e3aff69c9575134ce162 10.233.68.255:6379slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 10.233.94.233:6379)
M: 1f4df418ac310b6d14a7920a105e060cda58275a 10.233.94.233:6379slots:[0-5460] (5461 slots) master
M: bd1a8e265fa78e93b456b9e59cbefc893f0d2ab1 10.233.96.29:6379slots:[5461-10922] (5462 slots) master
M: 149ffd5df2cae9cfbc55e3aff69c9575134ce162 10.233.68.255:6379slots:[10923-16383] (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  • 为每个 Master 添加 Slave 节点(共三组
# 第一组 redis0 -> redis3
kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster add-node 10.233.94.209:6379 10.233.94.233:6379 --cluster-slave --cluster-master-id 1f4df418ac310b6d14a7920a105e060cda58275a# 参数说明
# 10.233.94.233:6379 任意一个 master 节点的 ip 地址,一般用 redis-cluster-0 的 IP 地址
# 10.233.94.209:6379 添加到某个 Master 的 Slave 节点的 IP 地址
# --cluster-master-id 添加 Slave 对应 Master 的 ID,如果不指定则随机分配到任意一个主节点
  • 正确执行后,输出结果如下 :(以第一组 0->3 为例
$ kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster add-node 10.233.94.209:6379 10.233.94.233:6379 --cluster-slave --cluster-master-id 1f4df418ac310b6d14a7920a105e060cda58275aWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 10.233.94.209:6379 to cluster 10.233.94.233:6379
>>> Performing Cluster Check (using node 10.233.94.233:6379)
M: 1f4df418ac310b6d14a7920a105e060cda58275a 10.233.94.233:6379slots:[0-5460] (5461 slots) master
M: bd1a8e265fa78e93b456b9e59cbefc893f0d2ab1 10.233.96.29:6379slots:[5461-10922] (5462 slots) master
M: 149ffd5df2cae9cfbc55e3aff69c9575134ce162 10.233.68.255:6379slots:[10923-16383] (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.233.94.209:6379 to make it join the cluster.
Waiting for the cluster to join>>> Configure node as replica of 10.233.94.233:6379.
[OK] New node added correctly.
  • 依次执行另外两组的配置(结果略)
# 第二组 redis1 -> redis4
kubectl exec -it -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster add-node 10.233.96.23:6379 10.233.94.233:6379 --cluster-slave --cluster-master-id bd1a8e265fa78e93b456b9e59cbefc893f0d2ab1# 第三组 redis2 -> redis5
kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster add-node 10.233.68.4:6379 10.233.94.233:6379 --cluster-slave --cluster-master-id 149ffd5df2cae9cfbc55e3aff69c9575134ce162

3.3 验证集群状态

  • 执行命令
kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster check $(kubectl get pods -n opsxlab -l app.kubernetes.io/name=redis-cluster -o jsonpath='{range.items[0]}{.status.podIP}:6379{end}')
  • 正确执行后,输出结果如下 :
$ kubectl exec -it redis-cluster-0 -n opsxlab -- redis-cli -a PleaseChangeMe2024 --cluster check $(kubectl get pods -n opsxlab -l app.kubernetes.io/name=redis-cluster -o jsonpath='{range.items[0]}{.status.podIP}:6379{end}')Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.233.94.233:6379 (1f4df418...) -> 0 keys | 5461 slots | 1 slaves.
10.233.68.255:6379 (149ffd5d...) -> 0 keys | 5461 slots | 1 slaves.
10.233.96.29:6379 (bd1a8e26...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.233.94.233:6379)
M: 1f4df418ac310b6d14a7920a105e060cda58275a 10.233.94.233:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 577675e83c2267d625bf7b408658bfa8b5690feb 10.233.96.23:6379slots: (0 slots) slavereplicates bd1a8e265fa78e93b456b9e59cbefc893f0d2ab1
M: 149ffd5df2cae9cfbc55e3aff69c9575134ce162 10.233.68.255:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 288bd84283237dcfaa7f27f1e1d0148488649d97 10.233.68.4:6379slots: (0 slots) slavereplicates 149ffd5df2cae9cfbc55e3aff69c9575134ce162
M: bd1a8e265fa78e93b456b9e59cbefc893f0d2ab1 10.233.96.29:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: a5fc4eeebb4c345d783f7b9d2b8695442e4cdf07 10.233.94.209:6379slots: (0 slots) slavereplicates 1f4df418ac310b6d14a7920a105e060cda58275a
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4. 集群功能测试

4.1 压力测试

使用 Redis 自带的压力测试工具,测试 Redis 集群是否可用,并简单测试性能。

测试 set 场景:

使用 set 命令,发送100000次请求,每个请求包含一个键值对,其中键是随机生成的,值的大小是100字节,同时有20个客户端并发执行。

$ kubectl exec -it redis-cluster-0 -n opsxlab -- redis-benchmark -h 192.168.9.91 -p 31379 -a PleaseChangeMe2024 -t set -n 100000 -c 20 -d 100 --cluster
Cluster has 3 master nodes:Master 0: dd42f52834303001a9e4c3036164ab0a11d4f3e1 10.233.94.243:6379
Master 1: e263c18891f96b6af4a4a7d842d8099355ec4654 10.233.96.41:6379
Master 2: 59944b8a38ecf0da5c1940676c9f7ac7fd9a926c 10.233.68.3:6379====== SET ======100000 requests completed in 1.50 seconds20 parallel clients100 bytes payloadkeep alive: 1cluster mode: yes (3 masters)node [0] configuration:save: 3600 1 300 100 60 10000appendonly: yesnode [1] configuration:save: 3600 1 300 100 60 10000appendonly: yesnode [2] configuration:save: 3600 1 300 100 60 10000appendonly: yesmulti-thread: yesthreads: 3Latency by percentile distribution:
0.000% <= 0.039 milliseconds (cumulative count 32)
50.000% <= 0.183 milliseconds (cumulative count 50034)
75.000% <= 0.311 milliseconds (cumulative count 76214)
87.500% <= 0.399 milliseconds (cumulative count 87628)
93.750% <= 0.495 milliseconds (cumulative count 94027)
96.875% <= 0.591 milliseconds (cumulative count 96978)
98.438% <= 0.735 milliseconds (cumulative count 98440)
99.219% <= 1.071 milliseconds (cumulative count 99219)
99.609% <= 1.575 milliseconds (cumulative count 99610)
99.805% <= 2.375 milliseconds (cumulative count 99805)
99.902% <= 3.311 milliseconds (cumulative count 99903)
99.951% <= 5.527 milliseconds (cumulative count 99952)
99.976% <= 9.247 milliseconds (cumulative count 99976)
99.988% <= 11.071 milliseconds (cumulative count 99988)
99.994% <= 22.751 milliseconds (cumulative count 99994)
99.997% <= 23.039 milliseconds (cumulative count 99997)
99.998% <= 23.119 milliseconds (cumulative count 99999)
99.999% <= 23.231 milliseconds (cumulative count 100000)
100.000% <= 23.231 milliseconds (cumulative count 100000)Cumulative distribution of latencies:
17.186% <= 0.103 milliseconds (cumulative count 17186)
55.606% <= 0.207 milliseconds (cumulative count 55606)
74.870% <= 0.303 milliseconds (cumulative count 74870)
88.358% <= 0.407 milliseconds (cumulative count 88358)
94.386% <= 0.503 milliseconds (cumulative count 94386)
97.230% <= 0.607 milliseconds (cumulative count 97230)
98.247% <= 0.703 milliseconds (cumulative count 98247)
98.745% <= 0.807 milliseconds (cumulative count 98745)
98.965% <= 0.903 milliseconds (cumulative count 98965)
99.148% <= 1.007 milliseconds (cumulative count 99148)
99.254% <= 1.103 milliseconds (cumulative count 99254)
99.358% <= 1.207 milliseconds (cumulative count 99358)
99.465% <= 1.303 milliseconds (cumulative count 99465)
99.532% <= 1.407 milliseconds (cumulative count 99532)
99.576% <= 1.503 milliseconds (cumulative count 99576)
99.619% <= 1.607 milliseconds (cumulative count 99619)
99.648% <= 1.703 milliseconds (cumulative count 99648)
99.673% <= 1.807 milliseconds (cumulative count 99673)
99.690% <= 1.903 milliseconds (cumulative count 99690)
99.734% <= 2.007 milliseconds (cumulative count 99734)
99.755% <= 2.103 milliseconds (cumulative count 99755)
99.883% <= 3.103 milliseconds (cumulative count 99883)
99.939% <= 4.103 milliseconds (cumulative count 99939)
99.945% <= 5.103 milliseconds (cumulative count 99945)
99.959% <= 6.103 milliseconds (cumulative count 99959)
99.966% <= 7.103 milliseconds (cumulative count 99966)
99.974% <= 9.103 milliseconds (cumulative count 99974)
99.986% <= 10.103 milliseconds (cumulative count 99986)
99.989% <= 11.103 milliseconds (cumulative count 99989)
99.993% <= 12.103 milliseconds (cumulative count 99993)
99.998% <= 23.103 milliseconds (cumulative count 99998)
100.000% <= 24.111 milliseconds (cumulative count 100000)Summary:throughput summary: 66533.60 requests per secondlatency summary (msec):avg       min       p50       p95       p99       max0.243     0.032     0.183     0.519     0.927    23.231

其它场景(结果略)

  • ping
kubectl exec -it redis-cluster-0 -n opsxlab -- redis-benchmark -h 192.168.9.91 -p 31379 -a PleaseChangeMe2024 -t ping -n 100000 -c 20 -d 100 --cluster
  • get
kubectl exec -it redis-cluster-0 -n opsxlab -- redis-benchmark -h 192.168.9.91 -p 31379 -a PleaseChangeMe2024 -t get -n 100000 -c 20 -d 100 --cluster

4.2 故障切换测试

测试前查看集群状态(以一组 Master/Slave 为例)

......
M: e6b176bc1d53bac7da548e33d5c61853ecbe1890 10.233.96.51:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: e7f5d965fc592373b01b0a0b599f00b8883cdf7d 10.233.68.1:6379slots: (0 slots) slavereplicates e6b176bc1d53bac7da548e33d5c61853ecbe1890
  1. 测试场景1: 手动删除一个 Master 的 Slave,观察 Slave Pod 是否会自动重建并加入原有 Master。

删除 Slave 后,查看集群状态。

......
M: e6b176bc1d53bac7da548e33d5c61853ecbe1890 10.233.96.51:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: e7f5d965fc592373b01b0a0b599f00b8883cdf7d 10.233.68.8:6379slots: (0 slots) slavereplicates e6b176bc1d53bac7da548e33d5c61853ecbe1890

结果: 原有 Slave IP 为 10.233.68.1,删除后自动重建,IP 变更为 10.233.68.8,并自动加入原有的 Master。

  1. 测试场景2: 手动删除 Master ,观察 Master Pod 是否会自动重建并重新变成 Master。

删除 Master 后,查看集群状态。

......
M: e6b176bc1d53bac7da548e33d5c61853ecbe1890 10.233.96.68:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: e7f5d965fc592373b01b0a0b599f00b8883cdf7d 10.233.68.8:6379slots: (0 slots) slavereplicates e6b176bc1d53bac7da548e33d5c61853ecbe1890

结果: 原有 Master IP 为 10.233.96.51,删除后自动重建, IP 变更为 10.233.96.68,并重新变成 Master

以上测试内容,仅是简单的故障切换测试,生产环境请增加更多的测试场景。

5. 安装管理客户端

大部分开发、运维人员还是喜欢图形化的 Redis 管理工具,所以介绍一下 Redis 官方提供的图形化工具 RedisInsight。

由于 RedisInsight 默认并不提供登录验证功能,因此,在系统安全要求比较高的环境会有安全风险,请慎用!个人建议生产环境使用命令行工具

5.1 编辑资源清单

  1. 创建资源清单

请使用 vi 编辑器,创建资源清单文件 redisinsight-deploy.yaml,并输入以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:name: redisinsightlabels:app.kubernetes.io/name: redisinsight
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: redisinsighttemplate:metadata:labels:app.kubernetes.io/name: redisinsightspec:containers:- name: redisinsightimage: registry.opsxlab.cn:8443/redis/redisinsight:2.60ports:- name: redisinsightcontainerPort: 5540protocol: TCPresources:limits:cpu: '2'memory: 4Girequests:cpu: 100mmemory: 500Mi
  1. 创建外部访问服务

我们采用 NodePort 方式在 K8s 集群中对外发布 RedisInsight 服务,指定的端口为 31380

请使用 vi 编辑器,创建资源清单文件 redisinsight-svc-external.yaml,并输入以下内容:

kind: Service
apiVersion: v1
metadata:name: redisinsight-externallabels:app: redisinsight-external
spec:ports:- name: redisinsightprotocol: TCPport: 5540targetPort: 5540nodePort: 31380selector:app.kubernetes.io/name: redisinsighttype: NodePort

5.2 部署 RedisInsight

  1. 创建资源

执行下面的命令,创建 RedisInsight 资源。

kubectl apply -f redisinsight-deploy.yaml -n opsxlab
kubectl apply -f redisinsight-svc-external.yaml -n opsxlab
  1. 验证资源

执行下面的命令,查看 Deployment、Pod、Service 创建结果。

$ kubectl get deploy,pod,svc -n opsxlab

5.3 控制台初始化

打开 RedisInsight 控制台,http://192.168.9.91:31380

进入默认配置页面,只勾选最后一个按钮,点击 Submit

添加 Redis 数据库: 点击「Add Redis database」。

选择「Add Database Manually」,按提示填写信息。

  • Host: 填写 K8s 集群任意节点IP,这里使用 Control-1 节点的 IP

  • Port: Redis 服务对应的 Nodeport 端口

  • Database Alias: 随便写,就是一个标识

  • Password: 连接 Redis 的密码

点击「Test Connection」,验证 Redis 是否可以连接。确认无误后,点击「Add Redis Database」。

5.4 控制台概览

下面用几张图简单展示一下 RedisInsight v2.60 版本管理控制台的功能,总体感觉管理功能比 V1 版本少了很多。

在 Redis Databases 列表页,点击新添加的 Redis 数据库,进入 Redis 管理页面。

  • 概览

  • Workbench(可以执行 Redis 管理命令)

  • Analytics

  • Pub-Sub

更多管理功能请自行摸索。

免责声明:

  • 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境由此引发的任何问题,作者概不负责

近期活动推荐

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02 python基础 python解释器安装

首先在网站&#xff1a;Welcome to Python.org进行下载安装python 最新的解释器不一定是最好的&#xff0c;最稳定的才一定是最好的&#xff1b;要关注解释器最后维护 的时间。 一、python的安装 python安装的时候一定要在下载勾选好添加path环境 安装的时候尽量选择好自己的安…

java编程开发基础,正则表达式的使用案例Demo

java编程开发基础,正则表达式的使用案例Demo!实际开发中&#xff0c;经常遇到一些字符串&#xff0c;信息的裁剪和提取操作&#xff0c;正则表达式是经常使用的&#xff0c;下面的案例&#xff0c;可以帮助大家快速的了解和熟悉&#xff0c;正则表达式的使用技巧。 package com…

Windows Pycharm 远程 Spark 开发 PySpark

一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接&#xff0c;连接虚拟机&#xff0c;选择项目目录即可远程开发

WebGL进阶(十一)层次模型

理论基础&#xff1a; 效果&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vie…

【H2O2|全栈】JS进阶知识(九)ES6(5)

目录 前言 开篇语 准备工作 class类 概念 形式 直接继承 概念 优点 案例 重写 概念 案例 关于重载 结束语 前言 开篇语 本系列博客主要分享JavaScript的进阶语法知识&#xff0c;本期为第九期&#xff0c;依然围绕ES6的语法进行展开。 本期内容为&#xff1a…

Prompting LLMs to Solve Complex Tasks: A Review

文章目录 题目简介任务分解未来方向结论 题目 促使 LLM 解决复杂任务&#xff1a; 综述 论文地址&#xff1a;https://www.intjit.org/cms/journal/volume/29/1/291_3.pdf 简介 大型语言模型 (LLM) 的最新趋势显而易见&#xff0c;这体现在大型科技公司的投资以及媒体和在线社…

学会Lambda,让程序Pythonic一点

Lambda是Python里的高阶用法&#xff0c;要把代码写得Pythonic&#xff0c;就需要了解这些高阶用法&#xff0c;想说自己是一名真正的Python程序员&#xff0c;先要把代码写得Pythonic。 今天聊下Lambda的用法&#xff0c;写篇简短的用法说明。 Lambda是匿名函数的意思&#…

加速科技精彩亮相中国国际半导体博览会IC China 2024

11月18日—20日&#xff0c;第二十一届中国国际半导体博览会&#xff08;IC China 2024&#xff09;在北京国家会议中心顺利举办&#xff0c;加速科技携重磅产品及全系测试解决方案精彩亮相&#xff0c;加速科技创始人兼董事长邬刚受邀在先进封装创新发展论坛与半导体产业前沿与…

window11编译pycdc.exe

一、代码库和参考链接 在对python打包的exe文件进行反编译时&#xff0c;会使用到uncompyle6工具&#xff0c;但是这个工具只支持python3.8及以下&#xff0c;针对更高的版本的python则不能反编译。 关于反编译参考几个文章&#xff1a; Python3.9及以上Pyinstaller 反编译教…

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)

深度极限学习机 (DELM) 作为一种新型的深度学习算法&#xff0c;凭借其独特的结构和训练方式&#xff0c;在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用&#xff0c;深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…

前端-react(class组件和Hooks)

文章主要以Hooks为主,部分涉及class组件方法进行对比 一.了解react 1.管理组件的方式 在React中&#xff0c;有两种主要的方式来管理组件的状态和生命周期&#xff1a;Class 组件和 Hooks。 Class 组件&#xff1a; Class 组件是 React 最早引入的方式&#xff0c;它是基于…

Ollama vs VLLM:大模型推理性能全面测评!

最近在用本地大模型跑实验&#xff0c;一开始选择了ollama,分别部署了Qwen2.5-14B和Qwen2.5-32B&#xff0c;发现最后跑出来的实验效果很差&#xff0c;一开始一直以为prompt的问题&#xff0c;尝试了不同的prompt&#xff0c;最后效果还是一直不好。随后尝试了vllm部署Qwen2.5…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

【PCIE常见面试问题-1】

PCIE常见面试问题-1 1 PCIE概述1.1 PCI为何发展开PCIE&#xff1f;1.2 什么是Root Complex(RC)1.3 什么是EP&#xff1f;1.4 什么是Swith1.5 PCIE协议如何组织通信的&#xff1f;1.6 简要介绍一下PCIE的分层结构&#xff0c;为什么需要分层&#xff1f;1.7 PCIE的事务类型有哪些…

解决 Docker Desktop 启动报错:Docker Desktop is unable to detect a Hypervisor

在使用 Docker Desktop 时&#xff0c;有时会遇到启动报错&#xff1a;“Docker Desktop is unable to detect a Hypervisor.” 这是由于系统的虚拟化功能未正确启用或配置导致的。本文将分步骤指导如何解决该问题。 一、检查虚拟化是否已启用 打开任务管理器 按下 Ctrl Shift…

订单日记为“惠采科技”提供全方位的进销存管理支持

感谢温州惠采科技有限责任公司选择使用订单日记&#xff01; 温州惠采科技有限责任公司&#xff0c;成立于2024年&#xff0c;位于浙江省温州市&#xff0c;是一家以从事销售电气辅材为主的企业。 在业务不断壮大的过程中&#xff0c;想使用一种既能提升运营效率又能节省成本…

rust中解决DPI-1047: Cannot locate a 64-bit Oracle Client library问题

我们在使用rust-oracle crate连接oracle进行测试的过程中&#xff0c;会发现无法连接oracle&#xff0c;测试运行过程中抛出“DPI-1047: Cannot locate a 64-bit Oracle Client library”错误。该问题是由于rust-oracle需要用到oracle的动态连接库&#xff0c;我们通过安装orac…

东方通重置管理员密码

百度给出的回答 注意&#xff0c;箭头所指的密码是举例&#xff0c;不是自己的默认密码 自己的默认密码存储在下图位置 原文地址

spark 写入mysql 中文数据 显示?? 或者 乱码

目录 前言 Spark报错&#xff1a; 解决办法&#xff1a; 总结一下&#xff1a; 报错&#xff1a; 解决&#xff1a; 前言 用spark写入mysql中&#xff0c;查看中文数据 显示?? 或者 乱码 Spark报错&#xff1a; Sat Nov 23 19:15:59 CST 2024 WARN: Establishing SSL…

电子应用设计方案-20:智能电冰箱系统方案设计

智能电冰箱系统方案设计 一、系统概述 本智能电冰箱系统旨在提供更便捷、高效、智能化的食品存储和管理解决方案&#xff0c;通过集成多种传感器、智能控制技术和联网功能&#xff0c;实现对冰箱内部环境的精确监测和控制&#xff0c;以及与用户的互动和远程管理。 二、系统组成…