Как я могу загрузить баланс FastAGI?

Я пишу несколько AGI с использованием Perl, которые будут вызываться из абонентской группы Asterisk. Я ожидаю получить множество похожих вызовов, поэтому мне нужен способ их балансировки нагрузки. Мне посоветовали использовать FastAGI вместо AGI. Проблема заключается в том, что мои AGI будут распределены по многим серверам, а не по одному, и мне нужно, чтобы моя точка входа Asterisk распределяла вызовы между этими серверами (где находятся агис) в зависимости от их доступности. Итак, я подумал о предоставлении приложению FastAGI нескольких IP-адресов вместо одного. Является ли это возможным?

3 ответа

Любой обратный прокси TCP сделает свое дело. HAProxy - это одно, а nginx с TCP-модулем - другое.

Некоторое время назад я создал свой собственный прокси-сервер FastAGI, используя node.js ( nodast) для решения этой очень специфической проблемы и немного больше, включая возможность запуска протокола FastAGI через SSL и маршрутизации запросов на основе местоположения и параметров запроса AGI (такие как $dnis, $channel, $language, ...)

Более того, поскольку конфигурация прокси-сервера в основном является 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; 

У меня есть большая реализация IVR, использующая FastAGI (24 E1 все делают вызовы FastAGI, пиковые значения составляют около 80%, так что почти 600 каналов Asterisk вызывают FastAGI). Я не нашел простого способа балансировки нагрузки, но в моем случае есть разные вызовы FastAGI: один в начале вызова для проверки пользователя в базе данных, затем другой для проверки баланса пользователя или его наиболее недавние транзакции и еще одна для совершения сделки.

Поэтому я отправил все проверочные и простые запросы одному приложению на одном сервере, а все вызовы транзакций - другому приложению на другом сервере.

Грубый способ балансировки нагрузки, если у вас много входящих вызовов на каналах zaptel/dahdi, - это использовать разные группы для каналов. Например, предположим, что у вас есть 2 сервера FastAGI и 4 E1, принимающих вызовы. Вы можете установить 2 E1 в группе g1 и 2 других E1 в группе g2. Затем вы объявляете глобальные переменные следующим образом:

[глобалы]
serverg1=ip_of_server1
serverg2=ip_of_server2

Затем в вашем диалплане вы называете FastAGI следующим образом:

AGI (аги://${сервер ${CHANNEL(callgroup)}}/some_action)

На каналах, принадлежащих группе g1, это преобразуется в serverg1, который преобразуется в ip_of_server1; на каналах, принадлежащих группе g2, CHANNEL(callgroup) преобразуется в g2, поэтому вы получаете ${serverg2}, который преобразуется в ip_of_server2.

Это не лучшее решение, потому что обычно звонки начинают поступать с одного промежутка, а затем с другого и т. Д., Поэтому один сервер получит больше работы, но это что-то.

Я думаю, что для реальной балансировки нагрузки нам нужно написать шлюз балансировки нагрузки FastAGI, это неплохая идея...

Меххх... использовать те же конструкции, которые применяются для балансировки нагрузки, например запросы веб-страниц.

Одним из способов является округление робина в DNS. Поэтому, если у вас vru1.example.com 10.0.1.100 и vru2.example.com 10.0.1.101, вы помещаете две записи в DNS, как...

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. И вы можете добавить столько хостов, сколько вам нужно.

Другой способ - это кое-что слишком сложное, чтобы объяснить его здесь, но прокси-инструменты, такие как HAProxy, должны иметь возможность маршрутизации между несколькими серверами с дополнительным преимуществом, заключающимся в том, чтобы "вынуть один из них" для обслуживания или сделать более продвинутый. балансировка, как распределить поровну на основе текущей нагрузки.

Другие вопросы по тегам