#!/bin/bash CWD=$(cd `dirname $0`;pwd) cd "${CWD}" source _env export HOST_IP_MODE=1 STAMP="$(date +%s)" STEP=1 PHASE_START_TIME=0 function timediff() { start_time=$1 end_time=$2 start_s=${start_time%.*} start_nanos=${start_time#*.} end_s=${end_time%.*} end_nanos=${end_time#*.} if [ "$end_nanos" -lt "$start_nanos" ];then end_s=$(( 10#$end_s - 1 )) end_nanos=$(( 10#$end_nanos + 10**9 )) fi time=$(( 10#$end_s - 10#$start_s )).`printf "%03d\n" $(( (10#$end_nanos - 10#$start_nanos)/10**6 ))` echo $time } function print_start_phase() { echo "/////////////////////// STEP ${STEP}: $@ ///////////////////////" STEP=$[ ${STEP} + 1 ] PHASE_START_TIME=$(date +%s.%N) } function print_end_phase() { cur_time=$(date +%s.%N) echo "/////////////////////// phase end: $(timediff ${PHASE_START_TIME} ${cur_time}) s ///////////////////////" } function is_true() { value=$1 # convert value to upper case string(can work in bash 4.x) value=${value^^} if [ "x${value}" == "xNO" ] || [ "x${value}" == "xFALSE" ] || [ "x${value}" == "x0" ]; then return 1 fi return 0 } function get_mode() { if test -z ${MODE} then MODE="MINI" fi MODE=${MODE^^} } function exit_while_error() { if test -z ${EXIT_WHILE_ERROR} then return 0 fi return `is_true ${EXIT_WHILE_ERROR}` } function fastboot() { if test -z ${FASTBOOT} then return 0 fi return `is_true ${FASTBOOT}` } function remove_disk_check_logic_in_obd() { # make sure obd copy the plugin code obd cluster list start_check_files=('/root/.obd/plugins/oceanbase/3.1.0/start_check.py' '/root/.obd/plugins/oceanbase/4.0.0.0/start_check.py') for start_check_file in ${start_check_files[@]} do sed -i "s/critical('(%s) %s not enough disk space\. (Avail/alert('(%s) %s not enough disk space\. (Avail/g" $start_check_file sed -i "s/critical(EC_OBSERVER_NOT_ENOUGH_DISK_4_CLOG/alert(EC_OBSERVER_NOT_ENOUGH_DISK_4_CLOG/g" $start_check_file done } function run_custom_scripts { INIT_SCRIPTS_ROOT="${1}"; # Check whether parameter has been passed on if [ -z "${INIT_SCRIPTS_ROOT}" ]; then echo "No INIT_SCRIPTS_ROOT passed on, no scripts will be run."; return; fi; # Execute custom provided files (only if directory exists and has files in it) if [ -d "${INIT_SCRIPTS_ROOT}" ] && [ -n "$(ls -A "${INIT_SCRIPTS_ROOT}")" ]; then echo -e "Executing user defined scripts..." run_custom_scripts_recursive ${INIT_SCRIPTS_ROOT} echo -e "DONE: Executing user defined scripts.\n" fi; } function run_custom_scripts_recursive { local f for f in "${1}"/*; do echo -e "running ${f} ..."; obclient -h127.1 -uroot@${OB_TENANT_NAME} -A -P${OB_MYSQL_PORT} < ${f} echo "DONE: running ${f}"; done } function deploy_failed { echo "deploy failed!" if exit_while_error then exit 1 else echo "Please check the log file ${OB_HOME_PATH}/log/observer.log" fi } # We should decide whether the observer's data exists and # whether the obd has the information of the cluster if [ -f "$HOME/.obd/cluster/${OB_CLUSTER_NAME}/config.yaml" ]; then echo "find obd deploy information, skip configuring..." echo "start ob cluster ..." obd cluster start $OB_CLUSTER_NAME else # nothing here, bootstrap print_start_phase "Config Generation" TMPFILE="boot.${STAMP}.yaml" get_mode if [ "x${MODE}" == "xNORMAL" ]; then echo "oceanbase-ce docker in normal mode" cp -f boot-tmp.yaml $TMPFILE elif [ "x${MODE}" == "xMINI" ]; then echo "oceanbase-ce docker in mini mode" cp -f boot-mini-tmp.yaml $TMPFILE elif [ "x${MODE}" == "xSLIM" ]; then echo "oceanbase-ce docker in slim mode" cp -f boot-mini-tmp.yaml $TMPFILE else cp -f boot-mini-tmp.yaml $TMPFILE fi if [ "x${MODE}" != "xSLIM" ]; then cat obagent.yaml >> $TMPFILE fi if [ "x${MODE}" == "xSLIM" ]; then cat ob-configserver.yaml >> $TMPFILE fi sed -i "s|@OB_SERVER_IP@|${OB_SERVER_IP}|g" $TMPFILE sed -i "s|@OB_HOME_PATH@|${OB_HOME_PATH}|g" $TMPFILE sed -i "s|@OB_MYSQL_PORT@|${OB_MYSQL_PORT}|g" $TMPFILE sed -i "s|@OB_RPC_PORT@|${OB_RPC_PORT}|g" $TMPFILE sed -i "s|@OB_CLUSTER_NAME@|${OB_CLUSTER_NAME}|g" $TMPFILE sed -i "s|@OB_MEMORY_LIMIT@|${OB_MEMORY_LIMIT}|g" $TMPFILE sed -i "s|@OB_SYSTEM_MEMORY@|${OB_SYSTEM_MEMORY}|g" $TMPFILE sed -i "s|@OB_DATAFILE_SIZE@|${OB_DATAFILE_SIZE}|g" $TMPFILE sed -i "s|@OB_LOG_DISK_SIZE@|${OB_LOG_DISK_SIZE}|g" $TMPFILE sed -i "s|@OB_ROOT_PASSWORD@|${OB_ROOT_PASSWORD}|g" $TMPFILE [ "${OB_DATA_DIR}" ] && echo " data_dir: ${OB_DATA_DIR}" >> $TMPFILE [ "${OB_REDO_DIR}" ] && echo " redo_dir: ${OB_REDO_DIR}" >> $TMPFILE print_end_phase print_start_phase "Ob-deploy mirror clone" mkdir -p $OB_HOME_PATH obd mirror clone /root/pkg/*.rpm \ && obd mirror list local print_end_phase print_start_phase "Ob-deploy deploy" remove_disk_check_logic_in_obd if fastboot; then obd devmode enable && obd cluster deploy "${OB_CLUSTER_NAME}" -c $TMPFILE; if [ $? -ne 0 ]; then deploy_failed fi print_end_phase print_start_phase "Ob-deploy restore store dir" rm -rf ${OB_HOME_PATH}/store && tar -Sxzvf /root/boot/store.tar.gz -C ${OB_HOME_PATH} BLOCK_CNT=`cat /root/boot/block_cnt` for i in $(seq 0 $[ $BLOCK_CNT - 1 ]) do fallocate -o 0 -l 67108864 ${OB_HOME_PATH}/store/clog/log_pool/$i echo "restore block id $i" done print_end_phase print_start_phase "Ob-deploy import etc" cp -r /root/boot/etc/* ${OB_HOME_PATH}/etc print_end_phase print_start_phase "Ob-deploy start" obd cluster start ${OB_CLUSTER_NAME} print_end_phase if [ "x${MODE}" == "xSLIM" ]; then run_custom_scripts /root/boot/init.d fi else print_start_phase "Ob-deploy autodeploy" obd devmode enable && obd cluster autodeploy "${OB_CLUSTER_NAME}" -c $TMPFILE; print_end_phase print_start_phase "Ob-deploy Create Tenant" create_tenant_cmd="obd cluster tenant create ${OB_CLUSTER_NAME} -n ${OB_TENANT_NAME}" if ! [ -z "${OB_TENANT_MINI_CPU}" ]; then create_tenant_cmd="${create_tenant_cmd} --min-cpu=${OB_TENANT_MINI_CPU}" fi; if ! [ -z "${OB_TENANT_MEMORY_SIZE}" ]; then create_tenant_cmd="${create_tenant_cmd} --memory-size=${OB_TENANT_MEMORY_SIZE}" fi; if ! [ -z "${OB_TENANT_LOG_DISK_SIZE}" ]; then create_tenant_cmd="${create_tenant_cmd} --log-disk-size=${OB_TENANT_LOG_DISK_SIZE}" fi; eval ${create_tenant_cmd} if [ $? -ne 0 ]; then deploy_failed fi if [ "x${MODE}" != "xSLIM" ]; then obclient -h127.1 -uroot@${OB_TENANT_NAME} -A -P${OB_MYSQL_PORT} < init_tenant_user.sql else run_custom_scripts /root/boot/init.d fi print_end_phase fi if [ $? -ne 0 ]; then deploy_failed fi mv -f $TMPFILE ${OB_HOME_PATH}/boot.yaml && echo "deploy success!" fi if [ $? -eq 0 ]; then echo "boot success!" # close the enable_rich_error_msg obclient -h127.1 -uroot@sys -A -P${OB_MYSQL_PORT} -e "alter system set enable_rich_error_msg = false;" else echo "boot failed!" if exit_while_error then exit 1 else echo "Please check the log file ${OB_HOME_PATH}/log/observer.log" fi fi exec tail -f /dev/null