Кластеризация Opensips И Сокрытие Топологии В Sip Сети Оператора

Наша сеть построена на OpenSIPS 1.8. Основная нагрузка на opensips приходится на обработку регистраций, в отличие от звонков, у которых нагрузка гораздо меньшая.

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

Планировалось обрабатывать вызовы целиком на узлах.

Тогда же возникла идея скрыть топологию.

Opensips имеет для этого два механизма.

Первая — это недавно представленная функция topology_hiding() в диалоговом модуле.

Второй — модуль b2b_logic, реализующий полноценный b2b. После тестирования было принято окончательное решение использовать b2b_logic. Однако мы столкнулись с ограничениями в его функциональности.

Например, не было возможности полноценно работать с SIP-заголовками (удалять, добавлять, изменять), а также не было режима прозрачной аутентификации.

Аутентификация на b2b-сервере была возможна, но я не смог переслать ее на следующий b2b-сервер.

Написаны соответствующие патчи к основному коду, которые разработчики opensips обещают включить в релиз 1.9. Также следует отметить, что opensips построен таким образом, что вы не можете одновременно использовать b2b и прокси на одном работающем экземпляре.

В результате родилась схема, которая стала у нас работать.



Кластеризация Opensips и сокрытие топологии в SIP сети оператора

B2B используется для балансировки SIP-трафика между узлами кластера, скрывает топологию сети в обоих направлениях, нормализует и фильтрует некоторые SIP-заголовки, отвечает за определение NAT, поддерживает протоколы SIP/UDP, SIP/TCP, SIP/TLS, а также СТУН-сервер.

Opensips используются в качестве узлов в режиме прокси; они отвечают за службу определения местоположения клиентов (location), нормализуют, настраивают SIP-заголовки от клиентов, которые неправильно поддерживают протокол SIP, управляют проксированием RTP и обрабатывают NAT. В этой схеме SIP-пакет проходит от клиента к программному коммутатору класса 5 следующим образом: софтсвитч -> балансировщик -> узел -> балансировщик -> клиент или в обратном порядке.

Каждый opensips размещается на собственном аппаратном сервере, и между серверами настроена репликация postgresql master-master. Наши файлы конфигурации генерируются с использованием m4. Каждый сервер содержит файл со статическими переменными, специфичными для этого сервера, а общие части конфигурации хранятся в git. В упрощенном виде представляю конфигурации здесь.

балансировщик.

cfg

   

####### Global Parameters ############################################## debug=3 log_stderror=no log_facility=LOG_LOCAL0 fork=yes children=3 disable_tcp=no # TCP tcp_children=10 tcp_accept_aliases=yes tcp_send_timeout=5 tcp_connect_timeout=5 tcp_max_connections=4096 tcp_poll_method=epoll_et mhomed=1 port=5060 listen = udp:192.168.0.1:5060 listen = udp:8.8.8.8:5060 listen = tcp:192.168.0.1:5060 listen = tcp:8.8.8.8:5060 server_header="Server: Cool SBC" user_agent_header="User-Agent: Cool SBC" disable_core_dump=no ####### Modules Section ################################################ mpath="/usr/lib64/opensips/modules" ######################################################################## loadmodule "maxfwd.so" ######################################################################## modparam("maxfwd", "max_limit", 256) ######################################################################## loadmodule "sipmsgops.so" ######################################################################## ######################################################################## loadmodule "textops.so" ######################################################################## ######################################################################## loadmodule "stun.so" ######################################################################## modparam("stun","primary_ip","8.8.8.8") modparam("stun","primary_port","5060") modparam("stun","alternate_ip","192.168.0.1") modparam("stun","alternate_port","3478") ######################################################################## loadmodule "mi_fifo.so" ######################################################################## modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo") modparam("mi_fifo", "fifo_mode", 0666) modparam("mi_fifo", "fifo_group", "opensips") modparam("mi_fifo", "fifo_user", "opensips") modparam("mi_fifo", "reply_dir", "/tmp/") modparam("mi_fifo", "reply_indent", "\t") ######################################################################## loadmodule "db_postgres.so" ######################################################################## ######################################################################## loadmodule "avpops.so" ######################################################################## ######################################################################## loadmodule "rr.so" ######################################################################## modparam("rr", "append_fromtag", 1) modparam("rr", "enable_double_rr", 1) modparam("rr", "add_username", 1) ######################################################################## loadmodule "sl.so" ######################################################################## modparam("sl", "enable_stats", 1) ######################################################################## loadmodule "tm.so" ######################################################################## modparam("tm", "fr_timer", 30) modparam("tm", "fr_inv_timer", 120) modparam("tm", "wt_timer", 5) modparam("tm", "delete_timer", 2) modparam("tm", "T1_timer", 500) modparam("tm", "T2_timer", 4000) modparam("tm", "ruri_matching", 1) modparam("tm", "via1_matching", 1) modparam("tm", "unix_tx_timeout", 2) modparam("tm", "restart_fr_on_each_reply", 1) modparam("tm", "pass_provisional_replies", 0) modparam("tm", "syn_branch", 1) modparam("tm", "onreply_avp_mode", 0) modparam("tm", "disable_6xx_block", 0) modparam("tm", "enable_stats", 1) modparam("tm", "fr_timer_avp", "$avp(fr_timer)") ######################################################################## loadmodule "signaling.so" ######################################################################## ######################################################################## loadmodule "path.so" ######################################################################## modparam("path", "use_received", 1) modparam("path", "enable_double_path", 1) ######################################################################## loadmodule "domain.so" ######################################################################## modparam("domain", "db_url", " postgres://opensips:[email protected]/opensips ") modparam("domain", "db_mode", 1) modparam("domain", "domain_table", "domain") modparam("domain", "domain_col", "domain") ######################################################################## loadmodule "cachedb_local.so" ######################################################################## modparam("cachedb_local", "cache_table_size", 9) modparam("cachedb_local", "cache_clean_period", 86400) ######################################################################## loadmodule "b2b_entities.so" ######################################################################## modparam("b2b_entities", "db_url", " postgres://opensips:[email protected]/opensips_balancer ") modparam("b2b_entities", "db_mode", 1) modparam("b2b_entities", "server_hsize", 14) modparam("b2b_entities", "client_hsize", 14) modparam("b2b_entities", "script_req_route", "B2B_REQUEST") modparam("b2b_entities", "script_reply_route", "B2B_REPLY") modparam("b2b_entities", "b2b_key_prefix", "sbc") ######################################################################## loadmodule "b2b_logic.so" ######################################################################## modparam("b2b_logic", "db_url", " postgres://opensips:[email protected]/opensips_balancer ") modparam("b2b_logic", "db_mode", 1) modparam("b2b_logic", "hash_size", 14) modparam("b2b_logic", "cleanup_period", 60) modparam("b2b_logic", "use_init_sdp", 1) modparam("b2b_logic", "init_callid_hdr", "x-orig-ci") modparam("b2b_logic", "max_duration", 86400) modparam("b2b_logic", "b2bl_from_spec_param", "$avp(hdrfrom)") modparam("b2b_logic", "custom_headers", "Replaces;x-orig-to;x-src-uri") ######################################################################## loadmodule "nathelper.so" ######################################################################## ######################################################################## loadmodule "dispatcher.so" ######################################################################## modparam("dispatcher", "db_url", " postgres://opensips:[email protected]/opensips_balancer ") modparam("dispatcher", "flags", 2) modparam("dispatcher", "force_dst", 0) modparam("dispatcher", "use_default", 0) modparam("dispatcher", "dst_avp", "$avp(disp_dst)") modparam("dispatcher", "attrs_avp", "$avp(disp_attrs)") modparam("dispatcher", "grp_avp", "$avp(disp_grp)") modparam("dispatcher", "cnt_avp", "$avp(disp_cnt)") modparam("dispatcher", "hash_pvar", "$avp(disp_hash)") modparam("dispatcher", "ds_ping_method", "OPTIONS") modparam("dispatcher", "ds_ping_from", " sip:[email protected] ") modparam("dispatcher", "ds_ping_interval", 1) modparam("dispatcher", "ds_probing_sock", " udp:192.168.0.1:5060 ") modparam("dispatcher", "ds_probing_threshhold", 1) modparam("dispatcher", "ds_probing_mode", 0) modparam("dispatcher", "options_reply_codes", "200") modparam("dispatcher", "table_name", "dispatcher") modparam("dispatcher", "setid_col", "setid") modparam("dispatcher", "destination_col", "destination") modparam("dispatcher", "flags_col", "flags") modparam("dispatcher", "weight_col", "weight") modparam("dispatcher", "attrs_col", "attrs") modparam("dispatcher", "socket_col", "socket") ######################################################################## route {

Теги: #opensips кластер #opensips #Разработка систем связи
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.