Как я могу загрузить баланс 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, должны иметь возможность маршрутизации между несколькими серверами с дополнительным преимуществом, заключающимся в том, чтобы "вынуть один из них" для обслуживания или сделать более продвинутый. балансировка, как распределить поровну на основе текущей нагрузки.