[转载] 新浪微博MySQL优化的小结和反思
原文: http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=206762682&idx=1&sn=1233ed1496d7fd059d247329f3d3a183&scene=1&key=c76941211a49ab587d35d0d840a84ff2e3948510bca7698783e134b95c3e8ad0a30d1f83897e9c764e289a1011c565db&ascene=0&uin=Mjk1ODMyNTYyMg%3D%3D&devicetype=iMac+MacBookPro9%2C2+OSX+OSX+10.10.3+build(14D136)&version=11020012&pass_ticket=GJi1zStfd3iFy8nPiSm73eDDCYHehF3pnzgmnpzERbyqm7LlmMscbVsBrAMC%2FPt3
本文根据高效运维系列微信群的一次精彩分享整理而成。“高效运维”公众号作为本系列群的官方唯一公众号,原创并独家首发。
欢迎关注“高效运维”公众号,以关注并免费参加「运维讲坛」每月一次的线下交流活动;并抢先赏阅干货满满的各种原创文章(详情参见文末)。
编辑
高浩淼-北京、徐文慧@21v (文章整理)
高浩淼-北京 (发布)
嘉宾介绍
杨尚刚,原新浪高级DBA,现在在美图负责数据库,微博zolker。2011年加入新浪,早期主要负责新浪微博核心数据库的架构设计,后期主要负责数据库平台的软硬件优化。
主题简介
MySQL数据库性能优化方面的一些策略
MySQL性能优化
MySQL性能优化的几点常规优化策略:
读写分离
sharding
参数优化
索引优化
系统优化
硬件优化
读写分离
读写分离是一种比较常规的优化策略,这个也很容易理解和实现,方案的主要目的还是做到读写的隔离,减少相互干扰,互联网的大多数场景都是读多写少的业务,所以这种策略都是没问题的。
Sharding
sharding拆分是一种通过一定的策略把数据重新分布的策略,主要解决单实例写入压力或容量过大的问题。但是sharding带来的问题也是很多的,比如运维管理成本增加和业务访问的复杂度增加。
sharding这种策略在微博早期压力大时候用的还是非常多的,天天各种拆分搞的很嗨,但是其实后来发现拆分很没意思,冷静下来发现其实很多拆分并不是那么紧迫或者没必要。
天天忙于拆分带来的问题就是导致没有时间做更深入优化和自动化方面的工作,所以拆分一定要做到适时适度。
sharding拆分主要分成两个维度,垂直拆分和水平拆分,水平拆分主要是在不改变schema的前提下重新分布数据,而垂直拆分主要是在业务层面解耦。基本上两者要结合使用。
所以控制拆分粒度是非常重要的 ,从现在的硬件水平上,单个sharding控制在2-3亿以内都是没问题的。
微博当时最大的单表在60亿+,单表容量过T,DBA有的时候还要“懒”一些的。
主从延迟优化
其实MySQL另外一个比较容易让人诟病的就是主从复制延时问题,这个主要还是早期MySQL复制单线程设计的问题。
而造成延时的原因其实主要是两点,主库写入过大导致从库SQL单线程性能跟不上,或者从库读压力过大影响了SQL单线程。当然现在MySQL 5.6也开始引入并行复制,但是粒度依然很大,还是基于库的复制,所以提升有限。
刚从这两点原因的主要诱发原因还是IO瓶颈的因素居多,所以解决延时问题首选的还是使用高性能IO存储,次之使用并行复制方案,再次之采用sharding拆分。
Schema优化
再讲一下 schema优化 ,主要考虑的是表结构的字段设计和索引设计合理性,以及分表策略是否合理。对后期管理优化都是非常重要的。
列类型够用就好,越小越好,简单就好,数据类型越简单越好,能用整型尽量不用字符串,比如存时间和字符串 ,避免Null,主键尽可能使用自增,不建议使用字符串,尤其是innodb单表索引数不要超过五个(5.6有待测试) 索引设计的差异性,避免冗余索引,字符集选择,尽量UTF8,emoji字符选择UTF8mb4。
参数优化
然后是MySQL的一些参数优化策略,主要是InnoDB层面的参数优化,MySQL Server层参数优化性能提升有限
innodb_file_per_table
innodb_buffer_pool_size
innodb_flush_log_at_trx_commit= 0 1 2 (和数据安全有关)
innodb_log_file_size
innodb_page_size
sync_binlog(和数据安全有关)
尤其要注意
innodb_flush_log_at_trx_commit和sync_binlog的设置,如果对数据安全要求高,建议都设置为1
硬件优化主要是,NUMA、大内存和SSD相关的使用和优化
NUMA在当前这种多核架构下,理论优化是有价值的,不过实际测试结果提升有限,而且还增加了管理成本。所以像Twitter的MySQL分支也建议关闭NUMA。之所以NUMA不起作用主要还是因为这种跨Node的访问对MySQL整体latency影响有限。
而SSD更是在MySQL性能提升的利器。微博知名大V曾说过“近十年真正改变数据库技术的就是闪存技术”,而且像阿里的去IOE也是离不开的SSD的应用的。
当时在新浪的应用模式是2U服务器,10块SSD做Raid5 ,性能还是不错的。
echo noop/deadline >/sys/block/[device]/queue/scheduler(性能提升最明显)
echo 2 > /sys/block/[device]/queue/rq_affinity (CentOS 6.4以上)
echo 0 > /sys/block/[device]/queue/add_random (关闭文件系统barrier)
针对SSD的系统参数优化:
针对SSD的MySQL参数优化在5.5以上,提高innodb_write_io_threads和innodb_read_io_threads,innodb_io_capacity需要调大,日志文件和redo放到机械硬盘,undo放到SSD atomic write,不需要Double Write,Buffer InnoDB压缩,降低SSD寿命磨损,单机多实例+cgroup。
FAQ
问题一:关于amazon的aurora的实现难度
从amazon披露的信息来看,难度还是比较大的。首先从上层数据库层面已经和原生MySQL差距很大了,应该也是自己重写或改写的,这个之前微博上也有过很多讨论,另外在文件系统和硬件存储上,amazon也都是深度定制的,相当于是把原来InnoDB的一些数据容错安全策略下防到文件系统和存储层面实现。
问题二:现在用PCI-E卡吗?
美图现在不用 ,原来新浪用了不少的,单从iops是要高的,实际跑业务差距不大,除非你的读写量超大。
问题三:除了刚才讲到的提高IO,降低主从延时有哪些建议?
那就是并行复制和拆分有效了,之前也有一些从库预读方案,预读Relay log,提升不大。
问题四:为什么建议把redo放在机械盘上呢?
文件读写特性有关,redo主要是顺序写为主,SSD更擅长随机写,实际我们也是都放SSD的,其实目前SSD寿命都还不错了,放在一起不区分也没什么问题。
问题五:什么场景不需要拆分?
就是看你数据量和访问量。从一般场景来说 单个sharding控制在2亿以内都是比较合理的,还是要根据自己的场景 判断瓶颈到底是不是只能sharding解决 ,能不用就不用吧。一般大表加字段用pt-online-schema也可以。不过像我们当时的那个60亿大表,估计要加字段就确实很麻烦了。
问题六:对原版MHA修改主要修改的哪些方面?galera有人用吗?
我们当时做的主要重写的他的切换逻辑部分。galera原生应该没人用,大部分用的还是percona基于galera封装的percona xtradb cluster。据我所知搜狐和去哪儿都在用,坑还是不少的,需要对代码底层有把控力的更好一些。
问题七:你们修改的MHA部分可以分享一下吗?你们用MariaDB吗,这个可以并行复制?你们用触发器吗?
我们修改的部分主要还是Python重写的核心切换逻辑,日志处理还是原生的。MariaDB可以并行复制,我们不要MariaDB,实际线上使用国内也不多。尽量不在线上使用触发器。
问题八:能讲讲SQL优化嘛?
SQL优化涉及到的东西就比较杂了,MySQL等值查询最好,尽可能好的利用索引,善用explain和pt-query-digest。
问题九:你们用MHA遇到了哪些问题,MHA自动切换如果丢了数据,如何恢复?PXC和MHA生产中如何选择,另外您提到您这边部分手动,部分自动,是什么原因?
MHA只是尽可能保证不丢,如果切换完数据补全完还有问题,只能看看业务日志是否可以恢复。PXC的限制还是很多的,比如跨IDC和集群节点数量等,运维成本也远高于原版。目的是全部自动,一些核心重要的业务可能需要人工介入判断,会有端口分级的策略。
问题十:官方的fabric怎样?
目前还在lab阶段,离生产还有距离。
问题十一:读写分离,你们是程序员写的不同IP吗?还是用的啥代理?
DNS域名。当时也开发过几个版本中间件,各种原因,线上使用的也不是很广泛。其实当时微博使用的也是类似TDDL的做法,proxy封装在前端。
问题十二:说说备份,冷备,mysqldump、xtrabackup您什么情况下用什么软件,说说原因,给点建议
一般使用xtrabackup就可以了,除非你要做逻辑备份,使用mysqldump。
如何一起愉快地发展
这是一个新的时代!每个人都有自己的声音,值得被尊重,并且有机会被尊重。
高效运维系列微信群是国内高端运维圈子、运维行业垂直社交的典范。现有会员800余名,其中运维总监及以上级别会员300多名。
“高效运维”公众号值得您的关注,作为高效运维系列微信群的唯一官方公众号,每周发表多篇干货满满的原创好文:来自于系列群的讨论精华、运维讲坛线上/线下活动精彩分享及部分群友原创。“高效运维”也是互联网专栏《高效运维最佳实践》及运维2.0官方公众号。
来吧朋友,共襄盛举。
【提示】目前高效运维两个微信群均已满员,如您愿意,可添加萧田国个人微信号 xiaotianguo 为好友,并申请加入我们聊天群(技术讨论+部分水贴,已有来自1群和2群众多喜欢热闹的朋友)。
重要提示:除非事先获得授权,请在本公众号发布2天后,才能转载本文。尊重知识,请必须全文转载,并包括本行及如下二维码。
[转载] 新浪微博MySQL优化的小结和反思的更多相关文章
- mysql 优化点小结
1.数据库表设计的合理性 1)三范式 一范式:原子性,属性不可分: 二范式:无部分依赖, 例:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分),存在部分依赖 (学号) → (姓名, 年龄) ...
- [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...
- mysql优化, 删除数据后物理空间未释放(转载)
mysql优化, 删除数据后物理空间未释放(转载) OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTI ...
- 4个MySQL优化工具AWR,帮你准确定位数据库瓶颈!(转载)
对于正在运行的mysql,性能如何,参数设置的是否合理,账号设置的是否存在安全隐患,你是否了然于胸呢? 俗话说工欲善其事,必先利其器,定期对你的MYSQL数据库进行一个体检,是保证数据库安全运行的重要 ...
- 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...
- 【转载】 mysql explain用法
转载链接: mysql explain用法 官网说明: http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数: htt ...
- 单表60亿记录等大数据场景的MySQL优化和运维之道
此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...
- 数据库 mysql 优化器原理
MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行. 你的最终目标是提交SELECT语句查找数据行,而不是排除数据行.优化器试图排除数据 ...
- MySQL 优化实战记录
阅读本文大概需要 2 分钟. 背景 本次SQL优化是针对javaweb中的表格查询做的. 部分网络架构图 业务简单说明 N个机台将业务数据发送至服务器,服务器程序将数据入库至MySQL数据库.服务器中 ...
随机推荐
- JavaEE基础(十八)/集合
1.集合框架(Map集合概述和特点) A:Map接口概述 查看API可以知道: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 ...
- javascript对象(2)
Number对象 创建方法 var myNum=new Number(value); //返回一个新创建的Number对象var myNum=Number(value); //把Number()作为一 ...
- The shortest problem
The shortest problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- u Calculate e 分类: HDU 2015-06-19 22:18 14人阅读 评论(0) 收藏
u Calculate e Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- Number Sequence 分类: HDU 2015-06-19 20:54 10人阅读 评论(0) 收藏
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 新蒂下午茶体基本版SentyTEA-Basic
一.目前的最新版新蒂下午茶体包含了7600+常用汉字,每个字都是手写而成,是一套充满手写感的中文字体,轻松.惬意,如同慢饮一杯下午茶.SentyTEA-Basic.ttf 这个一个新蒂下午茶体基本版 ...
- reactjs入门到实战(三)---- 组件详解
owner >>> 传递 props this >>>是默认指向组件本身 key>>>不能没有,在复用的情况下 组件:例子 <!-- 输入 ...
- 2016 Al-Baath University Training Camp Contest-1 I
Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...
- 正确修改MySQL最大连接数的三种好用方案
以下的文章主要介绍的是正确修改MySQL最大连接数的三种好用方案,我们大家都知道MySQL数据库在安装完之后,默认的MySQL数据库,其最大连接数为100,一般流量稍微大一点的论坛或网站这个连接数是远 ...
- mysql计划任务
这两天一直遇见mysql计划任务的案例,今天我就给大家分享一个真是的实例: 1.创建计划任务的语法: create event 任务名称 on schedule at 时间周期 starts '年- ...