Redis Cluster on K8s性能测试

说明

本测试用于了解Redis Cluster在Kubernetes环境下的性能表现,以及对比Kubernetes环境相比虚机环境的性能差异。

部署环境

Redis集群架构:4主4从,每个实例1GB内存,1个vCPU Core,开启RDB持久化

Redis版本:5.0.8(基于官方redis:5.0.8-alpine镜像)

Kubernetes Pod IP网段: 172.24.29.1/24

压测主机IP网段:172.24.30.1/24

Kubernetes Pod网络采用BGP-calico组网,与虚机网络打通3层互联,物理机网卡网卡带宽为25gbps

Kubernetes主机配置:88C/756G,CentOS Linux release 7.6.1810 64位,Kernel:3.10.0-957.27.2.el7.x86_64,共三台

压测主机配置:8C/32G,CentOS Linux release 7.3.1611 64位,Kernel:3.10.0-514.6.1.el7.x86_64

性能测试工具

选用Redis安装自带的redis-benchmark工具。

Redis Cluster代理配置

由于redis-benchmark无法对Redis Cluster中的所有节点发起连接,因此需要引入一款集群代理工具,我们选择RedisLabs官方推出的Cluster代理产品redis-cluster-proxy,连接池大小设置为20,其它参数保持默认。

测试用例及测试结果

1. 20个客户端并发连接,100,000个GET/SET请求,3 bytes payload:

 

2. 20个客户端并发连接,100,000个GET/SET请求,64 bytes payload:

 

3. 50个客户端并发连接,1,000,000个GET/SET请求,3 bytes payload:

  

4. 50个客户端并发连接,1,000,000个GET/SET请求,128 bytes payload:

  

5. 50个客户端并发连接,1,000,000个GET/SET请求,8k bytes payload: 

  

6. 单节点,20个客户端并发连接,100,000个GET/SET请求,64 bytes payload:

  

7. 单节点,20个客户端并发连接,100,000个GET/SET请求,64 bytes payload,Redis实例与测试程序同在一台主机

 

执行时间及吞吐量对比(Pod vs VM)

 

图1: 横坐标为测试编号,纵坐标为测试执行时间(秒);      图2: 横坐标为测试编号,纵坐标为每秒执行请求数。

结论

  1. 总体对比,基于BGP-calico组网的K8s容器环境与虚机环境下Redis Cluster性能十分接近;
  2. 虚机环境下绝大部分请求都在1ms内返回响应,因而具有相对更高吞吐量(payload不大时,相比容器环境);
  3. K8s容器环境下请求响应时间更稳定(最快与最慢执行时间更接近,GET与SET操作执行时间更接近);
  4. 客户端连接较少(50以下)、payload较小(1k以下)时,Kubernetes环境下的Redis Cluster相比虚机环境约有1/3的性能损耗;
  5. 客户端连接较多时(50及以上),Kubernetes环境下的Redis Cluster性能接近虚机环境下的表现;
  6. payload较大时(8k及以上),Kubernetes环境下的Redis Cluster性能表现优于虚机环境下的表现;
  7. 网络带宽是限制Redis性能非常重要的因素。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Kubernetes 上部署 Redis Cluster 集群,可以按照以下步骤进行: 1. 创建 Redis ConfigMap 首先,需要创建一个 Redis 配置文件 ConfigMap。可以使用以下命令创建: ``` kubectl create configmap redis-conf --from-file=redis.conf ``` 其中,`redis.conf` 是 Redis 配置文件的名称。可以根据实际情况进行修改。 2. 创建 Redis StatefulSet 接下来,可以创建 Redis StatefulSet。可以使用以下 YAML 文件作为模板: ``` apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 6 selector: matchLabels: app: redis-cluster template: metadata: labels: app: redis-cluster spec: containers: - name: redis image: redis:6.0.9 ports: - containerPort: 6379 name: client - containerPort: 16379 name: gossip volumeMounts: - name: config mountPath: /usr/local/etc/redis/redis.conf subPath: redis.conf command: - sh - -c - | if [ -n "${POD_NAME}" ]; then sed -i "s/%cluster-name%/redis-cluster/g" /usr/local/etc/redis/redis.conf sed -i "s/%node-name%/${POD_NAME}/g" /usr/local/etc/redis/redis.conf fi volumes: - name: config configMap: name: redis-conf volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi ``` 在上述 YAML 文件中,`replicas` 字段指定了 Redis 集群的节点数,`volumeClaimTemplates` 字段指定了每个节点的数据卷大小。另外,还需要注意以下几点: - `serviceName` 字段需要与 `metadata.name` 字段相同。 - `selector.matchLabels` 字段需要与 `metadata.labels` 字段相同。 - `command` 字段用于修改 Redis 配置文件中的节点名称和集群名称。 3. 创建 Redis Service 最后,需要创建 Redis Service。可以使用以下 YAML 文件作为模板: ``` apiVersion: v1 kind: Service metadata: name: redis-cluster labels: app: redis-cluster spec: ports: - name: client port: 6379 targetPort: 6379 - name: gossip port: 16379 targetPort: 16379 clusterIP: None selector: app: redis-cluster ``` 在上述 YAML 文件中,`clusterIP` 字段需要设置为 `None`,以便创建一个 Headless Service,让每个 Redis 节点可以通过 DNS 解析到自己的 IP 地址。 4. 部署 Redis Cluster 完成以上步骤后,可以使用以下命令部署 Redis Cluster: ``` kubectl apply -f redis-cluster.yaml ``` 其中,`redis-cluster.yaml` 是包含 Redis StatefulSet 和 Redis Service 的 YAML 文件。可以根据实际情况进行修改。 部署完成后,可以使用以下命令查看 Redis Cluster 的状态: ``` kubectl exec -it redis-cluster-0 -- redis-cli cluster nodes ``` 其中,`redis-cluster-0` 是 Redis Cluster 中的一个节点名称。可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值