熟悉了一段时间的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集群后的数据一致性的更多相关文章

  1. Redis单节点数据同步到Redis集群

    一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...

  2. 数据迁移_老集群RAC迁移数据恢复到新集群RAC

    数据迁移_老集群RAC迁移数据恢复到新集群RAC 作者:Eric 微信:loveoracle11g 1.把老集群RAC备份的数据远程拷贝到新集群RAC [root@old-rac-node1 ~]# ...

  3. Redis单机数据迁移至Sentinel集群

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  4. hadoop hdfs 数据迁移到其他集群

    # hadoop fs -cat /srclist Warning: $HADOOP_HOME is deprecated. hdfs://sht-sgmhadoopcm-01:9011/jdk-6u ...

  5. Redis集群搭建的三种方式

    一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制. ...

  6. Redis集群入门

    官方文章: https://redis.io/topics/cluster-tutorial#redis-cluster-configuration-parameters 本文永久地址: https: ...

  7. [个人翻译]Redis 集群教程(下)

    [个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(中) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过 ...

  8. 深入浅出—Redis集群的相关详解

    前言: 这篇文章主要介绍了Redis集群的相关,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 注意!要求使用的都是redis3.0以上的版本,因为3.0以上增加了red ...

  9. redis集群学习

    转载: http://arganzheng.life/redis-cluster.html Redis3.0版本加入了cluster功能,解决了Redis单点无法横向扩展的问题. 分布式系统要解决的不 ...

随机推荐

  1. winfrom 右下角弹窗(渐渐消失)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. Maximum file handles allowed by OS

    Linux can open 1024 files concurrently by each process by default: http://m.blog.csdn.net/blog/keepe ...

  3. Gamma Correction of OIIO

    \apiitem{"oiio:ColorSpace" : string}   The name of the color space of the color channels. ...

  4. [Perl]Can't link/include C library 'ft2build.h', 'freetype', aborting.

    原文:http://www.code-by.org/viewtopic.php?f=60&t=284 错误提示 Font-FreeType-0.07>perl Makefile.PL B ...

  5. Collection 集合框架

    1. Collection 集合框架:在实际开发中,传统的容器(数组)在进行增.删等操作算法和具体业务耦合在一起,会增加程序的开发难度:这时JDK提供了这样的容器---Collection 集合框架, ...

  6. 爬虫开发11.scrapy框架之CrawlSpider操作

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...

  7. 最大子段和问题(dp)

    最大子段和问题 给出一个整数数组a(正负数都有),如何找出一个连续子数组(可以一个都不取,那么结果为0),使得其中的和最大?   例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4, ...

  8. this指向的一个小总结

    凡是在函数内部调用的函数的this的指向都是window 定时器,延时器this的指向都是window 在事件中一般情况下this的指向都指向当前的DOM对象 在对象函数中this的指向一般情况下都指 ...

  9. 题目1010:A + B(字符串拆分)

    问题来源 http://ac.jobdu.com/problem.php?pid=1010 问题描述 给我们一行标准的字符串,整行读入之后,把它拆开转换成数字进行计算. 问题分析 首先考虑一个问题:如 ...

  10. .net core webapi发布

    地址:https://www.cnblogs.com/laozhang-is-phi/p/9565227.html#autoid-5-1-0 地址2:https://www.cnblogs.com/f ...