作者介绍
张秀云,网名飞鸿无痕,现任职于腾讯,负责腾讯金融数据库的运维和优化工作。2007年开始从事运维方面的工作,经历过网络管理员、Linux运维工程师、DBA、分布式存储运维等多个IT职位。对Linux运维、MySQL数据库、分布式存储有丰富的经验。
专职做DBA已经6年多的时间了,看同行、同事犯了太多的错误,自己也犯了非常多的错误。一路走来,感触非常深。然而绝大多数的错误其实都是很低级的错误,有的是因为不了解某个引擎的特性导致;有的是因为对线上环境不了解导致;有的是因为经验不足导致。一路上,跌跌撞撞,从小公司DBA,到腾讯高级DBA,再到现在的金融数据库高级DBA。 不由想起5年前的我,刚进入DBA行业,缺乏经验,经常犯错误,不是我不够努力,更多的是初来乍到的我根本不知道应该在哪方面下功夫。
本文就是基于这方面的考虑,根据自己在DBA这个职业上走过的弯路,总结一些方法给DBA同行。希望本文能给同行DBA或者运维的朋友们带来一些改变,让大家了解作为DBA需要在哪些方面发力。
下面主要从环境、数据安全、常规操作、预案、架构、心态等层面,介绍一些实用的经验。
环境篇
毫无疑问,DBA是需要综合技能最多的一个职业,需要你有网络、操作系统、文件系统、数据库、安全、编程等知识。作为DBA,为了少犯错误,你首先得非常熟悉你负责的数据库环境,大到网络环境、系统环境、数据库环境(这里主要以MySQL为例)。
如果不熟悉环境,很容易因为自身操作考虑不周而导致线上的故障。想想就知道,有多少DBA因为Alter操作导致线上故障?有多少DBA忽略了字符集的问题导致了线上的乱码?又有多少DBA由于迁移的时候没有备份触发器或者event导致故障?太多的教训足以让我们所有的DBA认识到熟悉环境的重要性。
另外,DBA对线上环境如果足够了解,在处理故障、讨论处理方案等,都能极大地增强我们的自信,更好地提升自己的影响力。我们可以说不熟悉环境的DBA不是好DBA。下面来介绍DBA在环境部分应该注意的问题。
软件
1.操作系统环境
针对操作系统部分,你可能需要了解的是使用的操作系统类型。Linux or Windows,该系统做了哪些内核的优化,尤其是针对数据库,比如文件描述符、配置NTP、Raid的写cache模式等。另外你还要对系统的运行状态有大致的了解,例如CPU使用、内存使用、IO使用以及网络带宽和包量的情况。
2.数据库环境
数据库环境包含的内容就非常多了,这里只介绍因为不了解而比较容易造成误操作的部分。
(1)部署方式
对于数据库的部署,我们需要了解数据库是如何部署的,部署在什么目录,可执行文件、数据文件、log文件、配置文件等的存放路径,数据库如何启动和停止等。
(2)使用引擎
了解目前数据库默认使用的引擎,以及现有的表使用的引擎,提前清楚地了解各个引擎的特点和使用,避免在出现数据迁移、表损坏以及启动问题时手忙脚乱导致误操作。(我们的技术就像武器库,都是靠平时闲谈中的积累和打造,在出问题的时候直接从武器库拿出来使用,因此要经常丰富我们的武器库)
备注:虽然现在基本使用的都是InnoDB引擎,但是,你也同样可以发现有的还用了Myisam,甚至有的还用到了Memory、merge、Spider、TokuDB等。
(3)同步方式
目前MySQL基本都会配置同步(如果没有的话,一定要加上,除非是数据丢了或者长时间故障也没关系的库),既然涉及到同步就会有多种不同的方式。比如常见的分类:
- 基于binlog和POS的同步
- 基于GTID的同步
- 异步
- 半同步
- 单线程同步
- 多线程同步
针对这些同步,都有一些不同的特点,比如出现问题了,需要跳过某个位置,GTID的同步和基于POS的同步操作就不一样,同步方式也是你必须掌握的技巧。
(4)版本
在维护数据库时,还需要了解当前数据库使用的大版本。因为数据库的大版本的功能会有很大的差异,有很多特性是只存在某个大版本的,因此了解使用的版本能让你大致知道当前数据库支持哪些特性。在涉及到迁移、同步、数据库升级等操作的时候,能从容应对。
(5)存储过程(procedure)、事件(event)
了解当前数据库是否存在存储过程和事件。在数据备份、数据迁移的时候,需要将对应的存储过程和事件的参数添加进去。另外如果存在事件,在迁移的时候会有特殊的操作,在迁移的目标机器要先将事件关闭,切换后再打开。防止事件导致数据不一致。
(6)关键配置
MySQL有几项非常关键的配置,需要了解清楚,避免由于配置没搞清楚导致误操作,总结关键配置如下:
- innodb_buffer_pool_size
#对innodb生效,对性能影响非常大,一般可以设置内存的50~80%
- key_buffer_size
#对Myisam生效,建议修改成innodb
- innodb_flush_log_at_trx_commit
#innodb的redo日志刷新方式,对innodb的影响会很大,一般设置为2
- log-bin
#是否开始binlog,如果没有开启,一定要开启
- sync_binlog
#刷binlog的方式,一般设置为0,如果对数据需要强一致的,可以将sync_binlog设置为大于1的数,兼顾安全和性能
- innodb_file_per_table
#采用独立表空间,建议都设置成独立表空间,不然后面磁盘空间满了,删除表空间也无法释放,必须做数据迁移
- lower_case_table_names
#表明区分大小写
- character_set_server
#字符集在迁移、数据库变更、数据导入等都是必须要注意的,不然数据乱码了就会很麻烦
- max_connections
#最大连接数不能设置太大,要计算一下session内存*max_connections + 固定内存 < 总内存-2G(这2G用来做系统内存,留给系统的内存可以再设大一点)
- transaction_isolation
#设置隔离级别,默认是Repeatable Read,如果是binlog是row模式,也经常设置为Read Committed级别
所有上面说的参数,都需要深入了解和熟悉,当我们在做数据迁移的时候或者搭建MySQL的时候,一定要比对一下源实例的配置(比对工具可以参考pt-config-diff工具),以免迁移完成后由于参数不一致,中途要重启实例的情况。在这个问题上,我见过太多的教训,希望大家能吸取教训,减少故障和问题的发生。
前面我们介绍了数据库的相关的环境,对于那么多的环境变量,我们应该如何更好地去收集,这里给大家介绍一个工具pt-mysql-summary。
这个工具的具体用法可以Google了解,也可以访问如下链接了解,不在本文的论述范围:
- https://www.percona.com/doc/percona-toolkit/2.1/pt-mysql-summary.html
硬件
经常有DBA由于不了解各个机型大致能支撑的性能 ,所以在方案选型和设备选型讨论中,无法肯定地确认具体需要什么设备,当前的设备配置是否能抗住对应的访问量,导致领导和开发对该DBA的专业度大打折扣。如果大家在日常工作中有空闲的机器,不妨使用sysbench、mysqlslap、FIO等工具捣鼓一下。
运行状态
- 数据库数据量和表的数据量
#数据量到多少G,尤其是单表的数据量
- 实例负载情况(CPU负载、IO负载、系统负载)
- 慢查询情况
- SQL延迟情况
- 锁情况
- 脏页情况
- 访问模型
#访问模型就是这数据库承担的是读多写少还是读少写多,以及是否是高并发等等
针对上述问题,可以采用pt-mysql-summary工具获取,再加以分析,也可以通过如下两个工具来实时查看:
- innotop
- orzdba
数据安全篇
权限安全
- 数据库一定设置符合密码复杂度的用户密码;
- 禁止给用户设置%的登录机器;
- 只给业务最小权限的帐号,并限制登录的机器。
数据一致性
为了保证数据的一致性,记得周期性地使用pt-table-checksum来检查主从数据是否一致,如果不一致,可以使用pt-table-sync进行修复。
数据安全
1.数据备份策略是否合理
2.备份数据是否安全
3.备份数据是否可用
常规操作篇
在操作数据库的时候,首先我们需要熟练常规的操作。常规的操作又分为两部分,一个是线上数据库的常规操作,另一个是针对常见故障的预案的常规操作。熟练了操作和预案,才能在线上出问题的时候不至于手忙脚乱。
常规操作
常规的操作一般包含如下几项:
- 启动停止
- 数据库常规变更
- 索引优化
- 配置修改
- 数据库的备份
- 数据的迁移
- 切换
以上这些操作,包含的内容太多,DBA们可以自行Google。总之要达到非常熟练的地步。如果命令记不住,建议将常规的操作通过关键字标记,并记录到类似印象笔记的文档中,要急用的时候也可以快速搜索到。也可以写成工具脚本,随时调用。
常见故障的预案
极端情况下的预案
定期演习
架构篇
你是一个合格DBA吗?
因此在架构篇部分其实想和大家聊的是在我们点鼠标的同时,还是要深入地去了解点鼠标背后发生的事情,知道异常如何分析和排查。甚至要再大胆一点,你也可以尝试着通过Python或者Go等语言去实现那些背后的逻辑,不要只是把自己局限在做一个OP。因此我们在做运维的时候,不妨好好地问自己几个问题:
我点了鼠标之后,后端都干了什么事情? 需要和哪些服务交互 ?如果点完鼠标以后,报错了,需要如何进行排查?需要到哪里看日志?需要如何处理?
问完这两个问题,更次一点的是找研发详细了解里面的运行逻辑,以及部署详情,日志存放,出现问题如何排查等。更好的办法,是找研发要代码,然后自己去看对应按钮后面代码的逻辑。
有的同学会说,我编码能力差,看不懂。这个不用担心,相信我,要基本看懂研发写的代码其实并没有那么难。践行一下你就会知道。等你看完研发的代码,估计很快就可以自己写一个类似的功能出来。
只有深入了解了逻辑之后,在遇到故障和问题,你就能更快速地进行定位,减少对业务的影响。此外你还能有针对性的做自动化,让自己工作更轻松。这么好的事情,为什么不践行一下?
了解业务
线上操作篇(经验)
DBA面对线上复杂的环境,尤其是面对高并发的环境,很容易导致线上故障,下面是整理的一些容易导致线上故障的操作以及规避误操作的技巧,希望能对各位DBA有所帮助:
- 修改或删除数据前先备份,先备份,先备份(重要事情说三遍) ;
- 线上变更一定要有回退方案;
- 批量操作中间添加sleep;
- DDL操作要谨慎,对于大表的Alter操作最好使用pt-online-schema-change;
- 变更操作先在测试环境测试;
- 重启数据库前先刷脏页;
- 禁止批量删除大量的binlog;
- 对于变更操作一定要写详细的操作步骤,并review;
- 按enter之前再进行一次环境确认;
- 如果你的操作可能会使状况变得更糟,请停止操作;
- 快速处理磁盘满,使用tune2fs释放文件系统保留块;
- 连接数满先修改内存变量,而不是重启,修改方式如下:
gdb -p pid -ex “set max_connections=1000” -batch
#pid是mysqld的对应的pid。
心态篇
心细胆大
从某种意义上讲,DBA是一个高危的行业,不是开玩笑,看看下面的截图就知道:
风险本身是个伪命题,对于某些人来说是风险,但对于某些人来说其实没有风险。就像医生做手术一样,我们常人看来就是个非常危险的事情,但是对于医生来讲,其实并没有什么风险(大部分的手术)。因此风险在于你是否已经了解深入,并且做足了功课。
这就要求我们在做线上操作之前要心细,要有详细的操作步骤,有想尽的回滚方案,做完备的测试。这些做完了以后,你的胆子才能“大”起来,胆大是因为你心中有底,心中有自信。这些自信都是前面你做功课带给你的。
勇于担当
工匠精神
有句话说得好:我们之所以经常犯错,就是因为我们做的功课不够。如果你有很多功课落下了,请安排时间逐步补上,要坚信一切都是闲谈中求来,热闹中使用。
文章来自微信公众号:DBAplus社群
本文链接:http://www.yunweipai.com/20143.html