在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像

本文介绍了如何通过 Istio 和 Envoy 实现 Redis Cluster 的数据分片、读写分离和流量镜像,无需修改客户端代码。详细步骤包括部署 Istio、Redis Cluster,以及配置 Envoy Filter。通过这种方法,可以简化客户端与 Redis Cluster 的交互,实现高级流量管理策略。
摘要由CSDN通过智能技术生成

Redis是一个高级的键值存储系统,被广泛使用的微服务架构中。如果我们想要使用Redis进行模式提供的高级特性,则需要对客户端代码进行替换,这带来了应用升级和维护利用Istio和Envoy,我们可以在不修改客户端代码的串行下实现客户端无感知的Redis Cluster数据分片,并提供识别,流量分离和高级流量管理功能。

Redis推测

通过在应用服务器和数据库服务器之间加入一个Redis缓存层,可以减少应用服务器对数据库的大量读取操作,避免数据库服务器在大压力下响应缓慢甚至停止的风险,显着加强整个系统的健壮性。

![](https://img-blog.csdnimg.cn/20201022101642629.png)

在一个小规模的系统中,上图所示的单个 Redis 就可以很好地实现缓存层的功能。当系统中需要缓存的数据量较大时,一个 Redis 服务器无法承担所有应用服务器的缓存需求;同时单个 Redis 实例失效时也会导致大量读请求被直接发送到后端的数据库服务器上,导致数据库服务器瞬时压力超标,影响系统的稳定性。我们可以采用 Redis Cluster 来对缓存数据进行分片,将不同的数据放到不同的 Redis 分片中,以提高 Redis 缓存层的容量能力。在每个 Redis 分片中,还可以采用多个 replica 节点对缓存的读请求进行负载分担,并实现 Redis 的高可用。采用了 Redis Cluster 的系统如下图所示:

从图中可以看到,在 Redis Cluster 模式下,客户端需要根据集群的分片规则将不同 key 的读写操作发送到集群中不同的 Redis 节点上,因此客户端需要了解 Redis Cluster 的拓扑结构,这导致我们无法在不修改客户端的情况下将一个使用 Redis 独立节点模式的应用平滑迁移到 Redis Cluster 上。另外,由于客户端需要了解 Redis Cluster 的内部拓扑,也将导致客户端代码和 Redis Cluster 运维上的耦合,例如要实现读写分离或者流量镜像的话,就需要修改每个客户端的代码并重新部署。

这种场景下,我们可以在应用服务器和 Redis Cluster 之间放置一个 Envoy 代理服务器,由 Envoy 来负责将应用发出的缓存读写请求路由到正确的 Redis 节点上。一个微服务系统中存在大量需要访问缓存服务器的应用进程,为了避免单点故障和性能瓶颈,我们以 Sidecar 的形式为每个应用进程部署一个 Envoy 代理。同时,为了简化对这些代理的管理工作,我们可以采用 Istio 作为控制面来统一对所有 Envoy 代理进行配置,如下图所示:

在本文的后续部分,我们将介绍如何通过 Istio 和 Envoy 来管理 Redis Cluster,实现客户端无感知的数据分区,以及读写分离、流量镜像等高级路由策略。

部署 Istio

Pilot 中已经支持了 Redis 协议,但功能较弱,只能为 Redis 代理配置一个缺省路由,而且不支持 Redis Cluster 模式,无法实现 Redis filter 的数据分片、读写分离、流量镜像等高级流量管理功能。为了让 Istio 可以将 Redis Cluster 相关的配置下发到 Envoy Sidecar 上,我们修改了 EnvoyFilter 配置相关代码,以支持 EnvoyFilter 的 “REPLCAE” 操作。该修改的 PR Implement REPLACE operation for EnvoyFilter patch 已经提交到 Istio 社区,并合入到了主分支中,将在 Istio 后续的版本中发布。

在撰写本文的时候,最新的 Istio 发布版本 1.7.3 中尚未合入该 PR。因此我构建了一个 Pilot 镜像,以启用 EnvoyFilter 的 “REPLACE” 操作。在安装 Istio 时,我们需要在 istioctl 命令中指定采用该 Pilot 镜像,如下面的命令行所示:

$ cd istio-1.7.3/bin
$ ./istioctl install --set components.pilot.hub=zhaohuabing --set components.pilot.tag=1.7.3-enable-ef-replace

备注:如果你采用的 Istio 版本新于 1.7.3,并且已经合入了该 PR,则可以直接采用 Istio 版本中缺省的 Pilot 镜像。

部署 Redis Cluster

请从 https://github.com/zhaohuabing/istio-redis-culster 下载下面示例中需要用到的相关代码:

$ git clone https://github.com/zhaohuabing/istio-redis-culster.git
$ cd istio-redis-culster

我们创建一个 “redis” namespace 来部署本例中的 Redis Cluster。

$ kubectl create ns redis
namespace/redis created

部署 Redis 服务器的 Statefulset 和 Configmap。

$ kubectl apply -f k8s/redis-cluster.yaml -n redis
configmap/redis-cluster created
statefulset.apps/redis-cluster created
service/redis-cluster created

验证 Redis 部署

确认 Redis 节点已经启动并正常运行:

$ kubectl get pod -n redis
NAME              READY   STATUS    RESTARTS   AGE
redis-cluster-0   2/2     Running   0          4m25s
redis-cluster-1   2/2     Running   0          3m56s
redis-cluster-2   2/2     Running   0          3m28s
redis-cluster-3   2/2     Running   0          2m58s
redis-cluster-4   2/2     Running   0          2m27s
redis-cluster-5   2/2     Running   0          117s

创建 Redis Cluster

在上面的步骤中,我们采用 Statefulset 部署了6个 Redis 节点,但目前这6个节点还是相互独立的,并未形成一个集群。下面我们采用 Redis 的 cluster create 命令将这些节点组成一个 Redis Cluster。

$ kubectl exec -it redis-cluster-0 -n redis -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ' -n redis)
Defaulting container name to redis.
Use 'kubectl describe pod/redis-cluster-0 -n redis' to see all of the containers in this pod.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.0.72:6379 to 172.16.0.138:6379
Adding replica 172.16.0.201:6379 to 172.16.1.52:6379
Adding replica 172.16.0.139:6379 to 172.16.1.53:6379
M: 8fdc7aa28a6217b049a2265b87bff9723f202af0 172.16.0.138:6379
   slots:[0-5460] (5461 slots) master
M: 4dd6c1fecbbe4527e7d0de61b655e8b74b411e4c 172.16.1.52:6379
   slots:[5461-10922] (5462 slots) master
M: 0b86a0fbe76cdd4b48434b616b759936ca99d71c 172.16.1.53:6379
   slots:[10923-16383] (5461 slots) master
S: 94b139d247e9274b553c82fbbc6897bfd6d7f693 172.16.0.139:6379
   replicates 0b86a0fbe76cdd4b48434b616b759936ca99d71c
S: e293d25881c3cf6db86034cd9c26a1af29bc585a 172.16.0.72:6379
   replicates 8fdc7aa28a6217b049a2265b87bff9723f202af0
S: ab897de0eca1376558e006c5b0a49f5004252eb6 172.16.0.201:6379
   replicates 4dd6c1fecbbe4527e7d0de61b655e8b74b411e4c
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 messa
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值