AWS Elasticcache Redis 集群的构建与管理

AWS Elasticcache Redis 集群的构建与管理
20180706 Chenxin

一般说明
创建,修改,删除Redis实例均大约需要10分钟(空实例).
通过EC2可以直接SSH登录redis集群的集群机器吗?不能
Redis集群(开启集群模式):指的是具有分片功能,可以增加实例数量的方式扩大集群.可以有最多15个分片.
Redis集群(禁用集群模式):指的是无分片,只是主从模式(读写分离),数据大小取决于单机的负载能力.只有1个分片.
节点组(分片):每个分片可以拥有1-6个节点(包括分片模式或主从模式).分片也可以称之为"节点组".1个分片可以由1-6个节点构成

我们这里计划创建禁用集群模式的方式来创建Redis集群.

创建
创建带有多个副本的Redis,终端节点和第一个副本会落在1个内网IP上.(会不会是同一个数据源呢?是的)
其他副本分别落在不同IP上.

Redis设置
端口:6379 (安全考虑,最好不要用默认端口.如使用9001端口)
参数组:选择默认
节点类型:选择适当配置的实例类型
副本数量:1 (通过主副角色增强性能).提高容错能力,我们建议在 Redis 群集中包含至少两个节点(副本数量1),并启用具有自动故障转移功能的多可用区

高级Redis设置
具有自动故障转移功能的多可用区
子网组:选择跟EC2访问实例相同的子网组(ElastiCache 使用该缓存子网组选择一个子网和此子网内的 IP 地址,以便与您的缓存节点相关).

安全性
安全组:选择Redis实例的"防火墙",具有内网流量不受限制的访问(这里默认会有1个安全组,属于自身访问自身不受限制.另外需要再添加1个10.0.0.0/8不受限制的安全组)
密码相关:ElasticCache-Redis不支持redis密码访问方式.aws只建议采用他们提供的方式(如安全组控制内网流量访问)

备份
启用自动备份
备份保留X天
备份时段:选择北美早上8点,也就是UTC时间12:00

维护
维护时段:不能跟备份时段重叠,选择"周三",UTC 10:00

SNS通知主题:可以创建1个

创建
可能会因为当地没有适用的资源造成无法成功申请.可以尝试更换可用区和实例类型的方式尝试.

测试连通性
因上面选择的1个副本,故这里会总共生成2个,1个主,1个副.主的挂001,副的挂002.
主终端节点:集群的主终端节点redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com:9001 用于应用程序连接执行读写(主终端节点域名始终自动指向可写的节点)
终端节点redis-0706-1550-001.ua0lui.0001.apse1.cache.amazonaws.com:9001 当前角色:primary (用于应用程序连接执行读操作,节点变化后,需要更新应用程序)
终端节点redis-0706-1550-002.ua0lui.0001.apse1.cache.amazonaws.com:9001 当前角色:replica (用于应用程序连接执行读操作,节点变化后,需要更新应用程序)
连接:
/usr/local/redis/src/redis-cli -h redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com -p 9001
redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com:9001> set a "hello"
OK
redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com:9001> get a
"hello"

添加节点
点开redis实例,可以创建新的"只读节点"到"复制组中.
ID:redis-0706-1550
redis-0706-1550.ua0lui.0001.apse1.cache.amazonaws.com:9001 当前角色:replica (这里的url跟主终端节点是不同的).
创建节点大约5分钟,删除节点大约20分钟.

备份
如果实例类型配置选择的过低,备份按钮会是灰色的,无法备份.所以请选择t2以上类型的配置.
执行备份时候有一定性能影响.性能影响可以参考 https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups.html#backups-performance

备份过程有时无法创建备份 (包括最终备份),不过这种情况很少见。预留内存不足通常是导致备份失败的原因。因此,您应确保在尝试备份之前有足够的预留内存。如果您拥有的内存不足,可以移出一些密钥或者增大 reserved-memory-percent 的值。

提升备份性能
以下是提高备份性能的准则。

  • 设置 reserved-memory-percent 参数—为了缓解过多分页问题,我们建议设置 reserved-memory-percent 参数。此参数可防止 Redis 使用节点的所有可用内存,有助于减少分页量。只需使用更大的节点,您也可以获得性能改进。有关 reserved-memory 和 reserved-memory-percent 参数的更多信息,请参阅 管理预留内存。
  • 从只读副本创建备份—如果您正在具有多个节点的节点组中运行 Redis,则可以从主节点或一个只读副本进行备份。由于在 BGSAVE 期间需要系统资源,因此我们建议您从一个只读副本上创建备份。从副本创建备份时,主节点不受 BGSAVE 资源要求的影响,可以继续为请求提供服务,而不会降低速度。

手动备份
选中redis实例,执行备份.或者通过aws cli 命令(对应脚本)来实现自动备份.

自动备份
创建redis的snapshot.在redis的"修改"选项中,可以随时调整自动备份频率和保存时间.

"备份"->"复制"
复制备份,导出备份-导出snapshot到自己的S3.
在备份控制台上,选中某个备份,点击"复制",选择一个自建的s3.
如果留空不选的话,会备份到默认的s3中.备份下来的snapshot默认是放到1个看不到的s3中.之后还可以导出备份到自建的s3里.

复制到自建的S3

创建S3
这里S3名称不能为redis-backup,否则会提示已经存在这个存储桶(应该是系统默认就有这个了).
这里创建名称为redis-backup-smhy的bucket.
自建的s3需要配置对应的权限才能接收到Redis复制动作的请求.见如下
需要在此bucket权限里配置"其他 AWS 账户的访问权限".

  1. 在其他 AWS 账户的访问权限下,选择+ 添加账户。
  2. 在框中,添加区域的规范 ID,如以下列表中所示:
    • 中国(北京) 和 中国 (宁夏) 区域:b14d6a125bdf69854ed8ef2e71d8a20b7c490f252229b806e514966e490b8d83
    • AWS GovCloud (US)区域: 40fa568277ad703bd160f66ae4f83fc9dfdfd06c2f1b5060ca22442ac3ef8be6
      重要,该备份必须导出到 AWS GovCloud (US) 中的 S3 存储桶。
    • 所有其他区域:540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353
  3. 通过为以下对象选择是来对存储桶设置权限: 1. 列出对象 2. 写入对象 3. 读取存储桶权限
  4. 选择 Save。
    具体请参见"导出备份": https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/backups-exporting.html

复制
点击复制,选择对应的bucket,进行复制(exploring).
完成后,查看S3,会多出1个redis-20180706-1733-0001.rdb 文件.

放在s3上的rbd文件,可以作为种子,创建1个具有相同数据内容的Redis.

手动创建备份(脚本)
CLI方式 https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/backups-manual.html
在预热服上,到/home/xbzj/server-bin/server-ip/目录下,以xbzj身份执行 aws configure 配置好密钥(默认放置在根目录/home/xbzj/.aws/下).

仅备份:
[xbzj@ip-10-0-0-200 server-ip]$ vim redis-bak.sh

!/bin/bash

20180809 Chenxin

echo "redis备份启动中 备份集群名称(副本):taihe-redis01-002 备份redis大约需要几分钟.这里源为只读从库.备份成功会收到邮件提醒."
Datadate=date +%Y%m%d%H%M%S
aws elasticache create-snapshot --region us-east-1 --cache-cluster-id taihe-redis01-002 --snapshot-name manage-redis-bk-"$Datadate"

备份,以及删除过期的备份文件:
[xbzj@ip-10-0-0-200 server-ip]$ cat redis-bak.sh

!/bin/bash

20180809 Chenxin

20180913 Chenxin update

source /etc/profile
cd /home/xbzj/server-bin/server-ip

当前时间

Datadate=date +%Y%m%d%H%M%S

多日前时间

olddate=date -d ‘-20day‘ +%Y%m%d%H%M%S

echo "redis备份启动中 备份集群名称(副本):taihe-redis01-002 备份redis大约需要几分钟.这里源为只读从库."

执行当天的备份

aws elasticache create-snapshot --region us-east-1 --cache-cluster-id taihe-redis01-002 --snapshot-name manage-redis-bk-"$Datadate"

获取手动备份的列表文件名

aws elasticache describe-snapshots --region us-east-1 |grep SnapshotName|grep "manage-redis-bk"|awk -F """ ‘{print $4}‘ >./redis-bak-file-list.txt

执行判断时间,满足条件的删除

for i in cat ./redis-bak-file-list.txt
do
filedatetime=echo $i|awk -F "-" ‘{print $4}‘

如果ElasticCache上手动(脚本)备份的文件时间小于这里给予的时间,则删除该备份文件

if [ $filedatetime -le $olddate ];then
aws elasticache delete-snapshot --region us-east-1 --snapshot-name $i
echo "delete $i Successfuly"
fi
done
[xbzj@ip-10-0-0-200 server-ip]$

[xbzj@ip-10-0-0-200 ~]$ crontab -l
*/5 * * * * /home/xbzj/server-bin/server-ip/proc-check.sh
10 0,6,12 * * * /home/xbzj/server-bin/server-ip/redis-bak.sh #18:00-19:00还有个自动备份任务(保留7天)

恢复,还原,导出到内网供测试
恢复到实例
在"备份"里选中某个snapshot,然后"还原".
恢复备份会自动创建1个新的redis实例.该实例与原实例不会落在同一个IP上.域名会有所变化.端口保持不变.

导出rdb文件到内网
参考: https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/backups-exporting.html
先在S3上申请一个S3,如 redis-tmp(然后在该S3的访问控制列表上赋予权限 ):

  1. 选择 Permissions。
  2. 选择访问控制列表。
  3. 在其他 AWS 账户的访问权限下,选择+ 添加账户。
  4. 在框中,添加区域的规范 ID:540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353
    到ElasticCache的控制台->备份列表->复制->选择对应的S3桶,确定.
    这样就可以将一个rdb文件复制到s3内了.然后开发人员就可以从s3下载该文件.

回档说明
回档需要创建新的实例(将备份文件直接生成新的实例)
注意实例名称,最好跟老的一致(如taihe-redis01)
修改所有服务器上redis的URL地址
确认redis定时备份是否正常(放在预热服上的每日4次备份脚本,涉及到region地区和redis的cluster-id)

维护时段
指的是备份时间窗口,你可以指定你希望的备份时间窗,也可以让系统自动选择.

问题或坑说明
1.程序连接redis一段时间后,偶尔报错如下(含game服,gateway服):
RedisTimeoutException: Redis server response timeout (3000 ms)

解决方案(待测试)
参考: https://www.cnblogs.com/junge8618/p/9241927.html
内网两条机器通过nat服务都连上远程的reids-server。空闲不操作,导致服务器上的链接被销毁。但连接客户端没有响应,导致继续连接发生异常.
查看资料,该问题在2017年11月23号已经修复(参见:https://github.com/redisson/redisson/issues/946),更新ressdion到3.7版本以上.并且:
在java的代码里(或配置文件),设置setPingConnectionInterval为60秒.

主从模式集群修改为多分片模式集群
需要先备份,再创建带有分片的新集群,指定备份数据做为种子.
修改所有访问redis实例的配置文件里对应的url地址
修改备份脚本

AWS Elasticcache Redis 集群的构建与管理

上一篇:python基础教程_学习笔记12:充电时刻——模块


下一篇:CEF(Chromium Embedded Framework)进程间通讯