条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群
前言
Amazon ElastiCache for Redis 是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建,可与 Redis API 兼容,能够与 Redis 客户端配合工作,并使用开放的 Redis 数据格式来存储数据。适用于 Redis 的 ElastiCache 兼具开源 Redis 的速度、简单性和多功能性与 Amazon 的可管理性、安全性和可扩展性,能够在游戏、广告技术、电子商务、医疗保健、金融服务和物联网领域支持要求最严苛的实时应用程序。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
利用 ElastiCache for Redis,客户可以使用多个分区创建和运行托管的 Redis 集群。当遇到以下三种主要场景时,必须扩展 Redis 环境。第一,如果 Redis 数据的总内存大小超出或预计超出单个虚拟机的内存容量。第二,如果应用程序将数据写入 Redis 的写入吞吐量超出单个虚拟机的容量。第三,如果要将数据分布到多个分区中,以便在单个节点遇到任何问题时,对总体 Redis 环境产生的影响都较小。
我们推出了一系列博客,展示了如何在不同语言中使用不同的支持 ElastiCache 集群模式的客户端对 ElastiCache 集群进行连接和操作,前面已经有一篇博客介绍了 “使用 redission 连接 Amazon ElastiCache for redis 集群”, 今天的主题是讨论如何使用 C 语言连接 Elasticache for redis 集群。通过 redis 官网上查询到现有的客户端,C 语言中支持 redis cluster 的主要有 Hiredis-cluster, hiredis-vip 等,C++ 语言中支持 redis cluster 的主要有 redis-plus-plus,xredis 等。本篇博客主要会介绍 Hiredis-cluster 的使用。
2. 搭建测试环境
在此说明下,此次测试在宁夏区域进行,测试的主要内容包括:
在开启 TLS 及 Auth 的 ElastiCache 集群中验证读写和 Failover
在未开启 TLS 及 Auth 的 ElastiCache 集群中验证读写和 Failover,因为对于未开启 TLS 及 Auth 的集群,Client 端的代码实现会有所不同。
2.1. 创建测试环境
创建 ElastiCache 集群
首先创建一个开启 TLS 及其 Auth 的 3 shards,6 节点的 ElastiCache 集群,实例类型为 cache.t3.small,版本为 5.0.6, 按下文的方式获取 configuration endpoint,此处假设其值为:
具体获取 endpoint 的方式如下:
查找 Redis(已启用集群模式)集群的 configuration endpoint
登录 Amazon Management Console 并打开 ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/?trk=cndc-detail)。
从导航窗格中,选择 Redis。
此时会显示一个列表,其中包含运行任意版本 Redis 的集群。
从集群列表中,选择运行“集群 Redis”的集群左侧的复选框。
此时屏幕会展开,以显示有关选定集群的详细信息。
找到 Configuration endpoint
2.创建一个关闭 TLS 且无 auth 的 3 shards,6 节点的 ElastiCache 集群,实例类型为 cache.t3.medium,版本为 5.0.6,按上文的方式获取 configuration endpoint,此处假设其值为:
创建 EC2 测试客户端
1.在同一个 VPC 内创建一个 EC2 并配置好响应 security group,我使用的 EC2 是 Ubuntu 18.04,安装的环境是一些 Ubuntu 的参考命令。
2.在 EC2 上准备环境, Hiredis-cluster 是基于 hiredis 扩展编写的, 我们环境准备准备的时候也会涉及到 hiredis 部分,
C Compiler 安装,这里我使用 GCC,可参考这个 How to install GCC Compiler on Ubuntu 18.04
libssl-dev 安装,sudo apt-get install libssl-dev 注意在 CMake 之前安装,否则会报错 “Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)”
CMake 安装,我使用的是 CMake 编译,CMake 官网提供了安装方式https://cmake.org/install/
libevent-dev 安装,sudo apt install libevent-dev, 直接安装可能会报如下错误,解决办法是
hiredis 下载并编译,因为 hiredis-cluster 是基于 hiredis 扩展编写的,所以需要安装并编译 hiredis。 如下命令,因为会用到 SSL,所以我使用 make USE_SSL=1, 可以直接使用 make 替代。
hiredis-cluster 环境准备,因为会测试 ssl,所以通过选项指定,Redis
3.在上面的步骤完成后,你的环境会是这样的:
hiredis 相关,中会生成 hiredis_ssl lib 文件,在</usr/local/lib/>中 hiredis.a 文件
中,hiredis_cluster lib 文件生成
2.2 不开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试
加载测试数据
使用 redis-cli 登录未开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。
redis-cli -c -h -p
分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在 shard1,shard2 和 shard3 上
C 代码
1.以下是写入 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行写入,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,另外修改不同的 keyname。
2.以下是读取 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行读取,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,另外修改不同的 keyname。
基本功能测试
1.使用如下命令编译代码:
2.运行程序并监控 ElastiCache 未开启 TLS 及 Auth 集群的 CurrConnections 指标,可以看到负载被均衡地发送到了 6 个节点上,即 hiredis-cluster 可以完成读写分离和负载均衡的工作:
我的代码在~/hiredis-cluster 路径下面,所以
2.3. 开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试
Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在终端节点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。 关于 TLS 加密这一块,具体可以参考条条大路通罗马- 使用 redission 连接 Amazon ElastiCache for redis 集群。
加载测试数据
1.使用 redis-cli 登录开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。
redis-cli -c -h -p
2.分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在 shard1,shard2 和 shard3 上
C 代码
1.以下是写入 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行写入,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,设置密码,另外修改不同的 keyname。这里需要注意的是 hiredis-cluster 对 SSL 的支持,可以分为两种方式,一种是指定 SSL 证书路径,另一种是指定证书,对于 EC2 访问 ElastiCache 的情况,指定证书路径即可, 具体可参考 hiredis 的文档。
2.以下是读取 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行读取,请注意配置的地址为 ElastiCache 集群的 configuration endpoint ,另外修改不同的 keyname。
基本功能测试
1.使用如下命令编译代码:
gcc hiredisc-naw1.c -o hiredisc-naw1 -L./build -lhiredis_cluster /usr/local/lib/libhiredis.a -L~/hiredis -lhiredis_ssl
2.运行程序并监控 ElastiCache 未开启 TLS 及 Auth 集群的 CurrConnections 指标,可以看到负载被均衡地发送到了 6 个节点上,即 hiredis-cluster 可以完成读写分离和负载均衡的工作:
我的代码在~/hiredis-cluster 路径下面,所以
2.3. 开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试
Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在终端节点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。 关于 TLS 加密这一块,具体可以参考条条大路通罗马- 使用 redission 连接 Amazon ElastiCache for redis 集群。
加载测试数据
1.使用 redis-cli 登录开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。
redis-cli -c -h -p
2.分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在 shard1,shard2 和 shard3 上
C 代码
1.以下是写入 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行写入,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,设置密码,另外修改不同的 keyname。这里需要注意的是 hiredis-cluster 对 SSL 的支持,可以分为两种方式,一种是指定 SSL 证书路径,另一种是指定证书,对于 EC2 访问 ElastiCache 的情况,指定证书路径即可, 具体可参考 hiredis 的文档。
2.以下是读取 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行读取,请注意配置的地址为 ElastiCache 集群的 configuration endpoint ,另外修改不同的 keyname 。
基本功能测试
1.使用如下命令编译代码:
gcc hiredisc-aw1.c -o hiredisc-aw1 -L./build -lhiredis_cluster /usr/local/lib/libhiredis.a -L~/hiredis -lhiredis_ssl
2.运行程序并监控 ElastiCache 开启 TLS 及 Auth 集群的 CurrConnections 指标,可以看到负载被均衡地发送到了 6 个节点上,即 hiredis-cluster 可以完成读写分离和负载均衡的工作:
我的代码在~/hiredis-cluster 路径下面,所以
三级标题
3.1. 未开启 TLS 及 auth 的 ElastiCache failover 测试
登录 console,对 Shard1 进行 failover,然后观测我们的 C 程序的输出, 此过程大约持续 12s ((观测所得)),
从 ElastiCache 集群的每个节点的 CurrConnections 指标截图同样可以看出,hiredis-cluster 将读写请求都发送到了 shard1 新的主节点上:
3.2. 开启 TLS 及 auth 的 ElastiCache failover 测试
登录 console,对 Shard1 进行 failover,然后观测我们的 C 程序的输出,这个时间大概 10s 左右(观测所得),
从 ElastiCache 集群的每个节点的 CurrConnections 指标截图同样可以看出, hiredis-cluster 将读写请求都发送到了 shard1 新的主节点上:
failover 测试中发生问题以及解决方案
在做 failover 的时候发现一个问题,在 failover 过程中,有的时候 client 端直接断开链接,有的时候成功,后来经过分析 hiredis 的代码得知需要把 timeout 时间调整下,所以从 1.5s 调整为 5.5s, 注意这个值并不是最佳实践,是根据测试得来的。
4. 结束语
在本博客中,主要使用 C 语言通过 hiredis-cluster 连接和操作 ElastiCache 集群,从简单的 Demo 中我们可以看到 hiredis-cluster 可以很好地支持 ElastiCache 集群开启 TLS 及 auth 等功能,并自动完成读写分离,负载均衡,failover 等工作,有助于我们便捷,高效地使用 ElastiCache。
5.参考
Hiredis-cluster 文档:https://github.com/Nordix/hiredis-cluster?trk=cndc-detail
Hiredis 文档: https://github.com/redis/hiredis?trk=cndc-detail
Amazon Elasticache : https://aws.amazon.com/elasticache/redis/?trk=cndc-detail
条条大路通罗马 —— 使用 redisson 连接 Amazon ElastiCache for redis 集群:https://aws.amazon.com/cn/blogs/china/connecting-amazon-elasticache-for-redis-cluster-using-redisson/?trk=cndc-detail
相关博客
条条大路通罗马 —— 使用 redisson 连接 Amazon ElastiCache for redis 集群
条条大路通罗马 —— 使用 redis-py 访问 Amazon ElastiCache for redis集群
条条大路通罗马 —— 使用 go-redis 连接 Amazon ElastiCache for Redis 集群
本篇作者
冯秋爽
Amazon 解决方案架构师,负责跨国企业级客户基于 Amazon 的技术架构设计、咨询和设计优化工作。在加入 Amazon 之前曾就职于 IBM 、甲骨文等 IT 企业,积累了丰富的程序开发和数据库的实践经验。
评论