MySQL Utilities 高可用工具体验

MySQL Utilities是MySQL官方的工具集,其中包括高可用相关的几个工具。 以下是对当前最新版本1.6的使用体验。

前提条件

MySQL Server 5.6+

基于GTID的复制

Python 2.6+

Connector/Python 2.0+

环境准备

在1台机器准备3个不同端口的MySQL实例用于测试

192.168.107.211:9001(master)

192.168.107.211:9002(slave1)

192.168.107.211:9003(slave2)

软件

OS: CentOS 7.1

MySQL: Percona Server 5.7.19

Python: 2.7.5

Connector/Python:2.1.7

mysql-utilities:1.6.5

创建MySQL实例1

生成实例1的配置文件my1.cnf

su - mysql

vi my1.cnf

[mysqld]

port=9001

datadir=/var/lib/mysql/data1

socket=/var/lib/mysql/data1/mysql.sock

basedir=/usr/

innodb_buffer_pool_size=128M

explicit_defaults_for_timestamp

skip-name-resolve

lower-case-table-names

expire-logs-days=7

plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl_semi_sync_master_wait_point=AFTER_SYNC

rpl_semi_sync_master_wait_no_slave=ON

rpl_semi_sync_master_enabled=ON

rpl_semi_sync_slave_enabled=ON

rpl_semi_sync_master_timeout=5000

server-id=9001

log_bin=binlog

gtid-mode=ON

enforce-gtid-consistency=ON

log-slave-updates=ON

master-info-repository=TABLE

relay-log-info-repository=TABLE

report-host=192.168.107.211

log-error=/var/lib/mysql/data1/mysqld.log

pid-file=/var/lib/mysql/data1/mysqld.pid

general-log=ON

general-log-file=/var/lib/mysql/data1/node1.log

[mysqld_safe]

pid-file=/var/lib/mysql/data1/mysqld.pid

socket=/var/lib/mysql/data1/mysql.sock

nice = 0

创建MySQL实例

mysqld --defaults-file=my1.cnf --initialize-insecure

mysqld --defaults-file=my1.cnf &

mysql -S data1/mysql.sock -uroot -e "set sql_log_bin=OFF;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '12345' WITH GRANT OPTION"

创建MySQL实例2

sed s/9001/9002/g my1.cnf | sed s/data1/data2/g >my2.cnf

mysqld --defaults-file=my2.cnf --initialize-insecure

mysqld --defaults-file=my2.cnf &

mysql -S data2/mysql.sock -uroot -e "set sql_log_bin=OFF;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '12345' WITH GRANT OPTION"

创建MySQL实例3

sed s/9001/9003/g my1.cnf | sed s/data1/data3/g >my3.cnf

mysqld --defaults-file=my3.cnf --initialize-insecure

mysqld --defaults-file=my3.cnf &

mysql -S data3/mysql.sock -uroot -e "set sql_log_bin=OFF;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '12345' WITH GRANT OPTION"

利用mysqlreplicate建立复制

-bash-4.2$ mysqlreplicate --master=admin:12345@192.168.107.211:9001 --slave=admin:12345@192.168.107.211:9002 --rpl-user=repl:repl -v

WARNING: Using a password on the command line interface can be insecure.

# master on 192.168.107.211: ... connected.

# slave on 192.168.107.211: ... connected.

# master id = 9001

# slave id = 9002

# master uuid = b8ca6259-ab80-11e7-91fc-000c296dd240

# slave uuid = d842240c-ab80-11e7-960f-000c296dd240

# Checking InnoDB statistics for type and version conflicts.

# Checking storage engines...

# Checking for binary logging on master...

# Setting up replication...

# Granting replication access to replication user...

# Connecting slave to master...

# CHANGE MASTER TO MASTER_HOST = '192.168.107.211', MASTER_USER = 'repl', MASTER_PASSWORD = 'repl', MASTER_PORT = 9001, MASTER_AUTO_POSITION=1

# Starting slave from master's last position...

# IO status: Waiting for master to send event

# IO thread running: Yes

# IO error: None

# SQL thread running: Yes

# SQL error: None

# ...done.

除去各种检查,mysqlreplicate真正做的事很简单。如下

先在master上创建复制账号

CREATE USER 'repl'@'192.168.107.211' IDENTIFIED WITH 'repl'

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.107.211' IDENTIFIED WITH 'repl'

mysqlreplicate会为每个Slave创建一个复制账号,除非通过以下SQL发现该账号已经存在。

SELECT * FROM mysql.user WHERE user = 'repl' and host = '192.168.107.211'

然后在slave上设置复制

CHANGE MASTER TO MASTER_HOST = '192.168.107.211', MASTER_USER = 'repl', MASTER_PASSWORD = 'repl', MASTER_PORT = 9001, MASTER_AUTO_POSITION=1

在启用GTID的情况的下,从哪儿开始复制完全由GTID决定,所以mysqlreplicate中的那些和复制起始位点相关的参数,比如-b,统统被无视,其效果相当于-b。

注意:mysqlreplicate不会理会当前的复制拓扑,所以如果把master和slave对调再执行一次,就变成主主复制了。

slave1的复制配置好后,用同样的方法配置slave2的复制

mysqlreplicate --master=admin:12345@192.168.107.211:9001 --slave=admin:12345@192.168.107.211:9003 --rpl-user=repl:repl -v

通过mysqlrplshow查看复制拓扑

-bash-4.2$ mysqlrplshow --master=admin:12345@192.168.107.211:9001 --discover-slaves-login=admin:12345 -v

WARNING: Using a password on the command line interface can be insecure.

# master on 192.168.107.211: ... connected.

# Finding slaves for master: 192.168.107.211:9001

# Replication Topology Graph

192.168.107.211:9001 (MASTER)

|

+--- 192.168.107.211:9002 [IO: Yes, SQL: Yes] - (SLAVE)

|

+--- 192.168.107.211:9003 [IO: Yes, SQL: Yes] - (SLAVE)

mysqlrplshow通过在master上执行SHOW SLAVE HOSTS发现初步的复制拓扑。 由于Slave停止复制或改变复制源时不能立刻反应到master的SHOW SLAVE HOSTS上,所以初步获取的复制拓扑可能存在冗余, 因此,mysqlrplshow还会再连到slave上执行SHOW SLAVE STATUS进行确认。

通过mysqlrpladmin检查集群健康状态

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 health

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

#

# Replication Topology Health:

+------------------+-------+---------+--------+------------+---------+

| host | port | role | state | gtid_mode | health |

+------------------+-------+---------+--------+------------+---------+

| 192.168.107.211 | 9001 | MASTER | UP | ON | OK |

| 192.168.107.211 | 9002 | SLAVE | UP | ON | OK |

| 192.168.107.211 | 9003 | SLAVE | UP | ON | OK |

+------------------+-------+---------+--------+------------+---------+

# ...done.

通过mysqlrpladmin elect挑选合适的新主

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 elect

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Electing candidate slave from known slaves.

# Best slave found is located on 192.168.107.211:9002.

# ...done.

然而,elect只是从slaves中选出第一个合格的slave,并不考虑复制是否已停止,以及哪个节点的日志更全。

下面把slave1的复制停掉

mysql -S data2/mysql.sock -uroot -e "stop slave"

再在master执行一条SQL

mysql -S data1/mysql.sock -uroot -e "create database test"

现在slave1上少了一个事务

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 gtid

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

#

# UUIDS for all servers:

+------------------+-------+---------+---------------------------------------+

| host | port | role | uuid |

+------------------+-------+---------+---------------------------------------+

| 192.168.107.211 | 9001 | MASTER | 5daf1e10-ac41-11e7-bcc4-000c296dd240 |

| 192.168.107.211 | 9002 | SLAVE | fe084f45-ac43-11e7-a343-000c296dd240 |

| 192.168.107.211 | 9003 | SLAVE | d0af3a6a-ac41-11e7-85e0-000c296dd240 |

+------------------+-------+---------+---------------------------------------+

#

# Transactions executed on the server:

+------------------+-------+---------+-------------------------------------------+

| host | port | role | gtid |

+------------------+-------+---------+-------------------------------------------+

| 192.168.107.211 | 9001 | MASTER | 5daf1e10-ac41-11e7-bcc4-000c296dd240:1-3 |

| 192.168.107.211 | 9002 | SLAVE | 5daf1e10-ac41-11e7-bcc4-000c296dd240:1-2 |

| 192.168.107.211 | 9003 | SLAVE | 5daf1e10-ac41-11e7-bcc4-000c296dd240:1-3 |

+------------------+-------+---------+-------------------------------------------+

# ...done.

但elect仍然会选slave1

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 elect

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Electing candidate slave from known slaves.

# Best slave found is located on 192.168.107.211:9002.

# ...done.

通过mysqlrpladmin switchover在线切换主备

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 --new-master=admin:12345@192.168.107.211:9002 switchover

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Performing switchover from master at 192.168.107.211:9001 to slave at 192.168.107.211:9002.

# Checking candidate slave prerequisites.

# Checking slaves configuration to master.

# Waiting for slaves to catch up to old master.

Slave 192.168.107.211:9002 did not catch up to the master.

ERROR: Slave 192.168.107.211:9002 did not catch up to the master.

switchover会连接到每一个节点并等待所有slave回放完日志才执行切换,因此有任何一个节点故障或任何一个slave复制故障都不会执行switchover。

启动刚才停掉的slave1的复制

mysql -S data2/mysql.sock -uroot -e "start slave"

再次执行switchover,成功

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 --new-master=admin:12345@192.168.107.211:9002 --demote-master switchover

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Performing switchover from master at 192.168.107.211:9001 to slave at 192.168.107.211:9002.

# Checking candidate slave prerequisites.

# Checking slaves configuration to master.

# Waiting for slaves to catch up to old master.

# Stopping slaves.

# Performing STOP on all slaves.

# Demoting old master to be a slave to the new master.

# Switching slaves to new master.

# Starting all slaves.

# Performing START on all slaves.

# Checking slaves for errors.

# Switchover complete.

#

# Replication Topology Health:

+------------------+-------+---------+--------+------------+---------+

| host | port | role | state | gtid_mode | health |

+------------------+-------+---------+--------+------------+---------+

| 192.168.107.211 | 9002 | MASTER | UP | ON | OK |

| 192.168.107.211 | 9001 | SLAVE | UP | ON | OK |

| 192.168.107.211 | 9003 | SLAVE | UP | ON | OK |

+------------------+-------+---------+--------+------------+---------+

# ...done.

执行switchover时,有一段Waiting for slaves to catch up to old master.,如果任何一个slave有故障无法同步到和master相同的状态,switchover会失败。即switchover的前提条件是所有节点(包括master和所有salve)都是OK的。

通过mysqlrpladmin failover故障切换主备

-bash-4.2$ mysqlrpladmin --slaves=admin:12345@192.168.107.211:9001,admin:12345@192.168.107.211:9003 failover

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Performing failover.

# Candidate slave 192.168.107.211:9001 will become the new master.

# Checking slaves status (before failover).

# Preparing candidate for failover.

# Creating replication user if it does not exist.

# Stopping slaves.

# Performing STOP on all slaves.

# Switching slaves to new master.

# Disconnecting new master as slave.

# Starting slaves.

# Performing START on all slaves.

# Checking slaves for errors.

# Failover complete.

#

# Replication Topology Health:

+------------------+-------+---------+--------+------------+---------+

| host | port | role | state | gtid_mode | health |

+------------------+-------+---------+--------+------------+---------+

| 192.168.107.211 | 9001 | MASTER | UP | ON | OK |

| 192.168.107.211 | 9003 | SLAVE | UP | ON | OK |

+------------------+-------+---------+--------+------------+---------+

# ...done.

failover时要求所有slave的SQL线程都是正常的,IO线程可以停止或异常。 如果未指定--candidates,一般会以slaves中第1个slave作为新主。 如果新主的binlog不是最新的,会先向拥有最新日志的slave复制,并等到binlog追平了再切换。

小结

从上面操作过程来看,借助MySQL Utilities管理MySQL集群还比较简便,但结合代码考虑到各种场景,这套工具和MHA比起来还不够严谨。

没有把从库的READ_ONLY设置集成到脚本里

switchover时没有终止运行中的事务,实际也没有有效的手段阻止新的写事务在旧master上执行。

failover不检查master死活,需要DBA在调用failover前自己检查,否则会引起脑裂。

mysql 高可用工具_MySQL Utilities 高可用工具体验相关推荐

  1. mysql slow log 分析工具_mysql slow log分析工具的比较

    mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具. 启用 slow log 在 my.cnf 中设置 [mysqld] ...

  2. mysql 高可用测试_mysql MHA高可用测试

    [环境介绍] 系统环境:Red Hat Enterprise Linux 7 + 5.7.18 + MHA version 0.57 [测试步骤:自动切换] 当前数据库状态: 系统 IP 主机名 备注 ...

  3. mysql创建表关联_MySQL创建高级联表教程

    #MYSQL#这是我第七篇MySQL教程,本篇主要介绍的是如何创建高级联表查询,主要包括使用表的别名,和自连接,外连接,和使用聚合函数连接,已经如何创建链接的条件.希望对你有所帮助. 在MySQL中除 ...

  4. mysql版本号超买_MySQL处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  5. mysql查看系统可用字符集_MySQL查看所有可用的字符集

    MySQL查看所有可用的字符集 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL ...

  6. mysql 数据库日志管理工具_mysql mysqlbinlog日志管理工具使用教程

    一.概述 由于服务器生成的二进制日志文件以二进制格式保存,所以如果要想检查这些文件的文本格式,就会用到mysqlbinlog日志管理工具. mysqlbinlog的语法如下: mysqlbinlog ...

  7. mysql mysqldump触发器备份_MySQL常用的备份工具之mysqldump

    mysqldump是MySQL中最常用的备份工具,在一些情况下,也是我们唯一可以选择的备份工具.mysqldump是在MySQL发行版中所提供的一种逻辑备份工具,支持对数据库进行全量备份和有条件的备份 ...

  8. 常用mysql连接数据库工具_MYSQL中常用的工具

    1.mysql(客户端链接工具): -u :指定用户名 -p:指定密码 -h:指定服务器ip或者域名 -P(大写):指定端口 例子:mysql -u root -h 202.194.132.237 - ...

  9. mysql dump 查看器_mysql备份之mysqldump工具

    参考文档: 利用mysqldump+二进制日志实现备份恢复数据库:http://www.178linux.com/60616 mysql进阶篇(三种备份方法总结:lvm, mysqldump, xtr ...

最新文章

  1. Linux系统.xsesion日志文件,linux系统日志
  2. c语言键盘输入若干个数据,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  3. python3精要(30)-深入列表解析
  4. Project Tango 的一些应用
  5. AngularJs编辑器
  6. 如何计算tomcat线程池大小?
  7. iview 自定义时间选择器组件_视图更新科技发布View UI组件库(即 iView 4.0),超过50项更新...
  8. FMS3 客户端call服务器端
  9. mysql sql语句面试经典50题_常见的SQL面试题:经典50题(简单)
  10. python开发仓库管理系统_tkinter的应用--mini级《仓库管理系统》
  11. 终于找到了IE6修复大全
  12. MVVM模式基于开源VLC解码器WPF万能视频播放器
  13. Java操作excel锁定
  14. java语言,MP3音频文件进行合并功能
  15. 02网络爬虫-使用 Beautiful Soup 解析网页
  16. 两张图片怎样合成一张左右拼图?
  17. Office各个windows版本支持大全
  18. 关于睡眠,你需要了解的3件事
  19. 华为双前置摄像头_华为第一款“刘海屏”手机发布,前置摄像头逆天
  20. 部门换届推文文字_这是一篇迟迟不想到来的推文

热门文章

  1. rgb sw 线主板接口在哪_十代至尊i910980XE直接上:技嘉X299X AORUS MASTER主板评测
  2. php 访问网页返回值,Ping网站并用PHP返回结果
  3. Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则
  4. 第三轮316工程知识竞赛简讯_【资讯】第五届日本文化知识竞赛决赛
  5. 微型计算机内存为8m,通常说一台微机的内存容量为8M,指的是_______。
  6. 搜狗皮肤php怎么转换,如何给搜狗输入法更换皮肤和输入方式
  7. davinci项目服务器无法,集成就能降成本!GS集成DaVinci Resolve项目服务器
  8. 镜像电流源特点_9000大型地网变频大电流接地特性测量系统介绍
  9. 《失控玩家》爆火背后:什么才是拥抱人工智能的正确姿势?
  10. 如何搭建AIoT智能对话交互系统:技术解析和实操分享