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单点无法横向扩展的问题. 分布式系统要解决的不 ...
随机推荐
- redis内部数据结构
redis内部数据结构,是指redis在自身的构建中,基于这些特定的内部数据结构进行的. 简单动态字符串:Simple Dynamic String 双端链表 字典:Dictonary 跳跃表:ski ...
- WPF 实现INotifyPropertyChanged .Net Framework 4.5
自己动手写了一个基类来实现INotifyPropertyChanged接口,以后可以直接使用. using System.ComponentModel; using System.Runtime.Co ...
- Python进程间通信之共享内存
前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...
- lua 5.3 英文手册 google机器翻译版
LUA Lua 5.3参考手册作者:Roberto Ierusalimschy,Luiz Henrique de Figueiredo,Waldemar Celes 版权所有©2015-2018 Lu ...
- JS 性别选择
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 原生态js单个点击展开收缩
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WEB新手之serialize’s revenge
最后一道题. 这道题提示比较少,一点也不友好.F12也没有什么线索.无奈之下用御剑扫下后台,发现了一个叫robots的txt文件. 打开robots.txt文件,可以得到一段代码,如下图所示. 审查代 ...
- jqGrid-基础篇
jqGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信. 一.jqGrid特性 基于jquery UI主题,开发者可以根据客户要 ...
- THUSC2017酱油记
啊..酱油记三连发.. 果然SHTSC用掉太多RP了.. 其实感觉没什么好写的..都被考懵逼了.. 但还是写一下吧.. DAY0 月考完提前一天到了..什么也没发生 DAY1 先考试再开幕式..好奇怪 ...
- MySQL大数据高并发处理之-查询的优化
http://www.php1.cn/Content/MySQL_DaShuJuGaoBingFaChuLiZhi_-_ChaXunDeYouHua.html