测试 split 计时 shell 脚本参考

#!/bin/bash# set -euxo#如果是一个新的环境,则须要设置变量TEST_ENV="new"TEST_ENV=#如果在dble本机导入split后的mysqldump文件,则须要设置变量LOADIN="locally",#如果须要将split后的mysqldump文件cp到后端mysql所在主机去执行导入,则须要设置变量LOADIN="remote"LOADIN="locally"test_dir='/tmp/splittest/'dble_conf_dir='/opt/dble/conf/'ex_dump_file_name='benchmarksql_with_data'dump_file_name='benchmarksql_with_data'shardingNum=10ex_shardingNum=10MYSQL='/usr/bin/mysql -uxxxx -pxxxx -P3306'MYSQL_HOST[0]='xx.xx.xx.101'MYSQL_HOST[1]='xx.xx.xx.102'MYSQL_HOST[2]='xx.xx.xx.105'MYSQL_HOST[3]='xx.xx.xx.108'DBLE_ROOT='/usr/bin/mysql -uroot -p111111 -P9066 -h127.0.0.1'function create_backend_mysqls_from_dble_cmd () {    #make file drop_and_create_shardingnodes_10dn for further test    drop_ex_shardingnodes="${test_dir}drop_ex_shardingnodes_dnx.sql"    create_shardingnodes="${test_dir}create_shardingnodes_dnx.sql"    rm -f ${drop_ex_shardingnodes}    cat>"${drop_ex_shardingnodes}"<<EOFDROPdrop database @@shardingnode="an\$1-${ex_shardingNum}";EOFDROP    rm -f ${create_shardingnodes}    cat>"${create_shardingnodes}"<<EOFCREATEreload @@config_all;create database @@shardingnode="an\$1-${shardingNum}";EOFCREATE    ${DBLE_ROOT} < ${drop_ex_shardingnodes}    if [[ $? != 0 ]]; then        echo "fail to drop backend schema via dble admin cmd line"        exit 1    fi    #change sharding.xml conf of new_sharding.xml    mv ${dble_conf_dir}sharding.xml ${dble_conf_dir}sharding_${ex_shardingNum}.xml    mv ${dble_conf_dir}sharding_${shardingNum}.xml ${dble_conf_dir}sharding.xml    ${DBLE_ROOT} < ${create_shardingnodes}    if [[ $? != 0 ]]; then        echo "fail to create backend schema via dble admin cmd line"        exit 1    fi    # check backend mysqldbs has been created    ${MYSQL} -h${MYSQL_HOST[1]} -e "show databases;" | grep "dh_dn_"     if [[ $? != 0 ]]; then        echo "fail to create backend schema via dble admin cmd line"    fi  }function generate_rm_old_split_dump_files () {    filename="${test_dir}rm_old_split_dump_files.sh"    rm -f ${filename}cat>"${filename}"<<EOF#!/usr/bin/expect -fset timeout -1set host [lindex \$argv 0]set file_name [lindex \$argv 1]spawn ssh test@\$host "rm -f \$file_name.sql-an*;ls -l /tmp/splittest/"expect "*continue connecting*"send "yes\r"expect "*password:"send "mypasswordfortestuser\r"expect eofEOF}function rm_old_dump_files_on_each_shardingnodes () {    rm -f ${test_dir}${ex_dump_file_name}.sql-an*    # 新环境中首次跑测试的时候须要生成这样一个文件 ${test_dir}rm_old_split_dump_files.sh    if [[ "${TEST_ENV}" == "new" ]]; then        generate_rm_old_split_dump_files    fi        for host in "${MYSQL_HOST[@]}";do        echo "${host}"           expect ${test_dir}rm_old_split_dump_files.sh "${host}" "${test_dir}${ex_dump_file_name}"    done}# split_cmd.sql 文件中有 dump_file_name,此处还能够参数化 -l等参数的数值function get_split_exec_cost_time () {    filename="${test_dir}split_cmd.sql"    rm -f ${filename}    cat>"${filename}"<<EOFsplit /opt/splitTest/${dump_file_name}.sql /tmp/splittest -sbenchmarksql;EOF    {        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> start exec split cmd on dble manager 9066"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime"        # echo "${DBLE_ROOT} < ${filename}"        echo "split /opt/splitTest/${dump_file_name}.sql /tmp/splittest -sbenchmarksql; "    }>> time_record.log    timer_start=$(date +%s)    ${DBLE_ROOT} < ${filename}    if [[ $? != 0 ]]; then        echo "$(date +["%Y-%m-%d %H:%M:%S"]) !!!!!!!!!!! fail to exec !!!!!!!!!!" >> time_record.log    fi    timer_end=$(date +%s)    duration=$(echo "$timer_end" "$timer_start" | awk '{print $1-$2}')s    {        echo "dble治理端执行split的耗时: ${duration} "        echo "total time is ${duration} "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> finish exec split cmd on dble manager 9066"        echo " "    }>> time_record.log        }# dble本机近程连贯后端mysql,别离并发导入function loadAll_shardingDumpFiles_on_dble_server () {    {        echo " "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> loadAll_shardingDumpFiles_on_dble_server  startTime"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime"    }>> time_record.log    timer_s=$(date +%s)        for ((i=1;i<="${shardingNum}";i++))    do    {        if [ ! -f "${test_dir}${dump_file_name}.sql-an${i}.sql" ]; then            mv ${test_dir}${dump_file_name}.sql-an"${i}"-*dump ${test_dir}${dump_file_name}.sql-an"${i}".sql        fi           node=$(( i % 4 ))        case ${node} in            1) host=${MYSQL_HOST[0]};;            2) host=${MYSQL_HOST[1]};;            3) host=${MYSQL_HOST[2]};;            0) host=${MYSQL_HOST[3]};;        esac        echo "${MYSQL} -h${host} dh_dn_${i} < ${test_dir}${dump_file_name}.sql-an${i}.sql" >>  time_record.log        ${MYSQL} -h${host} dh_dn_"${i}" < ${test_dir}${dump_file_name}.sql-an"${i}".sql            }&        done    wait    timer_e=$(date +%s)    tduration=$(echo "$timer_e" "$timer_s" | awk '{print $1-$2}')s    {        echo "split后的dumpfile文件从dble本机并发导入,总时长(即最长耗时)为:   ${tduration}  "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> loadAll_shardingDumpFiles_on_dble_server  finishTime"        echo " "    }>> time_record.log}# local导入耗时不须要此处function generate_send_split_dump_files () {    filename="${test_dir}send_split_dump_files.sh"    rm -f ${filename}cat>"${filename}"<<EOF#!/usr/bin/expect -fset timeout -1set file_num [lindex \$argv 0]set host [lindex \$argv 1]set file_name [lindex \$argv 2]spawn scp \$file_name.sql-an\$file_num.sql test@\$host:/tmp/splittest/.expect "*continue connecting*"send "yes\r"expect "*password:"send "mypasswordfortestuser\r"expect eofEOF}# local导入耗时不须要此处function change_split_dumpfile_name_and_cp_them_to_their_local () {    # 新环境中首次跑测试的时候须要生成这样一个文件 ${test_dir}t_dump_files.sh    if [[ ("${TEST_ENV}" == "new") && ("${LOADIN}" == "remote") ]]; then        generate_send_split_dump_files    fi        {        echo " "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> start change split filename and cp them to their local mysql server hosts"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime"    }>> time_record.log    timer_st=$(date +%s)    for ((i=1;i<="${shardingNum}";i++))    do    {        if [ ! -f "${test_dir}${dump_file_name}.sql-an${i}.sql" ]; then            mv ${test_dir}${dump_file_name}.sql-an"${i}"-*dump ${test_dir}${dump_file_name}.sql-an"${i}".sql        fi           node=$(( i % 4 ))        case ${node} in            1) host=${MYSQL_HOST[0]};;            2) host=${MYSQL_HOST[1]};;            3) host=${MYSQL_HOST[2]};;            0) host=${MYSQL_HOST[3]};;        esac        # scp ${test_dir}${dump_file_name}.sql-an"${i}".sql test@${host}:/tmp/splittest/.        expect "${test_dir}"send_split_dump_files.sh "${i}" "${host}" "${test_dir}${dump_file_name}"    }        done    timer_ed=$(date +%s)    cpduration=$(echo "$timer_ed" "$timer_st" | awk '{print $1-$2}')s    {        echo "split后的dumpfile文件cp到对应后端mysql本机,总时长(即最长耗时)为:   ${cpduration}  "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> finish change split filename and cp them to their local mysql server hosts"        echo " "    }>> time_record.log}function exec_romote_test_time_on_each_hosts () {    {        echo " "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> exec_remote_loadin_on_each_host  startTime"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> startTime"    }>> time_record.log    timer_s=$(date +%s)    for host in "${MYSQL_HOST[@]}"    do    {        echo "${host}"         expect "${test_dir}"exec_shell_on_remote_server.sh "${host}"     }&    done    wait     timer_e=$(date +%s)    tduration=$(echo "$timer_e" "$timer_s" | awk '{print $1-$2}')s    {        echo "split后的dumpfile文件从后端mysql本机并发导入,总时长(即最长耗时)为:   ${tduration}  "        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <=======> endTime"        echo "$(date +["%Y-%m-%d %H:%M:%S"]) <==========================> exec_remote_loadin_on_each_host  finishTime"        echo " "    }>> time_record.log}function clean_backend_schemas_and_old_dump_files () {    rm_old_dump_files_on_each_shardingnodes    create_backend_mysqls_from_dble_cmd}function test_of_split_dumpfile_on_mysql_respectively () {    echo "NOW we are testing scp split_dumpfiles to mysql and loadin respectively,and shardingnode num is ${shardingNum}--------------------------------------------------------------">> time_record.log    clean_backend_schemas_and_old_dump_files    get_split_exec_cost_time    change_split_dumpfile_name_and_cp_them_to_their_local    exec_romote_test_time_on_each_hosts    echo "NOW we have finished the testing of scp split_dumpfiles to mysql and loadin respectively,and shardingnode num is ${shardingNum}---------------------------------------------">> time_record.log}function test_of_split_dumpfile_on_dbleServer () {    echo "NOW we are testing loadin on dble server locally,and shardingnode num is ${shardingNum}--------------------------------------------------------------">> time_record.log    clean_backend_schemas_and_old_dump_files    get_split_exec_cost_time    loadAll_shardingDumpFiles_on_dble_server    echo "NOW we have finished the testing of loadin on dble server locally,and shardingnode num is ${shardingNum}---------------------------------------------">> time_record.log}if [ ${LOADIN} == "locally" ]; then     test_of_split_dumpfile_on_dbleServerelif [ ${LOADIN} == "remote" ]; then     test_of_split_dumpfile_on_mysql_respectivelyelse     echo "please check the file line 7: The value of variable LOADIN should be one of 'locally' or 'remote' ;The variable maybe on line 7"    exit 1   fi