亚马逊AWS官方博客
条条大路通罗马 —— 使用redisson连接Amazon ElastiCache for redis 集群
1. 前言
Amazon ElastiCache 是一种 Web 服务,可让用户在云中轻松设置、管理和扩展分布式内存数据存储或缓存环境。它可以提供高性能、可扩展且具有成本效益的缓存解决方案。同时,它可以帮助消除与部署和管理分布式缓存环境相关的复杂性。
ElastiCache for Redis集群是一个或多个缓存节点的集合,其中所有节点都运行 Redis 缓存引擎软件的实例。ElastiCache for Redis启用集群模式比之禁用集群模式拥有更好的可扩展性尤其是写入可扩展性,更强的高可用性以及更高的资源上限,因而现在越来越多的客户选择ElastiCache for Redis启用集群模式。要使用ElastiCache for Redis集群(启用集群模式),您需要使用可以支持redis集群模式的客户端。
当您的java程序需要连接和使用ElastiCache for redis集群时,通常有三种解决方案可选:jedis,redisson,lettuce,本篇blog将为您介绍如何使用redisson连接和使用ElastiCache for redis集群,除此以外,我们还推出了一系列博客,展示了如何在不同语言中,使用不同的支持ElastiCache集群模式的客户端对ElastiCache集群进行连接和操作,欢迎大家阅读。
2. 搭建测试环境
2.1. 创建测试环境
2.1.1. 创建ElastiCache集群
- 首先创建一个开启TLS及其auth的3 shards,6节点的ElastiCache集群,实例类型为cache.t3.small,版本为5.0.6,按下文的方式获取configuration endpoint,此处假设其值为<Enable TLS and auth ElastiCache configuration endpoint>:<port>
具体获取endpoint的方式如下:
查找 Redis(已启用集群模式)集群的configuration endpoint
- 登录 AWS Management Console 并打开 ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/)。
- 从导航窗格中,选择 Redis。
- 此时会显示一个列表,其中包含运行任意版本 Redis 的集群。
- 从集群列表中,选择运行“集群 Redis”的集群左侧的复选框。
- 此时屏幕会展开,以显示有关选定集群的详细信息。
- 找到 Configuration endpoint。
Redis(已启用集群模式)集群的configuration endpoint
- 其次创建一个关闭TLS且无auth的3 shards,6节点的ElastiCache集群,实例类型为t3.small,版本为5.0.6,按上文的方式获取configuration endpoint,此处假设其值为<No TLS and auth ElastiCache configuration endpoint>:<port>
2.1.2. 创建EC2测试客户端
- 在同一个VPC内创建一个EC2并配置好相应的security group使得EC2上的程序可以访问ElastiCache集群的端口,在EC2上准备好java环境。
- 用maven 创建一个 Java project并配置pom.xml
添加信息如下面红色字样所示:
2.2. 开启传输中加密(TLS)及auth的ElastiCache集群测试
Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在终端节点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。
2.2.1. ElastiCache 传输中加密可实现以下功能
- 加密连接– 服务器和客户端连接均采用安全套接字层 (SSL) 加密。
- 加密复制– 对在主节点与副本节点之间移动的数据进行加密。
- 服务器身份验证– 客户端可通过身份验证确定它们连接到正确的服务器。
- 客户端身份验证– 使用 Redis AUTH 功能,服务器可以对客户端进行身份验证。
2.2.2. 传输中加密的条件
在规划实现时,应记住有关 Amazon ElastiCache 传输中加密的以下限制:
- 在运行以下 Redis 版本的复制组上支持传输中加密:2.6、4.0.10 和更高版本。
- 只有在 Amazon VPC 中运行的复制组支持传输中加密。
- 只有运行以下节点类型的复制组才支持传输中加密。
- R6g、R5、R4、R3
- M6g、M5、M4、M3
- T4g、T3、T2
有关更多信息,请参阅 受支持的节点类型。
- 通过显式将参数
TransitEncryptionEnabled
设置为 true 可启用传输中加密。 - 只有在创建复制组时才能在复制组中启用传输中加密。无法通过修改复制组来开启和关闭传输中加密。有关在现有复制组中实现传输中加密的信息,请参阅启用传输中加密。
- 要连接到已启用传输中加密的复制组,必须为数据库启用传输层安全性 (TLS)。要连接到未启用传输中加密的复制组,数据库不得启用 TLS。
2.2.3. 加载测试数据
- 使用redis-cli登录开启了TLS和auth的ElastiCache集群并通过cluster nodes命令获取slots在shards中的分布,注意redis-cli要指定tls参数和password,通过redis-cli工具连接集群并进行操作的具体方法请见使用redis-cli连接到 Redis 集群。
- 分别生成testa,testb,testc三个key,可以通过其slot值结合上文各个shard上slot分布信息,判断出3个key恰好分布在shard1,shard2和shard3上
2.3.4. 生成java code
- 生成3个
java code redisson_aw1.java
,redisson_aw2.java
和redisson_aw3.java
对ElastiCache分布在三个shard上的testa,testb,testc三个key进行写入,请注意与下面连接不开启TLS及auth的ElastiCache集群相比,地址要以rediss://开头并需要设置密码。同样地请针对不同的java code修改不同的keyname,以redisson_aw1.java
为例。
- 生成3个
java code redisson_ar1.java
,redisson_ar2.java
和redisson_ar3.java
对ElastiCache分布在三个shard上的testa,testb,testc三个key进行读取,请注意与下面连接不开启TLS及auth的ElastiCache集群相比,地址要以rediss://开头并需要设置密码。同样地请针对不同的java code修改不同的keyname,以redisson_ar1.java
为例。
2.3.5. 基本功能测试
- 使用以下命令编译代码并打包:
- 运行程序并监控ElastiCache开启TLS及Auth集群的CurrConnections , SetTypeCmds以及GetTypeCmds指标,可以发现负载被均衡地发送到了6个节点上,只读副本承担了读取请求,即redisson完成读写分离和负载均衡的工作:
具体来说:
- 各个节点上SetTypeCmds数目相同一分钟内都是60,因为只读副本要复制数据,故而只读副本也有SetTypeCmds数目
- 只有只读副本上才有GetTypeCmds,说明redisson进行了读写分离,把只读负载发送到了只读副本
- 从CurrConnections来看,6个节点连接数相同
2.2. 不开启传输中加密(TLS)及auth的ElastiCache集群测试
2.2.1. 加载测试数据
- 使用redis-cli登录开启了TLS和auth的ElastiCache集群并通过cluster nodes命令获取slots在shards中的分布,通过redis-cli工具连接集群并进行操作的具体方法请见使用redis-cli连接到 Redis 集群。
- 分别生成testka,testb,testc三个key,可以通过输出的slot值结合上文各个shard上slot分布信息判断出3个key恰好分布在shard1,shard2和shard3上。
2.2.2. 生成java code
- 生成3个
java code redisson_nar1.java
,redisson_nar2.java
和redisson_nar3.java
对ElastiCache分布在三个shard上的testa,testb,testc三个key进行读取,请注意配置的地址为ElastiCache集群的configuration endpoint,另外请针对不同的java code修改不同的keyname,以redisson_nar1.java
为例。
- 生成3个
java code redisson_naw1.java
,redisson_naw2.java
和redisson_naw3.java
对ElastiCache分布在三个shard上的testa,testb,testc 三个key进行写入,请注意配置的地址为ElastiCache集群的configuration endpoint,另外请针对不同的java code修改不同的keyname,同样以redisson_naw1.java
为例。
2.2.3. 基本功能测试
- 使用以下命令编译代码并打包:
- 运行程序并监控ElastiCache开启TLS及Auth集群的CurrConnections , SetTypeCmds以及GetTypeCmds指标,可以发现负载被均衡地发送到了6个节点上,只读副本承担了读取请求,即redisson完成读写分离和负载均衡的工作,具体metrics含义和数值与上一章节类似,在此不做赘述。
3. failover 测试
因为无论是否开启TLS及Auth,ElastiCache 集群failover的进程是一致的,测试结果也相同。所以我们这里只选取开启TLS及Auth的集群的failover测试过程进行展示,如果有兴趣,各位读者也可以自行测试未开启TLS及Auth的ElastiCache集群的failover过程。
- 首先运行6个java程序,将负载均匀地发送到6个节点上一段时间
- 登录console,对Shard3进行failover,然后观测我们的java程序的输出:
- 我们通过java程序的输出会发现针对shard3的写入会有20秒钟左右的时间无法写入,但针对shard1,shard2的写入以及所有3个shard的读取则一切正常,redisson_aw3在ElastiCache集群failover期间的报错截图如下:
- 从ElastiCache集群的每个节点的CurrConnections指标截图同样可以看出,redisson将读写请求都发送到了shard3新的主节点上,具体说来:
- shard3原来的只读副本现在的主节点rllca-0003-001上SetTypeCmds数目减少,减少的数量和切换时间近似
- 在示例中fail over发生时间09:44及以后的时间,GetTypeCmds数目始终还是60,只不过暂时读写负载都发送到了新的主节点rllca-0003-001上
- 从CurrConnections来看,failover后原来的只读副本现在的主节点rllca-0003-001上的连接数多了一倍,而原来的主节点现在的只读副本rllca-0003-002上没有连接
4. 结束语
本博客为大家展示了如何在java程序中通过redisson连接和操作ElastiCache集群,从这个简单的Demo中我们可以看到redisson能很好地支持ElastiCache集群开启TLS及auth的功能,并自动完成读写分离,负载均衡,failover等工作。通过redisson,我们可以便捷,高效地使用ElastiCache集群。
除了本博客以外,我们还推出了一系列博客,展示了如何在不同语言中使用不同的客户端对ElastiCache集群进行连接和操作,欢迎大家阅读。
相关博客
- 条条大路通罗马 — 使用 redis-py 访问 Amazon ElastiCache for redis 集群:https://aws.amazon.com/cn/blogs/china/use-redis-py-to-access-amazon-elasticache-for-redis-cluster/
- 条条大路通罗马 — 使用 go-redis 连接 Amazon ElastiCache for Redis 集群:https://aws.amazon.com/cn/blogs/china/all-roads-lead-to-rome-use-go-redis-to-connect-amazon-elasticache-for-redis-cluster/
- 条条大路通罗马 — 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群:https://aws.amazon.com/cn/blogs/china/all-roads-to-rome-series-connect-amazon-elasticache-for-redis-cluster-with-hiredis-cluster/
- 条条大路通罗马 — 如何在.NET 程序中使用 StackExchange.Redis 操作 Amazon ElastiCache for Redis:https://aws.amazon.com/cn/blogs/china/all-roads-lead-to-rome-how-to-use-stackexchange-redis-to-operate-amazon-elasticache-for-redis-in-net-program/
- 条条大路通罗马 — 使用 Jedis 访问 Amazon ElastiCache for Redis 集群:https://aws.amazon.com/cn/blogs/china/accessing-an-amazon-elasticache-for-redis-cluster-using-jedis/