带有网状结构和DNSRR的Docker群集网络延迟

问题描述 投票:0回答:1

我有一个三节点泊坞窗群。

部署的一个堆栈是具有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应用程序看起来像...

docker-compose docker-swarm docker-networking
1个回答
0
投票

[如果有人在解决此类问题,我想发布一个解决方案(尽管我不一定称其为实际问题的“答案”),但比我真正高兴的解决方案更多与。

© www.soinside.com 2019 - 2024. All rights reserved.