Jump to content
Калькуляторы

Биллинговая система "Гидра" кто что думает

Зачем иметь два набора адресов, если рабочие ip один фиг управляются в индивидуальном порядке?

Не могли бы пояснить?

 

Что именно? Зачем городить огород с двумя наборами "хороших" и "не очень" ip адресов? В мир выпускаются только активные адреса. Все остальные - неактивные, должники и т.п., допускаются только к прафайлу и платежным формам.

Share this post


Link to post
Share on other sites

Зачем иметь два набора адресов, если рабочие ip один фиг управляются в индивидуальном порядке?

Не могли бы пояснить?

 

Что именно? Зачем городить огород с двумя наборами "хороших" и "не очень" ip адресов? В мир выпускаются только активные адреса. Все остальные - неактивные, должники и т.п., допускаются только к прафайлу и платежным формам.

 

У меня сделано так: серые адреса выдаются еще неизвестному системе оборудованию, а белые адреса - уже известному и закрепленному за абонентом. При задолженности белые адреса на ISG заруливаются на личный кабинет. Перерасход белых адресов на должниках конечно есть, но пока не критично, а далее можно просто особо злостным неплательщикам (2-3 мес) просто снимать привязку.

Share this post


Link to post
Share on other sites

Зачем иметь два набора адресов, если рабочие ip один фиг управляются в индивидуальном порядке?

Не могли бы пояснить?

 

Что именно? Зачем городить огород с двумя наборами "хороших" и "не очень" ip адресов? В мир выпускаются только активные адреса. Все остальные - неактивные, должники и т.п., допускаются только к прафайлу и платежным формам.

Тогда видится навешивание forward policy на адрес ipoe портала, при удачной авторизации она снимается.

Share this post


Link to post
Share on other sites

Добрый вечер!

Подскажите как обстоят дела с внешними пакетами и своей обработкой, можно ли сделать свой пакет на pl/sql и потом подвязать на выполнение определенные функции через "Задания", в документации вроде описано:

- Внешнее — задание, которое выполняется не ядром системы, а некоторым внешним приложением;

- Пользовательское — задание, разработанное для конкретного оператора связи.

 

Но как повесить не нашел или это возможно только через ТП и когда они сами разрабатывают ?

Или весь этот вэб подвязан к стандартному оракловскому планировщику заданий и собственно мне ни кто не мешает так запускать ?

 

Просьба не пинать, только осваиваю данный биллинг.

Edited by gofman

Share this post


Link to post
Share on other sites

Лучше спросить ТП, они скажут какие процедуры вызывать, дадут пример, либо сами вызовут (там одна процедура на «регистрацию задания»). Планировщик свой, лучше делать через него, иначе потом будет сложнее управлять заданием. Процедура должна быть с определенным интерфейсом, но это требование несложно соблюсти.

Share this post


Link to post
Share on other sites

вам говорил, что цена взята “не с потолка” и в разы просто так не уменьшается, а без внедрения Гидру брать опасно.

тю, так мож сразу тогда предупреждать, что мол хотите заюзать?

так к цене лицензии прибавьте х1,5 стоимости внедрения, так как сами без наших специалистов с оплатой их работы вы не сможете это сделать.

и немного отсыпьте для обучения своего колл-центра ити ТП.

 

в чем проблема сразу так писать, что бы не было таких вот 11 компаний.

Edited by dyadyajack

Share this post


Link to post
Share on other sites

вам говорил, что цена взята “не с потолка” и в разы просто так не уменьшается, а без внедрения Гидру брать опасно.

тю, так мож сразу тогда предупреждать, что мол хотите заюзать?

так к цене лицензии прибавьте х1,5 стоимости внедрения, так как сами без наших специалистов с оплатой их работы вы не сможете это сделать.

и немного отсыпьте для обучения своего колл-центра ити ТП.

 

в чем проблема сразу так писать, что бы не было таких вот 11 компаний.

 

Насколько я помню наш процесс покупки, нам не раз и не два всячески указывали, что _крайне_ желательно брать внедрение. И да, оно стоит столько-то, столько-то. Цен никто не скрывал.

Подробно отвечали на вопросы и описывали, что к чему.

 

"Не сможете это сделать" - говорить нельзя, поскольку это не корректно. Кто-то сможет, кто-то (большинство) - нет, или потратит на порядок больше времени.

Share this post


Link to post
Share on other sites

Делюсь своими наработками под гидру, мб кому-нибуть пригодится:

 

Софтина на гошечке, пингующая на равсокете все коммутаторы в БД и ставящее/снимающее им флаг "живой".

Кроме изменения в БД, при изменении состояния свитча дёргается указанная в конфиге ссылка - при событии можно какими-нибуть средствами слать уведомления заинтересованным.

Несколько тысяч свитчей у нас обходит примерно за минуту.

 

https://github.com/ircop/go-hpinger

 

 

snmp-поллер для оборудования, хранящегося в Гидре. Шлёт данные в graphite/carbon-daemon.

Несколько тысяч свитчей обходит за полторы-две минуты.

 

https://github.com/ircop/hpoller

 

 

PHP-Api для Гидры, работающее с её oracle API.

Наверное, достаточно узкоприменимо, т.к. требует php7 и жестко привязано к фреймворку Laravel.

Но с его помощью очень удобно творить с API почти всё, что угодно.

 

https://repo.ip-home.net/wingman/hapi

 

Сейчас поддерживаются только две версии: 3.4.5 и 4.0 (3.4.5 у нас в продакшне, на 4.0 потихоньку пробуем перелазить). Сответственно, ветки нужно выбирать releases/3.4.5 или releases/4.0

Share this post


Link to post
Share on other sites

Но с его помощью очень удобно творить с API почти всё, что угодно.

а изкаробки не удобно?

Share this post


Link to post
Share on other sites

Но с его помощью очень удобно творить с API почти всё, что угодно.

а изкаробки не удобно?

Из коробки никто не опишет взаимосвязи моделей, юзабельные функции, и т.д. Но яж не навязываю )

Share this post


Link to post
Share on other sites

у них неплохой REST API

к примеру

Create account

POST /rest/v1/subjects/customers/:customer_id/accounts

Share this post


Link to post
Share on other sites

у них неплохой REST API

к примеру

Create account

POST /rest/v1/subjects/customers/:customer_id/accounts

 

Там (на текущий момент) ооооочень мало возможностей по сравнению с pl/sql api

Share this post


Link to post
Share on other sites

VZP, вы похоже что-то перепутали. Биллинг Гида это который hydra-billing.ru. Во-первых, с него не было ни одного перехода на другой биллинг никогда. Это легко отследить разработчикам, потому что те, кто его внедрил оплачивают техподдержку.

 

Не переходят, потому что читают такие условия:

 

1. Лицензионный договор полностью исполнен. Право пользования вам передано, экземпляр программы предоставлен и вами принят. Договор исполнен. Основания для возврата отсутствуют
2. По договору технической поддержки была оплата консультаций в течение 1 месяца. Консультации проведены. Основания для возврата отсутствуют
3. По договору внедрения все работы завершены кроме двух платежных систем. Причины препятствующие завершению внешние. Нами были согласованы альтернативы. На текущий момент по этим задачам ожидаем данных от вас, после чего готовы завершить задачу в течении нескольких дней. Основания для возврата отсутствуют

 

 

Для ВАС, официально заявляю, вы обманываете. Человек, заплатив вам 100тр предоплаты, увидев РЕАЛЬНЫЕ его возможности и ценник, перешел на Абилс. На сайте одно и все красиво. В реале калькулятор с отсутствием системы заявок и т.д. Человек отвалив за такое гав-но конский прайс, прочитав такие ответы, не заморачивается. Развод полный.

Хотели стекировать Гидру с Юзерсайдом, потому что там за 115тр есть все, что надо для работы, так ТП несколько дней выносила мозг, что это новая задача. Это сообщить данные стековки с модулем ЮС!!! 5 строчек!!! Ощущение, что хотят продать этот модуль второй раз за 21тр, а этот модуль в ЮС 15тр.

 

Покупая этот "биллинг" хорошо подумайте! Умножьте цену в 2-3 раза и подкатите губу о возможностях, прочитанных на их сайте. И будьте готовы к "Основания для возврата отсутствуют"

Edited by alexs200

Share this post


Link to post
Share on other sites

перешел на Абилс.

И взял здоровенный напильник, и пилил он 3 года 3 месяца и 3 дня, плюнул и оставил как есть.

Share this post


Link to post
Share on other sites

перешел на Абилс.

И взял здоровенный напильник, и пилил он 3 года 3 месяца и 3 дня, плюнул и оставил как есть.

Бородатая шутка, но лет 5 как не актуальна

Share this post


Link to post
Share on other sites

Бородатая шутка, но лет 5 как не актуальна

Сравнение Абилса и Гидры будет? Или Абилс это для домохозяекмелких ISP. Еще скажите, что mysql для АСР самое то!

Обратите внимание на блокировки при высокой нагрузке, кстати с MVCC уже разобрались? Алгоритм выдачи IP адресов из пулов имеет занимательную логику, я сначала даже не поверил.

PS:// Не знаю как сейчас в абилсе с апдейтами, но лотерея была еще та.

Share this post


Link to post
Share on other sites

Сравнение Абилса и Гидры будет? Или Абилс это для домохозяекмелких ISP. Еще скажите, что mysql для АСР самое то!

Обратите внимание на блокировки при высокой нагрузке, кстати с MVCC уже разобрались? Алгоритм выдачи IP адресов из пулов имеет занимательную логику, я сначала даже не поверил.

PS:// Не знаю как сейчас в абилсе с апдейтами, но лотерея была еще та.

 

- конечно все "плохо" и 200 тисячники это по Вашим словам мелкие ISP.

- Кому не нравитcя может перейти на Oracle, механизм миграции освещён, правда не все готовы платить за издержки

- по остальным пунктам я просто приведу Вашу цитату c других ресурсов

 

 

10 ноя 2014 - 5:29 PM ~AsmodeuS~ писал:

 

ну как удалось еще что то найти ?

 

У меня пока не совсем достаточно времени, для детальных тестов. По мере нахождения, я буду отписываться. Скорее всего ближе к концу ноября.

 

 

прошло 2 года списка недочётов так и не получили

Share this post


Link to post
Share on other sites

- конечно все "плохо" и 200 тисячники это по Вашим словам мелкие ISP.

Начало попахивать ...

 

прошло 2 года списка недочётов так и не получили

Не до такой степени мне скучно.

 

Вступаю в жуткий оффтоп, прошу прощения.

Рассмотрим код из модуля авторизации функцию выдачи IP адресов, с позволения автора abills.

#*******************************************************************
1759	# returns:
1760	#
1761	#   -2 - No Free Address in TP pool
1762	#   -1 - No free address in nas pool
1763	#    0 - No address pool using nas servers ip address
1764	#   192.168.101.1 - assign ip address
1765	#
1766	# get_ip($self, $nas_num, $nas_ip)
1767	#*******************************************************************
1768	sub get_ip {
1769	  my $self = shift;
1770	  my ($nas_num, $nas_ip, $attr) = @_;
1771	
1772	  if (! $self->{LOGINS}) {
1773	        $self->{USER_NAME} = '' if (! $self->{USER_NAME});
1774	    $self->query2("SELECT INET_NTOA(framed_ip_address) AS ip FROM dv_calls 
1775	       WHERE user_name='$self->{USER_NAME}' 
1776	         AND status=11 
1777	         AND nas_id='$nas_num'
1778	         AND framed_ip_address > 0;");
1779	    if ($self->{TOTAL} > 0) {
1780	      return $self->{list}->[0]->[0];
1781	    }
1782	  }
1783	
1784	  if ($attr->{TP_IPPOOL}) {
1785	    $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id
1786	    FROM ippools
1787	     WHERE ippools.id='$attr->{TP_IPPOOL}'
1788	     ORDER BY ippools.priority;"
1789	    );
1790	    delete($attr->{TP_IPPOOL});
1791	  }
1792	  else {
1793	    $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id 
1794	    FROM ippools, nas_ippools
1795	     WHERE ippools.id=nas_ippools.pool_id AND nas_ippools.nas_id='$nas_num'
1796	     ORDER BY ippools.priority;"
1797	    );
1798	  }
1799	
1800	  if ($self->{TOTAL} < 1) {
1801	    return 0;
1802	  }
1803	
1804	  my @pools_arr      = ();
1805	  my $list           = $self->{list};
1806	  my @used_pools_arr = ();
1807	  my $next_pool_id   = 0;
1808	
1809	  foreach my $line (@$list) {
1810	    my $sip   = $line->[0];
1811	    my $count = $line->[1];
1812	    my $id    = $line->[2];
1813	    $next_pool_id = $line->[3];
1814	    push @used_pools_arr, $id;
1815	    my %pools = ();
1816	
1817	    for (my $i = $sip ; $i <= $sip + $count ; $i++) {
1818	      $pools{$i} = 1;
1819	    }
1820	    push @pools_arr, \%pools;
1821	
1822	    if($next_pool_id) {
1823	        last;
1824	    }
1825	  }
1826	
1827	  my $used_pools = join(', ', @used_pools_arr);
1828	
1829	  #Lock table for read
1830	  $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write');
1831	  #get active address and delete from pool
1832	  # Select from active users and reserv ips
1833	  $self->query2("SELECT c.framed_ip_address
1834	  FROM dv_calls c
1835	  INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id)
1836	  WHERE np.pool_id in ( $used_pools )
1837	  GROUP BY c.framed_ip_address;"
1838	  );
1839	
1840	  $list = $self->{list};
1841	  $self->{USED_IPS} = 0;
1842	
1843	  my %pool = %{ $pools_arr[0] };
1844	
1845	  for (my $i = 0 ; $i <= $#pools_arr ; $i++) {
1846	    %pool = %{ $pools_arr[$i] };
1847	    foreach my $ip (@$list) {
1848	      if (exists($pool{ $ip->[0] })) {
1849	        delete($pool{ $ip->[0] });
1850	        $self->{USED_IPS}++;
1851	      }
1852	    }
1853	    last if (scalar(keys %pool) > 0);
1854	  }
1855	
1856	  my @ips_arr = keys %pool;
1857	  my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef;
1858	
1859	  if ($assign_ip) {
1860	    # Make reserv ip
1861	    if (! $attr->{SKIP_RESERV}) {
1862	      $self->online_add({ %$attr, 
1863	                          NAS_ID            => $nas_num,
1864	                          FRAMED_IP_ADDRESS => $assign_ip,
1865	                          NAS_IP_ADDRESS    => $nas_ip
1866	                        });
1867	    }
1868	   
1869	    $self->{db}->do('unlock tables');
1870	    if( $self->{errno} ) {
1871	      return -1;
1872	    }
1873	    else {
1874	      $assign_ip = int2ip($assign_ip);
1875	      return $assign_ip;
1876	    }
1877	  }
1878	  else {    # no addresses available in pools
1879	    $self->{db}->do('unlock tables');
1880	    if($next_pool_id) {
1881	      return $self->get_ip($nas_num, $nas_ip, { TP_IPPOOL => $next_pool_id });
1882	    }
1883	    elsif ($attr->{TP_IPPOOL}) {
1884	      return $self->get_ip($nas_num, $nas_ip, $attr);
1885	    }
1886	    else {
1887	      return -1;
1888	    }
1889	
1890	  }
1891	  return 0;
1892	}

 

Запомним цифру 200000 ip адресов. Движемся по коду и останавливаемся на самых интересных местах.

Предположим авторизацию проходит 130001 пользователь.

Есть в базе пулы ip адресов, сомневаюсь что они там все внесены по /24, поэтому возьмем из реального примера /19. Есть пробелы в знаниях с perl поэтому предположение, что если выполняется данная конструкция if ($next_pool_id) last то в хэш еще добавятся много элементов.

SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id
    FROM ippools
     WHERE ippools.id='$attr->{TP_IPPOOL}'
     ORDER BY ippools.priority

Обрабатываем полученные данные и формируем из них хэш ~8189 эл.

  my %pools = ();
1816	
1817	    for (my $i = $sip ; $i <= $sip + $count ; $i++) {
1818	      $pools{$i} = 1;
1819	    }
1820	    push @pools_arr, \%pools;
1821	
1822	    if($next_pool_id) {
1823	        last;
1824	    }

Тут даже с комментариями код. Лочим таблицы с активными пользователями на чтение а потом еще и на запись, для меня это странно но тут я могу что то упускать (не гуру я sql да и perl).

Вытягиваем ip адреса активных пользователей , их у нас там в данный момент 130000.

#Lock table for read
1830	  $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write');
1831	  #get active address and delete from pool
1832	  # Select from active users and reserv ips
1833	  $self->query2("SELECT c.framed_ip_address
1834	  FROM dv_calls c
1835	  INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id)
1836	  WHERE np.pool_id in ( $used_pools )
1837	  GROUP BY c.framed_ip_address;"
1838	  );

Далее происходит магия поиска свободного ip адреса методом вычитанием из всех сформированных в хэш и активных активных на текущий момент.

 

$list = $self->{list};
1841	  $self->{USED_IPS} = 0;
1842	
1843	  my %pool = %{ $pools_arr[0] };
1844	
1845	  for (my $i = 0 ; $i <= $#pools_arr ; $i++) {
1846	    %pool = %{ $pools_arr[$i] };
1847	    foreach my $ip (@$list) {
1848	      if (exists($pool{ $ip->[0] })) {
1849	        delete($pool{ $ip->[0] });
1850	        $self->{USED_IPS}++;
1851	      }
1852	    }
1853	    last if (scalar(keys %pool) > 0);
1854	  }
1855	
1856	  my @ips_arr = keys %pool;
1857	  my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef;
1858	
1859	  if ($assign_ip) {
1860	    # Make reserv ip
1861	    if (! $attr->{SKIP_RESERV}) {
1862	      $self->online_add({ %$attr, 
1863	                          NAS_ID            => $nas_num,
1864	                          FRAMED_IP_ADDRESS => $assign_ip,
1865	                          NAS_IP_ADDRESS    => $nas_ip
1866	                        });
1867	    }
1868	   
1869	    $self->{db}->do('unlock tables');

Фух, выдохнул скрипт, отдал IP и разлочил таблицу, но не тут то было, прилетел 130002 и давай по новой. В предыдущих версиях данного модуля было более интереснее, но как видим телодвижения разработчиков были.

 

прошло 2 года списка недочётов так и не получили

Ну не стоит у меня на тягомотину, скучно очень ...

ps:/ Помните было от меня сообщение, как ваши клиенты оставляли свои логины и пароли от своих реальных биллинговых систем, которые получить не составляло реального труда. Я как порядочный человек проверил свою теорию на каком то Киевском ISP уже не помню название, потом на луганском ISP естественно ничего не трогая, получив accept я закрывал соединения, логи уже наверное потерлись у ребят, да и IP были восточных товарищей. Ваша оплошность в данной ситуации не велика, кто же заставлял товарищей администраторов в демке оставлять о себе инфу. Я отнесся по человечески и эту инфу нигде не разглашал, а сразу передал ее вам.

Возможно когда то я всерьез поставлю цель заняться тестированием вашего продукта, но явно не ближайшие 2 года.

ps:/ ps:/ Asmodeus, благодаря вам мне пришлось разобраться немного с perl, опыт был полезен, спасибо.

Share this post


Link to post
Share on other sites

- конечно все "плохо" и 200 тисячники это по Вашим словам мелкие ISP.

Начало попахивать ...

 

прошло 2 года списка недочётов так и не получили

Не до такой степени мне скучно.

 

Вступаю в жуткий оффтоп, прошу прощения.

Рассмотрим код из модуля авторизации функцию выдачи IP адресов, с позволения автора abills.

#*******************************************************************
1759	# returns:
1760	#
1761	#   -2 - No Free Address in TP pool
1762	#   -1 - No free address in nas pool
1763	#    0 - No address pool using nas servers ip address
1764	#   192.168.101.1 - assign ip address
1765	#
1766	# get_ip($self, $nas_num, $nas_ip)
1767	#*******************************************************************
1768	sub get_ip {
1769	  my $self = shift;
1770	  my ($nas_num, $nas_ip, $attr) = @_;
1771	
1772	  if (! $self->{LOGINS}) {
1773	        $self->{USER_NAME} = '' if (! $self->{USER_NAME});
1774	    $self->query2("SELECT INET_NTOA(framed_ip_address) AS ip FROM dv_calls 
1775	       WHERE user_name='$self->{USER_NAME}' 
1776	         AND status=11 
1777	         AND nas_id='$nas_num'
1778	         AND framed_ip_address > 0;");
1779	    if ($self->{TOTAL} > 0) {
1780	      return $self->{list}->[0]->[0];
1781	    }
1782	  }
1783	
1784	  if ($attr->{TP_IPPOOL}) {
1785	    $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id
1786	    FROM ippools
1787	     WHERE ippools.id='$attr->{TP_IPPOOL}'
1788	     ORDER BY ippools.priority;"
1789	    );
1790	    delete($attr->{TP_IPPOOL});
1791	  }
1792	  else {
1793	    $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id 
1794	    FROM ippools, nas_ippools
1795	     WHERE ippools.id=nas_ippools.pool_id AND nas_ippools.nas_id='$nas_num'
1796	     ORDER BY ippools.priority;"
1797	    );
1798	  }
1799	
1800	  if ($self->{TOTAL} < 1) {
1801	    return 0;
1802	  }
1803	
1804	  my @pools_arr      = ();
1805	  my $list           = $self->{list};
1806	  my @used_pools_arr = ();
1807	  my $next_pool_id   = 0;
1808	
1809	  foreach my $line (@$list) {
1810	    my $sip   = $line->[0];
1811	    my $count = $line->[1];
1812	    my $id    = $line->[2];
1813	    $next_pool_id = $line->[3];
1814	    push @used_pools_arr, $id;
1815	    my %pools = ();
1816	
1817	    for (my $i = $sip ; $i <= $sip + $count ; $i++) {
1818	      $pools{$i} = 1;
1819	    }
1820	    push @pools_arr, \%pools;
1821	
1822	    if($next_pool_id) {
1823	        last;
1824	    }
1825	  }
1826	
1827	  my $used_pools = join(', ', @used_pools_arr);
1828	
1829	  #Lock table for read
1830	  $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write');
1831	  #get active address and delete from pool
1832	  # Select from active users and reserv ips
1833	  $self->query2("SELECT c.framed_ip_address
1834	  FROM dv_calls c
1835	  INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id)
1836	  WHERE np.pool_id in ( $used_pools )
1837	  GROUP BY c.framed_ip_address;"
1838	  );
1839	
1840	  $list = $self->{list};
1841	  $self->{USED_IPS} = 0;
1842	
1843	  my %pool = %{ $pools_arr[0] };
1844	
1845	  for (my $i = 0 ; $i <= $#pools_arr ; $i++) {
1846	    %pool = %{ $pools_arr[$i] };
1847	    foreach my $ip (@$list) {
1848	      if (exists($pool{ $ip->[0] })) {
1849	        delete($pool{ $ip->[0] });
1850	        $self->{USED_IPS}++;
1851	      }
1852	    }
1853	    last if (scalar(keys %pool) > 0);
1854	  }
1855	
1856	  my @ips_arr = keys %pool;
1857	  my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef;
1858	
1859	  if ($assign_ip) {
1860	    # Make reserv ip
1861	    if (! $attr->{SKIP_RESERV}) {
1862	      $self->online_add({ %$attr, 
1863	                          NAS_ID            => $nas_num,
1864	                          FRAMED_IP_ADDRESS => $assign_ip,
1865	                          NAS_IP_ADDRESS    => $nas_ip
1866	                        });
1867	    }
1868	   
1869	    $self->{db}->do('unlock tables');
1870	    if( $self->{errno} ) {
1871	      return -1;
1872	    }
1873	    else {
1874	      $assign_ip = int2ip($assign_ip);
1875	      return $assign_ip;
1876	    }
1877	  }
1878	  else {    # no addresses available in pools
1879	    $self->{db}->do('unlock tables');
1880	    if($next_pool_id) {
1881	      return $self->get_ip($nas_num, $nas_ip, { TP_IPPOOL => $next_pool_id });
1882	    }
1883	    elsif ($attr->{TP_IPPOOL}) {
1884	      return $self->get_ip($nas_num, $nas_ip, $attr);
1885	    }
1886	    else {
1887	      return -1;
1888	    }
1889	
1890	  }
1891	  return 0;
1892	}

 

Запомним цифру 200000 ip адресов. Движемся по коду и останавливаемся на самых интересных местах.

Предположим авторизацию проходит 130001 пользователь.

Есть в базе пулы ip адресов, сомневаюсь что они там все внесены по /24, поэтому возьмем из реального примера /19. Есть пробелы в знаниях с perl поэтому предположение, что если выполняется данная конструкция if ($next_pool_id) last то в хэш еще добавятся много элементов.

SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id
    FROM ippools
     WHERE ippools.id='$attr->{TP_IPPOOL}'
     ORDER BY ippools.priority

Обрабатываем полученные данные и формируем из них хэш ~8189 эл.

  my %pools = ();
1816	
1817	    for (my $i = $sip ; $i <= $sip + $count ; $i++) {
1818	      $pools{$i} = 1;
1819	    }
1820	    push @pools_arr, \%pools;
1821	
1822	    if($next_pool_id) {
1823	        last;
1824	    }

Тут даже с комментариями код. Лочим таблицы с активными пользователями на чтение а потом еще и на запись, для меня это странно но тут я могу что то упускать (не гуру я sql да и perl).

Вытягиваем ip адреса активных пользователей , их у нас там в данный момент 130000.

#Lock table for read
1830	  $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write');
1831	  #get active address and delete from pool
1832	  # Select from active users and reserv ips
1833	  $self->query2("SELECT c.framed_ip_address
1834	  FROM dv_calls c
1835	  INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id)
1836	  WHERE np.pool_id in ( $used_pools )
1837	  GROUP BY c.framed_ip_address;"
1838	  );

Далее происходит магия поиска свободного ip адреса методом вычитанием из всех сформированных в хэш и активных активных на текущий момент.

 

$list = $self->{list};
1841	  $self->{USED_IPS} = 0;
1842	
1843	  my %pool = %{ $pools_arr[0] };
1844	
1845	  for (my $i = 0 ; $i <= $#pools_arr ; $i++) {
1846	    %pool = %{ $pools_arr[$i] };
1847	    foreach my $ip (@$list) {
1848	      if (exists($pool{ $ip->[0] })) {
1849	        delete($pool{ $ip->[0] });
1850	        $self->{USED_IPS}++;
1851	      }
1852	    }
1853	    last if (scalar(keys %pool) > 0);
1854	  }
1855	
1856	  my @ips_arr = keys %pool;
1857	  my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef;
1858	
1859	  if ($assign_ip) {
1860	    # Make reserv ip
1861	    if (! $attr->{SKIP_RESERV}) {
1862	      $self->online_add({ %$attr, 
1863	                          NAS_ID            => $nas_num,
1864	                          FRAMED_IP_ADDRESS => $assign_ip,
1865	                          NAS_IP_ADDRESS    => $nas_ip
1866	                        });
1867	    }
1868	   
1869	    $self->{db}->do('unlock tables');

Фух, выдохнул скрипт, отдал IP и разлочил таблицу, но не тут то было, прилетел 130002 и давай по новой. В предыдущих версиях данного модуля было более интереснее, но как видим телодвижения разработчиков были.

 

прошло 2 года списка недочётов так и не получили

Ну не стоит у меня на тягомотину, скучно очень ...

ps:/ Помните было от меня сообщение, как ваши клиенты оставляли свои логины и пароли от своих реальных биллинговых систем, которые получить не составляло реального труда. Я как порядочный человек проверил свою теорию на каком то Киевском ISP уже не помню название, потом на луганском ISP естественно ничего не трогая, получив accept я закрывал соединения, логи уже наверное потерлись у ребят, да и IP были восточных товарищей. Ваша оплошность в данной ситуации не велика, кто же заставлял товарищей администраторов в демке оставлять о себе инфу. Я отнесся по человечески и эту инфу нигде не разглашал, а сразу передал ее вам.

Возможно когда то я всерьез поставлю цель заняться тестированием вашего продукта, но явно не ближайшие 2 года.

ps:/ ps:/ Asmodeus, благодаря вам мне пришлось разобраться немного с perl, опыт был полезен, спасибо.

 

 

пример вообще не в тему и разяснения тоже

 

1 что бы произошло то что Вы пишите провайдер должен развадать 130000 ип /15 на одном сервере доступа и они должны быть все онлайн.

2 учитывая что у провайдера в среднем от 5 до 20 тис на одном сервере эта цифра уменьшается в разы.

3 если все таки не успевает универсальный механизм обработки раздать ип, можно адаптировать его к опрделенным тарифным планам провайдера. То что Вы показали это прямо с коробки скачал и поставил за 15 минут все без адаптаций.

4 провайдеры оставляли пароли в демо системе от своего аккаунта в сапорт системе, перепутав страницы входа

 

p.s.

 

- Если Вы так круто с этим разбираетесь, почему же за 3 года так и не предоставили более оптимальный механизм для опен сорс сообщества ?

Share this post


Link to post
Share on other sites

- Если Вы так круто с этим разбираетесь, почему же за 3 года так и не предоставили более оптимальный механизм для опен сорс сообщества ?

Я бы с огромным удовольствием предоставил, но мое "но" будет звучать как оправдание.

Дайте пищу для размышления по поводу 200к и репликации.

Asmodeus, никто не спорит что вы выполнили огромный труд и для open source сообщества, лично мне бы хотелось увидеть форк вашего продукта с db postgresql и некоторыми компонентами на си. Гидра не зря использует mongodb кроме oracle db.

ps:// Узкие места abills с 2011 года я своей жопой как по кочкам все ощутил, и даже больно иногда становится как вспоминаю. =)

ps:// ps:// Еще немного офтопа, как все эти 200к конектятся после аварий, механизм же предусматривали?

Share this post


Link to post
Share on other sites

- Если Вы так круто с этим разбираетесь, почему же за 3 года так и не предоставили более оптимальный механизм для опен сорс сообщества ?

Я бы с огромным удовольствием предоставил, но мое "но" будет звучать как оправдание.

Дайте пищу для размышления по поводу 200к и репликации.

Asmodeus, никто не спорит что вы выполнили огромный труд и для open source сообщества, лично мне бы хотелось увидеть форк вашего продукта с db postgresql и некоторыми компонентами на си. Гидра не зря использует mongodb кроме oracle db.

ps:// Узкие места abills с 2011 года я своей жопой как по кочкам все ощутил, и даже больно иногда становится как вспоминаю. =)

 

1 для распределённых решений мы уже боле года как разаработали сателиты с использованием mongodb

2 компоненты на C скорости не прибавят (5-8% я считаю это не существенно), а ошибок добавят и время решения растянут

- есть уже наработки компонентов на go но пока чисто в тестовых целях, провадерам до 50 тис они в принципе не нужны, ну и финансовые затраты выростают в разы

3 postgresql есть ценник, но также пока никто не решился, форкать никто не будет слишком много все уже в системе, а как показала практика форки не успевают за основным заработчиком.

4 я ж писал что за 5 лет много изменилось, а за последних пол года мы вообще переписали большую часть системы, обложив много моментов тестами. Ну и как тут уже упоминалось если хотите чтобы все было хорошо закажите установку и сопровождение, а Вы решили самостоятельно все делать.

 

ps:// ps:// Еще немного офтопа, как все эти 200к конектятся после аварий, механизм же предусматривали?

 

Если не ипользуется технология сателитов то сервера доступа запускаются по очереди

Share this post


Link to post
Share on other sites

3 postgresql есть ценник, но также пока никто не решился, форкать никто не будет слишком много все уже в системе, а как показала практика форки не успевают за основным заработчиком.

Если автор вкорячил в код все возмодные методы вендорлока на определенную БД, какой смысл платить ему второй раз чтобы он их оттуда удалил? Дурный нема.

Share this post


Link to post
Share on other sites

3 postgresql есть ценник, но также пока никто не решился, форкать никто не будет слишком много все уже в системе, а как показала практика форки не успевают за основным заработчиком.

Если автор вкорячил в код все возмодные методы вендорлока на определенную БД, какой смысл платить ему второй раз чтобы он их оттуда удалил? Дурный нема.

 

если использовать базу как хранилище, без использования сильных сторон, тогда смысл теряется вообще в такой работе.

 

при поддержке PG абоненты обязательно захотят

- дорожные карты при нештатных ситуациях

- кластеризацию

- оптимизации и т д

Share this post


Link to post
Share on other sites

если использовать базу как хранилище, без использования сильных сторон, тогда смысл теряется вообще в такой работе.

 

Чем вам не угодили хранилищные функции СУБД? Заметим, по части надежности PG даст 100 очков вперед мысклю и его производным.

 

- кластеризацию

PG не умеет в кластеры??? Или может быть кому-то просто лень почитать доки.

 

- оптимизации

Оптимизация этот бесконечный сизифов труд. Но если на него забить, то рано или поздно проект превращается в копролит.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now