百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

将ElastiCache Redis迁移到ec2 Linux实例

mhr18 2024-11-20 18:45 23 浏览 0 评论

ElastiCache for Redis简介:ElastiCache for Redis是AWS提供的基于原生的Redis做二次开发并提供缓存服务的托管业务,完全兼容原生Redis的API,通过ElastiCache for Redis服务可以省去我们在普通Linux服务器上部署和维护Redis的成本,让我们更专注于业务本身.

但是使用ElastiCache for Redis也会带来以下问题.

  1. 更高的费用:例如我们在AWS ec2上部署一台同等2核16GB内存大小的Linux实例,价格为¥595.00/月,使用ElastiCache for Redis单节点的费用是¥2331.00/月.
  1. 升级不便,在ec2上部署redis集群后可以在线升级Redis版本或者内存大小,但是使用ElastiCache for Redis需要将整个集群重启,缓存业务需要暂停.
  1. 监控不便,虽然ElastiCache for Redis提供了监控指标,但是不够详细,无法深入到Redis内部.

现在我们将一台ElastiCache for Redis单节点的实例迁移到AWS ec2的Linux实例

这里注意:我们在ElastiCache for Redis的版本是2.8.4,在ec2的Linux实例Redis版本是5.0.9

在ec2 Linux实例部署Redis

这里需要特别注意的是,部署Redis时不要启动AOF持久化功能,仅启用RDB持久化功能即可,这是因为如果同时开启了AOF和RDB持久化,Redis启动时会优先读取AOF文件,导致无法加载RDB文件,备份ElastiCache for Redis时实际上是使用BGSAVE产生一个RDB文件.

在Elasticache的默认区域创建Amazon S3存储桶

S3: 可以简单理解为文件服务器

存储桶: 可以简单理解为文件服务器中最上层的一个文件夹,你可以在这个最上层的文件夹里创建子文件夹或者存放数据,

授予ElastiCache对默认区域中的S3存储桶的访问权限

为了使 ElastiCache 能够向 Amazon S3 存储桶复制快照,需要为其授予该存储桶的访问权限,按照如下所示

手动对ElastiCache for Redis做备份

以下利用aws的命令行界面创建备份,也可以使用AWS的web操作

$ /usr/local/bin/aws elasticache create-snapshot \
    --region us-east-1 \
    --cache-cluster-id ec1d-userredis-01 \
    --snapshot-name dump-20200711

输出log

{
    "Snapshot": {
        "Engine": "redis", 
        "CacheParameterGroupName": "ec1d-userredis-20160726", 
        "VpcId": "vpc-e8ba5383", 
        "TopicArn": "arn:aws:sns:us-east-1:269547223311:NOC-DBA", 
        "CacheClusterId": "ec1d-userredis-01", 
        "SnapshotRetentionLimit": 7, 
        "NumCacheNodes": 1, 
        "SnapshotName": "dump-20200711", 
        "CacheClusterCreateTime": "2016-02-04T20:05:10.901Z", 
        "AutoMinorVersionUpgrade": true, 
        "PreferredAvailabilityZone": "us-east-1e", 
        "SnapshotStatus": "creating", 
        "SnapshotSource": "manual", 
        "SnapshotWindow": "08:01-09:01", 
        "EngineVersion": "2.8.24", 
        "NodeSnapshots": [
            {
                "CacheSize": "", 
                "CacheNodeId": "0001", 
                "CacheNodeCreateTime": "2016-02-04T20:05:10.901Z"
            }
        ], 
        "CacheSubnetGroupName": "ecachesubnetgroup", 
        "Port": 6379, 
        "PreferredMaintenanceWindow": "sun:10:01-sun:11:01", 
        "CacheNodeType": "cache.m3.medium"
    }
}

将ElastiCache备份导出到Amazon S3存储桶

备份完成后,我们将备份文件上传到刚才创建的S3存储通

以下利用aws的命令行界面创建备份,也可以使用AWS的web操作

$ /usr/local/bin/aws elasticache copy-snapshot \
    --region us-east-1 \
    --source-snapshot-name dump-20200711 \
    --target-snapshot-name dump-20200711 \
    --target-bucket redis-dump

输出log

{
    "Snapshot": {
        "Engine": "redis", 
        "CacheParameterGroupName": "ec1d-userredis-20160726", 
        "VpcId": "vpc-e8ba5383", 
        "TopicArn": "arn:aws:sns:us-east-1:269505453311:DB-OWNER", 
        "CacheClusterId": "ec1d-userredis-01", 
        "SnapshotRetentionLimit": 7, 
        "NumCacheNodes": 1, 
        "SnapshotName": "dump-20200711", 
        "CacheClusterCreateTime": "2016-02-04T20:05:10.901Z", 
        "AutoMinorVersionUpgrade": true, 
        "PreferredAvailabilityZone": "us-east-1e", 
        "SnapshotStatus": "exporting", 
        "SnapshotSource": "manual", 
        "SnapshotWindow": "08:01-09:01", 
        "EngineVersion": "2.8.24", 
        "NodeSnapshots": [
            {
                "CacheSize": "16 MB", 
                "SnapshotCreateTime": "2020-07-11T11:46:55Z", 
                "CacheNodeId": "0001", 
                "CacheNodeCreateTime": "2016-02-04T20:05:10.901Z"
            }
        ], 
        "CacheSubnetGroupName": "ecachesubnetgroup", 
        "Port": 6379, 
        "PreferredMaintenanceWindow": "sun:10:01-sun:11:01", 
        "CacheNodeType": "cache.m3.medium"
    }
}

上传完成后可以在刚才创建的存储桶中看到


将ec2 Linux实例部署的Redis服务停止

$ ps aux |grep redis
redis    18734  0.1  0.2 178608 16276 ?        Ssl  18:03   0:12 redis-server 0.0.0.0:6379
redis    25857  0.0  0.0 112708   984 pts/4    S+   20:02   0:00 grep --color=auto redis
$ kill -9 18734

将Amazon S3存储桶的的ElastiCache备份导出到ec2 Linux实例

从S3存储桶将备份下载

$ /usr/local/bin/aws s3 cp s3://redis-dump/dump-20200711-0001.rdb .

将原来的dump.rdb数据文件删除,将备份文件重命名为dump.rdb

$ rm -rf dump.rdb
$ mv dump-20200711-0001.rdb dump.rdb

将ec2 Linux实例部署的Redis服务启动

$ redis-server ../conf/redis.conf
$ redis-cli
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db1:keys=49,expires=0,avg_ttl=0
db2:keys=3370,expires=0,avg_ttl=0
db4:keys=489,expires=489,avg_ttl=75256404
db6:keys=421,expires=421,avg_ttl=75155522
db7:keys=1589,expires=0,avg_ttl=0
db8:keys=43827,expires=0,avg_ttl=0
db9:keys=2,expires=2,avg_ttl=53112235596
db13:keys=554,expires=554,avg_ttl=12508995435

从以上可以看到,redis启动后自动从我们备份的dump.rdb文件读取key-value的信息并加载到内存.

执行BGSAVE生成一个新的RDB文件

这里简单介绍一下,RDB文件是一个二进制文件,每个Redis发布版本的都会有对应一个RDB文件版本(当然也可能Redis小版本发布后沿用之前的RDB版本),Redis2.8.4的RDB版本是00006,而Redis5.0.9的RDB版本是00009,因为我们加载备份后还没有重启Redis或者执行SAVE/BGSAVE,所以RDB文件保存的还是以前的旧版本,可以通过下列命令查看

$ od -c dump.rdb | less
0000000   R   E   D   I   S   0   0   0   6 376  \0  \0   %   E   l   a
......

其中"0 0 0 6"就是代表的RDB文件的版本

手动执行BGSAVE生成一个新的RDB文件

127.0.0.1:6379> bgsave
Background saving started

通过log可以看到BGSAVE是否执行完成

26264:M 11 Jul 2020 20:18:31.479 * Background saving started by pid 26724
26724:C 11 Jul 2020 20:18:31.942 * DB saved on disk
26724:C 11 Jul 2020 20:18:31.944 * RDB: 0 MB of memory used by copy-on-write
26264:M 11 Jul 2020 20:18:32.039 * Background saving terminated with success

此时我们再次查看RDB文件版本

$ od -c dump.rdb | less
0000000   R   E   D   I   S   0   0   0   9 372  \t   r   e   d   i   s

可以看到RDB文件的版本号已经变成其中"0 0 0 9"了

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: