मेरे पास 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/मेष रूटिंग व्यवहार को बायपास करना चाहता हूं।
तो सवाल यह है:
मैं अपने वेबपैप की प्रत्येक प्रतिकृति को कंटेनर के आईपी पते को हार्ड कोडिंग किए बिना स्थानीय झुंड होस्ट के गैलेरा कंटेनर को कैसे हिट कर सकता हूं?
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
संबंधित सवाल
नए सवाल
docker-compose
कम्पोज़ डोकर के साथ जटिल अनुप्रयोगों को परिभाषित करने और चलाने के लिए एक उपकरण है। कम्पोज़ के साथ, आप एक एकल फ़ाइल में एक मल्टी-कंटेनर एप्लिकेशन को परिभाषित करते हैं, फिर अपने एप्लिकेशन को एक ही कमांड में स्पिन करते हैं, जो सब कुछ करता है जो इसे चलाने के लिए किया जाना चाहिए।