SlideShare una empresa de Scribd logo
1 de 21
Google-MySQL-T overview
              ools


说明




                     1
目 录

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


1 修订记录 ................................................................................................................................4


2 介绍 .......................................................................................................................................5


      2.1 目的和范围.....................................................................................................................................5


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


3 Google-MySQL-Tools MySQL5 V1 V2 已发布特性 ...............................................................6


      3.1 Mirrored Binlogs..............................................................................................................................6


      3.2 Semi-synchronous replication..........................................................................................................7


      3.3 SqlChanges..................................................................................................................................11


      3.4 InnodbSmp...................................................................................................................................12


      3.5 NewShowStatus ..........................................................................................................................12


      3.6 NewShowInnodbStatus.................................................................................................................12


      3.7 NewConfiguration ........................................................................................................................12


      3.8 UserTableMonitoring.....................................................................................................................12


      3.9 TransactionalReplication................................................................................................................13


      3.10 MysqlRoles.................................................................................................................................13


      3.11 MysqlRateLimiting.......................................................................................................................14


      3.12 MoreLogging ............................................................................................................................14


      3.13 InnodbAsyncIo............................................................................................................................14


      3.14 FastMasterPromotion..................................................................................................................14




                                                                           2
3.15 InnodbSampling ........................................................................................................................15


      3.16 NewSqlFunctions........................................................................................................................15


      3.17 InnoDBStatus..............................................................................................................................16


      3.18 LosslessFloatDump.....................................................................................................................16


      3.19 MysqlHttp....................................................................................................................................16


      3.20 InnodbIoTuning...........................................................................................................................16


      3.21 MutexContentionStats.................................................................................................................17


      3.22 FastMutexes .............................................................................................................................17


      3.23 InnodbFreeze..............................................................................................................................17


4 Features in the V2 beta patch.............................................................................................19


      4.1 GlobalTransactionIds ...................................................................................................................19


      4.2 OnlineDataDrift ............................................................................................................................19


      4.3 MysqlThreadPool..........................................................................................................................19


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


6 附录 .....................................................................................................................................21




                                                                           3
修订日期         版本号   描述           修订人
2009-02-04   1.0   create       Pickup.Li




1     修订记录




                            4
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.




                                              5
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。


                                      Log event to It binlog                           Log event to It binlog



               Master                                                  Master
               MySQL                                                   MySQL    IO thread reading master binlog and
                                                                                         :
                                 IO thread reading master binlog
                                          :
                                                                                        copy master binlog
                                SQL thread: execute master binlog
                                                                                SQL thread: execute master binlog
                                 and log to his binlog If log-slave-
                                                                                 and log to his binlog If log-slave-
                                            updates set.
                                                                                            updates set.
               Relay                                                   Relay
               MySQL             IO thread: reading relay binlog       MySQL      IO thread: reading relay binlog

                                SQL thread: execute master binlog               SQL thread: execute master binlog
                                 and log to his binlog If log-slave-             and log to his binlog If log-slave-
                                            updates set.                                    updates set.
                Slave                                                   Slave
               MySQL                                                   MySQL




            图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),并


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




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 又将重新
          启用。




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

                                                     7
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 时的流程图。




                                  图2 Semi-synchronous replication 示意图




                                               8
图3 master transaction commit 流程图




               9
图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 的性能影响不大。




                                                   10
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,
        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 连


                                               11
接(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)。




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 正在计划把他们整合到


                                         12
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)对应起来,而一个角
      色可以和多个账号对应起来。从而,当多个帐号有同样的权限时,可以避免为每一个账号去单独指定
      一个权限。


          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 有如下特性:一个帐户可以有多个密码;手
      动的密码过期机制;角色的概念;这个修改对客户端透明,客户端连接完全不需要修改。更多详细信
      息见这里。




                                          13
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 MASTER
     REVOKE SESSION WITH KILL, MAKE MASTER GRANT SESSION。而以下命令仅存在于 V1 补丁:


                                         14
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 参数值。




                                                     15
更多详细信息见这里。




3.17 InnoDBStatus

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




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)。




                                          16
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
     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 并不能达


                                            17
到这个目的,因为 InnoDB 的后台 IO 线程仍然可能做一些 IO 操作。更多详细信息见这里。




                        18
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 增加了线程池的代码。




                                       19
5    相关文档列表

    Google-MySQL-Tools 官方网站




                              20
6   附录




         21

Más contenido relacionado

La actualidad más candente

My sql管理基础 李春_v2
My sql管理基础 李春_v2My sql管理基础 李春_v2
My sql管理基础 李春_v2Pickup Li
 
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)frogd
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移wang hongjiang
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220Jinrong Ye
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)wang hongjiang
 
MySQL Replication新功能介绍
MySQL Replication新功能介绍 MySQL Replication新功能介绍
MySQL Replication新功能介绍 orczhou
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期frogd
 
Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析frogd
 
Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&LockLixun Peng
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5lovingprince58
 
PostgreSQL 9 Standby
PostgreSQL 9 StandbyPostgreSQL 9 Standby
PostgreSQL 9 StandbyMarch Liu
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结Lixun Peng
 
主备备的两个备机转为双Master出现诡异的slave lag问题
主备备的两个备机转为双Master出现诡异的slave lag问题主备备的两个备机转为双Master出现诡异的slave lag问题
主备备的两个备机转为双Master出现诡异的slave lag问题haojiewang
 
Infiniflash benchmark
Infiniflash benchmarkInfiniflash benchmark
Infiniflash benchmarkLouis liu
 

La actualidad más candente (18)

My sql管理基础 李春_v2
My sql管理基础 李春_v2My sql管理基础 李春_v2
My sql管理基础 李春_v2
 
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
Ali-tomcat
Ali-tomcatAli-tomcat
Ali-tomcat
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
 
MySQL Replication新功能介绍
MySQL Replication新功能介绍 MySQL Replication新功能介绍
MySQL Replication新功能介绍
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析
 
Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&Lock
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5
 
PostgreSQL 9 Standby
PostgreSQL 9 StandbyPostgreSQL 9 Standby
PostgreSQL 9 Standby
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结
 
主备备的两个备机转为双Master出现诡异的slave lag问题
主备备的两个备机转为双Master出现诡异的slave lag问题主备备的两个备机转为双Master出现诡异的slave lag问题
主备备的两个备机转为双Master出现诡异的slave lag问题
 
Intro to svn
Intro to svnIntro to svn
Intro to svn
 
Infiniflash benchmark
Infiniflash benchmarkInfiniflash benchmark
Infiniflash benchmark
 

Similar a Google mysql-tools overview

2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
1.基础篇 修改by徐定翔2 去掉批注
1.基础篇 修改by徐定翔2 去掉批注1.基础篇 修改by徐定翔2 去掉批注
1.基础篇 修改by徐定翔2 去掉批注gavin shaw
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展Sky Jian
 
Liferay环境搭建
Liferay环境搭建Liferay环境搭建
Liferay环境搭建donotbeevil
 
Mysql体系结构及原理(innodb)公开版
Mysql体系结构及原理(innodb)公开版Mysql体系结构及原理(innodb)公开版
Mysql体系结构及原理(innodb)公开版longxibendi
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)yiditushe
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎frogd
 
MySQL快速入门与提高
MySQL快速入门与提高MySQL快速入门与提高
MySQL快速入门与提高mysqlpub
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture introted-xu
 
Mysql mmm安装指南(翻译)
Mysql mmm安装指南(翻译)Mysql mmm安装指南(翻译)
Mysql mmm安装指南(翻译)Yiwei Ma
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点Bin Shao
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocketpwesh
 
Showinnodbstatus公开
Showinnodbstatus公开Showinnodbstatus公开
Showinnodbstatus公开longxibendi
 
Mysql proxy+mysql-mmm
Mysql proxy+mysql-mmmMysql proxy+mysql-mmm
Mysql proxy+mysql-mmmYiwei Ma
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制maclean liu
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优thinkinlamp
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發koji lin
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86dbabc
 
Web性能测试指标参考v0.2
Web性能测试指标参考v0.2Web性能测试指标参考v0.2
Web性能测试指标参考v0.2beiyu95
 

Similar a Google mysql-tools overview (20)

2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
1.基础篇 修改by徐定翔2 去掉批注
1.基础篇 修改by徐定翔2 去掉批注1.基础篇 修改by徐定翔2 去掉批注
1.基础篇 修改by徐定翔2 去掉批注
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展
 
Liferay环境搭建
Liferay环境搭建Liferay环境搭建
Liferay环境搭建
 
Mysql体系结构及原理(innodb)公开版
Mysql体系结构及原理(innodb)公开版Mysql体系结构及原理(innodb)公开版
Mysql体系结构及原理(innodb)公开版
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎
 
MySQL快速入门与提高
MySQL快速入门与提高MySQL快速入门与提高
MySQL快速入门与提高
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
Mysql mmm安装指南(翻译)
Mysql mmm安装指南(翻译)Mysql mmm安装指南(翻译)
Mysql mmm安装指南(翻译)
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
Showinnodbstatus公开
Showinnodbstatus公开Showinnodbstatus公开
Showinnodbstatus公开
 
Mysql proxy+mysql-mmm
Mysql proxy+mysql-mmmMysql proxy+mysql-mmm
Mysql proxy+mysql-mmm
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86
 
Web性能测试指标参考v0.2
Web性能测试指标参考v0.2Web性能测试指标参考v0.2
Web性能测试指标参考v0.2
 

Google mysql-tools overview

  • 1. Google-MySQL-T overview ools 说明 1
  • 2. 目 录 目 录 .......................................................................................................................................2 1 修订记录 ................................................................................................................................4 2 介绍 .......................................................................................................................................5 2.1 目的和范围.....................................................................................................................................5 2.2 术语与缩写解释..............................................................................................................................5 3 Google-MySQL-Tools MySQL5 V1 V2 已发布特性 ...............................................................6 3.1 Mirrored Binlogs..............................................................................................................................6 3.2 Semi-synchronous replication..........................................................................................................7 3.3 SqlChanges..................................................................................................................................11 3.4 InnodbSmp...................................................................................................................................12 3.5 NewShowStatus ..........................................................................................................................12 3.6 NewShowInnodbStatus.................................................................................................................12 3.7 NewConfiguration ........................................................................................................................12 3.8 UserTableMonitoring.....................................................................................................................12 3.9 TransactionalReplication................................................................................................................13 3.10 MysqlRoles.................................................................................................................................13 3.11 MysqlRateLimiting.......................................................................................................................14 3.12 MoreLogging ............................................................................................................................14 3.13 InnodbAsyncIo............................................................................................................................14 3.14 FastMasterPromotion..................................................................................................................14 2
  • 3. 3.15 InnodbSampling ........................................................................................................................15 3.16 NewSqlFunctions........................................................................................................................15 3.17 InnoDBStatus..............................................................................................................................16 3.18 LosslessFloatDump.....................................................................................................................16 3.19 MysqlHttp....................................................................................................................................16 3.20 InnodbIoTuning...........................................................................................................................16 3.21 MutexContentionStats.................................................................................................................17 3.22 FastMutexes .............................................................................................................................17 3.23 InnodbFreeze..............................................................................................................................17 4 Features in the V2 beta patch.............................................................................................19 4.1 GlobalTransactionIds ...................................................................................................................19 4.2 OnlineDataDrift ............................................................................................................................19 4.3 MysqlThreadPool..........................................................................................................................19 5 相关文档列表 ......................................................................................................................20 6 附录 .....................................................................................................................................21 3
  • 4. 修订日期 版本号 描述 修订人 2009-02-04 1.0 create Pickup.Li 1 修订记录 4
  • 5. 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. 5
  • 6. 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。 Log event to It binlog Log event to It binlog Master Master MySQL MySQL IO thread reading master binlog and : IO thread reading master binlog : copy master binlog SQL thread: execute master binlog SQL thread: execute master binlog and log to his binlog If log-slave- and log to his binlog If log-slave- updates set. updates set. Relay Relay MySQL IO thread: reading relay binlog MySQL IO thread: reading relay binlog SQL thread: execute master binlog SQL thread: execute master binlog and log to his binlog If log-slave- and log to his binlog If log-slave- updates set. updates set. Slave Slave MySQL MySQL 图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),并 6
  • 7. 修改了 MySQL 的 IO thread 的源代码:在 IO thread 中初始化和实例化该类并在 IO thread 获得一个 event 时将它记录到 binlog 文件中,这个 binlog 文件名和偏移量保持与 master 的一样。另外,要注意的 是,第一次设置了 Mirrored binlog 的时候,slave 将从 master 端下载当前的 binlog。这个过程可能要花 费一定的时间,在下载完成之前,将不会获取下一个 master 的 event。 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 又将重新 启用。 1 在测试环境中无法设置该参数,报错:[ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'rpl_mirror_binlog_no_replicate=1' 7
  • 8. 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 时的流程图。 图2 Semi-synchronous replication 示意图 8
  • 9. 图3 master transaction commit 流程图 9
  • 10. 图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 的性能影响不大。 10
  • 11. 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, 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 连 11
  • 12. 接(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)。 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 正在计划把他们整合到 12
  • 13. 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)对应起来,而一个角 色可以和多个账号对应起来。从而,当多个帐号有同样的权限时,可以避免为每一个账号去单独指定 一个权限。 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 有如下特性:一个帐户可以有多个密码;手 动的密码过期机制;角色的概念;这个修改对客户端透明,客户端连接完全不需要修改。更多详细信 息见这里。 13
  • 14. 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 MASTER REVOKE SESSION WITH KILL, MAKE MASTER GRANT SESSION。而以下命令仅存在于 V1 补丁: 14
  • 15. 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 参数值。 15
  • 16. 更多详细信息见这里。 3.17 InnoDBStatus Google-MySQL-Tools 为 MySQL 的 show innodb status 增加额外的输出信息。包括:当前的事务信 息段(current transaction section)太长了而被截断的时候而打印完整的信息(print last);返回的数据量从 64kb 增加到了 128kb;在 show innodb status 中提供了更加丰富的信息。额外的统计信息包括:每次读 或者写请求的平均时间;调用 fsync 的源;调用同步函数同步 InnoDB 事务日志的源;后台 IO 线程完 成的工作量等。更多详细信息见这里。 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)。 16
  • 17. 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 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 并不能达 17
  • 18. 到这个目的,因为 InnoDB 的后台 IO 线程仍然可能做一些 IO 操作。更多详细信息见这里。 18
  • 19. 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 增加了线程池的代码。 19
  • 20. 5 相关文档列表 Google-MySQL-Tools 官方网站 20
  • 21. 6 附录 21