Auto Migrate Tool

本文介绍了一段用于测试NFV节点性能的Shell脚本,该脚本能够自动选择合适的计算节点并完成UE节点的迁移工作,同时展示了如何在Shell中处理浮点数运算。

最近需要测试NFV某个node的性能,所以需要Node ei-0单独在一个computer上,所以写了一个脚本:

function echo__blue()      { echo -e "\e[0;34;1m$1\e[0m";}
function echo__red()       { echo -e "\e[0;31;1m$1\e[0m";}
function echo__green()     { echo -e "\e[0;32;1m$1\e[0m";}
function echo__yellow()    { echo -e "\e[0;33;1m$1\e[0m";}

COMPUTER_LIST=`nova hypervisor-list | awk '{print $4}' | awk 'NR>2'`
UE_NODE_NAME=`nova list | grep ei-0 | awk '{print $4}'`
OPTIMAL_COMPUTER=''
INIT_USED=8.0
for COMPUTER in $COMPUTER_LIST
    do
        CPUS_USED=`nova hypervisor-show $COMPUTER | grep -i "vcpus_used" | awk '{print $4}' | head -1`
        echo__blue "$COMPUTER node's vcpus_used is :  $CPUS_USED"
        if [[ $(echo "$CPUS_USED == 0.0"|bc) = 1 ]];then
            echo__blue "Greate! $COMPUTER is a optimal computer."
            OPTIMAL_COMPUTER=$COMPUTER
            break
        elif [[ $(echo "$CPUS_USED > 0.0"|bc) = 1 ]] && [[ $(echo "$CPUS_USED < 8.0 "|bc) = 1 ]];then
            echo__green "Maybe $COMPUTER is a selectable computer."
            if [[ $(echo "$CPUS_USED < $INIT_USED"|bc) = 1 ]];then
                INIT_USED=$CPUS_USED
                OPTIMAL_COMPUTER=$COMPUTER
                echo__blue "Now OPTIMAL_COMPUTER is: $COMPUTER."
            fi
        elif [[ $(echo "$CPUS_USED >= 8.0"|bc) = 1 ]] && [[ $(echo "$CPUS_USED <= 13.0 "|bc) = 1 ]];then
            echo__red "Maybe $COMPUTER is not a good choice."
            INSTANCE_NUMBER=`nova hypervisor-servers compute-159 | awk '{print $4}' | awk 'NR>2' | awk '{if(length!=0) print $0}' | wc -l`
            USED_RATE=$(echo "$CPUS_USED / $INSTANCE_NUMBER" | bc)
            echo "===========USED_RATE: $USED_RATE============="
            if [[ $(echo "$USED_RATE < $INIT_USED"|bc) = 1 ]];then
                INIT_USED=$USED_RATE
                echo "===========INIT_USED: $INIT_USED============="
                OPTIMAL_COMPUTER=$COMPUTER
                echo__blue "Now OPTIMAL_COMPUTER is: $COMPUTER."
            else
                continue
            fi
        else
            echo__red "This computer node is full."
        fi
    done
echo "===========Finally the chosen computer is $OPTIMAL_COMPUTER.=============="
echo__green "==============Begin to migrate UE node to $OPTIMAL_COMPUTER.====================="
nova live-migration $UE_NODE_NAME $OPTIMAL_COMPUTER
UE_NODE_STATE=`nova list | grep ei-0 | awk '{print $10}'`
if [ "Running" != "$UE_NODE_STATE" ];then
    echo "Still migrating, please wait..."
    sleep 5
fi
echo__green "Live migration is successfully."  

shell不是经常使用,所以编写过程中才发现浮点数不能判断以及计算的问题,因此记录下,遇到问题可以这么写:

  • 通过bc

    bc是一种任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,其中一个用途就是用来进行运算以及进制转换。我们经常使用的expr只支持整数运算,对于浮点运算就无能为力了,而且expr不能进行指数运算,而都有bc这些都不再话下。

    $(echo "$CPUS_USED > 0.0"|bc) = 1
    
  • 通过dc
    可能你曾经知道有此命令,也可能你还不知道。dc相比与bc要复杂,但是简单操作还是比较简单。简单的说dc是一直压栈操作,和bc一样,它也可以交互使用,或者与echo一起配合使用,它也支持浮点运算。dc后续再作研究。

  • expr
    expr竟然也可以?先保存下来,下次再试试:

    if [ `expr $a \> $b` -eq 0 ];then
    echo $b is bigger
    else
    echo $a is bigger
    fi
    
### 数据库表不存在问题分析 当执行 `publish-elevation.sh` 脚本时,如果出现错误提示 `'relation "tif_slices" does not exist' (SQLSTATE 42P01)`,这表明 PostgreSQL 数据库中缺少名为 `tif_slices` 的关系(通常是表)。此问题可能由以下几个原因引起: 1. **数据库初始化未完成**:脚本依赖的数据库结构尚未创建。需要确认是否已运行必要的 SQL 文件来构建所需的模式和表[^1]。 2. **连接配置不正确**:脚本使用的数据库连接参数可能导致其访问了一个不同的数据库实例或模式,而该目标环境中并未定义 `tif_slices` 表。 3. **迁移工具未应用更新**:某些项目会通过版本控制机制管理数据库变更。如果没有正确应用最新的迁移文件,则新引入的数据对象不会被部署到生产环境或其他测试环境中。 以下是具体的解决方案及其说明: ### 方案一:验证并重建缺失的关系 确保已经加载了正确的 DDL(数据定义语言)语句至对应的 PostgreSQL 实例之中。可以通过手动导入建模脚本来修复这个问题: ```sql -- 假设 tif_slices.sql 是包含创建 tif_slices 表逻辑的文件路径 \i /path/to/tif_slices.sql; ``` 注意替换 `/path/to/` 部分为实际存储位置前缀[^2]。 ### 方案二:检查当前活动的 schema 和 database 名称 由于 PostgreSQL 支持多个 Schema,默认情况下操作的是 public Schema。因此有必要核实所涉及的具体 Schema 是否已被激活以及是否存在预期中的实体。可以尝试如下查询确定上下文设置是否恰当: ```sql SHOW search_path; -- 查看默认搜索路径 SELECT current_database(); -- 获取正在工作的 DB Name ``` 如果发现任何异常情况,请调整相应的客户端变量或者切换至合适的命名空间再重试原指令集[^3]。 ### 方案三:重新同步元数据状态 对于那些采用 ORM 框架的应用程序来说,它们通常具备自动维护底层物理模型的能力。所以也可以考虑借助这些高级特性来自动生成丢失的部分。例如,在 Django 中你可以简单地调用 makemigrations/migrate 来实现这一目的;而对于 Hibernate 用户而言则需启用 hbm2ddl.auto 属性为 update 或 create-drop 等选项之一即可达成相似效果。 最后提醒一点,无论采取哪种方式处理此类状况都务必小心谨慎以免破坏已有业务功能!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值