今天有同事问show variables 中的report_port 是什么意思:"明明端口是设置成3307,为什么这还写着3306"。简单写下。
1、作用
在主从环境下,我们可以用show slave status看当前从库连接的主库信息,若反过来,主库要看当前是有哪些从库连着自己呢?
2、Show slave hosts命令
这个命令在主库执行,命令功能是列出当前连接自己的从库。不过若你现在去试一下,可能会发现返回的是空。
其原因是从库连上来的时候,并没有“报告”自己的位置。尤其是从库本身的端口,与建立主从联系的过程无关。
因此要能够在主库中列出从库位置,只能依靠从库自己连接的时候汇报。
3、report-系列
Report系列是设置在从库上的,包含四个参数 report-[host|port|user|password]. 当my.cnf中设置了report-host时,在从库执行start slave的时候,会将report-host和report-port(默认3306)发给主库,主库记录在全局哈希结构变量 slave_list 中。
如果想要连report-user和report-password也显示出来,则需要主库配置参参数show-slave-auth-info。
4、存在的问题
a) 这套参数的似乎很少被使用到,以至于有一个明显的bug:当从库退出或者stop slave时,从主库上的show slave hosts结果仍然能看到它。
翻代码发现在从库线程退出的时候,就没去调退出注册函数(unregister_slave)。
b) 存在的另外一个问题是,我们知道同一个maser的多个slave之间是允许server-id相同的(虽然这不太规范),而由于这个slave_list的hash key是server-id,所以当出现两个slave的server-id相同时,后面注册的slave无法显示在master的slave hosts列表中。
c)主库直接接收从库的配置结果,并不作检验,甚至于report-port填写的ip不符合规范都能直接列出来。 这样若配置规范还好,配置不规范反倒造成误解。
这套参数的用处似乎还未被开发出来,问题也不少,无怪乎官方文档中强调:
” If you are not sure, do not use this option.”。
如果没列出从库的需求,就无视好了。
==== 补充 ====
同一个master上若有相同id的slave,可能会在从库上报“received end packet from server, apparent master shutdown: ”。