我有一个三节点泊坞窗群。
部署的一个堆栈是具有3个副本的数据库集群。 (MariaDB Galera)
部署的另一个堆栈是具有2个副本的Web应用程序。
Web应用程序如下所示:
version: '3'
networks:
web:
external: true
galera_network:
external: true
services:
application:
image: webapp:latest
networks:
- galera_network
- web
environment:
DB_HOST: galera_node
deploy:
replicas: 2
FWIW,web
网络是traefik所连接的。
这里的问题是galera_node
(用于Web应用程序的数据库主机)解析为VIP,该VIP最终利用了swarm的网状路由(据我所知),并且当网状路由最终遍历了WAN,而不是解析到部署在同一物理主机上的galera_node
容器。
我发现的另一个选项是使用tasks.galera_node
,但似乎对3个galera群集容器使用DNSRR。因此,在33%的时间里,一切都好而又快...但是在其余时间中,我的混合中增加了不必要的延迟。
这两种行为看起来都像我们从不同的endpoint_mode
选项中所期望的那样被记录在案。参考:Docker endpoint_mode
为了说明延迟,请注意从within Webapp容器ping时:请注意每次ping解析的IP地址以及响应时间。
### hitting VIP that "masks" the fact that there is extra latency
### behind it depending on where the mesh routing sends the traffic.
root@294114cb14e6:/var/www/html# ping galera_node
PING galera_node (10.0.4.16): 56 data bytes
64 bytes from 10.0.4.16: icmp_seq=0 ttl=64 time=0.520 ms
64 bytes from 10.0.4.16: icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from 10.0.4.16: icmp_seq=2 ttl=64 time=0.153 ms
--- galera_node ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.153/0.291/0.520/0.163 ms
### hitting DNSRR that resolves to worst latency server
root@294114cb14e6:/var/www/html# ping tasks.galera_node
PING tasks.galera_node (10.0.4.241): 56 data bytes
64 bytes from 10.0.4.241: icmp_seq=0 ttl=64 time=60.736 ms
64 bytes from 10.0.4.241: icmp_seq=1 ttl=64 time=60.573 ms
--- tasks.galera_node ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 60.573/60.654/60.736/0.082 ms
### hitting DNSRR that resolves to local galera_node container
root@294114cb14e6:/var/www/html# ping tasks.galera_node
PING tasks.galera_node (10.0.4.242): 56 data bytes
64 bytes from 10.0.4.242: icmp_seq=0 ttl=64 time=0.133 ms
64 bytes from 10.0.4.242: icmp_seq=1 ttl=64 time=0.117 ms
--- tasks.galera_node ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.117/0.125/0.133/0.000 ms
### hitting DNSRR that resolves to other "still too much" latency server
root@294114cb14e6:/var/www/html# ping tasks.galera_node
PING tasks.galera_node (10.0.4.152): 56 data bytes
64 bytes from 10.0.4.152: icmp_seq=0 ttl=64 time=28.218 ms
64 bytes from 10.0.4.152: icmp_seq=1 ttl=64 time=40.912 ms
64 bytes from 10.0.4.152: icmp_seq=2 ttl=64 time=26.293 ms
--- tasks.galera_node ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 26.293/31.808/40.912/6.486 ms
我获得绕过延迟的良好性能的唯一方法是对本地容器的IP地址进行硬编码,但这显然不是一个长期解决方案,因为容器应被视为短暂的事物。] >
我完全明白,由于这种延迟,我可能需要重新考虑地理位置节点,并且可能还有其他一些性能调整我可以做。不过,似乎应该有一种方法可以强制执行我想要的行为。
我本质上是想在本地容器可用于服务给定请求时绕过DNSRR和VIP /网状路由行为。
所以问题是:
我如何让我的Web应用程序的每个副本都只命中本地群主机的galera容器,而不用硬编码该容器的IP地址?
我有一个3节点的docker群。部署的一个堆栈是具有3个副本的数据库集群。 (MariaDB Galera)部署的另一个堆栈是具有2个副本的Web应用程序。 Web应用程序看起来像...
[如果有人在解决此类问题,我想发布一个解决方案(尽管我不一定称其为实际问题的“答案”),但比我真正高兴的解决方案更多与。