Наша сеть построена на OpenSIPS 1.8. Основная нагрузка на opensips приходится на обработку регистраций, в отличие от звонков, у которых нагрузка гораздо меньшая.
Поэтому, когда количество регистраций в нашей сети перешагнуло определенный порог, было принято решение о горизонтальном масштабировании opensips. Так родился проект кластера opensips. Идея заключалась в том, чтобы создать максимально простой балансировщик, который бы распределял вызовы между узлами кластера.
Планировалось обрабатывать вызовы целиком на узлах.
Тогда же возникла идея скрыть топологию.
Opensips имеет для этого два механизма.
Первая — это недавно представленная функция topology_hiding() в диалоговом модуле.
Второй — модуль b2b_logic, реализующий полноценный b2b. После тестирования было принято окончательное решение использовать b2b_logic. Однако мы столкнулись с ограничениями в его функциональности.
Например, не было возможности полноценно работать с SIP-заголовками (удалять, добавлять, изменять), а также не было режима прозрачной аутентификации.
Аутентификация на b2b-сервере была возможна, но я не смог переслать ее на следующий b2b-сервер.
Написаны соответствующие патчи к основному коду, которые разработчики opensips обещают включить в релиз 1.9. Также следует отметить, что opensips построен таким образом, что вы не можете одновременно использовать b2b и прокси на одном работающем экземпляре.
В результате родилась схема, которая стала у нас работать.
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
Теги: #opensips кластер #opensips #Разработка систем связи####### 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 {
-
Яндекс.карты Для Iphone
19 Oct, 24 -
Хабр - Мой!
19 Oct, 24 -
Хранение Энергии В Виде Льда
19 Oct, 24 -
Тим О`рейли: Делайте То, Что Важно!
19 Oct, 24