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单点无法横向扩展的问题. 分布式系统要解决的不 ...
随机推荐
- (原创)Log4Net 在多层项目中的使用小记
这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各有各的说法,我结合我自己这个项目的需要,首先,项 ...
- vmware虚拟机监控数据
在vsphere产品中内建一个监控所有虚机包括主机资源的插件,叫做vcenter servcie status,这个插件的主要功能是记录当前虚拟机资源的cpu.硬盘.内存和网络等相关信息.通过它可以查 ...
- RAID 介绍
介绍 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨 ...
- TCP/IP学习笔记(3)-IP、ARP、RARP协议
这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树)
题面 传送门 题解 为啥一直莫名其妙\(90\)分啊--重构了一下代码才\(A\)掉-- 先考虑直接\(dp\)怎么做 树形\(dp\)的时候,记一下断开某个节点的最小值,就是从根节点到它的路径上最短 ...
- linux下的常用指令
1,在vim中查找字符段 :1?字段名,此方式可以从开始向下查询字段了. :?字段名 ,查询字都段: 2,修改某个文件夹用户和组 修改文件所属用户:chown [-R] 用户 文件或目录 如:chow ...
- [ActionScript 3.0] 处理xml内容换行时行间距较大问题的一种简单方法
我们一定遇到过这种情况,在读取xml里的文章内容时,一旦有换行的位置在flash里显示出来的行间距会比较大,而并非我们想要的效果,解决这个问题的方法除了使用正则表达式以外,这里介绍一种比较简单的方法, ...
- 事件委托,元素节点操作,todolist计划列表实例
一. 事件委托 事件委托就是利用冒泡的原理,把事件加到父级上,来代替子集执行相应的操作,事件委托首先可以极大减少事件绑定次数,提高性能:其次可以让新加入的子元素也可以拥有相同的操作. 比如有20个&l ...
- 针对ACM输出格式的一个小技巧(对格式错误说不!)
printf("%d%c",bmax," \n"[i==n]); 上文中bmax为题目中需要输出的整形变量,可以脑补很多ans,max之类的,重点在于%c和后面 ...
- django笔记-model
python manage.py sqlmigrate polls 打印人类可读格式