मेरे पास 3 नोड डॉकर झुंड है।

तैनात एक स्टैक 3 प्रतिकृतियों वाला एक डेटाबेस क्लस्टर है। (मारियाडीबी गैलेरा)

तैनात एक और स्टैक 2 प्रतिकृतियों वाला एक वेब अनुप्रयोग है।

वेब एप्लिकेशन इस तरह दिखता है:

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 नेटवर्क वह है जिससे ट्रैफ़िक जुड़ा हुआ है।

यहां समस्या galera_node (वेबएप के डेटाबेस होस्ट के लिए प्रयुक्त) एक वीआईपी को हल करती है जो झुंड के जाल रूटिंग (जहां तक ​​​​मैं बता सकता हूं) का लाभ उठाती है और यह अतिरिक्त विलंबता जोड़ती है जब जाल रूटिंग समाप्त हो जाती है उसी भौतिक होस्ट पर तैनात galera_node कंटेनर को हल करने के बजाय WAN।

एक अन्य विकल्प जो मैंने पाया है वह tasks.galera_node का उपयोग करना है, लेकिन ऐसा लगता है कि 3 गैलेरा क्लस्टर कंटेनरों के लिए DNSRR का उपयोग करना है। तो ३३% समय, चीजें अच्छी और तेज होती हैं... लेकिन बाकी समय, मेरे पास मिश्रण में अनावश्यक विलंबता जुड़ जाती है।

इन दो व्यवहारों को दस्तावेज के रूप में देखा जाता है जो हम विभिन्न endpoint_mode विकल्पों से अपेक्षा करते हैं। संदर्भ: Docker endpoint_mode

विलंबता को स्पष्ट करने के लिए, वेबएप कंटेनर के अंदर से पिंग करते समय ध्यान दें: प्रतिक्रिया समय के साथ प्रत्येक पिंग के लिए समाधान कर रहे 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

विलंबता को दरकिनार करने वाले अच्छे प्रदर्शन को प्राप्त करने का एकमात्र तरीका स्थानीय कंटेनर के आईपी पते को हार्ड कोड करना है, लेकिन यह स्पष्ट रूप से दीर्घकालिक समाधान नहीं है क्योंकि कंटेनरों को अल्पकालिक चीजों के रूप में माना जाना चाहिए।

मुझे पूरी तरह से पता है कि इस विलंबता के कारण मुझे अपने भौगोलिक नोड स्थानों पर पुनर्विचार करने की आवश्यकता हो सकती है, और कुछ अन्य प्रदर्शन ट्यूनिंग चीजें हो सकती हैं जो मैं कर सकता हूं। ऐसा लगता है कि मेरे वांछित व्यवहार को लागू करने का एक तरीका होना चाहिए, यद्यपि।

जब स्थानीय कंटेनर दिए गए अनुरोध की सेवा के लिए उपलब्ध होता है तो मैं अनिवार्य रूप से DNSRR और VIP/मेष रूटिंग व्यवहार को बायपास करना चाहता हूं।

तो सवाल यह है:

मैं अपने वेबपैप की प्रत्येक प्रतिकृति को कंटेनर के आईपी पते को हार्ड कोडिंग किए बिना स्थानीय झुंड होस्ट के गैलेरा कंटेनर को कैसे हिट कर सकता हूं?

0
Shaun McPeck 17 मई 2020, 05:57

1 उत्तर

सबसे बढ़िया उत्तर

अगर कोई और इस तरह के मुद्दे से लड़ रहा है, तो मैं एक समाधान पोस्ट करना चाहता था (हालांकि मैं इसे वास्तविक प्रश्न के लिए "उत्तर" नहीं कहूंगा) जो कि मैं वास्तव में खुश हूं ।

मेरे वेबएप के अंदर, मैं अपने डेटाबेस होस्ट के रूप में galera_node का उपयोग कर सकता हूं और यह जाल रूटिंग वीआईपी का समाधान करता है जिसका मैंने ऊपर उल्लेख किया है। यह मुझे कार्यक्षमता देता है, चाहे कुछ भी हो, इसलिए यदि मेरा वर्कअराउंड ट्रिप हो जाता है तो मुझे पता है कि मेरी कनेक्टिविटी अभी भी बरकरार है।

मैंने एक छोटी सी बैश स्क्रिप्ट तैयार की जिसे मैं क्रॉन जॉब कह सकता हूं और मुझे जो परिणाम चाहिए वह मुझे दे सकता है। इसका उपयोग अन्य उपयोग मामलों के लिए किया जा सकता है जो इसी मुद्दे से उत्पन्न होते हैं।

यह तीन मापदंडों में लेता है:

  • $1 = डेटाबेस कंटेनर का नाम
  • $2 = डेटाबेस नेटवर्क का नाम
  • $3 = वेबएप कंटेनर का नाम

स्क्रिप्ट कंटेनर के नाम की तलाश करती है, निर्दिष्ट नेटवर्क के लिए उसका आईपी पता ढूंढती है, और फिर उस कंटेनर नाम और आईपी पते को वेबएप कंटेनर की /etc/hosts फ़ाइल में जोड़ देती है।

यह काम करता है क्योंकि कंटेनर का नाम भी galera_node (मेरे मामले में) है, इसलिए इसे होस्ट फ़ाइल में जोड़ने से उस होस्टनाम को ओवरराइड कर दिया जाता है जो डॉकर वीआईपी को हल करता है।

जैसा कि उल्लेख किया गया है, मुझे यह पसंद नहीं है, लेकिन यह मेरे उद्देश्यों के लिए काम करता प्रतीत होता है और यह मुझे आईपी पते को हार्डकोड करने और मैन्युअल रूप से बनाए रखने से बचाता है। मुझे यकीन है कि कुछ परिदृश्य हैं जिनके लिए स्क्रिप्ट में बदलाव की आवश्यकता होगी, लेकिन यह एक कार्यात्मक प्रारंभिक बिंदु है।

मेरी स्क्रिप्ट: update_container_hosts.sh

#!/bin/bash
HOST_NAME=$1
HOST_NETWORK=$2
CONTAINER_NAME=$3

FMT="{{(index (index .NetworkSettings.Networks \"$HOST_NETWORK\") ).IPAddress}}"
CONTAINERS=`docker ps  | grep $CONTAINER_NAME | cut -d" " -f1`
HOST_ID=`docker ps | grep $HOST_NAME | cut -d" " -f1`
HOST_IP=$(docker inspect $HOST_ID --format="$FMT")

echo --- containers ---
echo $CONTAINERS
echo ------------------
echo host: $HOST_NAME
echo network: $HOST_NETWORK
echo ip: $HOST_IP
echo ------------------

for c in $CONTAINERS;
do
    if [ "$HOST_IP" != "" ]
    then
        docker cp $c:/etc/hosts /tmp/hosts.tmp
        IP_COUNT=`cat /tmp/hosts.tmp | grep $HOST_IP | wc -l`
        rm /tmp/hosts.tmp
        if [ "$IP_COUNT" = "0" ]
        then
                docker exec  $c /bin/sh -c "echo $HOST_IP $HOST_NAME >> /etc/hosts"
                echo "$c: Added entry to container hosts file."
        else
                echo "$c: Entry already exists in container hosts file.  Skipping."
        fi
    fi
done
0
Shaun McPeck 18 मई 2020, 07:30