通用方案:专有云企业版V3.6及以上版本单机房计划停机操作流程

通用方案:专有云企业版V3.6及以上版本单机房计划停机操作流程

更新时间:2020-09-10 13:36:55

1. 概述

本文主要介绍在专有云企业版V3.6及以上版本中,单机房计划停机的操作方法。

1.1. 适用范围

  • 专有云V3,所有

    说明:适用于专有云企业版V3.6及以上版本。

1.2. 风险说明

  1. 评估是否有数据丢失风险。
  2. 评估从机器上电到集群正常业务恢复需要时间。
  3. 断电演练之前请务必确保SLB侧业务流量已经进行切换,否则后续操作将中断所有业务。

2. 问题描述

在专有云企业版V3.6及以上版本中,在进行整机房计划停机操作时,请参考本方案进行停机操作。

3. 解决方案

3.1. 环境检查

  1. 使用天基控制台等工具对整个集群环境进行巡检,记录状态异常的集群。
  2. 若服务器总数超过100台,请登录天基控制台,检查tianji服务TMPL-TIANJI-SERVICE-APSARASTACK-V3-PRODUCTION模板的配置。选择user>HealingLaborService>oob_labor.json,查看concurrence_allow_size字段,确保其取值大于服务器总数。若不是,请自行修改,并提交。
    说明:修改concurrence_allow_size字段的取值并提交后,会触发tianji服务的Rolling。
  3. 保存pangu的状态到各个集群AG。

    1. all_pangu_check.tar.gz文件上传到OPS1服务器的新建目录下,例如/root/pangu_check目录。
      all_pangu_check.tar.gz
    2. 通过root用户执行以下命令,进行解压。
      tar zxvf all_pangu_check.tar.gz
    3. 通过root用户执行以下命令,保存pangu的状态到各个集群AG。
      ./pangu_status.sh save
      说明:请忽略以下报错。
      project:dfs cluster:PanguDcmCluster-A-20191204-1d3c get AG fail 'PanguTools#'

3.2. 实施步骤

3.2.1. 关闭权限认证

  1. 登录OPS1机器,执行以下命令,查找ConfigStore所在机器。
    curl "127.0.0.1:7070/api/v3/column/m.ip?m.sr.id=tianji.ConfigStore%23&m.sr.isPrimary=true"
  2. 执行以下命令,查找集群的Head版本。
    curl "http://[$ConfigStore_IP]:8082/clusters/TianjiMetaStore"
    说明:[$IP]为上一步获取的主机IP地址。
    系统显示类似如下。
    50c255cddd742042df8508165b4026485d4a2fea
  3. 执行以下命令,查找天基APIServer服务所在机器。
    curl "127.0.0.1:7070/api/v3/column/m.ip?m.sr.id=tianji.APIServer%23" 2>/dev/null | grep m.ip | awk -F"\"" '{print $4}' > tianji_api_servers
  4. 执行以下命令,查找天基TerminalServicePortal服务所在机器。
    curl "127.0.0.1:7070/api/v3/column/m.ip?m.sr.id=tianji.TerminalServicePortal%23" 2>/dev/null | grep m.ip | awk -F"\"" '{print $4}' > tianji_terminal_servers
  5. 执行以下命令,查看容器ID。
    docker ps|grep OpsOob|awk '{print $1}'
  6. 依次执行以下两条命令,将天基APIServer和TerminalServicePortal服务所在机器的列表文件拷贝到oob容器中。
    docker cp tianji_api_servers [$OOB_ID]:/
    docker cp tianji_terminal_servers [$OOB_ID]:/
  7. 执行以下命令,进入oob容器。
    docker exec -it [$OOB_ID] bash
  8. 执行以下命令,停止天基APIServer服务。
    cat tianji_api_servers | xargs -i -P1 ssh {} tjc stop tianji.APIServer#
  9. 登录OPS1机器,执行以下命令,关闭鉴权配置。
    curl "http://[$ConfigStore_IP]:8082/clusters/TianjiMetaStore/versions/[$Head_Version]/conf" -X POST -d '{"Name":"user","Email":"user","Message":"disable auth","Updates":{"authmode.conf":"{\"AuthMode\":\"false\"}"}}'
    说明:[$Head_Version]为步骤2获取的Head版本。
  10. 再次进入oob容器,依次执行以下两条命令,重启api_server和terminal_service_portal进程。
    cat tianji_api_servers | xargs -i -P1 ssh {} tjc start tianji.APIServer#
    cat tianji_terminal_servers | xargs -i -P1 ssh {} killall terminal_service_portal
  11. 登录OPS1机器,执行以下命令,确认权限认证已关闭。返回结果为false,则表示认证已关闭。
    /cloud/tool/tianji/tianji_clt authmode --get --config /cloud/data/bootstrap_controller/BootstrapController#/bootstrap_controller/tianji_dest.conf

3.2.2. 集群关机前带外网络的检查

  1. 以root用户登录OPS1服务器。
  2. 执行以下命令,获取全部物理服务器的SN,并以文件形式保存到当前目录下。

    curl 'localhost:7070/api/v3/column/m.sn' 2>/dev/null | grep sn | grep -v vm | awk '{print $2}' | sed 's/[",]//g' > snlist
  1. 执行以下命令,查询oob容器ID。
    docker ps | grep oob
  1. 执行以下命令,将oob容器内的“SN-带外IP”映射文件拷贝到当前目录。

    docker cp [$OOB_ID]:/tmp/sn_ip_map .
  1. 依次执行以下命令,确认全部物理服务器都已获取带外IP。
    cat snlist | xargs -n 1 -I {} grep {} sn_ip_map | awk '{print $1}' | sed 's/[:"]//g' > oobsnlist
    cat snlist oobsnlist | sort | uniq -u

    说明

    • 执行结果如果存在数据,则包含未获取带外IP的物理服务器SN。如果结果为空,则表明全部物理服务器都已获取带外IP。

    • 未获取带外IP的物理服务器需要修复,使其正常获取带外IP。如果无法修复,则开机时需要手工开机。

  1. 执行以下命令,获取全部物理服务器的带外IP,并以文件形式保存到当前目录下。

    cat snlist | xargs -n 1 -I {} grep {} sn_ip_map | awk '{print $2}' | sed 's/[",]//g' > oobiplist
  1. 执行以下命令,确认通过带外IP可以查询到全部物理服务器的电源状态。如果查询某些服务器的电源状态失败,需要修复这些服务器的带外功能。如果无法修复,则开机时需要手工开机。
    for currentMachine in $(cat oobiplist | xargs); do echo "Checking ${currentMachine} ..."; ipmitool -I lanplus -H ${currentMachine} -U [$Use] -P [$Password] power status; done

    说明

    • [$Use]为带外服务器登录用户名。

    • [$Password]为带外服务器登录用户密码。

3.2.3. 集群关机

  1. 停止所有上层应用或任务,并关闭所有ECS虚拟机。
  2. 登录天基控制台,选择报表>全部报表,在模糊查询中搜索开关机,可查询到集群开关机监控报表,单击集群开关机监控报表
  3. 集群开关机监控报表页面,选择操作菜单>批量关机
  4. 在关机确认页面,选择除minirds-mt、SLB、Vnet和qitian(如果存在)以外的所有产品,单击确认
  5. 请按照以下步骤将SLB各节点下线。
    说明:请务必确保Proxy和Keyserver先于LVS、SlbControlMaster执行下线操作。
    1. 登录slb-ag容器,输入cli命令,选择1,进入SLB后台命令行。
    2. 执行以下命令,获取[$LB_Global_IP]和[$Keyserver_IP]的值。
      list admin keyserver
      系统显示类似如下。

    3. 执行以下命令,逐台对Keyserver执行下线操作。执行完成后,对应Keyserver的weight值将会被修改为“0”。
      config vms weight user_id keyserver lb_id [$LB_Global_ID] vm_list {"address":"[$Keyserver_IP]","weight":0}
      说明
      • [$LB_Global_ID]和[$Keyserver_IP]为上一步获取的值。

      • [$Keyserver_IP]位置需要填入Keyserver节点的物理IP,即Flag字段取值为“1”的输出结果行,类似如下。

    4. 执行以下命令,获取Proxy的IP。

      list admin proxy

      系统显示类似如下。

    5. 执行以下命令,逐台对Proxy进行下线操作。
      config admin maintain_agent address [$Proxy_MGT_IP] enable 0 force 1
      说明:[$Proxy_MGT_IP]为上一步获取的值。
      系统显示类似如下。
    6. 以root用户登录OPS1服务器,执行以下命令,查询[$LB_Global_IP]。
      list admin lb_node
      系统显示类似如下。
    7. 执行以下命令,逐台对LVS执行下线操作。
      /usr/bin/curl -s -X PUT "http://[$SlbControlMaster_IP]:8088/admin/agents/maintain;enable=0;force=1;address=[$LB_Global_IP]"
      说明
      • [$LB_Global_IP]为上一步获取的值。

      • [$SlbControlMaster_IP]可在天基控制台的SLB集群配置页面查询,具体查询步骤如下。

        1. 登录天基控制台,选择运维>集群运维,在Project框中搜索slb,单击SLB集群右侧的集群配置

        2. 在服务配置页面,搜索slb-controler,可查看到对应的IP地址。

  6. 参考步骤4,按照顺序关闭以下集群,如果关闭失败,请联系阿里技术支持。

    • SLB、Vnet和qitian(如果存在) 

    • minirds-mt

  7. 登录天基控制台,选择运维>集群运维,在Project框中搜索minirds-mt,单击minirds服务的集群名,进入集群Dashboard页面。
  8. 刷新集群基本信息,等待minirds-mt关机成功。

    说明:如果发现minirds-mt集群处于pending状态(V3.6及之后的版本),需要将以下压缩包解压后,将脚本文件上传到OPS1服务器,然后执行sr_approver.py脚本,或者通过天基控制台手工审批。
    sr_approver.tar

  9. 执行以下命令,获取除OPS1之外的天基集群服务器带外IP地址列表,并以文件形式保存到当前目录下。
    curl 'localhost:7070/api/v3/column/m.sn?m.project=tianji' 2>/dev/null | grep m.sn | grep -v vm | grep -v "$(hostname | xargs -n 1 -I {} curl 'localhost:7070/api/v3/column/m.sn?m.id={}' 2>/dev/null | grep m.sn)" | awk '{print $2}' | sed 's/[",]//g' | xargs -n 1 -I {} grep {} sn_ip_map | awk '{print $2}' | sed 's/[",]//g' > tianji_oobiplist
  10. 以root用户登录OPS1服务器,执行以下命令,获取需要关闭机器的主机名,并以文件形式保存到当前目录下。
    curl 'localhost:7070/api/v3/column/m.id?m.project=tianji' 2>/dev/null|grep id|awk '{print $2}'| grep –v vm|sed 's/[",]//g'|grep -v `hostname` > hostnamelist
    说明:此处将文件名命名为“hostnamelist”,用户可自定义。
  11. 执行hostname命令,查看OPS1服务器的主机名,并确认hostnamelist文件内不包含OPS1的主机名。
  12. 执行以下命令,查询cloneweb容器ID。

    docker ps|grep cloneweb
  13. 执行以下命令,将存放除OPS1服务节点以外其他机器的主机名的文件拷贝到容器中。
    docker cp hostnamelist [$Clone_Web_ID]:/
    说明:[$Clone_Web_ID]为上一步获取的主机名。
  14. 执行以下命令,进入cloneweb容器。
    docker exec -it [$Clone_Web_ID] bash
  15. 执行以下命名,批量关闭除OPS1服务节点以外的其他机器。
    cat /hostnamelist |xargs -n 1 -P 100 -I {} ssh {} poweroff &
  16. 等待约2-5分钟后,执行以下命令,查看物理机是否关闭。如果还有机器没有关闭,请去相应机架手动关闭。
    cat /hostnamelist |xargs -n 1 -P 100 ping -w 1 -c 1 |grep -B 1 "1 received"|grep statistics|awk {'print $2'}
  17. 执行exit命令,退出容器。
  18. 执行poweroff命令,关闭OPS1服务器。
  19. 在相应机柜确认机器是否断电,如果没有,手动关闭电源。

3.2.4. 检查环境和故障维修

检查环境和故障维修,请保存现场变更记录。

3.2.5. 启动OPS1服务器

手工启动OPS1服务器,确认oob容器启动正常。

3.2.6. 集群开机前带外网络检查

  1. 以root用户登录OPS1服务器。集群关机前带外网络的检查
  2. 进入oob容器,将oob容器内的“SN-带外IP”映射文件拷贝到当前目录。
    docker cp [$OOB_ID]:/tmp/sn_ip_map .
  3. 依次执行以下命令,确认全部物理服务器是否都已获取带外IP。
    cat snlist | xargs -n 1 -I {} grep {} sn_ip_map | awk '{print $1}' | sed 's/[:"]//g' > oobsnlist
    cat snlist oobsnlist | sort | uniq -u
    说明
    • 执行结果将包含未获取带外IP的物理服务器SN。如果结果为空,则表明全部物理服务器都已获取带外IP。
    • 未获取带外IP的物理服务器需要修复,使其正常获取带外IP。如果无法修复,则开机时需要手工开机。

  4. 执行以下命令,获取全部物理服务器的带外IP,并以文件形式保存到当前目录下。
    cat snlist | xargs -n 1 -I {} grep {} sn_ip_map | awk '{print $2}' | sed 's/[",]//g' > oobiplist
  5. 执行以下命令,确认通过带外IP可以查询到全部物理服务器的电源状态。
    for currentMachine in $(cat oobiplist | xargs); do echo "Checking ${currentMachine} ..."; ipmitool -I lanplus -H ${currentMachine} -U [$Use] -P [$Password] power status; done
    说明:对于非天基集群的服务器,如果电源状态查询失败,需要修复这些服务器的带外功能。如果无法修复,则开机时需要手动开机,且需要执行以下命令,手动消除机器的“power_on_doing”状态。
    curl localhost:7070/api/v5/SetMachineAction?hostname=[$Hostname] -d '{"action_name":"power_on", "action_status":"done"}'

3.2.7. 集群开机

  1. 登录OPS1服务器,执行以下命令,使用3.2.3. 集群关机部分中的步骤9获取的天基集群非OPS1服务器带外IP地址列表tianji_oobiplist,批量启动天基集群服务器。
    for currentMachine in $(cat tianji_oobiplist | xargs); do echo "Starting ${currentMachine} ..."; ipmitool -I lanplus -H ${currentMachine} -U [$Use] -P [$Password] power on; done
  2. 根据3.2.3. 集群关机部分中的步骤10中获取的hostnamelist,到机柜检查hostnamelist中的机器是否已正常启动,若未启动,请手动开启机器电源。
  3. 登录天基控制台,选择报表>全部报表,在模糊查询中搜索开关机,可查询到集群开关机监控报表,单击集群开关机监控报表

  4. 集群开关机监控报表页面,选择操作菜单>批量开机

  5. 在关机确认页面,选择相应的产品,单击确认。按照以下顺序开机,需要等前一批到达终态后开启下一批产品。

    • minirds-mt
    • Vnet和qitian(如果存在)
    • SLB
  6. 请按照以下步骤将SLB各节点恢复。
    说明
    • 请务必在LVS、SlbControlMaster#准备就绪后,再对Proxy和Keyserver执行上电后的恢复操作。

    • 请务必确保Proxy和Keyserver均到达终态后,再将业务迁移到相应的服务器上。

    1. 以root用户登录OPS1服务器,执行以下命令,逐台对LVS进行恢复操作。
      /usr/bin/curl -s -X PUT "http://[$SlbControlMaster_IP]:8088/admin/agents/maintain;enable=1;force=1;address=[$LB_Global_IP]"
    2. 登录Proxy物理机,依次执行以下两条命令,逐台对Proxy执行上电后的恢复操作。
      /etc/init.d/slb-control-proxy restart
      /home/slb/release/[$Version]/proxy/scripts/start_process.py /home/slb/release/[$Version]/proxy/srv/pillar/node.sls
      说明:[$Version]字段可通过执行以下命令获取。
      rpm -qa | grep slb-proxy
      系统显示类似如下。
      slb-proxy-17.04.3-1728761.alios7.x86_64
    3. 执行以下命令,对Proxy进行引流。
      /home/slb/release/[$Version]/proxy/scripts/enable_node.py /home/slb/release/[$Version]/proxy/srv/pillar/node.sls
    4. 执行以下命令,确认机器上没有iptables规则。
      sudo iptables -L
      如果有iptables规则,则通过执行以下命令进行清除。
      sudo iptables -F
    5. 执行以下命令,通过日志确认post check没有异常。
      sudo tailf /home/admin/logs/proxy_monitor.log
      系统显示类似如下。
    6. 在天基控制台上确认Proxy到达终态。
  7. 逐台对Keyserver执行上电后的恢复操作。
    1. 登录Keyserver物理机,依次执行以下两条命令,启动Keyserver上的服务进程。
      /etc/init.d/slb-cert-central-agent restart
      /home/slb/release/[$Version]/keyserver/scripts/start_process.py /home/slb/release/[$Version]/keyserver/srv/pillar/node.sls
      说明:[$Version]字段可通过命令执行以下命令获取。
      rpm -qa | grep slb-keyserver
      系统显示类似如下。
      slb-proxy-17.04.11-1725841.alios7.x86_64
    2. 执行以下命令,对Keyserver进行引流。
      /home/slb/release/[$Version]/keyserver/scripts/enable_node.py /home/slb/release/[$Version]/keyserver/srv/pillar/node.sls
    3. 执行以下命令,确认机器上没有iptables规则。
      sudo iptables -L
      如果有iptables规则,则通过执行以下命令,进行清除。
      sudo iptables -F
    4. 执行以下命令,通过日志确认post check没有异常。
      sudo tailf /home/admin/logs/keyserver_monitor.log
      系统显示类似如下。
    5. 在天基控制台确认Keyserver到达终态。
  8. 将其他所有产品开机。
  9. 处理开机异常问题。
    1. 开机异常问题通用处理方法如下。
      1. 登录天基控制台,选择运维>集群运维,单击异常集群名,进入集群Dashboard页面。
      2. 在服务实例列表中,单击未达终态服务实例操作列的详情,系统显示服务实例Dashboard页面,可以查看未达终态的服务角色。
      3. 单击未达终态的服务角色操作列的详情,系统显示服务角色Dashboard页面。
      4. 在机器信息列表中,单击机器状态为error的机器操作列中的重启服务角色,系统显示确认页面。单击确认,重启服务角色。
    2. 开机异常问题排查顺序如下。
      1. minirds-mt
      2. SLB、LVS
      3. baseServiceAll下的aas和umm-ak
      4. RAM
      5. webappAll下的webapp-pop
      6. middleWareAll
      7. 其它产品或服务
  10. 等待集群恢复后,把关闭的ECS虚拟机开机,启动用户应用或任务。

3.2.8. 打开权限认证

登录OPS1机器,执行以下命令,即可打开认证。

/cloud/tool/tianji/tianji_clt authmode --enable --config /cloud/data/bootstrap_controller/BootstrapController#/bootstrap_controller/tianji_dest.conf

3.2.9. 查看权限认证

登录OPS1机器,执行以下命令,即可确认权限认证是否打开。返回如果为false,表示关闭认证;为true,表示打开认证。

/cloud/tool/tianji/tianji_clt authmode --get --config /cloud/data/bootstrap_controller/BootstrapController#/bootstrap_controller/tianji_dest.conf

3.3. 结果验证

  1. 检查专有云集群各产品服务状态,并进行功能验证。
  2. 登录OPS1服务器,进入all_pangu_check.tar.gz文件的解压目录,例如/root/pangu_check目录,通过root用户执行以下命令,用于检查各个集群pangu状态。如果输出有”FAIL“字样,则检测失败,请联系阿里云技术支持处理。
    ./pangu_status.sh check

4. 回滚方案

暂无回滚方法。

5. 补充说明

在SLB节点cli命令行,执行以下命令,对输出结果中的flag字段进行简单说明。

list admin keyserver

系统显示类似如下。

说明

  • flag=3:表示Keyserver所在的4层监听对应VIP的443端口,上图中监听IP为10.X.X.255,监听端口为443。
  • flag=2:表示Keyserver所在的4层监听对应的VIP的6666端口,上图中监听IP为10.X.X.255,监听端口为6666。 flag=2和flag=3使用的监听IP是相同的,只是端口不同。
  • flag=1:表示具体的Keyserver主机,上图中有两台Keyserver主机,分别是10.X.X.8和10.X.X.10。