老司机的 redis 数据迁移笔记

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 老服务器上内存一直报警,所以要把一部分redis数据迁移到新服务器上去。 迁移的方式有两种,一种是停服务器,搬迁数据;另一种通过主从同步转移。 停服务器,搬迁数据 首先在原服务器上执行redis-cli shutdown命令,该命令会触发保证写RDB文件以及将AOF文件写入磁盘,不会丢失数

老服务器上内存一直报警,所以要把一部分redis数据迁移到新服务器上去。

迁移的方式有两种,一种是停服务器,搬迁数据;另一种通过主从同步转移。

停服务器,搬迁数据

  1. 首先在原服务器上执行redis-cli shutdown命令,该命令会触发保证写RDB文件以及将AOF文件写入磁盘,不会丢失数据。 如果是kill -9 pid就会丢失数据。

  2. 然后将RDB文件和AOF文件都拷贝到新服务器上,注意需要与redis.conf文件中指定RDB文件名和AOF文件名匹配。

  3. 最后在新服务器上启动redis服务器。

个人觉得这种方式有点暴力,因为中间将数据保存到磁盘、拷贝数据、启动服务器,将数据从磁盘导入内存,会有很长一段时间。这段时间对线上服务造成不小的影响,所以我也没这么用。

主从同步转移

  1. 首先在新服务器上直接进入redis-cli,执行从库配置slaveof 192.168.1.100 6379,这里假设要将192.168.1.1006379端口的redis服务转移过来。这样就已经开始同步了。通过info可以查看当前服务器是slave

  2. 然后通过info命令查看master_link_status,如果为up,表示同步完成。(在同步过程中,执行查询的时候还是会提示"Redis is loading the dataset in memory",这属于正常情况.把数据从磁盘文件加载到内存中可能会消耗很长的一段时间。)

  3. 最后断开主从关系,在redis-cli命令行下执行slaveof no one提示OK,再通过info查看,该新服务器已经自己变成master了。

善后

确保旧的服务器的服务已经停止服务

上面没有配合说明业务代码对服务器的请求切换,但是我们在切换完服务之后肯定需要转移业务代码的请求吧。那么如何确定服务已经完全转移走了呢?

在旧服务器上通过netstat命令查看是否还有请求过来。

$ netstat -an|grep "100:6379"|wc -l

有时候netstat的结果也不一定准,因为有些请求已经不在,但是socket状态还在,比如CLOSE_WAIT状态最长可持续2小时。同时socket请求太快,也会出现netstat没数据,但是实际网卡有流量的情况。

我们可以通过tcdump监控网卡在该端口上确实已经没有流量。

tcpdump  -i em2 -vv -nn host  192.168.1.100 and  port 6379

注意排除监控系统对该redis实例的请求。

如何判断 redis 已经同步完毕呢?

  1. 在命令行查看 info master_link_status:up,则表示同步完成了。

  2. 日志文件也可以看

    [48864] 12 Jun 11:24:03.549 * The server is now ready to accept connections on port 6310
    [48864] 12 Jun 11:31:52.936 * SLAVE OF 192.168.50.17:8004 enabled (user request)
    [48864] 12 Jun 11:31:53.467 * Connecting to MASTER 192.168.50.17:8004
    [48864] 12 Jun 11:31:53.467 * MASTER <-> SLAVE sync started
    [48864] 12 Jun 11:31:53.470 * Non blocking connect for SYNC fired the event.
    [48864] 12 Jun 11:31:53.470 * Master replied to PING, replication can continue...
    [48864] 12 Jun 11:31:53.470 * Partial resynchronization not possible (no cached master)
    [48864] 12 Jun 11:31:53.470 * Master does not support PSYNC or is in error state (reply: -ERR unknown command 'PSYNC')
    [48864] 12 Jun 11:31:53.470 * Retrying with SYNC...
    [48864] 12 Jun 11:32:13.085 * MASTER <-> SLAVE sync: receiving 484322714 bytes from master
    [48864] 12 Jun 11:32:18.498 * MASTER <-> SLAVE sync: Flushing old data
    [48864] 12 Jun 11:32:18.498 * MASTER <-> SLAVE sync: Loading DB in memory
    [48864] 12 Jun 11:32:32.349 * MASTER <-> SLAVE sync: Finished with succes

RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高度兼容Oracle。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
canal 缓存 NoSQL
【Redis系列笔记】双写一致性
本文讨论了缓存不一致问题及其后果,如价格显示错误和订单计算错误。问题主要源于并发和双写操作的异常。解决方案包括使用分布式锁(但可能导致性能下降和复杂性增加)、延迟双删策略(通过延迟删除缓存来等待数据同步)以及异步同步方法,如通过Canal和MQ实现数据的最终一致性。面试中,可以提及这些策略来确保数据库和缓存数据的一致性。
26 1
【Redis系列笔记】双写一致性
|
2月前
|
存储 缓存 NoSQL
蚂蚁金服P7私藏的Redis原理与实践内部笔记
Redis 是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
59 1
|
3月前
|
NoSQL Redis
Redis原理之网络通信协议笔记
1. RESP协议 ​2. 自定义Socket连接Redis
|
3月前
|
NoSQL Linux Redis
Redis原理之网络模型笔记
Redis采用单线程模型,这意味着一个Redis服务器在任何时刻都只会处理一个请求。Redis的网络模型涉及到阻塞I/O(Blocking I/O)、非阻塞I/O(Non-blocking I/O)、I/O多路复用(I/O Multiplexing)、信号驱动I/O(Signal-driven I/O)以及异步I/O(Asynchronous I/O)。
|
29天前
|
NoSQL Redis Docker
Docker中Redis数据迁移到本地
Docker中Redis数据迁移到本地
19 1
|
19天前
|
NoSQL Redis 数据库
通过migrate命令实现两个redis实例之间的数据迁移
通过migrate命令实现两个redis实例之间的数据迁移
|
19天前
|
NoSQL Redis Sentinel
redis数据迁移方式
redis数据迁移方式汇总
21 0
|
3月前
|
NoSQL Redis
Redis原理之五种数据类型笔记
String List Set ZSet ​ Hash
|
3月前
|
NoSQL Redis C语言
|
3月前
|
存储 移动开发 NoSQL
笔记 - 《Redis深度历险》
《Redis深度历险》的笔记

热门文章

最新文章