
AWS 解决方案架构师,负责 AWS 云计算方案的咨询、设计和架构评估。在运维,DevOPS 和 DBA 方面有十余年经验,目前侧重于大数据领域的研究。01
概述
数据库日志是分析研究业务状态的参考资料,也是发生事故或审计时,可追溯检查的最具可靠性和权威性的原始记录,是寻找问题根源的重要的证据之一。RDS MySQL 的默认参数组和选项组并没有打开所有的日志选项。RDS 的控制台里提供了把日志直接输出到 CloudWatch 的方法,可以在 CloudWatch 里面直接分析日志。如果对于成本比较敏感,我们也可以通过 Lambda 定期把日志导出到 S3 做存储和分析。本教程旨在帮助初次接触 RDS 并想导出日志的用户,包含以下几部分内容:02
通过 S3 存储桶
做日志的生命周期管理
Amazon S3 是一种对象存储服务,有行业领先的扩展性、数据可用性、安全性和性能。S3 不但能可靠又低成本的保存日志,还能通过生命周期管理功能自动归档或删除过期的日志。03
创建 S3 存储桶
因为 S3 存储桶的名字是 DNS 的一部分,要起一个独一无二的名字,然后选择区域,创建存储桶。阻止所有公有访问权限选项默认是选中的,强烈建议不要改这个地方,否则数据有被他人访问的风险。
04
为存储桶
设置生命周期管理策略
设立一个30-365为名的规则,30天后自动用智能分层功能降低存储成本,365天后删除日志。
05
开启 RDS(MySQL) 的日志
MySQL 有错误日志、慢查询日志、常规日志、审计日志和 Binlog。错误日志是默认打开的,慢查询日志和审计日志需要修改参数组才能打开,审计日志需要修改选项组才能打开。Binlog 默认不保存。注意:更换选项组或修改审计选项不会造成 RDS 重启,但可能造成连接中断。默认:保留9个审计文件,每个文件大小1MiB。请根据业务情况修改。例:100个文件,每个100MiB(占10GiB)。SERVER_AUDIT_FILE_ROTATIONS: 100SERVER_AUDIT_FILE_ROTATE_SIZE: 100000000https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.AuditPlugin.html
开启常规日志和慢查询日志,performance_schema
注意:更换参数组需要重启 RDS,更改参数组中的参数可能需要重启 RDS。开启常规日志和慢查询日志会影响 DB 的性能,尤其是 DB 负载很高查询很多的时候。因此请根据情况选择是否打开。修改参数的影响请参考下面的链接:https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_ModifyInstance.MySQL.html#USER_ModifyInstance.MySQL.Settings存储日志到文件:log_output = FILE开启慢查询日志:slow_query_log = 1long_query_time = 3.5(记录超过3.5秒的查询)log_queries_not_using_indexes = 1 (记录未使用索引的查询)开启 performance_schema:performance_schema = 1RDS 参数组没有默认打开 performance_schema,建议打开。
07
在 RDS 上保存 Binlog
RDS 的 Binlog 生成后会很快被删除。为了故障调查等原因,建议保留一定时间。保留 Binlog 会占用 RDS 的磁盘空间。连上 RDS 后可以用下面的存储过程行设定 Binlog 的保存时间,比如24小时:> call mysql.rds_set_configuration(‘binlog retention hours’, 24);> call mysql.rds_show_configuration;注:如果要 RDS 生成 Binlog,还需要修改数据库实例,设置备份保留期在1天以上。下载 binlog 要用 mysqlbinlog 程序,详情请参照https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html
修改 RDS 实例使用新创建的
选项组和参数组(需要重启 RDS)
RDS 的 Configuration 页面是 pending-reboot 状态,RDS 重启后变成 in-sync 状态,设置生效。通过 Lambda 转储 RDS 日志
AWS Lambda 无服务器计算服务,可运行代码来响应事件并自动管理底层计算资源。它非常适合在一天导出几次日志这样的场景来使用。代码说明
1)这段代码利用 API 获得 RDS 的日志状态。其中 describeDBLogFiles 获得1小时内新生成的日志一览后依次处理各个日志。downloadDBLogFilePortion 下载日志并压缩后存储到 Lambda的/tmp 临时路径,putObject 上传日志文件到 S3 存储桶。
2)Lambda 代码最多运行15分钟,处理能力与分配的内存大小有关。建议分配 256MiB 以上的内存并指定15分钟的超时时间。如果 RDS 在业务繁忙时间生成的日志量太大,Lambda 不能在15分钟内处理完所有日志,就需要分配更大的内存。3)Lambda 的临时路径 /tmp 的容量是512MiB,以20%的压缩比率计算,能处理最大 2.5GiB 的单个日志。4)Lambda 除了基本的执行权限以外,还需要内联策略下载 RDS 日志,附加 AWSLambdaExecute 权限上传到 S3。<bucket>–RDS–<rds_id>–<log_type>–<YYYY-MM-DD>创建 Lambda 的步骤
这个步骤将创建一个拥有基本的 Lambda 执行权限的角色。后面第4)步中再给它添加 RDS 和 S3 的访问权限。2)配置一个 CloudWatch Events,每小时的第10分钟自动执行 Lambda Schedule 可以用 Crontab 格式:cron(10 * ? * * *)下面的代码里面,rdsid、bucket、region 三个变量需要根据实际情况修改。
粘贴和修改完代码以后,要点击一下画面右上角的保存按钮。权限设置,点击下方查看…角色的链接,为 RDS 和 S3 的相关操作附加策略。权限设置完成后再点保存。在 JSON 窗口粘贴以下内容,创建一个名为 LambdaDownloadRDSLog 的策略这个 Lambda 函数是定时驱动的,不需要传入参数。点击测试按钮后用默认事件模版创建一个测试事件,然后再测试。执行结果的详细信息里面,会列出 describeDBLogFiles 获得的1小时内新生成的日志一览,downloadDBLogFilePortion 分页下载日志的结果,putObject 上传日志文件到 S3 存储桶的结果。Lambda 函数测试通过以后,就可以保存下来。这个函数会被刚才配置的 CloudWatch 事件定期触发,自动转储日志到 S3 存储桶。参考链接
1.S3对象生命周期管理:
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/object-lifecycle-mgmt.html2.RDS MySQL 日志文件:
https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html3.MariraDB 审核插件支持:
https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.AuditPlugin.htmlhttps://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_ModifyInstance.MySQL.html#USER_ModifyInstance.MySQL.Settings
5.在 Lambda 控制台配置函数
https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/configuration-console.html6.Node.js 中的 Lambda 函数处理程序
https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/nodejs-handler.html7.AWS Node.js SDK
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/RDS.html
* 本篇文章引用自 AWS Blog,点击下方阅读原文查看 AWS Blog 原文。