阅读更多

2顶
0踩

数据库

转载新闻 MySQL 5.7 新特性大全和未来展望

2015-12-31 14:53 by 副主编 mengyidan1988 评论(0) 有18556人浏览
本文转自微信公众号:高可用架构
作者:杨尚刚
引用
美图公司数据库高级 DBA,负责美图后端数据存储平台建设和架构设计。前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计。之前在「高可用架构」发表的《单表 60 亿记录等大数据场景的 MySQL 优化和运维之道》广受好评。

2015 年最重磅的当属 MySQL 5.7 GA 的发布,号称 160 万只读 QPS,大有赶超 NoSQL 趋势。



上面这个图是 Oracle 在只读场景下官方测试的结果,看上去 QPS 确实提升很大。不过官方的硬件测试环境是很高的,所以这个 160 万 QPS 对于大家测试来说,可能还比较遥远,所以实际测试的结果可能会失望。但是,至少我们看到了基于同样测试环境,MySQL 5.7 在性能上的改进,对于多核利用的改善。

提高运维效率的特性
MySQL 5.7 动态修改 Buffer Pool
从 MySQL 5.7.5 开始可以在线动态调整,对运维更友好。很多人都经历过 Buffer Pool 过大或过小调整需要重启实例,运维成本非常高,尤其是主库或其他核心业务。

MySQL redo log 大小
5.5 <= 4G, 5.6 +<= 512G
当然这个也不是越大越好,但是提供了可以 尝试的机会,越大的 redo log 理论会有更稳定的性能。当然带来的风险就是故障恢复时间会更长。

下图就是不同 redo 大小的性能对比,主要是看性能抖动情况



innodb_file_per_table
默认值 Off <= 5.6.5 <=On,独立表空间优点很明显。尤其可以使用 InnoDB Transportable tablespaces,可以像 MyISAM 一样快速迁移表。

query cache
1 <= 5.6.8 <= 0,默认关闭。整体来说关闭 query cache 是利远大于弊,官方最终也选择了关闭。

SQL_Mode 变为Strict mode
SQL要求更严格,version < 5.6.6 sql_mode 为空,最为宽松,不够严谨。
5.6.6 < version < 5.7.4
  • NO_ENGINE_SUBSTITUTION

version > 5.7.9
  • ONLY_FULL_GROUP_BY
  • STRICT_TRANS_TABLES
  • NO_ZERO_IN_DATE
  • NO_ZERO_DATE
  • ERROR_FOR_DIVISION_BY_ZERO
  • NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

以 NO_ZERO_DATE 为例,如果你原表里有 0000-00-00 这种数据,在 MySQL 5.7 使用默认 SQL_Mode 时候改表时候就会报错了。

binlog_rows_query_log_events
默认关闭 ,可选打开,建议打开,还是比较有用的。可以看到row格式下的sql语句,方便排查问题和恢复数据。
以 NO_ZERO_DATE 为例,如果你原表里有 0000-00-00 这种数据,在 MySQL 5.7 使用默认 SQL_Mode 时候改表时候就会报错了。

binlog_rows_query_log_events
默认关闭 ,可选打开,建议打开,还是比较有用的。可以看到row格式下的sql语句,方便排查问题和恢复数据。



上图就是开启之后 binlog 解析出来的内容,可以看到正常 SQL。

max_execution_time
5.7.4 刚引入名字是 max_statement_time,后来改成 max_execution_time
单位是毫秒,SQL 语句的超时中断,自我保护的一种方案。
只针对 select,也可以在 sql 里指定。如果 percona 版本 的话,这个参数更暴力,对所有请求生效慎用。

replication info in tables
crash-safe slave 方案,最早 Google 做的方案是存储在事务日志里。单独存储更灵活,可以解决很多从库宕机后 duplicate key 问题。



innodb_numa_interleave
建议关掉 numa。最早 Twitter 开源分支里有提供,也可以启动实例时候设置 numactl –interleave all,不过实际线上使用系统默认 numa 策略,并没有遇到过因为 numa 导致的 swap 问题。

动态修改 replication filter
方便做拆分或做级连复制时候使用,可以通过 change 动态修改。如果用过 replication filter 应该清楚 这个还是比较有用的。



优化器 Server 层改进

优化器主要还是基于 cost model 层面和给用户更多自主优化



可配置 cost based optimizer,mysql.server_cost 和 mysql.engine_cost。



New JSON 数据类型和函数支持。当然 JSON 也可以存在 Text 或 VARCHAR 里用内置 json,更容易访问,方便修改。



支持生成列(虚拟列),以及虚拟列上索引。

CREATE TABLE order_lines (orderno integer,
lineno integer,
price decimal(10,2),
qty integer,
sum_price decimal(10,2) GENERATED ALWAYS AS (qty * price) STORED );

简化查询,有 virtual 和 stored 两种情况,感觉这个功能还是比较小众。

下图是二者对比



5.7 还对 explain 做了增强,对于当前正在运行查询 explain。
EXPLAIN [FORMAT=(JSON|TRADITIONAL)] FOR CONNECTION <id>;

InnoDB 层优化

InnoDB 层核心还是拆分各种锁,提高并发。只读事务优化就是其中一个例子
不再使用只读事务 list,重构 MVCC 代码,不为只读事务分配事务 id,降低内存开销。

如何使用只读事务:
start transaction read only
开启 autocommit 下的不加锁的 select 语句

原生支持分区 Native Partitioning,之前版本分区表是放在 server 层管理的,现在是在引擎层面支持,更节省内存,分区越多,效果越明显。

atomic write, disable double write,MySQL 5.7 开始支持 atomic write,成本高,性价比不算高,需要底层存储硬件支持,感觉比较鸡肋。

支持 spatial index 空间索引
基于 R tree 实现
目前只支持 2D 数据类型
支持 GeoHash 和 GeoJson ,提高数据查找效率

Transparent page compression
需要文件系统支持 PUNCH HOLE,ext4 和 xfs 都可以支持,测试效果比目前压缩效果好一些。适配更多压缩算法,支持 lz4 zlib,功能上还不够稳定和成熟。



performance_schema 改进,增加了很多统计信息表,metadata_locks,status_by_host ,status_by_user,status_by_thread,获取当前执行的慢查询 top10,可以获取到更多状态信息。



上图是对单个 thread_id 吞吐量统计信息

新增加的 sys 数据库,相当于对 performance_schema 的数据整合。IO 信息和索引信息,相当于 Oracle 里的 V$ Catalog,基于 ps_helper 实现。基于 performace schema 画的 SQL 执行时间分布图。



replication改进



上图是 MySQLreplication 的发展历史

最大的亮点 GTID 增强,支持在线调整 GTID。当然也不是简单的 SET @@GLOBAL.GTID_MODE = ON,步骤也是很复杂,不过至少不用停机,也是进步
从库可以不开启 log_slave_updates,通过引入 gtid_executed 表实现,对性能优一定帮助,大大简化切换流程。增强半同步复制,确保从库先收到,设置半同步从库个数。使用 mysqlbinlog 作为伪 slave 是个不错方案。



上图就是 loss-less 半同步和之前的区别

并行复制优化 ,Database 5.6 默认并行复制。logical-clock 5.7 引入,一个组提交内事务都可以并行,可以达到接近主库并发效果。



不同复制方案的可用性级别



5.7 引入的 group replication 也是为了提高可用性。多主复制,多点写入,内部检测冲突,保证一致性,自动探测。支持 GTID,共享 UUID,只支持 InnoDB,不支持并发 DDL。



安全方面密码自动过期,这个要注意,建议关闭。default_password_lifetime 控制过期默认一年。锁定用户,支持 SSL 访问,server 端利用 OpenSSL 加密。

工具支持 mysqlpump,并行版 mysqldump,也是替换原生 mysqldump 和 mydumper 的。--watch-progress 查看 dump 进度,--compress-ouptut 压缩。mysqldump 可以做为一个伪 slave 接受 binlog,做 binlog 备份的匪巢的方案,也支持 SSL。

从整体来说,MySQL 5.7 做的改进还是非常有吸引力的,不论是从运维角度还是性能优化上,当然真正在生产环境上遇到问题时在所难免的,要做好踩坑的准备。

未来发展

RDS服务
应该大家很多人都用过 RDS 服务,确实降低了使用成本。下图是各种架构区别,普通物理服务器,EC2,RDS,优势很明显。



阿里云 RDS MySQL,支持读写分离,多 zone,支持异地容灾,压缩(支持 TokuDB),阿里云宣称的一大亮点,代码控制能力强。

老牌 RDS 服务 Amazon RDS,目前有 MySQL Aurora 和 MariaDB 这三种。Aurora 虽然目前来说,会有一些问题,但是方向还是不错的。

HA 架构,从可用性来说 Galera > Aurora > MHA



关于 RDS 服务的一些建议,数据库经验积累还是很重要的,面临过或解决的问题越多,提供的服务也相对越稳定。RDS 提供便利的同时,也存在数据安全的风险和 RDS 服务本身的 SLA 保证,是用户更关心的。

如何降低云服务商故障对业务影响,其实从 RDS 提供的性能指标考量,如果使用同等性能配置的物理服务器,RDS 成本还是偏高一些的。从功能上来说大部分 RDS 还算完备,具体哪些坑实际用的不多不好评判。

存储层的优化
LSM Tree : LevelDB, RocksDB,适配高性能存储 SSD,更高的压缩比,,更低的写入放大比例,缺点读性能差,适合写多读少场景。
MyRocks: MySQL + RocksDB



统层优化
系统优化主要还是 IO 方面的,blk-mq、scsi-mq、IO 中断多队列、3D Xpoint 接近内存的访问速度和非易失存储,说不定以后整个数据库实例都可以放在这种介质上面,也是一场新的变革。

运维经验总结

数据恢复
备份 xtrabackup 物理为主,mydumper/mysqlpump 为辅,binlog 备份也是很重要的。恢复导出 SQL 文件正常恢复。
myloader
xtrabackup
InnoDB transportable space
online ddl

5.6 和 5.7 虽然一直在改善,但是在主从同步问题上依然有问题,下图是目前主流的 online DDL 方案。



总体使用 pt-osc 更通用一些,pt-osc 注意的一些坑,添加唯一键,导致数据丢失延时备份。行格式下,只在从库使用 OSC,丢数据。

MySQL 慢日志系统
基于 pt-query-digest logstash 和 Anemometer 实现,可以定期跟踪线上业务慢查询优化。



系统状态收集
基于某些特定条件触发,比如 MySQL 连接数增长到一定阈值,收集当前系统状态,方便后续问题排查。比如系统 top mpstat strace tcpdump 等,MySQL 的 processlist show engine innodb status 等。



Q & A

1、请问 query cache 关闭的原因,MySQL 是否支持全同步?
query cache 访问需要获取一个全局锁,高并发时候争用很严重。更主要的是 query cache 缓存的效果并不好。原生 MySQL 的话,5.7 里的 group replication 是支持全同步的,还有目前的基于 galera 实现的 percona xtradb cluster 也是支持全同步的。

2、有没有 MySQL 的读写分离中间件?最好没有语言限制的,谢谢!
目前开源的中间件很多了,比如 mycat、atlas、vitess等,你指的语言限制是指的对开发语言的兼容吧,我觉得每种都兼容的很好的 不多,毕竟现在的中间件都是基于开发者本公司的现状开发的,在兼容性上不太能做到很完美。现在官方做了个MySQL Fabric,现在应该也 GA 了,后面可以关注一下。

3、你们备份的策略(比如完整多久一次,增量多久一次,备份恢复测试多久一次), 备份对线上系统的影响如何控制都是选一个slave备份的么?
我们目前的策略是以周备+日备,结合 binlog 备份,理论可以恢复到一周内任意时间点。全部是全量备份,没有做增量。备份恢复测试,我们目前还没有做,基于xtrabackup备份数据可靠性还是很高的 ,之前在新浪是有实现备份测试的,大概2-3天能对线上备份端口做一轮测试。目前备份是选择一个线上从库来做的,控制影响的话主要是通过对备份工具 xtrabackup 的并行度和 IO 来进行限制。

4、请问关于 DB 管理的问题,线上数据库是否可开放给业务方技术人员查询?开放到什么程度?有没有必要做 WEB 查询平台?
开发人员还是有必要开放的,如果完全禁止,很多业务数据查询的事情可能就需要 DBA 介入,其实效率是比较低的。当然在权限上可以限制,比如只开放读权限,禁止 dump 这种。对核心库限制要更严格一些。如果能做 Web 平台 当然更好,可以在入口层做限制,后端控制数据访问频度和策略等。

5、当插入一条数据,非唯一索引是通过 change buffer 更新提高并发,那么唯一索引或者主键如何更新呢?保证高并发?
唯一索引或主键需要看更新或插入的数据在不在 Buffer Pool,没有的话就需要去磁盘读取数据做检测,需要维持约束。

6、" 聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的 ",有个疑问,某条数据的更新,是新生成一条,老本的打上版本号,然后定期删除。这样有个问题,新数据应该在新的物理地址。聚簇索引是不是失效了?
聚簇索引在实际磁盘存储也不是严格顺序的,并且老的版本是存储在 undo里,也就是 ibdata 共享表空间里 ,和实际数据不冲突。

7、MySQL 5.7 有没有对复合索引做优化,在违背 left most prefixing 时也能使用复合索引?
最左前缀的原则比较难突破,当然在 5.6 引入了 index condition pushdown 机制,可以在存储引擎层面做一些过滤,减少过滤行数,会有一定优化。
  • 大小: 63.5 KB
  • 大小: 70.6 KB
  • 大小: 107.8 KB
  • 大小: 73.3 KB
  • 大小: 86.9 KB
  • 大小: 116.2 KB
  • 大小: 127.6 KB
  • 大小: 79.1 KB
  • 大小: 122.2 KB
  • 大小: 26 KB
  • 大小: 95.7 KB
  • 大小: 164.3 KB
  • 大小: 161.8 KB
  • 大小: 154.5 KB
  • 大小: 106.7 KB
  • 大小: 78.1 KB
  • 大小: 98.4 KB
  • 大小: 127.1 KB
  • 大小: 145.3 KB
  • 大小: 55 KB
  • 大小: 231.7 KB
  • 大小: 75.6 KB
  • 大小: 108.7 KB
来自: 高可用架构
2
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • argoUML(中文版)

    argouml一款很好的开源uml工具 中文版的

  • 绘图工具-PlantUML

    PlantUML绘制工具使用: 1、UML图形绘制 2、非UML图形绘制 3、PlantUML C4模型

  • 开源UML建模工具:UMLet

        UMLet是开源的UML建模工具,有单独软件和Eclipse插件两种安装形式。先下载软件包(http://www.umlet.com/changes.htm)。下载后解压,独立软件的时候执行双击umlet.jar就可以运行了。然后在Palettes中选择要画的类型。从右边框拖拽图标到左边框就可以画图了。    官方说明如下:     UMLe

  • 优秀UML制图开源工具--ArgoUML

    一直就很羡慕开发Java的朋友们,有那么多称手的工具,为了能更好的进行软件项目管理,居然可以在用UML做好建模之后,就可以利用工具直接生成 Java代码,真正做到了设计与编码两不误,也不再需要在设计和编码两者之间权衡各自的时间了。尤其是在Eclipse下,各式各样的工具插件琳琅满目,让人目不暇给。可在PHP中就少得可怜了,好一点的多为商业软件,而且颇有很多自认为高手的大力推荐类似写字板的程序,以显...

  • UML建模工具ArgoUML概述

    ArgoUML是一款运行在Java平台的开源UML建模工具,支持UMLL 1.4规范。但是目前不支持基于代码的逆向工程。 1.官网http://argouml.tigris.org/ 2.许可证EPL 1.0 3.ArgoUML的使用 JRE 1.5及以上版本下载Windows的发布文件ArgoUML-0.34-setup.exe安装ArgoUML-0.34-setup.exe启动Ar

  • 12个优秀的开源UML工具

     本文将为您介绍12个优秀的UML工具:1. StarUML StarUML(简称SU),是一种创建UML类图,是一种生成类图和其他类型的统一建模语言(UML)图表的工具。StarUML是一个开源项目之一发展快、灵活、可扩展性强(zj)。2. Netbeans UML Plugin  目前支持:Activity图, Class图, S

  • ArgoUML 的简单用法

    今天下载了一个ArgoUML 软件,感觉还挺好用的,但是这个软件网上使用教程还是很少,官网上也是没写完的教程,所以简单介绍一下最基本的使用方法吧。1. 建立一个类下载安装ArgoUML软件,我的操作系统式mac (黑),安装后发现大部分是中文的,除了右下角的属性窗口是英文的。2.为类添加属性和方法添加完类的属性和方法后左边的工程树就会显示刚刚添加的属性和方法之后我们就可以点击...

  • uml类图制作软件ArgoUML

    是个中文版的,但是上面是繁体的。不过繁体基本都能认出来。但是它只是菜单是中文的。不过这也就够我们完整实现其功能了。反正总而言之呢,这个肯定是个不错的制uml的软件,在学校老师教我们交作业,上面uml就这个画的。相信我!没错的!不会坑人

  • 开源UML项目Udoc简介UDoc-1-005.rar

    由于对开源的热爱,经常需要看开源的东东,但是像Struts那样的开源框架来说,从代码入手的话,却像一头扎进了大海, 出不来。 经常想能获取到官方的文档资料, 比如说类关系图等,这样的话,可以对整个系统的架构很清楚,从架构再往代码方面转移。 这样的话,对于整个开源产品的理解无疑更加深入。 最近一段时间,由于工作需要,接触到powerDesigner和Rose比较多。这两个产品可以正向产生出资料,如PD的PDM图,然后根据物理模型(PDM),生成相关SQL 脚本。 Rose的UML图,而后的java文件。这些资料的生成都很方便。 更重要的是,这两个工具都支持逆向工程。既支持脚本或者源代码来反向生成PDM图或UML图。 而今天的主角却不是这些“重量级”的东西。 使用过以上产品的朋友都知道,这两个产品有个致命的缺点。就是跑起来非常的耗内存,而且破解麻烦,。 而今天我介绍的东西,源代码和第三方库,整个加起来, 大小不超过500K。 而且能够根据class或者jar文件,动态产生出UML图。 那么,今天的主角隆重登场, 它就是-----------UDoc. 为了证明我没有说谎,我把截图发上来, 看看这个软件的大小:

  • ArgoUML 0.34 使用手册

    官方最新版的使用手册。该软件可用JAVA C# PHP等语言。

  • eclipse下生成Java类图和时序图,生成UML图

    最近老板让我做类图和时序图,提苦恼的,完全不会,就从网上整理了些 1.安装和使用AmaterasUML 安装AmaterasUML前,需要先安装GEF 采用eclipse在线安装方式安装就好。 eclipse在线安装GEF的地址:http://download.eclipse.org/tools/gef/updates/releases/ 安装好GEF后,安装AmaterasUML

  • Dia Diagram Editor(流程图、UML)免费开源绘图软件

    近期工作各种繁忙,导致很少分享自己喜欢和常用的一些工具,今天有点时间再次给各位喜欢开源的小伙伴介绍一个好用、免费、开源的软件Dia Diagram Editor。 首先给大家看看这个软件的主界面吧! ​ ​ 下载地址1:https://sourceforge.net/projects/dia-installer/ ​ 下载地址1:http://dia-...

  • 开源UML工具StarUML和BoUML简介

        之前在Gentoo在下想安装Umbrello、直接emerge umbrello,结果由于依赖的软件包KDE-Base编译失败,导致安装不上(我估计还是安装Eclipse导致libjpeg的so文件变得不正确,而且在Django中使用PIL的时候也出现错误、哎,看来得整体更新下试试了。。),后来在无意中发现了StarUML、BoUML,都是开源的,还可以跨平台的,功能非常强大,并且都支持x

  • 免费 UML 工具

    选取了四款UML工具: astah 经常看到网上的黄色背景就是这个软件画的,最后一个免费的社区版本是:astah community7.2 安装包大小50M 以下三个均为免费版本: Software Ideas Modeler 可以画序列图,安装包很小,只有十几兆,而且提供便携版下载 Modelio 这是一个大型的软件,安装包300+MB Modelio是由位于法国巴黎的Modeliosoft开发的开源UML工具。它支持UML2和BPMN标准。 BOUML 看起来...

  • 13种优秀的UML tools 反向工程

    BOUML: linux windows platform   反向工程 BOUML 是一个开源的UML2 建模工具,可生成包括 C++、Java、Idl、PHP、Python 等代码,支持操作系统包括: Unix、Linux、Solaris、 MacOS X 和 Windows。 eclipse-uml2-tools: 反向工程 UML2 Tools 是一组基于GMF 的编

  • Eclipse安装ObjectAid UML工具

    第一步:打开eclipse,选择菜单栏help——&gt;Install New Software(如下图) 第二步:在弹出的窗口点击Add按钮 第三步:在弹出的Add Repository 窗口中分别添加Name: ObjectAid UML Diagram 和URL: http://www.objectaid.com/update/current,然后点击OK按钮 第四步:勾选...

Global site tag (gtag.js) - Google Analytics