zoukankan      html  css  js  c++  java
  • 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地址
    修改备份脚本

  • 相关阅读:
    打印一个0到1之间的数的二进制表示
    bzoj-3223 文艺平衡树
    Linux下使用fstatfs/statfs查询系统相关信息
    Pku3664
    hdu-2544 最短路
    java同步包种ArrayBlockingQueue类的分析与理解
    【剑指offer】不用加减乘除做加法
    PA模块经常使用表
    网络编程
    // 插入排序 源代码
  • 原文地址:https://www.cnblogs.com/chanix/p/12739227.html
Copyright © 2011-2022 走看看