应急预案:专有云V3环境中停止RDS产品SQL审计采集功能的方法

应急预案:专有云V3环境中停止RDS产品SQL审计采集功能的方法

更新时间:2020-06-30 19:56:10

1. 概述

本文主要介绍在专有云V3环境中,停止RDS产品SQL审计采集功能的方法。

1.1. 适用范围

  • 专有云V3企业版,RDS
    说明:适用于专有云V3.5以上版本,RDS管控版本为3580以上版本。

1.2. 用户告知

  • 适用平台:x86
  • 授权级别:L1(一线驻场工程师)、L2(二线技术支持工程师)
  • 临时或固化方案:临时
  • 操作复杂度:中
  • 预估执行时长:1小时
  • 业务影响:否
  • 风险等级:中
    说明:该方案只适用于应急预案,不能作为通用方案进行操作,操作的过程需要阿里云技术支持指导操作。

2. 问题描述

请参见以下场景,根据实际情况,停止RDS产品SQL审计采集功能。

  • 场景一:由于个别环境的体量过大,SQL审计和性能采集导致Kafka容器的资源被占满,导致容器所在的物理机夯机,其他产品在天基控制台上未达终态,产生此问题的原因如下:
    Kafka是RDS产品SQL审计链路和性能数据采集链路的一个组件,Kafka不断刷新数据,会占用物理的内存。物理机无法支撑大的流量,从而导致夯机,该物理机上部署了其他产品的Docker,进而导致其他产品的Docker异常,从而影响天基未达终态。
  • 场景二:客户业务系统对RDS for MySQL数据库实例进行数据查询时,会收到数据库实例以下报错,业务系统无法完成查询操作,导致业务系统对外服务异常。
    the table '/home/mysql/xxxx/xxxx/#[$Tab_Name]' is full
    系统显示类似如下。

    导致发生该问题的原因如下:

    RDS for MySQL实例所在物理机的Logagent采集审计数据后,未及时清理*.alog,从而导致tmp目录被占满,客户复杂查询再无存储空间可用,最终导致客户业务系统复杂查询异常。

3. 解决方案

3.1. 环境检查

根据实际场景,参见以下操作,进行检查。

  • 场景一:此场景需要同天基产品一起进行排查
    1. 登录天基控制台,在Project框中搜索rds,单击brain集群右侧的集群运维中心,选择rds-brain服务和KafkaBroker#服务角色,单击机器右侧的Terminal,登录对应的机器。
    2. 在kafka-broker容器中,执行以下命令,查看内存使用情况。
      free -m
    3. 在未达终态的容器所在的宿主机,查看dmesg中的信息。
  • 场景二:客户端报错临时表空间过小,需要先确认该实例的临时表空间的大小
    1. 登录报错实例,执行以下SQL语句,查看临时表空间大小。
      show variables like '%tmp%';
      系统显示类似如下。
    2. 在RDS管理控制台,单击实例名,在配置实例中,单击读写参数(需要重启数据库),查看该报错实例的参数设置。
      说明:查看loose_rds_max_tmp_disk_space和tmp_table_size参数大小。
    3. 登录报错实例所在物理机,查看临时表空间的目录是否被*.alog文件占用。
      说明:物理机的目录为/home/mysql/data[$Port]/tmp,[$Port]为端口号。

3.2. 实施步骤

以下两个场景都是修改SQL审计链路的采集,但是场景一是从根本上不产生,场景二是产生,但是不进行消费。

  • 场景一:是在实例数据库内核层面,修改参数任务,关闭SQL审计产生的方法,该场景不在产生SQL审计。
  • 场景二:是关闭log_agent,对SQL审计不在采集。

场景一的处理方法

由于SQL审计将kafka容器的资源被占满,可以临时选择对该环境中实例SQL日志不采集的策略,修改数据库的loose_opt_rds_audit_log_enabled参数,具体操作如下:

  1. 登录RDS管理控制台,选择实例管理>实例批量管理>批量实例参数刷新,勾选MySQL集群,单击选择参数模板
  2. 勾选loose_opt_rds_audit_log_enabled参数,单击下一步,将该参数值修改为0
  3. 等待批量刷新的参数任务结束,确认RDS管理控制台中无中断任务,在数据库中执行以下SQL语句,确认该参数已经修改为off
    show variables like '%opt_rds_audit_log_enabled%';
    系统显示类似如下。
  4. 在kafka-broker容器中,执行以下命令,如果Kafka停止刷新,说明SQL审计链路已经停止采集。
    /usr/local/rds/kafka/bin/kafka-console-consumer.sh --zookeeper [$KafkaZK]:2181 --topicrds_sql_log
    说明:[$KafkaZK]替换为实际ZookeeperServer地址。
  5. 观察宿主的内存使用情况。

场景二的处理方法

log_agent采集的.alog将临时表空间占满,需要停止log_agent采集。

故障应急处理
  1. 登录实例所在主库的主机,依次执行以下命令,停止log_agent采集。
    pssh -ih dblist "rpm -qa|grep t-cloudmon-logagent |xargs rpm -e"
    chmod -x /etc/init.d/logagent
    chmod -x /opt/log_agent/bin/service.sh
    ps -ef|grep log_agent|grep -v grep|awk '{print $2}'|xargs kill -9
  2. 执行以下命令,清理受影响实例物理机的.alog文件。
    find /u01/tmp*/ -name "*.alog" | xargs rm -f
  3. 停止MySQL引擎的审计日志,恢复log_agent。
    1. 执行以下命令,将审计日志的采集移除。
      date;mv /opt/log_agent/conf/sql_collect /opt/log_agent
    2. 执行以下命令,确认机器上的service脚本执行权限。
      ll /opt/log_agent/bin/service.sh 
      如果没有执行权限,则执行以下命令,添加执行权限。
      date;chmod +x /opt/log_agent/bin/service.sh 
    3. 执行以下命令,启动log_agent。
      /opt/log_agent/bin/service.sh start
    4. 登录RDS管理控制台,单击实例名,在配置实例中,单击实例资源配置,关闭PPAS引擎的磁盘检查。
      说明:因为老版本的log_agent Bug,导致PPAS会出现审计日志累积。

3.3. 结果验证

确认RDS产品SQL审计采集功能已停止。

4. 回滚方案

请根据不同场景执行回滚操作,具体操作如下:

  • 场景一:参见实施步骤,需要在RDS管理控制台中,将数据库的loose_opt_rds_audit_log_enabled参数修改为1
  • 场景二:依次执行以下命令,逐步恢复MySQL审计日志。
    date ; pssh -ih mysqldb06 "ls /opt/log_agent/conf | grep sql_collect"
    date ; pssh -ih /tmp/shark/audit/mysqldb01 "mv /opt/log_agent/sql_collect /opt/log_agent/conf"