google mysql-tools overview

18

Click here to load reader

Upload: lichun-pickup

Post on 24-Jun-2015

2.543 views

Category:

Technology


0 download

DESCRIPTION

简单介绍google为MySQL做的补丁,部分补丁已经并入MySQL新版的源代码中了

TRANSCRIPT

Page 1: Google mysql-tools overview

Google-MySQL-Tools overview

说明

1

Page 2: Google mysql-tools overview

目 录目 录

目目 录录...........................................................................................................................................................2

1 修订记录.............................................................................................................................................3

2 介绍.....................................................................................................................................................4

2.1 目的和范围..................................................................................................................................................4

2.2 术语与缩写解释..........................................................................................................................................4

3 详细限制和依赖描述.........................................................................................................................5

3.1 数据表限制..................................................................................................................................................5

3.2 冲突解决限制..............................................................................................................................................5

3.3 MySQL 服务器限制.....................................................................................................................................6

4 MySQL 5.1的新特性.........................................................................................................................7

4.1 Partitioning 分区...........................................................................................................................................7

4.2 Row-based replication....................................................................................................................................7

4.3 Plugin API.....................................................................................................................................................8

4.4 Event scheduler..............................................................................................................................................8

4.5 Server log tables.............................................................................................................................................8

4.6 Upgrade program...........................................................................................................................................8

4.7 MySQL Cluster replication.............................................................................................................................8

4.8 MySQL Cluster disk data storage....................................................................................................................8

4.9 Improved backups for MySQL Cluster...........................................................................................................9

4.10 MySQL Cluster NDB 6.x...............................................................................................................................9

4.11 Backup of tablespaces....................................................................................................................................9

4.12 Improvements to INFORMATION_SCHEMA...............................................................................................9

4.13 XML functions with XPath support................................................................................................................9

4.14 Load emulator................................................................................................................................................9

5 相关文档列表...................................................................................................................................10

6 附录...................................................................................................................................................11

2

Page 3: Google mysql-tools overview

1 修订记录

修订日期 版本号 描述 修订人

2009-02-04 1.0 create Pickup.Li

3

Page 4: Google mysql-tools overview

2 介绍

2.1 目的和范围

本文档主要介绍 google-mysql-tools 工具的相关特性,原理及相关配置注意事项。

google-mysql-tools 工具是 google 公司为了管理,维护和改进 MySQL 性能的一系列工具,它是一个开源项目,遵守 Apache License 2.0 协议,编写工具包括 python 和 c++语言。这一系列工具主要包括三个主要的方面:

1) mypgrep.py。python 文件,类似于 pgrep 工具。它是用来查看和管理 MySQL 连接的。

2) compact_innodb.py。python 文件。这个工具通过 dumping and reloading 所有的 table 来压缩 innodb 的数据文件。

3) patches。为 MySQL 4.0.26 和 5.0.37 增加一些新特性的一系列 patch 文件。通过这些文件给 MySQL 的源代码打上对应的补丁以后,增强了 MySQL 的功能。目前 google-mysql-tools 对 MySQL5.0.37 有两个版本的补丁 V1 和 V2,V2 版本是 V1 版本的加强,并增加了新特性,但目前 V2 版本仍然是 beta

版本,没有发布出来。

本文档主要描述的是 google-mysql-tools 打上 V1 版本的补丁以后为 MySQL 增加的新特性。并简单涉及了V2 版本的相关内容。

2.2 术语与缩写解释

编号 术语 解释1.2.3.4.5.6.7.

8.9.

4

Page 5: Google mysql-tools overview

3 GOOGLE-MYSQL-TOOLS MYSQL5 V1 V2已发布特性

3.1 Mirrored Binlogs

该 patch 仅存在于 V1 版本,在 V2 版本中它被 GlobalTransactionIds patch 替换掉了。

3.1.1 概述

MySQL 本身的 replication 的效率,稳定性和易用性基本上能够满足一般用户的需求。但是对于那些复杂架构的 replication 结构有所欠缺。MySQL replication 是 slave 保持着 master 的 binlog 名称和偏移量来复制 event 的。如图 1 左图所示,relay MySQL 从 master 复制,并作为中继将从 master 复制的数据记录到本地 binlog 中(这里其实有一个“翻译”的过程,master 的 binlog 名称和偏移量在 relay 中都不同了),而 slave MySQL 则从 relay 的 binlog 中读取 event。

图1 MySQL replication 和 Google-MySQL-Tools mirrored binlog 比较

Mirrored binlogs 利用 relay 的 IO 线程来下载和保存一个 master 的 binlog 文件,binlog 文件名和偏移量和 master 端的完全一致。

假如,还有另外一个 MySQL instance 从 master 复制数据。当 master 崩溃时,大家想到的第一个办法就是 failover 到从 relay MySQL 那里复制数据,因为 relay MySQL 已经从 master 中复制了数据,但是 relay MySQL 的 binlog 文件名和偏移量和 master 都不相同,这个新的 slave 应该从从 relay MySQL

的那个地方开始复制,这个很难确定而且容易出错。但是 relay MySQL 如果采用了 Mirrored binlog,由于本地保存 binlog 文件和 master 端的完全一样,那么从 master 端 failover 到 slave 端时,新的 slave 可能完全感觉不到切换的过程。

3.1.2 原理和实现方法

实际上 Mirrored binlogs 的原理很简单,它仅仅增加了一个 ReplMule 的类(sql/repl_mule.h),并修改了 MySQL 的 IO thread 的源代码:在 IO thread 中初始化和实例化该类并在 IO thread 获得一个event 时将它记录到 binlog 文件中,这个 binlog 文件名和偏移量保持与 master 的一样。另外,要注意的是,第一次设置了 Mirrored binlog 的时候,slave 将从 master 端下载当前的 binlog。这个过程可能要花费一定的时间,在下载完成之前,将不会获取下一个 master 的 event。

5

Page 6: Google mysql-tools overview

3.1.3 配置

Mirrored binlog 有三个配置选项:rpl_mirror_binlog_enabled,rpl_mirror_binlog_no_replicate,sync-

mirror-binlog。rpl_mirror_binlog_enabled设置 Mirrored binlog 功能的有效性。rpl_mirror_binlog_no_replicate

启用 slave 端的 Mirrored binlog 功能,但是不允许它的 slave 继续Mirrored binlog1。sync-mirror-binlog 类似于 sync_binlog,只不过它是针对 Mirrored Binlogs 的。

在 my.cnf 中添加了 rpl_mirror_binlog_enabled 时,需要同时指定 MASTER_HOST="192.168.1.111",

MASTER_USER = 'repl', MASTER_PASSWORD = 'slavepass'等选项以便Mirrored Binlog 连接 Master 获取数据。并且不能指定 skip-slave-start,否则 Mirrored Binlogs 将无效。

如果配置正确,重新启动MySQL 后你可以在 slave 的 data 目录看到和 master 的 binlog 同名的文件,这就是 Mirrored Binlogs 下载并生成的。另外,在 slave 端用 show master status你看到的将是 master

的 binlog 文件名

3.2 Semi-synchronous replication

3.2.1 概述

MySQL replication 本身是异步的,master 并不知道 slave何时或者是否已经获得了 binlog 的event。它的效率也是比较高的,slave请求某个 binlog 文件的某一偏移量开始的 replication event,而master 在 event准备好时将它们发送给 slave,这样对 master 没有很多的性能消耗。

Semi-synchronous replication扩展了 replication 为半双工的,slave 可以配置为 async或 semi-sync 两种不同的方式。如果在 master 端启用了 Semi-synchronous replication,当语句提交返回前都需要阻塞,直到至少收到了一个 semi-sync slave 的确认或者达到了用户配置的超时时间。如果超过了超时时间,Semi-synchronous replication 将不再有效,当 slave重新同步成功,Semi-synchronous replication又将重新启用。

3.2.2 原理和实现方法

Semi-synchronous replication 的主要流程如图 2 所示,它修改了 MySQL replication 的协议,以及语句提交的代码。在 transanction提交以后将等待 slave,这里将有可能超过超时时间;之后,才返回客户端通知操作结果。在等待网络回应的过程中其他的 transaction 并不会阻赛。在 slave 连接 master 并开始请求数据的时候,如果设置了 Semi-synchronous replication,那么 slave 的请求数据的 binlog_flag 中将设置 BINLOG_SEMI_SYNC 以注册 slave 为 semi-sync模式。这样的话,master向该 slave 发送的 event

将包括一个额外单字节的头,该字节指明 slave 是否需要向master回应一个消息。

Master 端将为所有正在等待回应的 transaction建立一个检索树,检索树以(binlog_filename,

binlog_pos)为键,方便 replication 线程找到当前等待的 transaction。图 3,图 4 分别为 master 端transaction commit 的流程图和 replication thread 发送 binlog 时的流程图。

1在测试环境中无法设置该参数,报错:[ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'rpl_mirror_binlog_no_replicate=1'

6

Page 7: Google mysql-tools overview

图2 Semi-synchronous replication 示意图

图3 master transaction commit流程图

7

Page 8: Google mysql-tools overview

图4 replication 线程发送 binlog流程图

3.2.3 配置

Semi-synchronous replication 有三个配置选项:rpl_semi_sync_enabled,rpl_semi_sync_slave_enabled,rpl_semi_sync_timeout。rpl_semi_sync_enabled 用来在 master 端启用 Semi-synchronous replication,而 rpl_semi_sync_slave_enabled 用于在 slave 端启用。而commit超时的时间由 rpl_semi_sync_timeout设置。另外,用户还可以通过 show status 查看 Semi-

synchronous replication 的状态变量,例如:semi-sync slave 的个数-Rpl_semi_sync_clients,semi-sync 是否被启用-Rpl_semi_sync_status等等。

Semi-synchronous replication 可以在不重启数据库的情况下停用或者启用。

简单的测试表明,Semi-synchronous replication 由于在第一次 slave 不能跟上的情况下将会自动停用,所以对 master 的性能影响不大。

3.3 SqlChanges

Google-MySQL-Tools 对 MySQL 的 SQL 分析进行了一定的改变。为 MySQL 增加了新的 tokens,新的函数,新的语句(statements),也为已有的语句增加了新的选项(options)。

3.3.1 New tokens

Google-MySQL-Tools 为 MySQL 增加了一些新的 token,主要包括:CLIENT_STATISTICS,

TABLE_STATISTICS, USER_STATISTICS, INDEX_STATISTICS, IF_IDLE, MAKE, MAPPED,

8

Page 9: Google mysql-tools overview

MAX_QUERIES_PER_MINUTE, NEW_PASSWORD, ROLE, SLOW, TCMALLOC,

IEEE754_TO_STRING, LAST_VALUE, ORDERED_CHECKSUM, UNORDERED_CHECKSUM。

3.3.2 New SQL functions

Google-MySQL-Tools 为 MySQL 增加了一些新的函数。包括:ORDERED_CHECKSUM,

UNORDERED_CHECKSUM, LAST_VALUE, HASH, IEEE754_TO_STRING, NEW_PASSWORD。这些函数的具体信息可以通过这里查找到详细信息。参见 3.16 NewSqlFunctions

3.3.3 New options for existing statements

KILL <id> IF_IDLE 可以仅在一个连接空闲的时候切断它。MAX_QUERIES_PER_MINUTE 可以用来替代 MAX_QUERIES_PER_HOUR,从而对查询的限制从每小时转为每分钟。CREATE MAPPED

USER 'foo' ROLE 'bar'和 DROP MAPPED USER 'foo'为 Mapped user提供支持。详情请查看 MySQLRoles

介绍或者这里。相对应的 SHOW PROCESSLIST WITH ROLES 和 SHOW USER_STATISTICS WITH

ROLES 通过 role 而不是用户名来再结果中展示进程和用户数据。

3.3.4 New statements

Google-MySQL-Tools 为 MySQL 增加了用户表监控函数:SHOW USER_STATISTICS, SHOW

TABLE_STATISTICS, SHOW INDEX_STATISTICS, SHOW CLIENT_STATISTICS, FLUSH

TABLE_STATISTICS, FLUSH INDEX_STATISTICS, FLUSH CLIENT_STATISTICS。参见 3.8节UserTableMonitoring。

Google-MySQL-Tools 为 MySQL 增加了针对帐号和客户端 IP 速度限制的函数 。例如:MAKE

USER 'foo' DELAYED 1000, MAKE CLIENT '10.0.0.1' DELAYED 2000, SHOW DELAYED USER, SHOW

DELAYED CLIENT。参见 3.11节MysqlRateLimiting。

另外,还包括:SHOW TCMALLOC STATUS 用于展示 tcmalloc 的状态,它只有在在 MySQL 连接(link) tcmalloc 并且编译时指定了-DUSE_TCMALLOC 时才有效。实际上它只是展示了MallocExtension::GetStats 的输出结果。CAST函数可以转换数据为双精度型。SHOW INNODB LOCKS

函数提供了 InnoDB锁的占用者 holders 和等待者waiters 的更多详细信息。FLUSH SLOW QUERY

LOGS刷新 slow query log 文件。MAKE MASTER REVOKE SESSION使得除当前会话以外的连接都断开,并且除了有 SUPER, REPL_CLIENT或者 REPL_SLAVE权限的用户可以连接,其他的用户都不能连接数据库。与之相反的,MAKE MASTER GRANT SESSION 取消这种限制。

3.4 InnodbSmp

Google-MySQL-Tools 修改了 MySQL 的源代码使得它在 SMP 服务器上运行更加快速,在 8核以上的服务器上更加明显。代码修改包括:对 InnoDB 的互斥量 mutex 采用原子内存操作(atomic memory

operations)。使用 tcmalloc 并且禁用了 InnoDB 的内存堆(memory heap)。对 InnoDB 的读写互斥量 rw-

mutex 采用原子内存操作(atomic memory operations)。

9

Page 10: Google mysql-tools overview

3.5 NewShowStatus

Google-MySQL-Tools 为用户监控和查看 MySQL 的状态提供了更多的信息。Show status 中现在宝航了一些 show innodb status 的信息。对那些频繁查看 MySQL状态的工具(overzealous monitoring tools)

也进行了速率限制,限制他们不断的进行耗费资源的 show操作。更多详细信息见这里。

3.6 NewShowInnodbStatus

Google-MySQL-Tools 修改了 SHOW INNODB STATUS 的输出,输出了更多信息。通过输出的重新排序使得事务以列表的形式打印并且可能返回的最大输出大小。更多详细信息见这里。

3.7 NewConfiguration

由于 Google-MySQL-Tools 增加了这么多功能,所以配置文件也有相应的选项增加。更多详细信息见这里。

3.8 UserTableMonitoring

Google-MySQL-Tools 为每个帐号,数据表,索引记录了数据库动作(database activity) 。同样,为这些数据提供了 SQL 语句来打印这些信息。并且,Google-MySQL-Tools正在计划把他们整合到information_schema 中。

相关的 SQL statement 有:SHOW USER_STATISTICS, SHOW TABLE_STATISTICS, SHOW

INDEX_STATISTICS, SHOW CLIENT_STATISTICS, FLUSH TABLE_STATISTICS, FLUSH

INDEX_STATISTICS, FLUSH CLIENT_STATISTICS。更多详细信息见这里。

3.9 TransactionalReplication

MySQL 本身的 replication会记录当前的复制信息到 master.info 和 relay-log.info 文件中。SQL thread

首先在存储引擎端提交事务,然后更新上述两个文件来指明下一个 SQL thread执行的 event 的偏移量。但是,如果正好在提交事务以后和更新文件之前 MySQL 被停掉了,那么复制状态就不对了,SQL

thread 将在 MySQL再次启动的时候重新执行上次的最后一个事务。

Google-MySQL-Tools 通过在 InnoDB 的事务日志中保存复制状态来避免上述错误。在 MySQL重新启动的时候,保证前面提到的复制信息文件和该状态保持一致。可以通过指定:rpl_transaction_enabled=1 来使的该策略生效。一般来说,它应该加到 my.cnf 的[mysqld]段。更多详细信息见这里。

3.10 MysqlRoles

MySQL 对成千上万的账号和表的访问控制效果不理想。导致这个问题的原因在于,很多帐户都有一样的权限,而唯一为一个账号限制它的访问权限的办法就是为它在表一级或者列一级分配权限,从而使得 mysql.user 表存在很多条记录。实际上,权限(privileges)可以和角色(role)对应起来,而一个角色可以和多个账号对应起来。从而,当多个帐号有同样的权限时,可以避免为每一个账号去单独指定一个权限。

10

Page 11: Google mysql-tools overview

Google-MySQL-Tools 在 MySQL访问控制模式中增加了 mapped user 来实现这样的功能。一个mapper user提供了权限认证并且对应于访问控制中的一个角色。Mysql.mapped_user 表就是为了定义mapper user 的表。Mysql.user 表则被当作角色的表。也就是说:mapped user 对应于 mysql.mapped_user

表中的一行记录,role 对应 mysql.user 的一行记录,而同时又对应着多个 mysql.mapped_user 中的记录(对应列为:mysql.mapped_user.Role)。

通过对访问控制模式的修改,Google-MySQL-Tools 有如下特性:一个帐户可以有多个密码;手动的密码过期机制;角色的概念;这个修改对客户端透明,客户端连接完全不需要修改。更多详细信息见这里。

3.11 MysqlRateLimiting

Google-MySQL-Tools 为 MySQL 的每个用户或者客户端 IP 增加了速度控制。MAKE USER 'foo'

DELAYED 1000使得 foo 用户提交的 SQL 语句在执行前先 sleep 1000毫秒。当延迟设置为 0 时表示没有延迟。对应的用户延时值可以通过 SHOW DELAYED USER 打印出来。这些延时值是易失的,在MySQL重启之后都被设置为 0。对于已有的连接,延时设置是无效的,只有该用户在重新连接的时候才会获得新的延时值。另外要注意的是,MySQL 本身通过 mysql.user. max_questions 列为一个账号指定了每个小时可以执行的语句个数,Google-MySQL-Tools把它改为每分钟可以执行的语句个数。

MAKE CLIENT '10.0.0.1' DELAYED 2000 对 IP 地址为 10.0.0.1提交的语句 sleep 2000毫秒,这些延时值通过 SHOW DELAYED CLIENT 获得。更多详细信息见这里。

3.12 MoreLogging

Google-MySQL-Tools 为 MySQL 增加了更多的日志记录选项:audit_log 记录了用户登录信息,对指定表的查询语句(用 log_tables选项来指定,各表名用分号分隔)和启动的相关信息。Log-update 记录有 SUPER权限的用户提交的 DDL 和 DML 语句。更多详细信息见这里。

3.13 InnodbAsyncIo

InnoDB 在 Windows环境下支持异步 IO,在 Linux环境下将启动 4 个线程来完成后台的 IO任务,这些线程都采用同步 IO。

在不使用直接 IO(direct IO)而采用缓存 IO(buffered IO)或者远程 IO(remote disk)的架构里,写线程(write threads)个数并不需要太多,因为写到操作系统的缓存中非常快速。但是如果内存非常大,使用直接 IO 的效率会更高。

Google-MySQL-Tools 修改了 InnoDB 相关代码,使得用户可以配置读写请求的后台 IO 线程个数。配置参数如下:innodb_max_merged_io:后台 IO 线程合并提交的 IO请求的最大个数 。innodb_read_io_threads:读取预取请求(prefetch requests)的后台 IO 线程的个数 。innodb_write_io_threads:从缓存中向脏页(dirty pages)写的后台 IO 线程个数。更多详细信息见这里。

3.14 FastMasterPromotion

Google-MySQL-Tools提供了一些命令来允许快速的将 slave升级为 master,它是在 slave 不重新启动的情况下升级的,有脏页(dirty pages)的存储引擎,例如 InnoDB 需要耗费很长时间(大于一分钟)来停止。以下命令在 V1 和 V2 补丁中都存在:MAKE MASTER REVOKE SESSION, MAKE

11

Page 12: Google mysql-tools overview

MASTER REVOKE SESSION WITH KILL, MAKE MASTER GRANT SESSION。而以下命令仅存在于V1 补丁:MAKE MASTER MASTER_LOG_FILE=<log_file>, MASTER_SERVER_ID=<id> BINLOG,

MAKE MASTER MASTER_LOG_FILE=<log_file>, MASTER_SERVER_ID=<id>,

INDEX=<log_file.index> BINLOG。

MAKE MASTER MASTER_LOG_FILE使得 slave 在不重启mysqld 的情况下使用对应的 binlog 文件。MAKE MASTER REVOKE SESSION阻止那些没有 SUPER权限的用户连接,当指定了 WITH

KILL选项时当前的没有 SUPER权限的连接将被断开。MAKE MASTER GRANT SESSION 则取消上述限制,允许那些没有 SUPER权限的用户连接。更多详细信息见这里。

3.15 InnodbSampling

InnoDB使用取样(sampling)来确定进一步的优化统计(optimizer statistics)。它采用 8 个叶子节点(leaf

node)的索引键。而 Google-MySQL-Tools 增加了一个会话参数(session parameter)来设置取样的叶子快(leaf block)个数,缺省为 8。对应的参数为:innodb_btr_estimate_n_pages。更多详细信息见这里。

3.16 NewSqlFunctions

Google-MySQL-Tools 为 MySQL添加了一些新的函数。

IEEE754_TO_STRING:转换浮点型(float)或者双精度型(double)数据为字符串型(string)。转换成的字符串为 17位的数字精度(17 digits of precision),这样从字符串转换回双精度型就不会损失精度。这样,除非在特殊情况下,转换回的双精度型数据和原来的相等。

UNORDERED_CHECKSUM:这是一个 SQL聚合函数(SQL aggregate function),接受一个或者多个参数,返回每个 group 的输入参数的 hash值(returns the hash of its input arguments per group)。该函数与order独立。Group 中的每一个 row 的结果是用异或(XOR)连接起来的。用户可以像这样调用该函数:select unordered_checksum(c1, c2) from foo group by c3;

ORDERED_CHECKSUM:和上面的函数一样,不过它跟 order 有关,group 中的第一个 row 将作为下一个 row 的 hash 的种子。

HASH:这是一个 SQL函数(SQL function),返回输入参数的 hash值,它不是一个聚合函数,对每个 row 将返回一个值。

LAST_VALUE:这是一个 SQL聚合函数(SQL aggregate function),它返回每个 group 读取的最后一个值。也就是说它依赖于聚合的输入顺序(input order to aggregation)。可以参考OnlineDataDrift。

NEW_PASSWORD:计算新密码(new-style password)的 hash值,而不管 my.cnf 中的 old_passwords

参数值。

更多详细信息见这里。

3.17 InnoDBStatus

Google-MySQL-Tools 为 MySQL 的 show innodb status 增加额外的输出信息。包括:当前的事务信息段(current transaction section)太长了而被截断的时候而打印完整的信息(print last);返回的数据量从64kb 增加到了 128kb;在 show innodb status 中提供了更加丰富的信息。额外的统计信息包括:每次读或者写请求的平均时间;调用 fsync 的源;调用同步函数同步 InnoDB 事务日志的源;后台 IO 线程完成的工作量等。更多详细信息见这里。

12

Page 13: Google mysql-tools overview

3.18 LosslessFloatDump

Google-MySQL-Tools使得 MySQL备份和恢复(dump and restore)列数据为浮点型(float)或者双精度型(double)时没有精度上的损失。用户可以在 mysqldump命令里加上选项—lossless-fp 来启用这个特性。这样,备份时,浮点和双精度型的数据将被转换为 17位精度的数字字符串(decimal string with 17 digits

of precision)。更多详细信息见这里。

3.19 MysqlHttp

Google-MySQL-Tools 为 MySQL 增加了 HTTP 的内容。更多详细信息见这里。

3.20 InnodbIoTuning

Google-MySQL-Tools 修改了 InnoDB 相关代码来调整输入输出。InnoDB 利用后台线程来进行 IO

操作,包括:purge thread物理删除那些被逻辑删除的行;insert buffer thread更新二级索引(secondary

indexes);log thread 进行事务日至 IO 的操作;write thread 将缓存脏页(dirty buffer cache pages)写入磁盘;read thread预取磁盘块(prefetches blocks)。一般来说,一个线程无法完成读和写的任务,所以 Google-

MySQL-Tools 增加了一些配置参数来设置线程个数:innodb_read_io_threads,innodb_write_io_threads。参见 3.13 InnodbAsyncIO。

Google-MySQL-Tools 为了避免后台 IO 线程耗尽服务器资源增加了速度限制的功能。这里假设服务器最大可以做 100 个 IOPs,用户可以设置 innodb_io_capacity 来指定最大磁盘 IOPs 数。另外innodb_extra_dirty_writes 可以在 dirty pct 比最大值小的时候刷新缓存脏页(dirty buffer page)。

3.21 MutexContentionStats

这个补丁是在 x86-64 的 linux 2.6 上用 gcc 构建的,不知道在其他平台下好不好用。

该补丁为 MySQL提供了互斥量争用统计信息(mutex contention statistic),它和 show mutex status提供的 InnoDB 的互斥量输出信息类似。

它同样在请求锁的阻塞过程前(before blocking on lock request)使用忙等循环(busy-wait loops)。这么做的主要原因是为了确定是否有互斥量争用的情况(mutex contention)。如果在忙等循环中不能获得锁,代码就会假设调用者(caller)在请求锁的时候应该要阻塞。忙等循环的持续时间由 my.cnf 中的参数mysql_spin_wait_loops 确定,默认值为 500-在 X86-64 的 CPU 上对应为 4毫秒的延迟。在 mysqld启动时将获得该延迟并且输出在数据库的 error log 日志文件中。同样在 show status 的变量Mysql_spin_wait_microseconds 中也可以查看。

对于指定的锁请求来说,忙等时间是从 1 到 Max(Max 为变量 mysql_spin_wait_loops 的值)中的一个随机数。Google-MySQL-Tools 修改了这个计算随机值的函数,使用从 InnoDB 中的代码,而不是用 libc 中的 random()函数。因为 random()函数本身就有互斥量争用的问题。

忙等循环(busy-wait loop)将循环四次(four rounds)。在每次循环中,它都会尝试提交一个非阻塞的锁请求(makes a non-blocking lock attempt)。如果没有得到锁,那么 spin 1毫秒(spins for 1 microsecond)。如果四次都失败了,它将提交一个阻塞型的锁请求,并且增加 sleeps counter。Spin 的主要目的是为了检查互斥量争用(mutex contention),它并不是用来提升性能的。它应该用在性能测试环境(performance

13

Page 14: Google mysql-tools overview

debugging builds)而不是生产环境(production builds)。在构建时可以通过指定标志:--with-fast-mutexes 来启用它。

SHOW GLOBAL MUTEX STATUS命令可以显示大部分信息。更多详细信息见这里。

3.22 FastMutexes

Google-MySQL-Tools 将 MySQL5.1 中的快速互斥量(fast mutexes)backport 到以前的版本,并实现了 MutexContentionStat。编译时指定—with-fast-mutexes 就可以启用它。更多详细信息见这里。

3.23 InnodbFreeze

Google-MySQL-Tools 可以冻结 InnoDB 的文件系统的活动。通过 set global

innodb_disallow_writes=ON,set global innodb_disallow_writes=OFF 可以实现这样的目的。它们允许或者阻止用户进行除读取以外的 InnoDB 文件系统的操作。如果你想在不停止MySQL 的情况下备份数据库并且你也没有使用 LVM,ZFS或者其他可以提供快照(snapshots)的存储软件(storage software),那么你可以使用上述命令来阻止 InnoDB 对文件的修改操作(halt all destructive file system activity from

InnoDB),然后就可以备份 InnoDB 的数据文件。注意:FLUSH TABLES WITH READ LOCK 并不能达到这个目的,因为 InnoDB 的后台 IO 线程仍然可能做一些 IO操作。更多详细信息见这里。

14

Page 15: Google mysql-tools overview

4 FEATURES IN THE V2 BETA PATCH

Google-MySQL-Tools 的 V2 patch 目前并没有发布出来。我们这里简要介绍一下它的几个简单特性。

4.1 GlobalTransactionIds  

Google-MySQL-Tools让 slave 能够直接从一个 master 切换到另外一个 master。它提出了一个Global Group ID 的概念。每个 MySQL instance 都有一个统一的 Global Group ID,并且在复制的过程中Global Group ID 不会变化。这个 ID 将加到 binlog 的事件头中,一个 group 中的所有事件 event 的 ID 都相同,并且 group ID 都是唯一并且比之前的 group ID 要大。这个 group ID 同样也要写到 slave 的 relay

log 中。这样,slave 的 SQL thread 分析执行 event 的时候也要解析 group ID 并且把它保持不变的写到自己的 binlog 中。这样,当 fail over 到新的 master 的时候,它就可以从以前的 master 的 group ID 号继续。更多详细信息见这里。

4.2 OnlineDataDrift  

这个工具主要做以下事情:1、评估数据库里面的 row 的数目来决定它运行的速度。2、对每一个表执行一系列语句来计算一些行(a chunk of rows)的校验和(checksum)并把结果记录到一个表中。当它运行完时,就可以比较 master 和 slave 的存放结果的表。如果两者有不同,那就说明有数据偏差(data drift)。更多详细信息见这里。

4.3 MysqlThreadPool

Google-MySQL-Tools 为 MySQL 增加了线程池的代码。

15

Page 16: Google mysql-tools overview

5 相关文档列表

Google-MySQL- Tools 官方网站

16

Page 17: Google mysql-tools overview

6 附录

17