记一次 Redis 数据库迁移

笔者通过一个 Redis 数据库迁移的例子,介绍了迁移脚本的执行思路。

作者:马文斌,MySQL/Redis 爱好者~

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 500 字,预计阅读需要 2 分钟。

业务背景

最近因业务需要将集群中的 Redis db8 迁移到另一个库中。不需要把全部的 Redis 都迁移过去,只需要迁移 db8 到新服务器的 db15。

大概情况是这样,如图:

集群迁移效果

当然也探索了一些开源工具看能否实现,最后效果都不太理想,于是自己手撸一个脚本来迁移吧。

migrate_redis.py

以下是脚本内容。

import redis
import time# 定义 redis1 和 redis 主机信息
redis1_host = '192.168.1.1'
redis1_port = 6579
redis1_db = 8
redis1_password = 'xxxx'redis2_host = '192.168.1.1'
redis2_port = 6579
redis2_db = 15
redis2_password = 'xxxx'# 连接 redis1 和 redis2 并验证密码
redis1 = redis.StrictRedis(host=redis1_host, port=redis1_port, db=redis1_db, password=redis1_password)
redis2 = redis.StrictRedis(host=redis2_host, port=redis2_port, db=redis2_db, password=redis2_password)# 设置每次批量迁移的数据量
batch_size = 1000# 为进度跟踪初始化变量
keys_processed = 0
start_time = time.time()# 使用 SCAN 批量获取 key
cursor = '0'
total_keys = len(redis1.keys('*'))while cursor != 0:cursor, keys = redis1.scan(cursor, count=batch_size)for key in keys:key_data = redis1.dump(key)redis2.restore(key, 0, key_data, replace=True)keys_processed += 1# 每 1000 个 key 打印一次进度if keys_processed % batch_size == 0 or keys_processed == total_keys:elapsed_time = time.time() - start_timekeys_per_second = batch_size / elapsed_timeestimated_remaining_time = (total_keys - keys_processed) / keys_per_secondprint(f"Processed {keys_processed}/{total_keys} keys. "f"Elapsed Time: {elapsed_time:.2f} seconds. "f"Estimated Remaining Time: {estimated_remaining_time:.2f} seconds for the next 1000 keys.")# 为下一批次重置变量start_time = time.time()print("Data migration completed.")

输出效果

每隔 1000 个 key 打印一次输出,并评估剩余迁移时间。

Processed 1000/3592 keys. Elapsed Time: 16.46 seconds. Estimated Remaining Time: 42.67 seconds for the next 1000 keys.
Processed 2000/3592 keys. Elapsed Time: 16.96 seconds. Estimated Remaining Time: 27.01 seconds for the next 1000 keys.
Processed 3000/3592 keys. Elapsed Time: 17.03 seconds. Estimated Remaining Time: 10.08 seconds for the next 1000 keys.
Processed 3592/3592 keys. Elapsed Time: 9.81 seconds. Estimated Remaining Time: 0.00 seconds for the next 1000 keys.
Data migration completed.Process finished with exit code 0

迁移完之后检查

运行 info 命令检查:

源库 3592 个 key,目标库也是 3592 个 key, 迁移完成,收工!

迁移检查

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343868.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘HTTP协议:深入了解互联网通信的核心!

文章目录 HTTPHTTP的消息结构HTTP 常用请求方法HTTP 状态码 HTTP HTTP 是超文本传输协议,HTTP是缩写,全称是 HyperText Transfer Protocol 超文本指的是 HTML、css、JavaScript和图片等,HTTP的出现就是为方便接收和发布超HTML页面&#xff0c…

Django(七)

Django(六) 4.编辑用户 点击编辑,跳转到编辑页面(将编辑行的ID携带过去)。编辑页面(默认数据,根据ID获取并设置到页面中)提交: 错误提示数据校验在数据库更新 user_edit.html {% exte…

代码随想录 Leetcode203. 移除链表元素

题目: 代码(首刷看解析 2024年1月11日): class Solution { public:ListNode* removeElements(ListNode* head, int val) {if(headnullptr) return nullptr;ListNode* BeforeHead new ListNode(0,head);ListNode* temp BeforeHead;while(te…

Android开发基础(三)

Android开发基础(三) 本篇将介绍Android权限管理。 Android权限管理 Android权限管理主要是为了保护用户的隐私和设备的安全性; 在Android系统中,应用在请求权限时必须进行明确的申请,根据权限的保护级别&#xff0…

打造高性价比小程序,轻松降低成本

随着移动互联网的普及,小程序已经成为一个热门的应用开发方向。然而,对于许多企业和个人而言,制作一个小程序的费用却让人望而却步。那么,如何以最低的成本制作一款高性价比的小程序呢? 答案很简单,只需要找…

什么是 CAS

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

Qt添加资源文件

ui->setupUi(this);//1. 使用本地文件:ui->actionasdasdas->setIcon(QIcon("本地绝对路径"));ui->actiona1->setIcon(QIcon("C:/Users/满满/Desktop/output/picture/1.jpg"));//2. 使用资源文件:ui->actionasdasd…

C++内存管理机制(侯捷)笔记4(完结)

C内存管理机制(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 介绍 下面是第四讲和第五讲…

html+css实现子元素完全居中常见方案

详细过程 查看公众号文章 htmlcss实现子元素完全居中常见方案 获取更多内容,请关注微信公众号。搜索“码圈小橙子”,或扫描下方二维码获取关注

Jarvis步进法(Jarvis March)凸包算法

Jarvis步进法(也称为包裹法): Jarvis步进法是一种逐步选择凸包顶点的算法。从点集中选择一个起始点,然后在每一步中选择下一个顶点,该顶点是当前点集中与当前点形成的线段上,极角最小的点。该算法的时间复杂…

限流式保护器在户外汽车充装的应用

摘 要:国家标准GB51348-2019中规定储备仓库、电动车充电等场所的末端回路应设置限流式电气防火保护器。电气防火限流式保护器可以有效克服传统断路器、空气开关和监控设备存在的短路电流大、切断短路电流时间长、短路时产生的电弧火花大,以及使用寿命短等…

XSS的利用(包含:蓝莲花、beef-xss)

0x00、环境搭建 dvwa靶场 操作指南和最佳实践:使用 DVWA 了解如何防止网站漏洞_dvwa源代码-CSDN博客 xss漏洞接收平台 下载:GitHub - firesunCN/BlueLotus_XSSReceiver 将解压后的BlueLotus_XSSReceiver原代码放置 phpstudy 安装目录的WWW文件夹下 访问平台:http://127…