MySQL Utilities 高可用工具体验

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL Utilities 高可用工具体验 MySQL Utilities是MySQL官方的工具集,其中包括高可用相关的几个工具。 以下是对当前最新版本1.6的使用体验。

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比起来还不够严谨。

  1. 没有把从库的READ_ONLY设置集成到脚本里
  2. switchover时没有终止运行中的事务,实际也没有有效的手段阻止新的写事务在旧master上执行。
  3. failover不检查master死活,需要DBA在调用failover前自己检查,否则会引起脑裂。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
157 10
|
11月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
824 3
Mysql高可用架构方案
|
5月前
|
canal 关系型数据库 MySQL
MySQL 自动同步开源工具
本文介绍了几种开源工具用于实现 MySQL 数据库的自动同步。
|
9月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
1607 4
|
8月前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
10月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
435 11
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
12月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
293 3
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
1066 4

推荐镜像

更多