【虹科干货】轻松简化数据库客户端工作,除了Proxy还有谁?

随着业务拓展, 单点 redis 无法满足 越来越高的性能要求 ,但使用 Redis OSS Cluster和Redis Sentine l来解决起问题太过复杂。此时,就需要Redis Enterprise Proxy来保持 数据库操作和维护 的简便性。


大多数开发人员在构建应用程序时, 一般 会从小规模开始,使用简单的 Redis 开源(Redis OSS)数据库。一开始,数据库的使用非常简单 它只有一个 节点 ,仅仅需要应用程序连接到该端点并开始发送请求。

而当 Redis 应用程序需要更多特性 ,如扩展和高可用性, 麻烦就来了 为此,可以使用Redis OSS Cluster和Redis Sentinel来解决这些问题。不过,这需要开发人员维护数据库 拓扑结构并处理实际的扩展问题。 换言之,你必须编写更多代码,而在企业 级应用中 ,这 很快 使应用 会变得更为复杂。

Redis Enterprise 借助 Proxy摆脱了这些额外的工作 ,从而解决 这些复杂性问题。 无论你是从 Enterprise 直接开始,还是从 Redis OSS 迁移而来,我们设计它的目的 是为了让应用程序在大规模 运行 时, 仍然保持 数据库操作和维护 的简便性

一、 Proxy 是什么?

Redis Enterprise Proxy 是应用程序与数据库之间的中介实体, 其延迟很低,甚至可以忽略不计 它只将 数据库端点 提供 给数据库客户端   隐藏 Redis Enterprise 集群的 内部 活动。 这样,开发人员就可以专注于应用程序 数据 使用情况 ,而不必担心数据库拓扑结构的频繁变化。

Proxy 采用多线程架构,可以通过使用更多可用 CPU 内核轻松扩展。它通过使用多路复用和流水线设计来应对高流量。当成千上万的客户端同时连接到 Redis Enterprise 时,代理会将所有传入请求整合到一组内部管道中,并将它们分发到相关的数据库分片 使得最终的请求处理速度大大加快, 同时 实现高吞吐量和低延迟。

 

1:Redis Enterprise 代理在应用程序和数据库之间进行调解

二、 常见 的集群级 情况

让我们来看看导致拓扑变化的几种常见集群级情况。我们将展示如何将这些变化隐藏在 Proxy 之后,使集群向客户端提供的数据库端点 不变   从开发人员的角度来看,这意味着减少 额外的编码,以及 可顺利 Redis OSS 迁移 Redis Enterprise。

1. 扩展

只要数据库分片达到一定(预定义)大小,Redis Enterprise 就能对其进行扩展。扩展是通过启动一个新的 Redis 实例,并将原始分区一半 哈希槽移动到新分区来实现的。这样,数据库的吞吐量和性能就会呈线性增长。

Redis Enterprise 中,有两种扩展数据库的方法:

·  纵向扩展 :在不增加集群节点的情况下,向数据库添加分片。添加分片 需要 集群有足够的容量(内存和 CPU)。

·  横向扩展 :在创建新分片之前,向 Redis Enterprise 集群添加一个(或多个)新节点。 常用在 集群的现有物理资源不足以扩展数据库时。

2. 纵向扩展

下面是一个关于纵向扩展的例子。

 

2:在 Redis Enterprise 中扩展数据库。客户端继续使用相同的数据库端点

2 显示了将单分片数据库扩展为双分片数据库的示例。在 图片 左侧(扩展前),可以看到包含单分片的单节点。在 图片 右侧(扩展完成后),数据库被重新分片。现在,分片 1 和分片 2 位于同一节点,各自拥有一半的哈希槽。

那么, 扩展是否会改变客户端连接数据库的方式? 答案是 不会 ”。客户端会继续像以前一样向相同的数据库端点发送请求,让 Proxy 负责将每个请求转发到相应的分片。

这与 Redis OSS 集群不同,在 Redis   OSS 中,客户端分别连接到每个分片,因此必须了解集群拓扑结构 才能完成扩展

3. 横向扩展

下面是一个关于横向扩展的例子。

 

3:使用多Proxy策略时扩展数据库

相反,如果我们在使用多 Proxy 策略时扩展数据库,会发生什么情况呢?在这种情况下,我们有多个 Proxy 在同一个端点后面运行。

(在   Redis Enterprise 中,也可以通过使用 OSS Cluster API 的形式扩展数据库。 在这种情况下,每个 Proxy 都有自己的端点)

3 显示了将一个双分片数据库扩展到一个四分片数据库。左侧的集群中添加了一个新节点,其中包含一个仍处于非活动状态的 Proxy。扩展完成后,分片 1 和分片 2 位于节点 1,分片 3 和分片 4 位于节点 2。这两个节点现在都包含启用的 Proxy

横向扩展也不会改变客户端连接数据库的方式,因为这些变化对客户端来说都是 透明 ,客户端无需关心集群内部的变化 。数据库继续像以前一样向相同的数据库端点发送请求。处理每个请求的 Proxy 会将这些请求转发给相关的分片。

4. 自动故障转移

Redis Enterprise 实现 高可用性的一个关键 在于 自动故障转移,它依赖于数据复制。当检测到 Redis Enterprise 集群内出现故障时,无论是数据库分片中断还是整个节点失效,集群都能在几秒钟内 实现 自我修复。

修复过程由集群管理器执行,通常会改变集群内的数据库拓扑结构。Proxy 会收到通知,并根据新的拓扑结构进行调整。

而从数据库客户端的角度来看,没有任何变化。客户端将继续使用与以前相同的数据库端点,因为拓扑变化是隐藏在代理之后 内部变化。

 

下面我们来看两个故障转移示例

主分片故障转移

下面是个关于主分片故障转移的例子。

 

4:主分片自动故障转移

4 左侧的主分片位于节点 1,其副本位于节点 2。Proxy 会将所有客户端请求发送到主分片,主分片会 时刻 与其副本同步数据变化。如果出了问题怎么办?

如果主分片发生故障,Redis Enterprise 集群管理器会将副本分片升级为主分片。Proxy 现在会将接收到的请求重定向到新的主分 ,让客户端照常运行。最后一步是创建新的副本分片(如图 4 右侧所示)。

节点故障转移

在本例中,整个节点发生故障,包括主分片和 Proxy 。数据库客户端会断开连接。

不过,一旦 Redis Enterprise 集群管理器完成故障转移过程,客户端就会重新连接到与之前相同的数据库端点,并照常进行操作。从开发人员和操作的角度来看,无需做任何更改,因为群集故障转移机制会将相同的端点分配给不同的代理。

 

5:自动节点故障切换,客户端重新连接到相同的数据库端点

5 展示了节点 1 出现故障时的 故障转移 流程。节点 2 的代理变为启用状态,Redis Enterprise 将副本提升为主节点。数据库现在又可用了,因此客户可以重新连接,而不会察觉到拓扑结构的变化。集群管理器还会找到一个健康的节点(节点 3),Redis Enterprise 会在其中创建一个新的副本分片。

三、用数据说话, Proxy到底有多高效?

Proxy 无疑简化了数据库客户端的工作 但其实现的速度有多快?为了检验它的效率,让我们来看看一些基准数据。

为了对延迟进行基准测试,我们使用了一个单端点 Redis Enterprise Cloud 集群。我们 设计 了一个包含 20% SET(写)和 80% GET(读)命令的常见场景。

我们创建了一个内存限制为 5GB 的数据库,并选择了五个吞吐量目标: 分别为每秒 50K、100K、200K、400K 和 800K 次操作(ops/sec)。对于每种配置,Redis Enterprise Cloud 都会选择合适的云实例来使用,确保集群以最小的成本获得足够的资源。

 

6:p50 延迟基准测试结果

6的 结果 展示 Redis Enterprise 有多快 。在所有目标吞吐量下,该基准 测试 都能 p50延迟 5 0% 的延迟) 保持 亚毫秒级。在某些情况下,它 p99 延迟 9 9% 的延迟) 能达到亚毫秒级。

目标吞吐量 (ops/sec)

客户端连接数

分片数

p50 每连接延迟(msec)

p99 每连接延迟(msec)

50,000

2000

2

0.182

0.317

100,000

2000

4

0.258

0.588

200,000

2000

8

0.325

1.184

400,000

2000

16

0.406

2.791

800,000

2000

32

0.398

2.907

 

 

 


请使用浏览器的分享功能分享到微信等