前言

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集群

  1. 首先创立一个敞开 TLS 及其 Auth 的3 shards,6节点的ElastiCache 集群,实例类型为 cache.t3.small,版别为5.0.6, 按下文的方法获取 configuration endpoint,此处假定其值为:

详细获取 endpoint 的方法如下:

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

查找 Redis(已启用集群形式)集群的 configuration endpoint

  • 登录 Amazon Management Console 并翻开 ElastiCache 控制台 (console.aws.amazon.com/elasticache…%E3%80%82)
  • 从导航窗格中,选择 Redis。
  • 此时会显现一个列表,其中包含运转恣意版别 Redis 的集群。
  • 从集群列表中,选择运转“集群 Redis”的集群左侧的复选框。
  • 此时屏幕会展开,以显现有关选定集群的详细信息。
  • 找到 Configuration endpoint

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

2.创立一个封闭 TLS 且无 auth 的3 shards,6节点的 ElastiCache 集群,实例类型为 cache.t3.medium,版别为5.0.6,按上文的方法获取 configuration endpoint,此处假定其值为:

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

创立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 官网提供了装置方法cmake.org/install/?tr…
  • libevent-dev 装置,sudo apt install libevent-dev, 直接装置或许会报如下过错,解决办法是
CMake Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
 Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
Call Stack (most recent call first):
 /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
 /usr/local/share/cmake-3.23/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
 tests/CMakeLists.txt:40 (find_package)
  • hiredis 下载并编译,因为 hiredis-cluster 是根据 hiredis 扩展编写的,所以需求装置并编译 hiredis。 如下指令,因为会用到 SSL,所以我运用 make USE_SSL=1, 能够直接运用 make 替代。
git clone https://github.com/redis/hiredis.git
cd hiredis
make USE_SSL=1
sudo make install
  • hiredis-cluster 环境预备,因为会测验 ssl,所以经过选项指定,Redis
mkdir build; cd build
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_SSL=ON ..
make

3.在上面的进程完结后,你的环境会是这样的:

hiredis 相关,中会生成 hiredis_ssl lib 文件,在</usr/local/lib/>中 hiredis.a 文件

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

中,hiredis_cluster lib 文件生成

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

2.2 不敞开传输中加密(TLS)及 auth 的 ElastiCache 集群测验

加载测验数据

  1. 运用 redis-cli 登录未敞开了 TLS 和 auth 的 ElastiCache 集群并经过 cluster nodes 指令获取 slots 在 shards 中的散布,经过 redis-cli 东西衔接集群并进行操作的详细方法请见运用 redis-cli 衔接到 Redis 集群。

redis-cli -c -h -p

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

  1. 别离生成 testka,testb,testc 三个 key,能够经过其 slot 值结合上文各个 shard 上 slot 散布信息,判别出3个 key 刚好散布在 shard1,shard2 和 shard3 上

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

C代码

1.以下是写入 ElastiCache 集群的代码, 针关于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行写入,请留意装备的地址为 ElastiCache 集群的 configuration endpoint,别的修正不同的 keyname。

#include "hircluster.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);
    struct timeval timeout = {1, 500000}; // 1.5s
    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, "<No TLS and auth ElastiCache configuration endpoint>:<port>");    
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }
    int count = 0;
    while(count < 10000){
        redisReply *reply = (redisReply *)redisClusterCommand(cc, "SET %s %d", "test1", count);
        printf("SET: %d\n", count);
        count++ ;
        if (cc && cc->err) {
                printf("Error: %s\n", cc->errstr);
        }
        freeReplyObject(reply);
        sleep(1);
    }
    redisClusterFree(cc);
    return 0;
}

2.以下是读取 ElastiCache 集群的代码, 针关于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行读取,请留意装备的地址为 ElastiCache 集群的 configuration endpoint,别的修正不同的 keyname。

#include "hircluster.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);
    struct timeval timeout = {1, 500000}; // 1.5s
    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, "<No TLS and auth ElastiCache configuration endpoint>:<port>");    
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }
    int count = 0;
    while(count < 10000){
        redisReply *reply = (redisReply *)redisClusterCommand(cc, "GET %s", "test1");
        if(reply && reply->str) {
                printf("GET: %s\n", reply->str);
        }
        freeReplyObject(reply);
    if (cc && cc->err) {
                printf("Error: %s\n", cc->errstr);
        }
        count++;
        sleep(1);
    }
    redisClusterFree(cc);
    return 0;
}

基本功能测验

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 途径下面,所以

cd hiredis-cluster/ &&./hiredisc-naw1
cd hiredis-cluster/ &&./hiredisc-naw2
cd hiredis-cluster/ &&./hiredisc-naw3
cd hiredis-cluster/ &&./hiredisc-nar1
cd hiredis-cluster/ &&./hiredisc-nar2
cd hiredis-cluster/ &&./hiredisc-nar3

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

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 集群。

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

redis-cli -c -h -p

2.别离生成 testka,testb,testc 三个 key,能够经过其 slot 值结合上文各个 shard 上 slot 散布信息,判别出 3 个 key 刚好散布在 shard1,shard2 和 shard3 上

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

C代码

1.以下是写入 ElastiCache 集群的代码, 针关于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行写入,请留意装备的地址为 ElastiCache 集群的 configuration endpoint,设置暗码,别的修正不同的 keyname。这儿需求留意的是 hiredis-cluster 对 SSL 的支撑,能够分为两种方法,一种是指定 SSL 证书途径,另一种是指定证书,关于 EC2 拜访 ElastiCache 的状况,指定证书途径即可, 详细可参阅 hiredis的文档。

#include "hiredis_cluster/hircluster.h"
#include "hiredis/hiredis_ssl.h"
#include <stdio.h>
#include <stdlib.h>
#define CLUSTER_NODE_TLS ":<Enable TLS and auth ElastiCache configuration endpoint>:<port>"
#define CLUSTER_PASSWORD "<PASSWORD>"
int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);
    redisSSLContext *ssl;
    redisSSLContextError ssl_error;
    redisInitOpenSSL();
    ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,
                                NULL, &ssl_error);
    if (!ssl) {
        printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));
        exit(1);
    }
    struct timeval timeout = {5, 500000}; // 5.5s
    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterSetOptionEnableSSL(cc, ssl);
    redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }
    int count = 0;
    while(count < 10000){
        redisReply *reply = (redisReply *)redisClusterCommand(cc, "SET %s %d", "test1", count);
        printf("SET: %d\n", count);
        if (cc && cc->err) {
                printf("Error: %s\n", cc->errstr);
        }
    count++ ;
        freeReplyObject(reply);
        sleep(1);
    }
    redisClusterFree(cc);
    redisFreeSSLContext(ssl);
    return 0;
}

2.以下是读取 ElastiCache 集群的代码, 针关于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行读取,请留意装备的地址为 ElastiCache 集群的 configuration endpoint ,别的修正不同的 keyname。

#include "hircluster.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);
    struct timeval timeout = {1, 500000}; // 1.5s
    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, "<No TLS and auth ElastiCache configuration endpoint>:<port>");    
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }
    int count = 0;
    while(count < 10000){
        redisReply *reply = (redisReply *)redisClusterCommand(cc, "GET %s", "test1");
        if(reply && reply->str) {
                printf("GET: %s\n", reply->str);
        }
        freeReplyObject(reply);
    if (cc && cc->err) {
                printf("Error: %s\n", cc->errstr);
        }
        count++;
        sleep(1);
    }
    redisClusterFree(cc);
    return 0;
}

基本功能测验

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 途径下面,所以

cd hiredis-cluster/ &&./hiredisc-naw1
cd hiredis-cluster/ &&./hiredisc-naw2
cd hiredis-cluster/ &&./hiredisc-naw3
cd hiredis-cluster/ &&./hiredisc-nar1
cd hiredis-cluster/ &&./hiredisc-nar2
cd hiredis-cluster/ &&./hiredisc-nar3

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

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 集群。

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

redis-cli -c -h -p

2.别离生成 testka,testb,testc 三个 key,能够经过其 slot 值结合上文各个 shard 上 slot 散布信息,判别出 3 个 key 刚好散布在shard1,shard2 和 shard3 上

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

C代码

1.以下是写入 ElastiCache 集群的代码, 针关于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行写入,请留意装备的地址为 ElastiCache 集群的 configuration endpoint,设置暗码,别的修正不同的 keyname。这儿需求留意的是 hiredis-cluster 对SSL的支撑,能够分为两种方法,一种是指定 SSL 证书途径,另一种是指定证书,关于 EC2 拜访 ElastiCache 的状况,指定证书途径即可, 详细可参阅 hiredis 的文档。

#include "hiredis_cluster/hircluster.h"
#include "hiredis/hiredis_ssl.h"
#include <stdio.h>
#include <stdlib.h>
#define CLUSTER_NODE_TLS ":<Enable TLS and auth ElastiCache configuration endpoint>:<port>"
#define CLUSTER_PASSWORD "<PASSWORD>"
int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);
    redisSSLContext *ssl;
    redisSSLContextError ssl_error;
    redisInitOpenSSL();
    ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,
                                NULL, &ssl_error);
    if (!ssl) {
        printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));
        exit(1);
    }
    struct timeval timeout = {5, 500000}; // 5.5s
    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterSetOptionEnableSSL(cc, ssl);
    redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }
    int count = 0;
    while(count < 10000){
        redisReply *reply = (redisReply *)redisClusterCommand(cc, "SET %s %d", "test1", count);
        printf("SET: %d\n", count);
        if (cc && cc->err) {
                printf("Error: %s\n", cc->errstr);
        }
    count++ ;
        freeReplyObject(reply);
        sleep(1);
    }
    redisClusterFree(cc);
    redisFreeSSLContext(ssl);
    return 0;
}

2.以下是读取 ElastiCache 集群的代码, 针关于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行读取,请留意装备的地址为 ElastiCache 集群的 configuration endpoint ,别的修正不同的 keyname 。

#include "hiredis_cluster/hircluster.h"
#include "hiredis/hiredis_ssl.h"
#include <stdio.h>
#include <stdlib.h>
#define CLUSTER_NODE_TLS "<Enable TLS and auth ElastiCache configuration endpoint>:<port>"
#define CLUSTER_PASSWORD "<PASSWORD>"
int main(int argc, char **argv) {
    UNUSED(argc);
    UNUSED(argv);
    redisSSLContext *ssl;
    redisSSLContextError ssl_error;
    redisInitOpenSSL();
    ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,
                                NULL, &ssl_error);
    if (!ssl) {
        printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));
        exit(1);
    }
    struct timeval timeout = {5, 500000}; // 5.5s
    redisClusterContext *cc = redisClusterContextInit();
    redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);
    redisClusterSetOptionConnectTimeout(cc, timeout);
    redisClusterSetOptionRouteUseSlots(cc);
    redisClusterSetOptionEnableSSL(cc, ssl);
    redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);
    redisClusterConnect2(cc);
    if (cc && cc->err) {
        printf("Error: %s\n", cc->errstr);
        // handle error
        exit(-1);
    }
    int count = 0;
    while(count < 10000){
        redisReply *reply = (redisReply *)redisClusterCommand(cc, "GET %s", "test1");
        if(reply && reply->str) {
        printf("GET: %s\n", reply->str);
    }
    freeReplyObject(reply);
if (cc && cc->err) {
                printf("Error: %s\n", cc->errstr);
        }
    count++;
        sleep(1);
    }
    redisClusterFree(cc);
    redisFreeSSLContext(ssl);
    return 0;
}

基本功能测验

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 途径下面,所以

cd hiredis-cluster/ &&./hiredisc-aw1
cd hiredis-cluster/ &&./hiredisc-aw2
cd hiredis-cluster/ &&./hiredisc-aw3
cd hiredis-cluster/ &&./hiredisc-ar1
cd hiredis-cluster/ &&./hiredisc-ar2
cd hiredis-cluster/ &&./hiredisc-ar3

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

三级标题

3.1. 未敞开 TLS 及 auth 的 ElastiCache failover 测验

登录 console,对 Shard1 进行 failover,然后观测咱们的C程序的输出, 此进程大约继续12s ((观测所得)),

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

从 ElastiCache 集群的每个节点的 CurrConnections 目标截图相同能够看出,hiredis-cluster 将读写恳求都发送到了 shard1 新的主节点上:

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

3.2. 敞开 TLS 及 auth 的 ElastiCache failover 测验

登录 console,对 Shard1 进行 failover,然后观测咱们的C程序的输出,这个时刻大概 10s 左右(观测所得),

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

从 ElastiCache 集群的每个节点的 CurrConnections 目标截图相同能够看出, hiredis-cluster 将读写恳求都发送到了 shard1 新的主节点上:

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

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 文档:github.com/Nordix/hire…

Hiredis 文档:github.com/redis/hired…

Amazon Elasticache :aws.amazon.com/elasticache…

条条大路通罗马 —— 运用 redisson 衔接 Amazon ElastiCache for redis 集群:aws.amazon.com/cn/blogs/ch…

相关博客

条条大路通罗马 —— 运用 redisson 衔接 Amazon ElastiCache for redis 集群

条条大路通罗马 —— 运用 redis-py 拜访 Amazon ElastiCache for redis集群

条条大路通罗马 —— 运用 go-redis 衔接 Amazon ElastiCache for Redis 集群

本篇作者

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

冯秋爽

Amazon 解决方案架构师,担任跨国企业级客户根据 Amazon 的技能架构规划、咨询和规划优化作业。在加入 Amazon 之前曾上任于 IBM 、甲骨文等 IT 企业,积累了丰富的程序开发和数据库的实践经验。

文章来历:dev.amazoncloud.cn/column/arti…