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></host,port> - 如果为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\G命令去发现主库。 -- DiscoveryByShowSlaveHosts意义 既然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是192.168.56.11:3307,slave是192.168.56.12:3306,且从库没有设置report_host // show slave hosts报错信息如下 2019-10-29 17:37:18 ERROR ReadTopologyInstance(192.168.56.11:3307) show slave hosts: ReadTopologyInstance(192.168.56.11:3307) "show slave hosts" returned row with <host,port>: <,3306> // 显示192.168.56.12:3307连不上,说明通过processlist发现从库用的是和主库相同的端口 2019-10-29 17:37:24 ERROR dial tcp 192.168.56.12:3307: connect: connection refused</host,port> 此时需要手动进行发现: 命令行:orchestrator-client -b hjj:hjj -c discover -i 192.168.56.12:3306 web界面:clusters/discover -- 结论 综上考虑,我们需要将DiscoverByShowSlaveHosts设置为true,并且至少在mysql配置文件中设置正确的report_host。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!