用haproxy、keepalived配置后,除了主节点能通过VIP访问tidb外,其他节点都连不上VIP

小白,自己在测试haproxy+kp测试高可用,按教程配置好后只有VIP所在的节点上能够访问数据库,其他节点都访问不上,不了解里面的门道,求大佬教
目前情况如下:
VIP:192.168.1.238
tidb_server:192.168.10.102:4000,192.168.10.103:4000
当VIP在192.168.10.102的节点时:
102节点可以通过mysql -u -p -h192.168.1.238 -P4000连接数据库
103节点无法通过上述命令连接数据库。
手动挂掉102节点后,VIP飘至103,此时:
103节点可以通过mysql -u -p -h192.168.1.238 -P4000连接数据库

102-haproxy配置如下:


102-haproxy配置如下:

102kp配置如下:


103kp配置如下:

tidb配置信息如下:

不连VIP是否可以呢?HA的日志发出来看看呢

连不上正常把
VIP:192.168.1.238
tidb_server:192.168.10.102:4000,192.168.10.103:4000

如果是24位掩码,那192.168.1.X 和192.168.10.X是不同网段,自然不通了

来,参考我的文章看看:

1 个赞

欸呀吗,原来大佬在这,我正是参考这篇文章布置的,可能是我机器部署有问题,如果不用keepalived,只用haproxy是能够通过虚拟IP访问的。所以我猜想可能是keepalived和tidb server部署在同两台机器上造成的。想请教一个问题,我在测试haproxy+tidb时,实际tidb_server(192.168.10.102/192.168.10.103),haproxy设置的虚拟ip(192.168.10.104),能够通过104访问到tidb,但是当我挂掉实际tidb的某一台时,就没法通过虚拟IP连接上了;
报错如下:
ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading authorization packet’, system error: 2

我在文章最后也看到了有这个常见报错,但没看到解决方法

VIP飘到的tidb_server上时可以连。比如VIP(192.168.1.238)飘到tidb_server(192.168.10.102)上的时候,在192.168.10.102上可以通过 mysql -u -p -h192.168.1.238 -P4000连上,其他的机子连不上,搞不懂这个 :joy:

没啥搞不懂的啊,192.168.1.238和192.168.1.238是同一个台机器,那当然192.168.1.238一定能访问到,放其他机器上当然访问不到,最简单的你ping下这几个ip还有vip看看哪个通哪个不通

1 个赞

这部应该是keepAlived的VIP访问HA的虚地址,HA虚地址随机飘么?登陆时直接mysql -h到HA的地址呗

haproxy 和 tidb server分开部署

看上去是这个情况
1.你访问请求的是4000端口,但haproxy监听的是3390端口,所以你的访问其实没经过haproxy,而是直接打到了tidb server;
2.由于你配置了代理透传proxy-networks指定102和103是代理,当你使用102、103这两个源地址直接连接tidb server的时候,tidb server需要看到请求侧携带真实的IP,但你并非是代理访问而是直接访问,所以不会携带真实IP,这是访问不到的原因。

解决方案也比较明确:
1.改成访问3390端口;
2.加一个proxy-protocol.fallbackable: true这个参数,即如果遇到代理IP请求且没有携带真实IP,则fallback到不使用代理的方式处理这个请求;
3.还有个问题,haproxy建议bind 0.0.0.0这个地址,否则可能只会监听102和103这两个地址的3390端口,而不监听VIP 238这个地址的3390端口。

实测可以,供参考。

1 个赞

之前配置的4000端口的server无法直接访问,改成3390可以了

学习了

学习了,分析情况的第二点解开了我的疑惑:ha服务如果和tidb_server 在一台服务器上,不能正常访问真是的端口,只能访问ha的端口。一直没有搞明白原因,也未深究过,今天学习了