MySQL高可用工具Orchestrator系列二:复制拓扑的发现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mysql高可用工具orchestrator系列文章


前言

上篇文章讲了orchestrator单节点的安装。本篇文章我们继续探索orchestrator的旅程,讲一讲orchestrator是如何实现数据库实例复制拓扑的发现。


给定实例,如何发现自己

这里涉及到两个参数:HostnameResolveMethod、MySQLHostnameResolveMethod

  • HostnameResolveMethod有三个选项:"cname"、"default"、"none"
  • cname:通过CNAME做域名解析(resolve hostname)
  • default:不做特别的解析, no special resolving via net protocols
  • none:do nothing
  • MySQLHostnameResolveMethod有三个选项:"@@hostname"、"@@report_host"、""
  • @@hostname: select @@hostname
  • @@report_host: select @@report_host
  • "": do nothing


这里会有一个问题需要注意:

  • 假设生产环境存在两台数据库服务器主机名一样,比如都是localhost.localdomain;并且,orch配置参数HostnameResolveMethod使用了默认的"default"、MySQLHostnameResolveMethod使用了默认的"@@hostname"。那么,orch在查找的时候,会将用户输入的IP地址解析成hostname,但因为存在两台hostname一样的机器,所以可能会导致出错,即orch找不到正确的那台服务器。

因此,最好保证线上环境,不同服务器的主机名都不同。


给定主库,如何发现从库

由参数DiscoverByShowSlaveHosts控制

  • 如果为true,则会尝试先通过show slave hosts命令去发现从库。此时会有三种情况
  • 从库设置了正确的report_host,show slave hosts中的host字段显示正确的IP,则直接通过show slave hosts发现从库
  • 从库设置了错误的report_host,show slave hosts中的host字段显示错误的IP,则orchestrator找不到从库
  • 如果IP ping不通,则报如下信息:
[mysql] 2019/10/29 17:57:24 driver.go:81: net.Error from Dial()': dial tcp 10.10.30.222:3306: i/o timeout
[mysql] 2019/10/29 17:57:25 driver.go:81: net.Error from Dial()': dial tcp 10.10.30.222:3306: i/o timeout
[mysql] 2019/10/29 17:57:26 driver.go:81: net.Error from Dial()': dial tcp 10.10.30.222:3306: i/o timeout
2019-10-29 17:57:26 ERROR driver: bad connection
  • 如果IP ping的通,则可能报如下信息:
2019-10-29 18:15:34 ERROR dial tcp 10.10.30.228:3306: connect: connection refused
2019-10-29 18:15:40 ERROR dial tcp 10.10.30.228:3306: connect: connection refused
2019-10-29 18:15:46 ERROR dial tcp 10.10.30.228:3306: connect: connection refused
2019-10-29 18:15:52 ERROR dial tcp 10.10.30.228:3306: connect: connection refused
// 或者
2019-10-29 18:11:11 ERROR Error 1045: Access denied for user 'orchestrator'@'10.10.30.146' (using password: YES)
WARNING: NamedStopwatch.Stop("instance") IsRunning is false
2019-10-29 18:11:17 ERROR Error 1045: Access denied for user 'orchestrator'@'10.10.30.146' (using password: YES)
WARNING: NamedStopwatch.Stop("instance") IsRunning is false
  • 从库没有设置report_host,show slave hosts中的host字段显示为空,则通过processlist发现从库
  • 此时,会报如下信息:
2019-08-06 18:12:49 ERROR ReadTopologyInstance(10.10.30.129:3306) show slave hosts: ReadTopologyInstance(10.10.30.129:3306) 'show slave hosts' returned row with <host,port>: <,3306>
  • 如果为false,则通过information_schema.processlist去发现从库
select substring_index(host, ':', 1) as slave_hostname from information_schema.processlist where command IN ('Binlog Dump', 'Binlog Dump GTID');


给定从库,如何发现主库

通过show slave status命令去发现主库


DiscoverByShowSlaveHosts的意义

既然show slave status命令显示的host不一定准确,那为什么还要加入DiscoverByShowSlaveHosts这个参数呢?

这个有几种原因:

  • 首先,MaxScale不支持PROCESSLIST,因此SHOW SLAVE HOSTS是唯一的选择。
  • 更重要的是,如果只是通过information_schema.processlist去发现从库,master无法知道replica监听的是哪个端口。show processlist只会显示复制进程使用的套接字端口,而不是replica实例监听的端口。所以需要用户在配置文件中设置好report_host和report_port参数,并且在orch的配置文件中将参数DiscoverByShowSlaveHosts设置为true。


注意点

report_port

report_port其实可以不在mysql配置文件中配置,因为report_port默认会被设置成slave的端口。

The default value for this option is the port number actually used by the slave. This is also the default value displayed by SHOW SLAVE HOSTS.


DiscoverByShowSlaveHosts设置为false

这种情况下,orch通过information_schema.processlist去发现从库。如果slave的端口和master的不一样,orch会假设从库监听的是和主库相同的端口,那么这个slave就无法被orch自动发现,需要人工手动进行发现:

  • 命令行:orchestrator-client -b hjj:hjj -c discover -i 10.10.30.230:3307
  • web界面:clusters/discover

实际生产环境中有可能主从端口不是同一个,所以DiscoverByShowSlaveHosts不能为false


DiscoverByShowSlaveHosts设置为true

如果没有使用默认的3306端口,比如slave用的是3308端口,然后在mysql的配置文件中又没有配置report_host参数,orch会先尝试通过show slave hosts发现从库,但会报错,然后再通过processlist去发现从库。这个时候orch会假设从库监听的是和主库相同的端口(并不会使用show slave hosts中得到的port的信息,因为没有设置report_host,就无法将port和host对应),如果此时主库使用的是3306端口,那么这个slave就自动发现不了。

## 这里我的master是10.10.30.230:3307,slave是10.10.30.249:3306,且从库没有设置report_host
// show slave hosts报错信息如下
2019-10-29 17:37:18 ERROR ReadTopologyInstance(10.10.30.230:3307) show slave hosts: ReadTopologyInstance(10.10.30.230:3307) 'show slave hosts' returned row with <host,port>: <,3306>
// 显示10.10.30.249:3307连不上,说明通过processlist发现从库用的是和主库相同的端口
2019-10-29 17:37:24 ERROR dial tcp 10.10.30.249:3307: connect: connection refused

此时需要手动进行发现:

  • 命令行:orchestrator-client -b hjj:hjj -c discover -i 10.10.30.249:3306
  • web界面:clusters/discover


结论

综上考虑,我们需要将DiscoverByShowSlaveHosts设置为true,并且至少在mysql配置文件中设置正确的report_host。


参考文章

https://github.com/github/orchestrator/blob/master/docs/supported-topologies-and-versions.md

http://code.openark.org/blog/mysql/the-importance-of-report_host-report_port









相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
115 4
|
6天前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
26天前
|
SQL 关系型数据库 MySQL
说一下MySQL主从复制的原理?
【8月更文挑战第24天】说一下MySQL主从复制的原理?
48 0
|
28天前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 数据备份工具有哪些?
在Linux中,mysql 数据备份工具有哪些?
|
1月前
|
运维 容灾 关系型数据库
MySQL高可用方案--Xenon全解
MySQL高可用方案--Xenon全解
|
1月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
28天前
|
SQL 关系型数据库 MySQL
orchestrator搭建mysql高可用
orchestrator搭建mysql高可用
15 0
|
28天前
|
缓存 关系型数据库 MySQL
如何实现mysql高可用集群
如何实现mysql高可用集群
14 0
|
1月前
|
安全 关系型数据库 MySQL
【MySQL】Orchestrator最简单的 mysql 高可用方案最细细细细~
【MySQL】Orchestrator最简单的 mysql 高可用方案最细细细细~
|
3天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。

热门文章

最新文章