将AWS EC2的Docker中的Redis迁移到ElastiCache

作者:光环云 马立刚

AWS ElastiCache 概述

  • 支持两种类型的缓存引擎Memcached和Redis,同RDS一样,可以在EC2上安装Memcached和Redis软件,也可以用AWS ElastiCache托管服务来创建Memcached和Redis服务,AWS帮助我们创建和管理缓存实例的软件升级,打patch等
  • 常规业务系统的数据库访问中,读写操作的比例一般在7/3到9/1,也就是说读操作远多于写操作,因此高并发系统设计里,通过NoSQL技术将热点数据(短期内变动概率小的数据)放入内存以达到减轻DB压力,提升数据访问速度的目的,当然如果系统里的写操作居多也没有必要使用缓存,因此Redis主要用于解决访问性能和并发能力的问题。
  • 哪些数据适合作为缓存?
  1. 热点数据;
  2. 静态资源。
  • 哪些数据最好不要缓存?
  1. 不常访问的数据,如历史数据,账户余额等
  2. 经常变化的数据,如网站登录次数,某实时订单总数,实时订单状态等
  • Redis特性
    每个集群只有1个结点,但支持挂5个read replica,可以将它们放到一个redis replication group中, 支持多种数据类型,如list,map,string,set等, 支持数据持久化,可以将所有内存数据持久化到磁盘文件,并通过此备份文件创建新的Redis结点, 创建高配置的结点,从备份文件导入数据,不能直接修改原结点配置
  • Replication and Multi-AZ 副本和多可用区部署
    Redis 的 ElastiCache 提供具备自动故障转移和增强稳健性的多可用区功能
    这些功能只有Redis支持,开启Multi-AZ后,Redis具备高可靠,当某个副本挂掉后,AWS ElastiCache会自动创建新的结点,并加入replication group。如果是主结点宕机,会选举一个副本作为主结点,并自动修改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后,便可使用docker exec -it /bin/bash命令进入该容器。
 $ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
231ba129ef79        redis:4                     "redis"   3 weeks ago         Up 3 hours          0.0.0.0:6379->6379/tcp   service-redis
$ docker exec -it 758ba439ef38 /bin/bash

进入Docker容器后,便可通过reids-cli连接到本地Redis服务器中,并使用save/bgsave命令进行备份操作。Redis中save/bgsave命令的都可备份数据,两者的区别为save需要阻塞Redis主进程知道数据保存完成,其间不响应任何客户端的操作;而bgsave命令将会创建一个子进程进行数据保存的操作,在允许bgsave的期间服务器扔可继续处理客户端的请求。

root@758ba439ef38:/data# redis-cli
127.0.0.1:6379> bgsave
127.0.0.1:6379> exit
root@758ba439ef38:/data# ls
dump.rdb

运行完save/bgsave后,默认将在容器中的/data目录下生成一个名为dump.rdb的文件。

  • 获取备份文件
    至此,已经完成了Redis备份的操作,但保存后的dump.rdb文件扔存放与Docker容器中,需要手动从中复制/移动出Docker容器。首先需要退出Docker容器到服务器中,再使用docker cp :<src_path> <dest_path>命令复制到服务器中。
root@758ba439ef38:/data# exit
$ docker cp 758ba439ef38 data/dump.rdb .

上述语句的作用为将ID为231ba129ef79的Docker容器中的/data/dump.rdb文件复制至服务器中的当前目录下。为了能使用创建的备份文件,需要使用aws s3 cp命令将其上传至S3中。使用Amazon Linux系统映像的实例中默认已经安装有aws-cli,可直接使用aws s3 cp命令,而使用其他类型系统映像的实例可能需要先使用pip install awscli安装aws-cli后才可使用。

$ aws s3 cp dump.rdb s3://redis-dump/dump.rdb

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

  • 中国北京与中国宁夏区域:
    B58d6a125bdf69854ed8ef2e71d8a20b7c490f252111b806e514966e490b6d83

  • 所有其他区域:
    540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e8888
    在这里插入图片描述

  • 创建ElastiCache Redis实例
    进入ElastiCache控制面板,在左侧选择Redis后点击创建进行创建。创建过程中需要在将数据导入集群下的为 RDB 文件 S3 位置做种子填写备份文件的路径,格式为存储桶名称/文件夹(可省略)/文件名,例如上节中设置的,可填写为redis-dump/dump.rdb。参考图示:
    在这里插入图片描述
    创建Redis实例此过程大约需要数分钟,在Redis实例创建完成后,即可得到该实例的终端节点,在创建ElastiCache前,需要确认VPC设置,最好EC2应用和此redis在同一个VPC下的同一个子网,确保ElastiCache能访问S3中的资源,在创建完成后,需要确认安全组设置是否允许Redis对应端口入站。

  • 从本地或者其他环境迁移到ElastiCache的注意事项
    导出RDB文件后,需要原redis暂停服务,待导入到ElastiCache中后切换后再正常提供服务,使用ElastiCache将会产生额外的费用,建议在业务访问比较低时提示暂停服务。

发布了35 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/SinnetCloud/article/details/100116706