2009-06-11 10 views
3

私は、Asteriskダイヤルプランから呼び出されるPerlを使用して複数のAGIを作成しています。私は数多くの同時呼び出しを受けることを期待しているので、それらの負荷を分散する方法が必要です。 AGIの代わりにFastAGIを使用するように勧められました。問題は、私のAGIが1台だけでなく多くのサーバに分散され、私のエントリーポイントが必要だということです。アスタリスクは、そのアベイラビリティに基づいて、アジスが存在するサーバ間でコールを送出します。ですから、FastAGIアプリケーションに複数のIPアドレスを1つではなく提供することを考えました。出来ますか?FastAGIの負荷を分散するにはどうしたらいいですか?

答えて

1

(つまりFastAGIを呼び出すほぼ600アスタリスクチャンネルですので、24個のE1の全てやっFastAGI呼び出し、ピークは約80%である)私はFastAGIを使用して大規模なIVRの実装を持っています。私はロードバランシングを行う簡単な方法は見つけられませんでしたが、私のケースでは、FastAGIの呼び出しが異なります.1つはコールの開始時にデータベース内のユーザーを検証し、もう1つはユーザーの残高またはそのほとんど最近のトランザクション、もう1つはトランザクションを実行します。

だから何私がやったことは1台のサーバー上で一つのアプリケーションにすべての検証と単純なクエリを送信し、すべてのトランザクションは、別のサーバー上の別のアプリケーションへの呼び出しました。あなたはzaptel/dahdiチャンネル上の着信コールの多くを持っている場合

のロードバランシングを行うには、粗な方法は、チャンネルごとに異なるグループを使用することです。たとえば、2台のFastAGIサーバーと4台のE1の受信コールがあるとします。グループg1に2つのE1を、グループg2に2つのE1を設定できます。あなたはこのようFastAGI呼び出すあなたのダイヤルプランに続いて

[globals] 
serverg1=ip_of_server1 
serverg2=ip_of_server2 

:その後、あなたは、このようなグローバル変数を宣言ip_of_server1に解決されますserverg1に解決され、グループG1に属するチャンネルで

AGI(agi://${server${CHANNEL(callgroup)}}/some_action)

。グループg2に属するチャネルでは、CHANNEL(コールグループ)がg2に解決され、$ {serverg2}がip_of_server2に解決されます。

通常の通話は1つのスパンに着信を開始し、その後、別のため、それはとても一つのサーバがより多くの仕事を取得するなど、最善の解決策ではないのですが、それは何か。

...私たちはFastAGI負荷分散ゲートウェイ、全く悪くないアイデアを書かなければならないだろうと思い、実際のロード・バランシングを取得するには

1

Mehhh ...何かを負荷分散するために適用される同じ構文を使用しますウェブページのような要求。

1つの方法は、DNSでラウンドロビンを行うことです。あなたはvru1.example.com 10.0.1.100およびvru2.example.com 10.0.1.101を持っているのであれば、あなたのようなDNSに2つのエントリを入れて...

fastagi.example.com 10.0.1.100

fastagi.example .com 10.0.1.101

...ダイヤルプランのagi(agi://fastagi.example.com/youagi)は、理論上は10.0.1.100と10.0.1.101の間で交互に表示する必要があります。また、必要な数のホストを追加できます。

もう1つの方法は、ここで説明するにはあまりにも複雑すぎることですが、HAProxyのようなプロキシツールは、複数のサーバー間をルーティングできる必要があります。メンテナンスのために現在の負荷に基づいて均等に分散するような、より高度なバランスをとることができます。

+0

は良いが。クライアント(つまりアスタリスク)はDNS要求をキャッシュする可能性が最も高く、したがって常に同じIPを繰り返し使用します。短いTTLであっても。 – pdeschen

2

すべてのTCPリバースプロキシがこのトリックを行います。HAProxyは1であり、nginxであり、TCP moduleである。

私は、この非常に特定の問題に対処するためにnode.js(nodast)を使用して独自のFastAGIプロキシを作成しました。これは、FastAGIプロトコルをSSLで実行し、AGI要求

また、プロキシ設定は基本的にjavascriptなので、実際に面白い方法で実際に負荷を分散することができます。

サンプルの設定は以下の通りになりませんでしょう:

var config = { 
    listen : 9090, 
    upstreams : { 
     test : 'localhost:4573', 
     foobar : 'foobar.com:4573' 
    }, 
    routes : { 
     'agi://(.*):([0-9]*)/(.*)' : function() { 
      if (this.$callerid === 'unknown') { 
       return ('agi://foobar/script/' + this.$3); 
      } else { 
       return ('agi://foobar/script/' + this.$3 + '?callerid' + this.$callerid); 
      } 
     }, 
     '.*' : function() { 
      return ('agi://test/'); 
     }, 
     'agi://192.168.129.170:9090/' : 'agi://test/' 
    } 
}; 
exports.config = config; 
関連する問題