提问

EC2的Docker中Redis迁移到ElastiCache

AWS技术交流  / 只看大图  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2019-7-30

跳转到指定楼层
本帖最后由 社群技术交流 于 2019-7-30 10:51 编辑

作者:光环云 马立刚
AWS ElastiCache 概述
  • 支持两种类型的缓存引擎Memcached和Redis,同RDS一样,可以在EC2上安装Memcached和Redis软件,也可以用AWS ElastiCache托管服务来创建Memcached和Redis服务,AWS帮助我们创建和管理缓存实例的软件升级,打patch等
  • 常规业务系统的数据库访问中,读写操作的比例一般在7/39/1,也就是说读操作远多于写操作,因此高并发系统设计里,通过NoSQL技术将热点数据(短期内变动概率小的数据)放入内存以达到减轻DB压力,提升数据访问速度的目的,当然如果系统里的写操作居多也没有必要使用缓存,因此Redis主要用于解决访问性能和并发能力的问题。
  • 哪些数据适合作为缓存?
       1. 热点数据;
       2. 静态资源。
      哪些数据最好不要缓存?
      1. 不常访问的数据,如历史数据,账户余额等
      2. 经常变化的数据,如网站登录次数,某实时订单总数,实时订单状态等
  • Redis特性
       每个集群只有1个结点,但支持挂5个readreplica,可以将它们放到一个redis  replication group中, 支持多种数据类型,如list,map,string,set等, 支持数据持久化,可以将所有内存数据持久化到磁盘文件,并通过此备份文件创建新的Redis结点, 创建高配置的结点,从备份文件导入数据,不能直接修改原结点配置
  • Replication and Multi-AZ 副本和多可用区部署
      Redis 的 ElastiCache 提供具备自动故障转移和增强稳健性的多可用区功能
      这些功能只有Redis支持,开启Multi-AZ后,Redis具备高可靠,当某个副本挂掉后,AWS ElastiCache会自动创建新的结点,并加入replicationgroup。如果是主结点宕机,会选举一个副本作为主结点,并自动修改DNS接入点,这些对用户来说都是透明的,主-从之间的复制都是异步的
  • 备份和恢复 Redis支持备份和导出快照RDB文件到S3存储桶
       尽量不要在Primary node上backup数据,可以在只读副本上操作,以减少影响
       自动备份,支持自动创建snapshot来备份缓存数据,并存入S3,并定期删除备份
       手动备份,手动创建snapshot来备份数据,不会自动删除
       恢复时只能恢复到新创建的结点上,不能恢复到原结点
  • 访问控制
        Security Group and ACL:通过网络配置,指定哪些网络可以访问Redis结点
EC2 中Docker的Redis迁移到ElastiCache
  • 背景
      公司后端服务部署于AWS EC2之上,服务与Redis分别置于同一服务器的两个Docker容器中。 为避免因服务器故障造成Redis上的数据丢失,决定将其迁至ElastiCache中。
  • 备份Redis
      因为Redis是在Docker容器中,进行备份前需要进入到对应的容器中。使用docker ps命令可以获得当前正常运行的所有容器的信息,从中可以找到需要备份的Redis容器的容器ID,如下述示例中的758ba439ef38。获得Docker容器ID后,便可使用dockerexec -it <cid> /bin/bash命令进入该容器。
  1. $ docker ps
  2. CONTAINER
  3. ID       IMAGE                       COMMAND                  CREATED  
  4.            STATUS              PORTS                    NAMES
  5. 231ba129ef79
  6.       redis:4                    "redis"   3 weeksago         Up 3
  7. hours          0.0.0.0:6379->6379/tcp   service-redis
  8. $ docker exec-it 758ba439ef38 /bin/bash
复制代码
      进入Docker容器后,便可通过reids-cli连接到本地Redis服务器中,并使用save/bgsave命令进行备份操作。Redis中save/bgsave命令的都可备份数据,两者的区别为save需要阻塞Redis主进程知道数据保存完成,其间不响应任何客户端的操作;而bgsave命令将会创建一个子进程进行数据保存的操作,在允许bgsave的期间服务器扔可继续处理客户端的请求。
  1. root@758ba439ef38:/data# redis-cli
  2. 127.0.0.1:6379>bgsave
  3. 127.0.0.1:6379>exit
  4. root@758ba439ef38:/data# ls
  5. dump.rdb
复制代码
     运行完save/bgsave后,默认将在容器中的/data目录下生成一个名为dump.rdb的文件。

  • 获取备份文件
      至此,已经完成了Redis备份的操作,但保存后的dump.rdb文件扔存放与Docker容器中,需要手动从中复制/移动出Docker容器。首先需要退出Docker容器到服务器中,再使用docker cp <cid>:<src_path> <dest_path>命令复制到服务器中。
  1. root@758ba439ef38:/data# exit
  2. $ docker cp 758ba439ef38data/dump.rdb
复制代码
      上述语句的作用为将ID为231ba129ef79的Docker容器中的/data/dump.rdb文件复制至服务器中的当前目录下。为了能使用创建的备份文件,需要使用aws s3 cp命令将其上传至S3中。使用Amazon Linux系统映像的实例中默认已经安装有aws-cli,可直接使用aws s3 cp命令,而使用其他类型系统映像的实例可能需要先使用pip installawscli安装aws-cli后才可使用。

  1. $ aws s3 cpdump.rdb s3://redis-dump/dump.rdb
复制代码

     将备份文件上传至S3后,需为该文件授予ElastiCache的权限。在S3中选择上传的备份文件,进入该文件的详细页面后选择权限选项卡,若aws-scs-s3-readonly或下述对应的规范ID未列出,需点击其他AWS账户的访问权限添加对应的ID及授予读取对象与读取对象权限权限如以下:

  • 中国北京与中国宁夏区域:
      B58d6a125bdf69854ed8ef2e71d8a20b7c490f252111b806e514966e490b6d83
  • 所有其他区域:
      540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e8888
image1.png
file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png

  • 创建ElastiCache Redis实例
      进入ElastiCache控制面板,在左侧选择Redis后点击创建进行创建。创建过程中需要在将数据导入集群下的为 RDB 文件 S3 位置做种子填写备份文件的路径,格式为存储桶名称/文件夹(可省略)/文件名,例如上节中设置的,可填写为redis-dump/dump.rdb。参考图示:
image2.JPG
file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
创建Redis实例此过程大约需要数分钟,在Redis实例创建完成后,即可得到该实例的终端节点,在创建ElastiCache前,需要确认VPC设置,最好EC2应用和此redis在同一个VPC下的同一个子网,确保ElastiCache能访问S3中的资源,在创建完成后,需要确认安全组设置是否允许Redis对应端口入站。
  • 从本地或者其他环境迁移到ElastiCache的注意事项
      导出RDB文件后,需要原redis暂停服务,待导入到ElastiCache中后切换后再正常提供服务,使用ElastiCache将会产生额外的费用,建议在业务访问比较低时提示暂停服务。



转播转播
回复

使用道具

联系楼主
*
*
客户公司所在区域:
*
产品:
*
简述客户的业务场景和需求
*
*
*

成为第一个回答人

B Color Link Quote Code Smilies
光环云社区 |京ICP备18044167号-13|

京公网安备 11010102003758号