Bash实践:抽样检测数据迁移至Redis集群后的数据一致性
熟悉了一段时间的Bash编程,因此借此任务操作一把bash编程,主要涉及到Redis单节点与Redis集群的操作
1. 任务背景
近日有个任务需要将历史的Redis(主从节点)中的数据迁移至Redis集群中。相关条件与要求如下:
(1) 历史Redis以及新的Redis集群分别部署在北京、合肥、广州三地
(2) 待迁移的Redis数据只存在合肥环境
(3) 需要从一个节点访问三地的Redis集群或历史Redis节点
(4) 待迁移的Redis中的数据量大概为2000W+
(5) 迁移完成后需抽样检测数据迁移后的准确性、以及整体数量是否匹配
2. 实现流程
(1) 网络打通
需要从合肥节点能够同时访问北京、合肥、广州三地的Redis主从或集群,因此需要打通网络。
(2) 三地Redis集群访问
打通网络后,需要访问三地的Redis集群,采用Predixy中间件分别配置访问三地,Prodixy中间件使得对Redis集群的操作,像操作Redis单节点那样简单
(3) 数据迁移
Predixy部署好之后,执行数据迁移,由于数据量较大,使用hadoop或Spark进行迁移
(4) 迁移后的验证
需要验证迁移后的数据总量是否对等、且抽样检测迁移的数据是否准确。因此编写Bash脚本,进行抽样检测。具体内容如下:
1) 抽样检测数据的一致性
#!/bin/bash source ~/.bashrc old_port=( )
new_port=( ) init_pre=c_music
ip="127.0.0.1"
old_passwd="test1"
new_passwd="test2" type=$
to_check_id=$
if [ -z "$type" -o -z "$to_check_id" ];then
printf "Error paramter: <type(cr|tag|tpl|vu2sid|ao2u|vo2sid|so2u)> <to_check_id>\n"
exit
fi ## Redis集群需增加前缀,Redis主从需指定db
case "$type" in
"cr") old_db=; pre="$init_pre"_cr2sid_ ;;
"tag") old_db=; pre="$init_pre"_tg2sid_ ;;
"tpl") old_db=; pre="$init_pre"_topl_ ;;
"vu2sid") old_db=; pre="$init_pre"_vid2sid_ ;;
"ao2u") old_db=; pre="$init_pre"_al_o2u_ ;;
"vo2sid") old_db=; pre="$init_pre"_void2sid_ ;;
"so2u") old_db=; pre="$init_pre"_si_o2u_ ;;
*) "Invalid Type" && exit
esac printf "type:%s\t\tori_db:%s\t\tkey:%s\n" "$type" "$old_db" "$pre$to_check_id" ## 查找原始Redis主从的id信息
for port in ${old_port[@]}
do
ty=$(redis-cli -h $ip -p $port -n $old_db -a $old_passwd type $to_check_id)
if [ ! -z "$ty" ];then
printf "%s:%s\t\t" "$ip" "$port"
case $ty in
"list") redis-cli -h $ip -p $port -n $old_db -a $old_passwd lrange $to_check_id ; redis-cli -h $ip -p $port -n $old_db -a $old_passwd llen $to_check_id ;;
"string") redis-cli -h $ip -p $port -n $old_db -a $old_passwd get $to_check_id ;;
"hash") redis-cli -h $ip -p $port -n $old_db -a $old_passwd hgetall $to_check_id ;;
esac
break;
fi
done printf "\n" ## 查看迁移后的Redis集群中的id是否一致
for port in ${new_port[@]}
do
printf "%s:%s\t\t" "$ip" "$port"
case $ty in
"list") redis-cli -h $ip -p $port -c -a $new_passwd lrange "$pre$to_check_id" ; redis-cli -h $ip -p $port -c -a $new_passwd llen "$pre$to_check_id" ;;
"string") redis-cli -h $ip -p $port -c -a $new_passwd get "$pre$to_check_id" ;;
"hash") redis-cli -h $ip -p $port -c -a $new_passwd hgetall "$pre$to_check_id";;
esac
done
2) 校验总量是否一致
主要使用redis-cli中的--scan参数,下面的脚本主要是提取Redis集群中指定前缀(以下脚本中前缀为c_kg_vpo2u_)的key,注意使用keys "*"命令会导致阻塞,redis中建议禁止使用。
#!/bin/bash redis_bin=/bin
passwd="test" for ip in 127.0..{..} ## redis集群中的主节点
do
for port in {..} ## 相关的端口信息
do
echo "starting......"
$redis_bin/redis-cli -h $ip -p $port -a $passwd --scan --pattern "c_kg_vpo2u_*" >> c_kg_vpo2u.txt
echo "ending......"
done
done
Bash实践:抽样检测数据迁移至Redis集群后的数据一致性的更多相关文章
- Redis单节点数据同步到Redis集群
一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...
- 数据迁移_老集群RAC迁移数据恢复到新集群RAC
数据迁移_老集群RAC迁移数据恢复到新集群RAC 作者:Eric 微信:loveoracle11g 1.把老集群RAC备份的数据远程拷贝到新集群RAC [root@old-rac-node1 ~]# ...
- Redis单机数据迁移至Sentinel集群
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- hadoop hdfs 数据迁移到其他集群
# hadoop fs -cat /srclist Warning: $HADOOP_HOME is deprecated. hdfs://sht-sgmhadoopcm-01:9011/jdk-6u ...
- Redis集群搭建的三种方式
一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制. ...
- Redis集群入门
官方文章: https://redis.io/topics/cluster-tutorial#redis-cluster-configuration-parameters 本文永久地址: https: ...
- [个人翻译]Redis 集群教程(下)
[个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(中) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过 ...
- 深入浅出—Redis集群的相关详解
前言: 这篇文章主要介绍了Redis集群的相关,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 注意!要求使用的都是redis3.0以上的版本,因为3.0以上增加了red ...
- redis集群学习
转载: http://arganzheng.life/redis-cluster.html Redis3.0版本加入了cluster功能,解决了Redis单点无法横向扩展的问题. 分布式系统要解决的不 ...
随机推荐
- [SIP01]SIP Header Fields里面各字段用途
INVITE sip:bob@biloxi.com SIP/2.0 Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds Max-Forw ...
- layui后台框架的搭建
layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从 ...
- 也说AOP
前言 1.引言 2.Aop概念 3.Aop实践 4.总结 一.引言 对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里...博主今 ...
- 用FileZilla服务器端和客户端实现本机与虚拟机之间文件上传和下载
1. FileZilla简介 2.准备工作3.安装 FileZilla Server和配置3.1.问题及解决方法3.2.添加目录3.3.测试FIP4.安装FileZilla Client5.连接服务器 ...
- 洛谷P5158 【模板】多项式快速插值
题面 传送门 前置芝士 拉格朗日插值,多项式多点求值 题解 首先根据拉格朗日插值公式我们可以暴力\(O(n^2)\)插出这个多项式,然而这显然是\(gg\)的 那么看看怎么优化,先来看一看拉格朗日插值 ...
- [AIR] 使用操作系统默认应用程序打开文件
AIR 2.0及以上提供了非常简单易用的API让你使用操作系统所定义的关联应用程序打开文件. 这使得使用AIR开发基于“文件管理器”的应用称为可能 用法如下: var file:File = File ...
- Tutorial 01 4,5题
.任务四: 程序设计思想:利用Math.random()产生一个char类型的字符,再利用for循环是他们相加,最后将他们放在一个消息框中输出. 程序流程图: 源程序: p ...
- JS 与 OC 交互
WebView与JS的几种交互 IOS中 使用JavaScriptCore 实现OC与JS的交互 JavaScriptCore 使用
- StringBuffer类和String类的区别
StringBuffer是使用缓冲区的,本身也是操作字符串的,但与String类不同,String类的内容一旦声明后是不可改变的,改变的只是其内存的指向,而StringBuffer类的对象内容是可以改 ...
- java中的Lamdba表达式和Stream
基于JDK 1.8 1.循环: // 以前的循环方式 for (String player : players) { System.out.print(player + "; ") ...