先史時代
遅かれ早かれ、システム管理者は複数のチャネルにトラフィックを分散する必要性に直面しますが、当然ながら各チャネルを最大限に使用する必要があります。 同様のニーズに直面し、車輪を再発明しないことを決定した彼は、検索エンジンの助けを借りました。 Ubuntuにサーバーがあるため、記事http://help.ubuntu.ru/wiki/ip_balancingに注意を向けました。 「方法1」を実装しましたが、テスト中に次の重大な問題に気付きました。一部のサイトでリンクを使用したときに開かなかった(たとえば、VKontakteリソースで音楽をオンにしようとしたとき)。 理由は明らかです-要求は別のチャネルを通過しました。 状況について考えた後、バランスを取るためのアプローチを組み合わせることにしました。 ロジックは単純です-すべてのトラフィックのほとんどが急流や同様のプログラムを食べるため、トラフィックを共有します。 その結果、最大11000までのポートを持つトラフィックをサブスクライバの数でほぼ均等に分散します。サブネット、ポート11000〜60000のトラフィックでチャネルの負荷を分散します。
設定
ルーティングテーブルはチャネルごとに作成されることを前提としているため、それぞれchan1 、 chan2 、 chan3-3つのチャネルと呼びます。
たとえば、/ etc / rc.localのどこかに次のようなものを追加します。
ip rule add prio 101 fwmark 1 table chan1 ip rule add prio 102 fwmark 2 table chan2 ip rule add prio 103 fwmark 4 table chan3
スクリプト/etc/rc.balanceを作成します。
#!/bin/bash lst='/etc/rc.balance.lst' ########### Flushing ################## /sbin/iptables -t mangle -F PREROUTING /sbin/iptables -t mangle -F POSTROUTING /sbin/iptables -t mangle -F OUTPUT ####################################### /etc/rc.baltor /sbin/iptables -t mangle -A PREROUTING -d 172.16.0.0/16 -j RETURN /sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/16 -m state --state INVALID -j DROP while read net mark do /sbin/iptables -t mangle -A PREROUTING -s $net -m state --state new,related -j CONNMARK --set-mark $mark done<$lst /sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/16 -p udp --sport 11000:60000 --dport 11000:60000 -m state --state new,related -j BALANCE /sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/16 -p tcp --sport 11000:60000 --dport 11000:60000 -m state --state new,related -j BALANCE /sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/16 -j CONNMARK --restore-mark exit 0
チャネルごとのグリッドの分布のリストを作成します(2番目の列のマーク)。
172.16.0.0/22 1 172.16.4.0/22 2 172.16.8.0/22 4
スクリプト/etc/rc.baltor-バランス規則:
#!/bin/bash /sbin/iptables -t mangle -F BALANCE lst='/etc/rc.cnload.lst' mrk=1 while read kld do /sbin/iptables -t mangle -A BALANCE -j CONNMARK --set-mark $mrk /sbin/iptables -t mangle -A BALANCE -m statistic --mode random --probability 0.$kld -j RETURN mrk=`expr $mrk \* 2` done < $lst /sbin/iptables -t mangle -A BALANCE -j CONNMARK --set-mark $mrk exit 0
スクリプト/etc/rc.cnload-チャネル負荷に応じた確率の計算:
#!/bin/bash cn1=800000 # cn2=600000 # .. cn3=400000 # if1='eth1' # if2='eth2' # if3='eth3' # lst='/etc/rc.cnload.lst' a1=`ifconfig $if1 | grep "RX bytes" | awk '{print $2}' | awk -F: '{print $2}'` a2=`ifconfig $if2 | grep "RX bytes" | awk '{print $2}' | awk -F: '{print $2}'` a3=`ifconfig $if3 | grep "RX bytes" | awk '{print $2}' | awk -F: '{print $2}'` sleep 20 b1=`ifconfig $if1 | grep "RX bytes" | awk '{print $2}' | awk -F: '{print $2}'` b2=`ifconfig $if2 | grep "RX bytes" | awk '{print $2}' | awk -F: '{print $2}'` b3=`ifconfig $if3 | grep "RX bytes" | awk '{print $2}' | awk -F: '{print $2}'` c1=`expr \( $b1 - $a1 \) \* 8 / 20000` c2=`expr \( $b2 - $a2 \) \* 8 / 20000` c3=`expr \( $b3 - $a3 \) \* 8 / 20000` d1=`expr \( $cn1 - $c1 \) \* 100 / $cn1` d2=`expr \( $cn2 - $c2 \) \* 100 / $cn2` d3=`expr \( $cn3 - $c3 \) \* 100 / $cn3` # 60% if [ $d1 -lt "40" -o $d2 -lt "40" -o $d3 -lt "40" ] then e1=`expr 100 \* $d1 / \( $d1 + $d2 + $d3 \)` e2=`expr 100 \* $d2 / \( $d2 + $d3 \)` f1=`head -n 1 $lst | tail -n 1` f2=`head -n 2 $lst | tail -n 1` # if [ $e1 -ne $f1 -a $e2 -ne $f2 ] then echo $e1 > $lst echo $e2 >> $lst /etc/rc.baltor fi fi exit 0
/etc/rc.localに追加します
/etc/rc.balance
および/ etc / crontab
*/1 * * * * root /etc/rc.cnload
係数/etc/rc.cnload.lstが既に存在するファイルを開始するときには、スクリプト/etc/rc.cnloadを実行してコンパイルできることが重要です。
おわりに
この方法は、8000人の加入者を持つネットワークで正常に実装されました。 バランシングに加えて、動的シェーピングが使用されますが、これは別の記事のトピックです。
すべてのすべてのバランス。