আমি আমার সেটআপটি ব্যাখ্যা করব এবং কীভাবে আমি মনোমুগ্ধকর লোডগুলি সমাধান করেছি:
আমার 2 টি নোড এইচএপ্রক্সি চালিত এবং কিপালাইভড সহ একটি সাধারণ সেটআপ রয়েছে। ইন্টারফেসের ডামি0 ধরে রাখুন, তাই আমি সুইচ ওভারটিকে জোর করে "ifconfig dummy0 ডাউন" করতে পারি।
আসল সমস্যাটি হ'ল, কেন জানি না, একটি "হ্রপোক্সি রিলোড" এখনও সমস্ত ইস্টাব্লিশড সংযোগগুলি ফেলে দেয় :( আমি জের্তা দ্বারা প্রস্তাবিত "iptables ফ্লিপিং" চেষ্টা করেছি, তবে আমি কিছু সমস্যা খুঁজে পেয়েছি কারণ এটি গন্তব্যটিতে একটি NAT সম্পাদন করে আইপি ঠিকানা, যা কিছু পরিস্থিতিতে উপযুক্ত সমাধান নয়।
পরিবর্তে, আমি নতুন সংযোগের প্যাকেটগুলি চিহ্নিত করতে একটি কনমার্কের নোংরা হ্যাক ব্যবহার করার সিদ্ধান্ত নিয়েছি এবং তারপরে চিহ্নিত চিহ্নিত প্যাকেটগুলি অন্য নোডে পুনর্নির্দেশ করব।
এখানে 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) এ প্রেরণ করে।
Original ষ্ঠ নিয়মে নতুন প্রবাহের প্যাকেটগুলি তাদের মূল গন্তব্যে পৌঁছনোর জন্য আটকে দেয়।
ইন্টারফেসে বা কার্নেলগুলিতে rp_filter অক্ষম করার কথা মনে রাখবেন সেই মার্টিয়ান প্যাকেটগুলি নামবে।
এবং শেষ কিন্তু শেষ নয়, রিটার্নিং প্যাকেটগুলি মনে রাখবেন! আমার ক্ষেত্রে অসমমিত রাউটিং রয়েছে (অনুরোধ ক্লায়েন্টের কাছে আসে -> haproxy1 -> haproxy2 -> ওয়েবসার্ভার, এবং উত্তরগুলি ওয়েবসভার -> haproxy1 -> ক্লায়েন্ট থেকে আসে) তবে এটি প্রভাবিত করে না। এটা ভাল কাজ করে।
আমি জানি যে সর্বাধিক মার্জিত সমাধানটি হ'ল ডাইভার্টটি করতে আইপ্রউট 2 ব্যবহার করা হবে তবে এটি কেবল প্রথম এসওয়াইএন প্যাকেটের জন্য কাজ করেছিল। এটি যখন এসি (3-ওয়ে হ্যান্ডশেকের তৃতীয় প্যাকেট) পেয়েছে তখন এটি চিহ্নিত করে না :( আমি তদন্ত করতে বেশি সময় ব্যয় করতে পারিনি, আমি যখনই এটি টিই লক্ষ্য নিয়ে কাজ করতে দেখলাম তখনই এটি এটি সেখানে রেখে গেল। অবশ্যই, iproute2 দিয়ে এটি ব্যবহার করে নির্দ্বিধায়
মূলত, "গ্রেফুল লোড" এর মতো কাজ করে:
- আমি iptables নিয়মটি সক্ষম করে তাৎক্ষণিকভাবে অন্যান্য এইচএপ্রক্সিতে নতুন সংযোগগুলি দেখতে পাচ্ছি।
- "ড্রেনিং" প্রক্রিয়াটি তদারকি করার জন্য আমি "নেটস্ট্যাট-গ্রেট ESTABLISHED | wc -l" তে নজর রাখছি।
- একবার মাত্র কয়েকটি (বা শূন্য) সংযোগ হয়ে গেলে, "আইফোনফিগ ডামি0 ডাউন" ব্যর্থ রাখার জন্য রক্ষণশীলকে বাধ্য করতে, যাতে সমস্ত ট্র্যাফিক অন্য এইচএপ্রক্সিতে চলে যায়।
- আমি iptables রুলসেটটি সরিয়েছি
- (কেবলমাত্র "নন-প্রিম্পটিং" কিপালাইভ কনফিগারেশনের জন্য) "ifconfig ডামি0 আপ"।
আইপেটেবলস রুলসেটটি সহজেই স্টার্ট / স্টপ স্ক্রিপ্টের সাথে সংহত করা যায়:
#!/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