DBA一族九阳神功秘籍,标准和制度(含重大节假日应急预案)
背景
如果你是数据库这个行业的朋友,最近可能会被朋友圈的各种关于 “炉石数据被删” 、 “mongoDB遭黑客勒索” 、 “gitlab数据文件被rm -rf” 的事件刷屏。
数据库在是企业中占据非常重要的位置,发生数据库被SQL注入,数据被误删的事情,不仅仅影响业务,还可能造成用户的信息被泄露。
DBA一族就像IT行业的边防战士,守卫数据是DBA的重要职责之一。
眼看就要春节了,DBA一族想不想过个好年?和小伙伴们一起戳个麻将,和家人去哪里度个假,晚上好好的睡个觉,又或者晚上和新买的充气XXOO?oh no,不要被shit的故障电话CALL醒了。
从人在囧途说起
在大城市里打工的年轻IT民工们,一年难得回一趟老家看看家里的爸妈。
首先要恭喜一下买到了过年回家的票的小伙伴们,你们真是幸运的。
在开始漫长的回家旅程之前,细心的同学一定会做好这几件事情再粗发吧?
防火防盗防色狼
备好路途中所需的粮食和水,短途的朋友可以忽略
备好应急启动电源,拖车线,防滑链。
买好保险
春节前尽量做个汽车保养,检查一下车辆健康状况,一些已经发现的小毛病修掉
检查备胎的胎压是否正常,加满油,加满玻璃水
备足银两
交足电话费,确保春节期间手机畅通
手机充满电、最好带个充电宝,旅途就不会那么无聊了,当然你还可以下点小视频哦
关闭煤气、暖气等开关
关闭所有的水龙头,特别是洗衣机的进水口开关
关闭所有的家电,关闭电源开关
给小花小草足够的水分,不然半个月的春节过去小花们都等谢了
开启远程摄像头,嘿嘿现在已经不是高科技了,远程随时监控,很多家里请了全职保姆单独带娃的可能都会装一个这样的设备
锁好门窗,准备出发,祝大家旅途愉快
DBA一族,春节期间不能忽略的N件事
与其说春节期间不能忽略的N件事,倒不如说是DBA一族的《九阳神功》,它应该包含日常篇、重大节假日前篇、重大节假日中篇、重大节假日后篇。
1 日常篇
作为DBA一族,首当其冲的是守卫数据,让数据库正常运转,所以有些事情是骨子里就应该遵循的。
1. 制定并执行数据库安全规范
2. 制定并执行数据库管理规范
3. 制定并执行数据库开发规范
4. 建立自动化监控系统
5. 建立自动化巡检、备份、HA、异地容灾、异地备份系统、(还有很重要的备份集可用性校验,特别是在磁带库时代)
6. 制定节假日的封网机制、应急机制
这样就建立了一道强有力的封印,可以有效的防止外族入侵。
细节请打开如下文档阅读
《DBA专供 冈本003系列 - 数据库安全第一,过个好年》
《PostgreSQL 最佳实践 - 在线增量备份与任意时间点恢复》
《PostgreSQL 最佳实践 - 任意时间点恢复源码分析》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)方案与实战》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集自动校验》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)单个数据库采用多个zfs卷(如表空间)时如何一致性备份》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)双机HA与块级备份部署》
《PostgreSQL 最佳实践 - 块级别增量备份(pg_rman baseon LSN)源码浅析与使用》
《PostgreSQL 最佳实践 - pg_rman 以standby为源的备份浅析》
《PostgreSQL 最佳实践 - pg_rman 数据库恢复示例 与 软件限制解说》
《PostgreSQL 数据库在上市公司重要应用中的SOX审计》
2 重大节假日前篇
1. 春节前,建议增加一次例行的巡检,就好像我们出远门检查一下车子一样。
有问题提前发现,提前改造,优化。
比如这样一些例行的检查项
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 操作系统信息 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 主机名: "
"----->>>---->>> 以太链路信息: "
"----->>>---->>> IP地址信息: "
"----->>>---->>> 路由信息: "
"----->>>---->>> 操作系统内核: "
"----->>>---->>> 内存(MB): "
"----->>>---->>> CPU: "
"----->>>---->>> 块设备: "
"----->>>---->>> 拓扑: "
"----->>>---->>> 进程树: "
"----->>>---->>> 操作系统配置文件 静态配置信息: "
"----->>>---->>> /etc/sysctl.conf "
"----->>>---->>> /etc/security/limits.conf "
"----->>>---->>> /etc/security/limits.d/*.conf "
"----->>>---->>> /etc/sysconfig/iptables "
"----->>>---->>> /etc/fstab "
"----->>>---->>> /etc/rc.local "
"----->>>---->>> /etc/selinux/config "
"----->>>---->>> /boot/grub/grub.conf "
"----->>>---->>> /var/spool/cron 用户cron配置 "
"----->>>---->>> chkconfig --list "
"----->>>---->>> iptables -L -v -n -t filter 动态配置信息: "
"----->>>---->>> iptables -L -v -n -t nat 动态配置信息: "
"----->>>---->>> iptables -L -v -n -t mangle 动态配置信息: "
"----->>>---->>> iptables -L -v -n -t raw 动态配置信息: "
"----->>>---->>> sysctl -a 动态配置信息: "
"----->>>---->>> mount 动态配置信息: "
"----->>>---->>> selinux 动态配置信息: "
"----->>>---->>> 建议禁用Transparent Huge Pages (THP): "
"----->>>---->>> 硬盘SMART信息,判断磁盘寿命(需要root): "
"----->>>---->>> /var/log/boot.log "
"----->>>---->>> /var/log/cron(需要root) "
"----->>>---->>> /var/log/dmesg "
"----->>>---->>> /var/log/messages(需要root) "
"----->>>---->>> /var/log/secure(需要root) "
"----->>>---->>> /var/log/wtmp "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库信息 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 数据库版本: "
"----->>>---->>> 用户已安装的插件版本: "
"----->>>---->>> 用户使用了多少种数据类型: "
"----->>>---->>> 用户创建了多少对象: "
"----->>>---->>> 用户对象占用空间的柱状图: "
"----->>>---->>> 当前用户的操作系统定时任务: "
"----->>>---->>> 获取pg_hba.conf md5值: "
"----->>>---->>> 获取pg_hba.conf配置: "
"----->>>---->>> 获取postgresql.conf md5值: "
"----->>>---->>> 获取postgresql.conf配置: "
"----->>>---->>> 用户或数据库级别定制参数: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库错误日志分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 获取错误日志信息: "
"----->>>---->>> 获取连接请求情况: "
"----->>>---->>> 获取认证失败情况: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库慢SQL日志分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 慢查询统计: "
"----->>>---->>> 慢查询分布头10条的执行时间, ms: "
"----->>>---->>> 慢查询分布尾10条的执行时间, ms: "
"----->>>---->>> auto_explain 分析统计: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库空间使用分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 输出文件系统剩余空间: "
"----->>>---->>> 输出表空间对应目录: "
"----->>>---->>> 输出表空间使用情况: "
"----->>>---->>> 输出数据库使用情况: "
"----->>>---->>> TOP 10 size对象: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库连接分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 当前活跃度: "
"----->>>---->>> 总剩余连接数: "
"----->>>---->>> 用户连接数限制: "
"----->>>---->>> 数据库连接限制: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库性能分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> TOP 5 SQL : total_cpu_time "
"----->>>---->>> 索引数超过4并且SIZE大于10MB的表: "
"----->>>---->>> 上次巡检以来未使用或使用较少的索引: "
"----->>>---->>> 数据库统计信息, 回滚比例, 命中比例, 数据块读写时间, 死锁, 复制冲突: "
"----->>>---->>> 检查点, bgwriter 统计信息: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库垃圾分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 表引膨胀检查: "
"----->>>---->>> 索引膨胀检查: "
"----->>>---->>> 垃圾数据: "
"----->>>---->>> 未引用的大对象: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库年龄分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 数据库年龄: "
"----->>>---->>> 表年龄: "
"----->>>---->>> 长事务, 2PC: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库XLOG, 流复制状态分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 是否开启归档, 自动垃圾回收: "
"----->>>---->>> 归档统计信息: "
"----->>>---->>> 流复制统计信息: "
"----->>>---->>> 流复制插槽: "
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"| 数据库安全或潜在风险分析 |"
"|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|"
"----->>>---->>> 密码泄露检查: "
"----->>>---->>> 简单密码检查: "
"----->>>---->>> 用户密码到期时间: "
"----->>>---->>> SQL注入风险分析: "
"----->>>---->>> 普通用户对象上的规则安全检查: "
"----->>>---->>> 普通用户自定义函数安全检查: "
"----->>>---->>> unlogged table 和 哈希索引: "
"----->>>---->>> 剩余可使用次数不足1000万次的序列检查: "
"----->>>---->>> 触发器, 事件触发器: "
"----->>>---->>> 检查是否使用了a-z 0-9 _ 以外的字母作为对象名: "
"----->>>---->>> 锁等待: "
"----->>>---->>> 继承关系检查: "
如果数据库系统特别多,应该有重点的进行关注,1、核心业务数据库,2、本身就排在负载TOP的数据库系统。
《Use PostgreSQL collect and analyze Operation System statistics》
2. 对可预知的业务数据库、(当然还包括应用服务器等)进行扩容,这个是很有必要的,通常许多业务会在节假日时迎接高峰,例如游戏类业务、社交类业务、电商类业务等。
3. 预备一批硬件standby,以便应对春节的即时需要
4. 封网,停止变更,通常需要提前数天停止变更,减少因为变更带来的潜在问题。
例如应用程序变更后,可能新增了一些SQL语句,这些SQL语句本身可能没有优化好,又或者无法预知业务对这些SQL语句的请求量并发量等,导致数据库在重大节假日存在潜在的炸弹。
5. 排班。安排好值日,做到7*24小时有DBA可以响应,保持手机畅通,同时确保值班的童鞋可以连接网络。
6. 通常值日生在节假日期间一个人要负责的业务比平时负责的业务更广泛,所以对值日生进行值班内容、业务的培训也是很有必要的。
因此平时的DBA轮岗机制也是很重要的,要绝对避免这样的现象:一个业务只有一位DBA熟悉。
7. 宣导,向公司业务方敲锣打鼓的宣导,要进入封网期间了,请大家遵循封网规则,不要在封网期间做越界的事情(比如变更、发布)。
虽然在制度上和某些IT手段上控制了封网期间的行为,但是难免有漏网之鱼,所以宣导也是很重要的。
8. 应急响应还需要包括问题分级手册,常见问题处理方法手册,每个问题需要包含问题现象描述,常见原因描述,处理方法,故障等级预估,责任人,通知流程,响应流程。
9. 数据库系统应该按业务系统分级,例如分为核心业务系统、业务保障支撑系统、非关键业务系统等。
3 重大节假日中篇
1. 值班,通常分为在线和离线值班,在线和上班差不多,可能要随时关注一些NOC平台的指标,间歇性的填写一些值班报告。
离线值班指被动的接收告警短信,邮件,发生问题时上线处理。
2. 交接班,交接班是非常重要的,通常上一个班的同事会发现一些异常,交代给下一位值班的同事,如果真的遇到问题响应速度和判断效率也更高。
4 重大节假日后篇
封网结束后,一切又回归正常了。但是有一件很重要的事情别忘记了。
1. 复盘
复盘通常指对封网期间的系统状态进行回顾,要达到几个目的
1.1 扩容预估是否合理,同时建议反馈给业务方相应的数据
1.2 是否有故障,什么原因导致的,将来如何避免
1.3 监控系统是否存在疏漏,将来如何避免
1.4 是否有违规变更、发布,将来如何避免
小结
相信很多公司都有类似的制度,DBA一族加油。
如果有哪些写得不对或者不够完善,也感谢指出。
小象Pi吉(PostgreSQL) 和 大象吉Pi(GPDB) 预祝大伙新年快乐。