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
登录后评论
立即登录 注册