应急预案:专有云V3.6.1环境由于云盘挂载过多导致存在两个river_server进程的修复方法

1. 概述

本文主要介绍在专有云V3.6.1环境,由于云盘挂载过多,导致存在两个river_server进程的修复方法。

1.1. 适用范围

  • 专有云V3,ECS
    说明:适用于专有云V3.6.1环境,此问题在V3.6.2环境已经修复。

1.2. 用户告知

  • 适用平台:x86
  • 授权级别:L2(二线技术支持工程师)
  • 临时或固化方案:临时
  • 操作复杂度:中
  • 预估执行时长:60分钟
  • 业务影响:是
    说明:操作过程中会有短暂的IO抖动。
  • 风险等级:中

2. 问题描述

现场环境的IO7River和IO8River集群挂载的云盘过多,读写数据量加大,导致mes上涨迅速。在源代码中定义mes的容量超过3GB,将会导致watchdog进程检测到river_server进程的内存使用量较高,在超过3GB后watchdog进程会对原有的river_server进程重启,但是该过程在结束river_server进程后,tianjimon会再次启动River Server服务。与此同时,watchdog在检测到该环境结束river_server进程后,watchdog也会启动一个新的river_server进程,从而出现该情况。

说明:内部曙光环境未出现过该问题,经判断应该是现场实际环境挂载的云盘过多,同时有大量进行中的IO,导致mes超过了原定的最大数据。

3. 解决方案

3.1. 环境检查

  1. 登录天基控制台,选择任务>部署概况,单击部署详情
  2. 找到ecs产品,单击角色右侧的详情
  3. 找到对应的集群,选择EcsRiver服务>RiverServer#服务角色。
  4. EcsRiver.RiverServer#机器列表页面,单击机器右侧的Terminal,登录对应的机器。
  5. 执行以下命令,获取对应集群的全部物理机IP地址。
    说明:IO7、IO7River、IO8、IO8river等集群都需要导出,导出文件名iplist_file根据实际情况改动。
    /apsara/river/river_admin cluster ls server | grep serverip | awk '{print $2}' | awk -F: '{print $1}' >iplist_file
    系统显示类似如下。
  6. 将获取的所有IO集群物理机列表拷贝到OPS1服务器。
    说明:包括IO7、IO7River、IO8、IO8river等集群。
  7. 登录OPS1服务器,如何登录OPS服务器请参见专有云如何登录OPS服务器
  8. 执行以下命令,检查存在双river_server进程的物理机。
    说明:几个集群中的物理机都需要查看。
    pssh -ih iplist_file "ps -eo pid,ppid,rss,vsize,lstart,cmd | grep river_server | grep -v grep | grep -v EcsRiver" > check_river_server_file.txt
    说明
    • iplist_file为第5步中导出集群的物理机IP地址。
    • check_river_server_file.txt为导出的存在双river_server进程的NC。
    • 异常情况显示如下。
    • 正常情况显示如下。

3.2. 实施步骤

拷贝文件文件到物理机

  1. 登录OPS1服务器,编写tianjimon.conf替换文件,文件内容如下:
    vim tianjimon.conf
    {
        "AppType": "application",
        "AppName": "",
        "MonitorTasks": [
            {
                "cmd": "check_river_server_self",
                "name": "river_server-check_river_server_self",
                "timeout": 10,
                "interval": 60
            },
            {
                "cmd": "check_ecs_coredump 1800",
                "name": "ecs_server_storage-check_coredump",
                "timeout": 10,
                "interval": 300
            },
            {
                "cmd": "check_etag_mismatch",
                "name": "ecs_server_storage-check_etag_mismatch",
                "timeout": 300,
                "interval": 600
            },
            {
                "cmd": "check_merge_fail",
                "name": "ecs_server_storage-check_merge_fail",
                "timeout": 10,
                "interval": 1800
            }
        ]
    }
    系统显示类似如下。
  2. 编辑tianjimon的overwrite执行脚本文件riverserver_tianjimon_overwrite.sh,脚本文件内容如下:
    #!/bin/bash
    set -x
    ss_root_dir="/cloud/app/EcsRiver/RiverServer#/tianjimon-inspector-riverserver"
    current_ss=$(sudo readlink -f $ss_root_dir/current)
    current_ss_overwrite="$current_ss.overwrite"
    current_ss_version=$(sudo basename $current_ss)
    sudo cp -r $current_ss $current_ss_overwrite
    sudo cp -f /tmp/tianjimon.conf $current_ss_overwrite/conf.tmpl/tianjimon.conf
    sudo rm -f $current_ss_overwrite/script/check_river_server_proc
    sudo /cloud/tool/tianji/overwrite add EcsRiver RiverServer# tianjimon-inspector-riverserver $current_ss_version 1000
    exit 0
    系统显示类似如下。
  3. tianjimon.confriverserver_tianjimon_overwrite.sh文件拷贝到物理机上。

查看对应current的指向信息

  1. 登录OPS服务器,执行以下命令,将文本切片成指定份数。
    split -l [$Number] --numeric-suffixes [$InputFile] [$InputFile].
    说明
    • [$Number]为一个文件切片的份数。
    • [$InputFile]为需要切片的物理机IP列表文件。
    系统显示类似如下。
  2. 执行以下命令,批量执行overwrite操作。
    pssh -ih [$Iplist_File_1] "sh /tmp/riverserver_tianjimon_overwrite.sh"
    说明:[$Iplist_File_1]为切片后的文件名。
  3. 执行以下命令,批量查询current指向链接,查看是否是最新的。
    pssh -ih [$Iplist_File_1] "ls -lrt /cloud/app/EcsRiver/RiverServer#/tianjimon-inspector-riverserver"
    说明:此操作需要分批执行,操作之后无问题再继续其他的操作。

进入重写后的物理机查看是否有双进程

  1. 登录物理机,执行以下命令,获取到两个river_server进程的信息。
    ps -eo pid,ppid,rss,vsize,lstart,cmd | grep river_server | grep -v grep | grep -v EcsRiver
  2. 找出第二个river_server进程的PID,且满足以下两个条件:
    • 内存占用很高,且远远超过另外一个river_server进程。
    • 启动时间晚于另外一个river_server进程。
  3. 判断第二个river_server进程的父进程是否为watchdog_river。
    1. 先执行以下命令,获取到watchdog_river的进程PID。
      ps -eo pid,cmd | grep watchdog_river | grep -v grep
    2. 通过获取到watchdog_river的进程PID与第二个river_server进程的ppid,进行对比确认。
  4. 执行以下命令,将当前两个river_server进程都结束掉,让watchdog自动再次启动river_server进程。
    sudo kill -9 [$PID1] [$PID2]
    说明:[$PID1]和[$PID2]为两个river_server进程的ID。
  5. 执行以下命令,确认watchdog_river已经在运行。
    ps -eo pid,lstart,cmd | grep watchdog_river | grep -v
  6. 再次执行以下命令,查看当前river_server进程。
    ps -eo pid,ppid,lstart,cmd | grep river_server | grep -v grep | grep -v EcsRiver
    • 如果当前仅剩下一个river_server进程,则这台机器操作完成。
    • 如果没有自动启动river_server进程,则执行以下命令,重启river服务。
      sudo service river restart
      说明:重启river服务会有短暂的IO抖动。

3.3. 结果验证

登录物理机,执行以下命令,查看物理机上的river_server进程。如果当前仅剩下一个river_server进程,则这台机器操作完成。

ps -eo pid,ppid,lstart,cmd | grep river_server| grep -v grep | grep -v EcsRiver

4. 回滚方案

不需要回滚。