【redis可高用】在Kubernetes中部署基于Sentinel模式的高可用的redis

1、整体方案

本文中的Redis高可用方案采用Sentinel(哨兵)模式(一个master:M1、两个slave:R2、R3,每个redis节点都有一个Sentinel:S1、S2、S3),Sentinel自身也是一个集群。在reids集群出现故障的时候,会自动进行故障转移,从而保证集群的可用性。

Redis 集群

Sentiel的在redis集群中功能如下所示:

  •  监控:不间断的检查redis master/slave实例否是按照预期正常工作;
  •  通知:当 Redis 实例出现错误的时候,负责通知管理员;
  •  自动故障转移:在master发生故障时,哨兵会开启故障转移处理,将一台slave提升为master;
  •  配置信息:客户端通过Sentinel获取当前Redis master的地址,如果发生故障转移,Sentinel将会提供新的服务器地址。

Sentinel本身是一套分布式系统,它被设计成能够进行多个进程间协同工作的模式,这样的好处如下:

  • 降低错报:多个Sentinel一致明确给定的主机不再可用时,才会执行故障检测,这能够有效降低错报的概率。
  • 高健壮性:即使只有一个Sentinel在正常运行,Redis也是可用的,从而保证系统具有较高的健壮性。

2、场景描述

Sentinel 将对redis集群中的所有redis节点进行监控,并在被监视的redis master(这里为server1)处于下线状态时,自动将某个redis slave升级为新的master。同上,会将其它redis slave设置为新的master节点的slave。

在Server1 掉线后:

升级Server2 为新的主服务器:

3、redis部署

通过执行下面的命令,添加helm stable仓库:


helm repo add bitnami https://charts.bitnami.com/bitnami


通过执行下面的命令,在Kubernetes中部署redis高可用方案:


helm install bitnami-redis –set master.service.type=NodePort –set cluster.enabled=true –set sentinel.enabled=true –set metrics.enabled=true –set password=redis bitnami/redis –namespace=kube-public


其中:

  • 使用的charts为bitnami/redis;
  • 通过设置cluster.enabled为true,启用redis集群模式;
  • 通过设置sentinel.enabled为true,启用哨兵模式;
  • 通过设置metrics.enabled为true,允许指标被外部进行监控;
  • 通过设置master.service.type类型为NodePort,外部应用通过宿主机IP+端口访问redis服务。

4、验证

4.1 获取go-redis客户端

这里go语言客户端对redis进行验证访问,通过执行下面的命令获取go-redis/redis客户端。

go get -u github.com/go-redis/redis

4.2 通过go在redis中连接和创建数据

通过执行cd $GOPATH/src,进入go工作目录中,在此目录目录下创建connect_redis.go文件,此文件内容如下所示。

package main

import (

“fmt”

“github.com/go-redis/redis”

)

func main() {

// 构建连接客户端

client := redis.NewClient(&redis.Options{

Addr: “10.0.33.203:31426”,

Password: “redis”, //no password set

DB: 0, // use default DB

})

ping, err := client.Ping().Result()

fmt.Println(ping, err)

// 创建数据 age=18

err = client.Set(“age”, “18”, 0).Err()

if err != nil {

panic(err)

}

// 获取age键的值

val, err := client.Get(“age”).Result()

if err != nil {

panic(err)

}

fmt.Println(“age”, val)

}

通过执行go run connect_redis.go,客户端会连接redis服务,并创建age=18的键值对数据。

4.3 查看redis中的数据

在这里通过RedisStudio可视化工具查看redis中的数据,此工具可以通过:https://github.com/cinience/RedisStudio/releases 进行下载。

5 基于Prometheus和Grafana进行监控

在部署是设置了metrics.enabled为true,在k8s中对应部署了metrics容器,通过此容器用于获取redis的指标信息,并提供给Prometheus。

5.1 Prometheus配置

在Prometheus的配置文件(/etc/prometheus/prometheus.yml)的最后面增加下面的内容。


– job_name: ‘redis-ha-exporter’

   static_configs:

   – targets: [‘bitnami-redis-metrics.redis-ha:9121’]


并在k8s中重新部署Prometheus。

5.2 导入redis的Grafana DashBoard

在Grafana中导入Redis Dashboard for Prometheus Redis Exporter,通过此DashBoard就能监控redis运行的相关指标。

参考资料

1)Redis Sentinel:https://www.jianshu.com/p/231afa35d937

2)Redis Sentinel Documentation:https://github.com/antirez/redis-doc/blob/master/topics/sentinel.md

3)Redis:https://hub.helm.sh/charts/bitnami/redis


作者简介:季向远,本文版权归原作者所有。微博:ik8s​​​​

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址