生产实践:
使用shell重复调用命令行
学习技巧:
Shell 判断、循环、function & polysh工具使用
脚本内容:
使用shell脚本一键迁移存储机器上的分片,使用polysh在中控机上执行,避免登陆集群机器手动执行命令,提高效率
mig_rt_out.sh:将分片迁出
#!/bin/bash # create by anzhihe@chegva.com 2020-05-14 dirname="/home/anzhihe/opdir/" logfile="/home/anzhihe/opdir/mig_rt.log" show_copy_tasks="/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks" force_balance="/home/anzhihe/rt-table/rt-dashboard/MasterCmd force_balance offset=0 limit=1" get_time() { echo -e "\n++++++++++++ `date '+%F %T'` ++++++++++++" | tee -a $logfile } # 获取迁移分片任务总数 get_tasksum() { sum=`/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks |wc -l` task_sum=`expr $sum - 3` } # 将迁移任务信息记录日志 set_logfile() { echo "++++++++++++ $1 分片迁移任务开始 ++++++++++++" | tee -a $logfile echo $date_now >> $logfile && echo "$($show_copy_tasks)" | tee -a $logfile } # 配置分片迁移信息 set_copy_tasks_info() { if [ $# -lt 1 ]; then echo "Usage: `basename $0` host_ip1 host_ip2..." exit; elif [ $# -eq 1 ]; then json_file=`echo $1".json"` chunk_file=`echo "$dirname""$json_file"` #echo $chunk_file if [ ! -f "$chunk_file" ]; then get_time echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute --output_check_res 0 rm_chunks --chunks $1:9090 > $chunk_file" | tee -a $logfile /home/anzhihe/rt-table/rt-dashboard/trp_distribute --output_check_res 0 rm_chunks --chunks $1:9090 > $chunk_file | tee -a $logfile echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file" | tee -a $logfile /home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file | tee -a $logfile set_logfile "$1" else echo "$chunk_file文件已存在,请检查!" | tee -a $logfile exit 1 fi else port=":9090" host=("$*") allhost=`echo $host | sed "s/\s\+/_/g"` hostinfo=`echo $host | sed "s/\s\+/${port}#/g"`${port} #echo $hostinfo json_file=`echo $allhost".json"` chunk_file=`echo "$dirname""$json_file"` #echo $chunk_file if [ ! -f "$chunk_file" ]; then get_time echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute --output_check_res 0 rm_chunks --chunks ${hostinfo} > $chunk_file" | tee -a $logfile /home/anzhihe/rt-table/rt-dashboard/trp_distribute --output_check_res 0 rm_chunks --chunks ${hostinfo} > $chunk_file | tee -a $logfile echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file" | tee -a $logfile /home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file | tee -a $logfile set_logfile "${allhost}" else echo "$chunk_file文件已存在,请检查!" | tee -a $logfile exit 1 fi fi } # 执行分片迁移任务 run_copy_tasks() { while true do get_tasksum if [ $task_sum -ge 1 ]; then if echo $($show_copy_tasks) | grep -q "Copying" ; then sleep 30 else $($force_balance) fi else date_now=$(date +"%Y-%m-%d %H:%M:%S") #cd $dirname && cp -f $json_file $json_file.bak-`date +%Y%m%d` echo "++++++++++++ ${date_now} 分片迁移任务已完成!++++++++++++" | tee -a $logfile break fi done } main() { get_tasksum if [ $task_sum -lt 1 ]; then set_copy_tasks_info "$@" sleep 10 if [ -f "$chunk_file" ]; then run_copy_tasks else get_time echo "$json_file文件没有创建成功,请检察!" | tee -a $logfile exit 1 fi else echo "已经存在迁移任务,请检查!" fi } main "$@"
mig_rt_in.sh:将分片迁回
#!/bin/bash # create by anzhihe@chegva.com 2020-05-14 dirname="/home/anzhihe/opdir/" logfile="/home/anzhihe/opdir/mig_rt.log" show_copy_tasks="/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks" force_balance="/home/anzhihe/rt-table/rt-dashboard/MasterCmd force_balance offset=0 limit=1" get_time() { echo -e "\n============ `date '+%F %T'` ============" | tee -a $logfile } # 获取迁移分片任务总数 get_tasksum() { sum=`/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks |wc -l` task_sum=`expr $sum - 3` } # 将迁移任务信息记录日志 set_logfile() { echo "============ $1 分片迁回任务开始 ============" | tee -a $logfile echo $date_now >> $logfile && echo "$($show_copy_tasks)" | tee -a $logfile } # 配置分片迁移信息 set_copy_tasks_info() { if [ $# -ne 1 ]; then echo "Usage: `basename $0` chunk_file" exit fi if [ ! -f "$dirname$@" ]; then echo "$@文件不存在请检查!" exit fi host=`basename $1 .json` json_file_b=`echo $host"-b.json"` chunk_file=`echo "$dirname""$json_file_b"` echo $chunk_file if [[ "$@" == *_* ]]; then host1=`echo $host |awk -F"_" '{ print $1}'` host2=`echo $host |awk -F"_" '{ print $2}'` if [ ! -f "$chunk_file" ]; then get_time sed -n '/"ChunkAddr": "'$host1':9090"/{h;n;/"ChunkAddr":/!{:a;N;/"PartitionId"/!ba;x;H;n};x;H;x};p' $dirname$@ | sed -n '/"ChunkAddr": "'$host2':9090"/{h;n;/"ChunkAddr":/!{:a;N;/"PartitionId"/!ba;x;H;n};x;H;x};p' | tee -a $chunk_file echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file" | tee -a $logfile /home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file set_logfile $host else echo "$chunk_file文件已存在,请检察!" | tee -a $logfile exit 1 fi else if [ ! -f "$chunk_file" ]; then get_time sed -n '/"ChunkAddr": "'$host':9090"/{h;n;/"ChunkAddr":/!{:a;N;/"PartitionId"/!ba;x;H;n};x;H;x};p' $dirname$@ | tee -a $chunk_file echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file" | tee -a $logfile /home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file set_logfile $host else echo "$chunk_file文件已存在,请检察!" | tee -a $logfile exit 1 fi fi } # 执行分片迁移任务 run_copy_tasks() { while true do get_tasksum; if [ $task_sum -ge 1 ]; then if echo $($show_copy_tasks) | grep -q "Copying" ; then sleep 30 else $($force_balance) fi else date_now=$(date +"%Y-%m-%d %H:%M:%S") cd $dirname && mv ${json_file} ${json_file}-`date +%Y%m%d` && mv ${json_file_b} ${json_file_b}-`date +%Y%m%d` echo "============ ${date_now} 分片迁回任务已完成!============" | tee -a $logfile break fi done } main() { get_tasksum if [ $task_sum -lt 1 ]; then set_copy_tasks_info "$@" sleep 10 if [ -f "$chunk_file" ]; then json_file="$@" run_copy_tasks else get_time echo "$json_file文件没有创建成功,请检察!" | tee -a $logfile exit 1 fi else echo "已经存在迁移任务,请检查!" fi } main "$@"
run_copy_tasks.sh:执行分片迁移
#!/bin/bash # create by anzhihe@chegva.com 2020-05-14 dirname="/home/anzhihe/opdir/" logfile="/home/anzhihe/opdir/mig_rt.log" show_copy_tasks="/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks" force_balance="/home/anzhihe/rt-table/rt-dashboard/MasterCmd force_balance offset=0 limit=1" date_now=$(date +"%Y-%m-%d %H:%M:%S") get_time() { echo -e "\n============ $date_now ============" | tee -a $logfile } # 获取迁移分片任务总数 get_tasksum() { sum=`/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks |wc -l` task_sum=`expr $sum - 3` } # 将迁移任务信息记录日志 set_logfile() { echo "============ 重启分片迁移任务开始 ============" | tee -a $logfile echo $date_now >> $logfile && echo "$($show_copy_tasks)" | tee -a $logfile } # 配置分片迁移信息 set_copy_tasks_info() { if [ $# -ne 1 ]; then echo "Usage: `basename $0` chunk_file" exit fi if [ ! -f "$dirname$@" ]; then echo "$@文件不存在请检查!" exit fi host=`basename $1 .json` json_file_b=`echo $host"-b.json"` chunk_file=`echo "$dirname""$json_file_b"` echo $chunk_file if [[ "$@" == *_* ]]; then host1=`echo $host |awk -F"_" '{ print $1}'` host2=`echo $host |awk -F"_" '{ print $2}'` if [ ! -f "$chunk_file" ]; then get_time sed -n '/"ChunkAddr": "'$host1':9090"/{h;n;/"ChunkAddr":/!{:a;N;/"PartitionId"/!ba;x;H;n};x;H;x};p' $dirname$@ | sed -n '/"ChunkAddr": "'$host2':9090"/{h;n;/"ChunkAddr":/!{:a;N;/"PartitionId"/!ba;x;H;n};x;H;x};p' | tee -a $chunk_file echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file" | tee -a $logfile #/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file set_logfile $host else echo "$chunk_file文件已存在,请检察!" | tee -a $logfile exit 1 fi else if [ ! -f "$chunk_file" ]; then get_time sed -n '/"ChunkAddr": "'$host':9090"/{h;n;/"ChunkAddr":/!{:a;N;/"PartitionId"/!ba;x;H;n};x;H;x};p' $dirname$@ | tee -a $chunk_file echo "/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file" | tee -a $logfile #/home/anzhihe/rt-table/rt-dashboard/trp_distribute set_copy_tasks_info --data-file $chunk_file set_logfile $host else echo "$chunk_file文件已存在,请检察!" | tee -a $logfile exit 1 fi fi } # 执行分片迁移任务 run_copy_tasks() { set_logfile while true do get_tasksum; if [ $task_sum -ge 1 ]; then if echo $($show_copy_tasks) | grep -q "Copying" ; then sleep 30 else $($force_balance) fi else date_now=$(date +"%Y-%m-%d %H:%M:%S") #cd $dirname && mv ${json_file} ${json_file}-`date +%Y%m%d` && mv ${json_file_b} ${json_file_b}-`date +%Y%m%d` echo "============ ${date_now} 分片迁移任务已完成!============" | tee -a $logfile break fi done } main() { run_copy_tasks } main
.bash_profile:polysh调用配置
# ~/.bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs # User specific environment and startup programs alias rp='polysh xxx --command="sh /home/anzhihe/opdir/cmdb.sh"' rt-bj-pub() { local host_master=`polysh chegva-rtmaster01.bj01 --command='/home/anzhihe/rt-table/rt-dashboard/MasterCmd host_master | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}" | grep -v 127.0.0.1'|awk '{ print $3 }'` case "$@" in "status") polysh $host_master --command="/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks" ;; "stop") polysh $host_master --command="/home/anzhihe/rt-table/rt-dashboard/MasterCmd stop_copying_tasks" ;; "master") echo $host_master ;; *) if [[ "$1" == cmd ]]; then polysh $2 --user=anzhihe --command="$3" elif [[ "$1" == file ]]; then polysh $host_master --command="find /home/anzhihe/opdir -name "*.json*" |xargs -n1 basename" elif [[ "$1" == run ]]; then polysh $host_master --user=root --command="sh /home/anzhihe/opdir/run_copy_tasks.sh" elif [[ "$1" == out ]]; then host=`echo ${@:2}` polysh $host_master --user=root --command="sh /home/anzhihe/opdir/mig_rt_out.sh $host" elif [[ "$1" == back ]]; then host=`echo ${@:2}` polysh $host_master --user=root --command="sh /home/anzhihe/opdir/mig_rt_in.sh $host" else echo "输入参数有误,请检查后执行!" fi esac } rt-gz-gs() { local host_master=`polysh chegva-rtmaster00.gz01 --command='/home/anzhihe/rt-table/rt-dashboard/MasterCmd host_master | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}" | grep -v 127.0.0.1'|awk '{ print $3 }'` case "$@" in "status") polysh $host_master --command="/home/anzhihe/rt-table/rt-dashboard/MasterCmd show_copy_tasks" ;; "stop") polysh $host_master --command="/home/anzhihe/rt-table/rt-dashboard/MasterCmd stop_copying_tasks" ;; "master") echo $host_master ;; *) if [[ "$1" == cmd ]]; then polysh $2 --user=anzhihe --command="$3" elif [[ "$1" == file ]]; then polysh $host_master --command="find /home/anzhihe/opdir -name "*.json*" |xargs -n1 basename" elif [[ "$1" == run ]]; then polysh $host_master --user=root --command="sh /home/anzhihe/opdir/run_copy_tasks.sh" elif [[ "$1" == out ]]; then host=`echo ${@:2}` polysh $host_master --user=root --command="sh /home/anzhihe/opdir/mig_rt_out.sh $host" elif [[ "$1" == back ]]; then host=`echo ${@:2}` polysh $host_master --user=root --command="sh /home/anzhihe/opdir/mig_rt_in.sh $host" else echo "输入参数有误,请检查后执行!" fi esac } #删除所有任务: #./MasterCmd del_all_copy_tasks #./MasterCmd stop_copying_tasks PATH=$PATH:$HOME/bin export PATH