मैं अपना सेटअप समझाता हूँ और मैंने कैसे सुंदर रिलोड्स हल किये हैं:
मेरे पास एक विशिष्ट सेटअप है जिसमें 2 नोड्स HAproxy चल रहे हैं और रखवाले हैं। Keepalived पटरियों इंटरफ़ेस dummy0, इसलिए मैं एक "ifconfig dummy0 डाउन" कर सकता हूं ताकि स्विच ओवर किया जा सके।
असली समस्या यह है कि, मुझे नहीं पता कि क्यों, एक "हाइपोक्सिक्स रीलोड" अभी भी सभी स्थापित कनेक्शनों को गिरा देता है :( मैंने गार्ट्स द्वारा प्रस्तावित "आईपीप्लेट फ़्लिपिंग" की कोशिश की, लेकिन मुझे कुछ मुद्दे मिले क्योंकि यह गंतव्य पर एक NAT करता है। आईपी पता, जो कुछ परिदृश्यों में एक उपयुक्त समाधान नहीं है।
इसके बजाय, मैंने नए कनेक्शन से संबंधित पैकेटों को चिह्नित करने के लिए एक CONNMARK गंदे हैक का उपयोग करने का फैसला किया, और फिर उन चिह्नित पैकेटों को दूसरे नोड पर पुनर्निर्देशित किया।
यहाँ iptables नियम है:
iptables -t mangle -A PREROUTING -i eth1 -d 123.123.123.123/32 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i eth1 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth1 -p tcp --tcp-flags RST RST -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth1 -m mark ! --mark 0 -j TEE --gateway 192.168.0.2
iptables -t mangle -A PREROUTING -i eth1 -m mark --mark 1 -j DROP
पहले दो नियम नए प्रवाह से संबंधित पैकेटों को चिह्नित करते हैं (123.123.123.123 हैपॉलिव्ड वीआईपी है जिसका इस्तेमाल हाइप्रोक्स पर फ्रंट को बांधने के लिए किया जाता है)।
तीसरे और चौथे नियम मार्क पैकेट्स फिन / आरएसटी पैकेट। (मुझे नहीं पता कि क्यों, टीईई लक्ष्य "फ़ाइनल / आरएसटी पैकेट" को अनदेखा करता है)।
पांचवां नियम अन्य चिह्नित पैकेटों के डुप्लिकेट को अन्य HAproxy (192.168.0.2) को भेजता है।
छठे नियम अपने मूल गंतव्य तक पहुंचने से रोकने के लिए नए प्रवाह से संबंधित पैकेटों को गिराता है।
याद रखें कि इंटरफेस या कर्नेल पर rp_filter को निष्क्रिय करना उन मार्शल पैकेट को गिरा देगा।
और अंतिम लेकिन कम से कम, लौटने वाले पैकेट का मन नहीं! मेरे मामले में असममित मार्ग है (अनुरोध ग्राहक के लिए आते हैं -> haproxy1 -> haproxy2 -> वेबसर्वर, और उत्तर वेबसर्वर से जाते हैं -> haproxy1 -> ग्राहक), लेकिन यह प्रभावित नहीं करता है। यह बढ़िया काम करता है।
मुझे पता है कि सबसे सुंदर समाधान divert करने के लिए iproute2 का उपयोग करना होगा, लेकिन यह केवल पहले SYN पैकेट के लिए काम करता था। जब इसे ACK (3-रास्ता हैंडशेक का तीसरा पैकेट) प्राप्त हुआ, तो उसने इसे चिह्नित नहीं किया :( मैं जांच के लिए ज्यादा समय नहीं दे सका, जैसे ही मैंने देखा कि यह टीईई लक्ष्य के साथ काम करता है, इसने इसे वहीं छोड़ दिया। बेशक, यह iproute2 के साथ आज़माने के लिए स्वतंत्र महसूस करें।
मूल रूप से, "सुशोभित रीलोड" इस तरह काम करता है:
- मैं iptables नियमों को सक्षम करता हूं और तुरंत नए कनेक्शन को अन्य HAproxy में जा रहा हूं।
- मैं "netstat -an | grep ESTABLISHED | wc -l" पर नजर रखता हूं ताकि "ड्रेनिंग" प्रक्रिया की देखरेख कर सकूं।
- एक बार बस कुछ (या शून्य) कनेक्शन होते हैं, "ifconfig dummy0 डाउन" जो कि विफलता को रखने के लिए मजबूर किया जाता है, इसलिए सभी ट्रैफ़िक दूसरे HAproxy में जाएंगे।
- मैं iptables नियमों को हटा देता हूं
- (केवल "नॉन-प्रीमेप्टिंग" कीपैलिव कॉन्फिग "के लिए" ifconfig dummy0 up "।
IPtables नियम आसानी से एक स्टार्ट / स्टॉप स्क्रिप्ट में एकीकृत किया जा सकता है:
#!/bin/sh
case $1 in
start)
echo Redirection for new sessions is enabled
# echo 0 > /proc/sys/net/ipv4/tcp_fwmark_accept
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
iptables -t mangle -A PREROUTING -i eth1 ! -d 123.123.123.123 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i eth1 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth1 -p tcp --tcp-flags RST RST -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth1 -m mark ! --mark 0 -j TEE --gateway 192.168.0.2
iptables -t mangle -A PREROUTING -i eth1 -m mark --mark 1 -j DROP
;;
stop)
iptables -t mangle -D PREROUTING -i eth1 -m mark --mark 1 -j DROP
iptables -t mangle -D PREROUTING -i eth1 -m mark ! --mark 0 -j TEE --gateway 192.168.0.2
iptables -t mangle -D PREROUTING -i eth1 -p tcp --tcp-flags RST RST -j MARK --set-mark 2
iptables -t mangle -D PREROUTING -i eth1 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 2
iptables -t mangle -D PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -D PREROUTING -i eth1 ! -d 123.123.123.123 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1
echo Redirection for new sessions is disabled
;;
esac