В данном разделе описываются основные понятия и настройка георезерва (географического резервирования).

Общие положения

Георезерв применяется для:

  • Обработки ошибки полного выхода из строя/недоступности для абонентов локации ECSS-10;
  • Обслуживание клиентов резервируемого гео-сайта в случае проблем, недоступности по сети и т.п.

Основные понятия

  • Нода — представляет собой виртуальную машину Erlang и является элементом вычислительного кластера ECSS-10. Ноды в ECSS-10 типизируются по выполняемому на них функционалу. Однотипные ноды объединяются в кластера соответствующего типа. Пример, кластер Core состоит из нод, выполняющих функцию ядра коммутационной системы.
  • Кластер — совокупность элементов одного типа, выполняющих, с точки зрения системы, единую функцию. С их помощью описывается вычислительная топология системы. В нашей системы элементом кластера является нода. Кластер существует до тех пор, пока в его состав входит хотя бы одна нода.
  • Хост — устройство, подключенное к сети и использующее протоколы TCP/IP (компьютер, сервер и т.п.).
  • Сайт — один или более хостов, расположенных в одном месте (помещении/здании), между которыми установлены высокоскоростные каналы связи. Ограничениями по скорости передачи данных можно пренебречь.
  • Логические ресурсы ESCC-10 — виртуальные АТС-домены с информацией о маршрутизации, абонентах, абонентских настройках, транках, ограничениях.
  • Мастер-сайт логического ресурса — сайт, который является владельцем логического ресурса ESCC-10.
  • Бэкап-сайт логического ресурса — сайт, на который резервируется информация логического ресурса ESCC-10.
  • Активное состояние логического ресурса — состояние, при котором сайт обслуживает трафик поступающий в рамках логического ресурса.
  • Пассивное состояние логического ресурса — состояние, при котором сайт не обслуживает трафик поступающий в рамках логического ресурса.
  • Федерация — механизм, посредством которого осуществляется обмен сообщениями между сайтами.

Возможные схемы резервирования

Резервирование может быть как однонаправленным, так и двунаправленным пример:

В примере №1 SITE_1 резервируется на SITE_2 и SITE_3, SITE_2 и SITE_3 в свою очередь резервирует друг друга.
В примере №2 описана одна из возможных конфигураций с использованием пяти гео сайтов, стрелками указываются направления резервирования.
Специальных ограничений на количество гео-сайтов в системе не устанавливается.
Ниже описывается пошаговая настройка резервирования между двумя гео сайтами.

Пошаговая настройка георезерва

Исходим из того, что у нас есть два сайта: <SITE_1> с нодами DS <NODE_11>, <NODE_12> (например, сайт ecss10 с нодами ds1@ecss1, ds1@ecss2); <SITE_2> с нодами DS <NODE_21>, <NODE_22>.

  1. На каждом из сайтов независимо устанавливаем и настраиваем ECSS-10 по руководству по инсталляции и начальному конфигурированию.
  2. Настройка dnsmasq
    На каждом из хостов <SITE_1> и <SITE_2> добавляем в /etc/dnsmasq.d/ecss-broker следующие правила соответствия:

    Для <SITE_1>:

    primary.<SITE_2>.broker.ecss - IP адрес хоста 1 на гео-кластере 2;
    secondary.<SITE_2>.broker.ecss - IP адрес хоста 2 на гео-кластере 2;

    Для <SITE_2>:

    primary.<SITE_1>.broker.ecss - IP адрес хоста 1 на гео-кластере 1;
    secondary.<SITE_1>.broker.ecss - IP адрес хоста 2 на гео-кластере 1;

    Пример:

    address=/primary.site1.broker.ecss/192.168.23.110
    address=/secondary.site1.broker.ecss/192.168.23.111
    • Перезапускаем dnsmasq на всех хостах <SITE_1> и <SITE_2>

      sudo systemctl restart dnsmasq.service
  3. На каждом из хостов <SITE_1> и <SITE_2> настраиваем mycelium
    Файл настройки mycelium находится по пути /etc/ecss/ecss-mycelium/mycelium1.config
    • В секции mycelium_client добавляем realm до соседнего сайта:
      mycelium_client <SITE_1>

      {mycelium_client, [
          {realms,  [
              {local, "/ssw", "ssw", "ssw", 2, []},
              {remote_geo_site, "/ssw", "ssw", "ssw", 10, [
                  {<SITE_2>_l, 9, {host, "primary.<SITE_2>.broker.ecss"},  5672, 10},
                  {<SITE_2>_r, 8, {host, "secondary.<SITE_2>.broker.ecss"},  5672, 10}
              ]}
          ]}
      ]},

      {mycelium_client, [
          {realms,  [
              {local, "/ssw", "ssw", "ssw", 2, []},
              {remote_geo_site, "/ssw", "ssw", "ssw", 10, [
                  {<SITE_1>_l, 9, {host, "primary.<SITE_1>.broker.ecss"},  5672, 10},
                  {<SITE_1>_r, 8, {host, "secondary.<SITE_1>.broker.ecss"},  5672, 10}
              ]}
          ]}
      ]},
    • Настройка секции mycelium_federation

      Описание секции значений федерации:

      {values, #{
              <<"<SITE_LOCAL>">> => <<"<SITE>">>,
              <<"<SITE_REMOTE>">> => <<"<SITE>">>,
              <<"<NODE_DS1>">> => <<"ds1@ecss1">>,
              <<"<NODE_DS2>">> => <<"ds1@ecss2">>,
              <<"<CLUSTER_CORE>">> => <<"core1">>,
              <<"<CLUSTER_SIP>">> => <<"sip1">>
              }},

      <SITE_LOCAL> — название локального сайта в формате <<"<SITE>">> (например <<"<SITE_LOCAL>">> => <<"site1">>);
      <SITE_REMOTE> — название удаленного сайта в формате <<"<SITE>">> (например <<"<SITE_REMOTE>">> => <<"site2">>);
      <NODE_DS1> — название первой ноды DS — по умолчанию <<"ds1@ecss1">>;
      <NODE_DS2> — название второй ноды DS — по умолчанию <<"ds1@ecss2">>;
      <CLUSTER_CORE> — название кластера ядра — по умолчанию <<"core1">>;
      <CLUSTER_SIP> — название кластера SIP адаптера — по умолчанию <<"sip1">>.

      В секцию mycelium_federation добавляем следующие правила (если секция отсутствует, добавьте её), секция values заполняется в соответствии с описанием, приведенным выше:

       mycelium_federation <SITE_1>
      {mycelium_federation, [
          {values, #{
              <<"<SITE_LOCAL>">> => <<"<SITE_1>">>,
              <<"<SITE_REMOTE>">> => <<"<SITE_2>">>,
              <<"<NODE_DS1>">> => <<"ds1@ecss1">>,
              <<"<NODE_DS2>">> => <<"ds1@ecss2">>,
              <<"<CLUSTER_CORE>">> => <<"core1">>,
              <<"<CLUSTER_SIP>">> => <<"sip1">>
              }},
          {defaults, #{
              uplink => #{
                 realm => remote_geo_site          % имя рилма, который будет использован для подключения к удаленному брокеру
                 },
             exchange => #{
                 type => <<"direct">>,
                 args => []},
             queue => #{
                 passive => false,
                 durable => false,
                 exclusive => false,
                 auto_delete => true,
                 args => [
                     {<<"lifetime_interval">>, 16#22, 1000},%uint32
                     {<<"max_message_num">>, 16#32, 10000},%uint64
                     {<<"overflow_warning">>, 16#08, true},%boolean
                     {<<"shuffle_subscriptions">>, 16#08, false}]},%boolean
             subscribe => #{
                 acquire_mode => 0,
                 accept_mode => 0,
                 exclusive => false,
                 flow_unit_byte => infinity,
                 flow_unit_message => infinity,
                 args => [{<<"random_location">>, 16#08, true}]}}},
         {uplinks, [
                  %% ===========================================================%%
                  %% Настройки федерации для ECSS-PA-SIP (<SITE_LOCAL>)         %%
                  %% Настройка репликации с сайта <SITE_LOCAL> -> <SITE_REMOTE> %%
                  %% ===========================================================%%
                  #{%Очередь для обмена регистрациями 
                      name => <<"ecss.<SITE_LOCAL>.<CLUSTER_SIP>.sync">>,
                      destination => {exchange, <<"sync.sip.ex">>, <<"sync.<SITE_LOCAL>.<CLUSTER_SIP>.rk">>},
                      exchange => [#{name => <<"sync.sip.ex">>}],
                      queue => [#{name => <<"sync.sip.q">>, auto_delete => true, args => []}],
                      bind => [#{exchange => <<"sync.sip.ex">>, binding_key => <<"sync.sip.rk">>, queue => <<"sync.sip.q">>}],
                      subscribe => [#{queue => <<"sync.sip.q">>}]},
                  %% ===========================================================%%
                  %% Настройки федерации для ECSS-DS (<SITE_LOCAL>)             %%
                  %% Настройка репликации с сайта <SITE_LOCAL> -> <SITE_REMOTE> %%
                  %% ===========================================================%%
                  #{%Альтернативная очередь для сайта <SITE_LOCAL>
                      name => <<"ecss.<SITE_LOCAL>.sync.db.alt">>,
                      destination => {exchange, <<"ecss.sync.db.alt.ex">>, <<"ecss.<SITE_LOCAL>.sync.db.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_LOCAL>.sync.db.alt.q">>, auto_delete => true, args => []}],
                      bind => [#{exchange => <<"ecss.sync.db.alt.ex">>, binding_key => <<"ecss.<SITE_LOCAL>.sync.db.rk">>, queue => <<"ecss.<SITE_LOCAL>.sync.db.alt.q">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_LOCAL>.sync.db.alt.q">>}]},
                  #{%Private exchange <NODE_DS1>
                      name => <<"ecss.sync.db.<NODE_DS1>">>,
                      destination => {exchange, <<"ecss.sync.db.ex">>, <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.ex">>, alternate_exchange => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.q">>, auto_delete => true, args => []}],
                      bind => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.q">>, exchange => <<"ecss.sync.db.ex">>, binding_key => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.rk">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.q">>}]},
                  #{%Private exchange <NODE_DS2>
                      name => <<"ecss.sync.db.<NODE_DS2>">>,
                      destination => {exchange, <<"ecss.sync.db.ex">>, <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.ex">>, alternate_exchange => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.q">>, auto_delete => true, args => []}],
                      bind => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.q">>, exchange => <<"ecss.sync.db.ex">>, binding_key => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.rk">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.q">>}]},
                  %% ===========================================================%%
                  %% Настройки федерации для ECSS-DS (<SITE_LOCAL>)             %%
                  %% Настройка репликации с сайта <SITE_LOCAL> -> <SITE_REMOTE> %%
                  %% ===========================================================%%
                  #{%Альтернативная очередь для сайта <SITE_LOCAL>
                      name => <<"ecss.<SITE_REMOTE>.sync.db.alt">>,
                      max_hops => 2,
                      destination => {exchange, <<"ecss.sync.db.ex">>, <<"ecss.<SITE_REMOTE>.sync.db.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.ex">>, alternate_exchange => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_REMOTE>.sync.db.q">>, auto_delete => true, args => []}],
                      bind => [#{exchange => <<"ecss.sync.db.ex">>, binding_key => <<"ecss.<SITE_REMOTE>.sync.db.rk">>, queue => <<"ecss.<SITE_REMOTE>.sync.db.q">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_REMOTE>.sync.db.q">>}]}
         ]}]
      },
       mycelium_federation <SITE_2>
      {mycelium_federation, [
          {values, #{
              <<"<SITE_LOCAL>">> => <<"<SITE_2>">>,
              <<"<SITE_REMOTE>">> => <<"<SITE_1>">>,
              <<"<NODE_DS1>">> => <<"ds1@ecss1">>,
              <<"<NODE_DS2>">> => <<"ds1@ecss2">>,
              <<"<CLUSTER_CORE>">> => <<"core1">>,
              <<"<CLUSTER_SIP>">> => <<"sip1">>
              }},
          {defaults, #{
              uplink => #{
                 realm => remote_geo_site          % имя рилма, который будет использован для подключения к удаленному брокеру
                 },
             exchange => #{
                 type => <<"direct">>,
                 args => []},
             queue => #{
                 passive => false,
                 durable => false,
                 exclusive => false,
                 auto_delete => true,
                 args => [
                     {<<"lifetime_interval">>, 16#22, 1000},%uint32
                     {<<"max_message_num">>, 16#32, 10000},%uint64
                     {<<"overflow_warning">>, 16#08, true},%boolean
                     {<<"shuffle_subscriptions">>, 16#08, false}]},%boolean
             subscribe => #{
                 acquire_mode => 0,
                 accept_mode => 0,
                 exclusive => false,
                 flow_unit_byte => infinity,
                 flow_unit_message => infinity,
                 args => [{<<"random_location">>, 16#08, true}]}}},
         {uplinks, [
                  %% ===========================================================%%
                  %% Настройки федерации для ECSS-PA-SIP (<SITE_LOCAL>)         %%
                  %% Настройка репликации с сайта <SITE_LOCAL> -> <SITE_REMOTE> %%
                  %% ===========================================================%%
                  #{%Очередь для обмена регистрациями 
                      name => <<"ecss.<SITE_LOCAL>.<CLUSTER_SIP>.sync">>,
                      destination => {exchange, <<"sync.sip.ex">>, <<"sync.<SITE_LOCAL>.<CLUSTER_SIP>.rk">>},
                      exchange => [#{name => <<"sync.sip.ex">>}],
                      queue => [#{name => <<"sync.sip.q">>, auto_delete => true, args => []}],
                      bind => [#{exchange => <<"sync.sip.ex">>, binding_key => <<"sync.sip.rk">>, queue => <<"sync.sip.q">>}],
                      subscribe => [#{queue => <<"sync.sip.q">>}]},
                  %% ===========================================================%%
                  %% Настройки федерации для ECSS-DS (<SITE_LOCAL>)             %%
                  %% Настройка репликации с сайта <SITE_LOCAL> -> <SITE_REMOTE> %%
                  %% ===========================================================%%
                  #{%Альтернативная очередь для сайта <SITE_LOCAL>
                      name => <<"ecss.<SITE_LOCAL>.sync.db.alt">>,
                      destination => {exchange, <<"ecss.sync.db.alt.ex">>, <<"ecss.<SITE_LOCAL>.sync.db.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_LOCAL>.sync.db.alt.q">>, auto_delete => true, args => []}],
                      bind => [#{exchange => <<"ecss.sync.db.alt.ex">>, binding_key => <<"ecss.<SITE_LOCAL>.sync.db.rk">>, queue => <<"ecss.<SITE_LOCAL>.sync.db.alt.q">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_LOCAL>.sync.db.alt.q">>}]},
                  #{%Private exchange <NODE_DS1>
                      name => <<"ecss.sync.db.<NODE_DS1>">>,
                      destination => {exchange, <<"ecss.sync.db.ex">>, <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.ex">>, alternate_exchange => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.q">>, auto_delete => true, args => []}],
                      bind => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.q">>, exchange => <<"ecss.sync.db.ex">>, binding_key => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.rk">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS1>.sync.db.reply.q">>}]},
                  #{%Private exchange <NODE_DS2>
                      name => <<"ecss.sync.db.<NODE_DS2>">>,
                      destination => {exchange, <<"ecss.sync.db.ex">>, <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.ex">>, alternate_exchange => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.q">>, auto_delete => true, args => []}],
                      bind => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.q">>, exchange => <<"ecss.sync.db.ex">>, binding_key => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.rk">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_LOCAL>.<NODE_DS2>.sync.db.reply.q">>}]},
                  %% ===========================================================%%
                  %% Настройки федерации для ECSS-DS (<SITE_LOCAL>)             %%
                  %% Настройка репликации с сайта <SITE_LOCAL> -> <SITE_REMOTE> %%
                  %% ===========================================================%%
                  #{%Альтернативная очередь для сайта <SITE_LOCAL>
                      name => <<"ecss.<SITE_REMOTE>.sync.db.alt">>,
                      max_hops => 2,
                      destination => {exchange, <<"ecss.sync.db.ex">>, <<"ecss.<SITE_REMOTE>.sync.db.rk">>},
                      exchange => [#{name => <<"ecss.sync.db.ex">>, alternate_exchange => <<"ecss.sync.db.alt.ex">>, type => <<"x-random-uniform">>}],
                      queue => [#{name => <<"ecss.<SITE_REMOTE>.sync.db.q">>, auto_delete => true, args => []}],
                      bind => [#{exchange => <<"ecss.sync.db.ex">>, binding_key => <<"ecss.<SITE_REMOTE>.sync.db.rk">>, queue => <<"ecss.<SITE_REMOTE>.sync.db.q">>}],
                      subscribe => [#{queue => <<"ecss.<SITE_REMOTE>.sync.db.q">>}]}
         ]}]
      },
  4. Настройка гео-сайта <SITE_1>
    • Устанавливаем имя гео-сайта системы <SITE_1>:

      antoniy@[restfs1@ecss1]:/$ /system/geo-backup/properties/set site <SITE_1>
      Property "site" successfully changed from: 
      ecss10
         to
      <SITE_1>.
    • Указываем имя (имена) гео-сайтов, с которых мы будем принимать репликации:

      antoniy@[restfs1@ecss1]:/$ /system/geo-backup/properties/set slave_sites <SITE_2>
      Property "slave_sites" successfully changed from: 
      
         to
      <SITE_2>.
    • Для ранее созданных доменов устанавливаем имя master гео-сайта (для вновь создаваемых доменов значение гео-сайта равняется установленному в п.6.1):

      admin@[md1@ecss1]:/$ /domain/properties/set * site <SITE_1>     
      Property "site" successfully changed from: 
      ecss10
         to
      <SITE_1>.
      Если в качестве домена указана звездочка, то значения изменяются только в тех доменах, в которых они установлены по умолчанию. Иначе останется то же значение, что явно было выставлено на домене.
    • Для георезервируемых доменов устанавливаем replica_type master:

      admin@[restfs1@ecss1]:/$ domain/test.domain/properties/set replica_type master       
      Property "replica_type" successfully changed from: 
      none
        to
      master.
    • Настраиваем ip-set (ip-set георезервируемых доменов на <SITE_1> и <SITE_2> должны иметь одинаковые имена): Команды управления сетевыми настройками протокола SIP.

      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/network/set ip_set geo.domain listen-ports list = [5060]
      Property "ip_set" successfully changed from: 
      
         to
      geo.domain  5060
      geo.domain  no addresses set.
      
      [exec at: 11.09.2017 15:39:54, exec time: 158ms, nodes: sip1@ecss1]
      
      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/network/set ip_set geo.domain node-ip node = sip1@ecss1 ip = 192.168.23.110              
      Property "ip_set" successfully changed from: 
      geo.domain  5060
      geo.domain  no addresses set
         to
      geo.domain  5060
      geo.domain  sip1@ecss1 192.168.23.110.
      
      [exec at: 11.09.2017 15:40:34, exec time: 172ms, nodes: sip1@ecss1]
      
      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/network/set ip_set geo.domain node-ip node = sip1@ecss2 ip = 192.168.23.111 
      Property "ip_set" successfully changed from: 
      geo.domain  5060
      geo.domain  sip1@ecss1 192.168.23.110
         to
      geo.domain  5060
      geo.domain  sip1@ecss1 192.168.23.110
      geo.domain  sip1@ecss2 192.168.23.111.
      
      [exec at: 11.09.2017 15:40:47, exec time: 161ms, nodes: sip1@ecss1]
    • Указываем адрес альтернативного сервера:

      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/properties/set alternative_server 192.168.23.183
      Property "alternative_server" successfully changed from: 
      undefined
         to
      "192.168.23.183".
      
      [exec at: 13.09.2017 09:39:56, exec time: 61ms, nodes: sip1@ecss1]

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

    • Перезагружаем все сервисы сайта <SITE_1>
  5. Настройка гео-сайта <SITE_2>
    • Устанавливаем имя гео-сайта системы <SITE_2>:

      antoniy@[restfs1@ecss1]:/$ /system/geo-backup/properties/set site <SITE_2>
      Property "site" successfully changed from: 
      ecss10
         to
      <SITE_2>.
    • Указываем имя (имена) гео-сайтов, с которых мы будем принимать репликации:

      antoniy@[restfs1@ecss1]:/$ /system/geo-backup/properties/set slave_sites <SITE_1>
      Property "slave_sites" successfully changed from: 
      
         to
      <SITE_1>.
    • Для ранее созданных доменов устанавливаем имя master гео-сайта (для вновь создаваемых доменов значение гео-сайта равняется установленному в п.7.1):

      admin@[md1@ecss1]:/$ /domain/properties/set * site <SITE_2>     
      Property "site" successfully changed from: 
      ecss10
         to
      <SITE_2>.
      Если в качестве домена указана звездочка, то значения изменяются только в тех доменах, в которых они установлены по умолчанию. Иначе останется то же значение, что явно было выставлено на домене.
    • Настраиваем ip-set (ip-set георезервируемых доменов на <SITE_1> и <SITE_2> должны иметь одинаковые имена): Команды управления сетевыми настройками протокола SIP

      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/network/set ip_set geo.domain listen-ports list = [5060]
      Property "ip_set" successfully changed from: 
      
         to
      geo.domain  5060
      geo.domain  no addresses set.
      
      [exec at: 11.09.2017 15:39:54, exec time: 158ms, nodes: sip1@ecss1]
      
      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/network/set ip_set geo.domain node-ip node = sip1@ecss1 ip = 192.168.23.183              
      Property "ip_set" successfully changed from: 
      geo.domain  5060
      geo.domain  no addresses set
         to
      geo.domain  5060
      geo.domain  sip1@ecss1 192.168.23.183.
      
      [exec at: 11.09.2017 15:40:34, exec time: 172ms, nodes: sip1@ecss1]
      
      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/network/set ip_set geo.domain node-ip node = sip1@ecss2 ip = 192.168.23.184 
      Property "ip_set" successfully changed from: 
      geo.domain  5060
      geo.domain  sip1@ecss1 192.168.23.183
         to
      geo.domain  5060
      geo.domain  sip1@ecss1 192.168.23.183
      geo.domain  sip1@ecss2 192.168.23.184.
      
      [exec at: 11.09.2017 15:40:47, exec time: 161ms, nodes: sip1@ecss1]
    • Указываем адрес альтернативного сервера:

      admin@[restfs1@ecss1]:/$ cluster/adapter/sip1/sip/properties/set alternative_server 192.168.23.110
      Property "alternative_server" successfully changed from: 
      undefined
         to
      "192.168.23.110".
      
      [exec at: 13.09.2017 09:39:56, exec time: 61ms, nodes: sip1@ecss1]

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

    • Перезагружаем все сервисы сайта <SITE_2>
  6. После перезагрузки на двух сайтах включаем географическое резервирование:

    antoniy@[restfs1@ecss1]:/$ /system/geo-backup/properties/set enabled true
    Property "enabled" successfully changed from: 
    false
       to
    true.
  7. Устанавливаем ip-set для георезервируемого домена на <SITE_1>

    admin@[restfs1@ecss1]:/$ domain/test.domain/sip/network/set ip_set [geo.domain]             
    Property "ip_set" successfully changed from: 
    []
       to
    ["geo.domain"].
    
    [exec at: 11.09.2017 15:53:22, exec time: 83ms, nodes: sip1@ecss1]

    Если необходимо, можно скорректировать период реплицирования данных (задается в секундах):

    /system/geo-backup/properties/set sync_timeout 1800
  8. Настройка медиаресурсов

    Для корректной работы георезерва на удаленном гео-сайте необходимо настроить медиаресурсы, используемые георезервируемым доменом (имена медиаресурсов site и zone должны совпадать). Настройка медиаресурсов подробно описана в разделе Конфигурирование распределенного медиасервера.

  9. Выполняем команду синхронизации домена:

    admin@[restfs1@ecss1]:/$ system/geo-backup/sync <DOMAIN_NAME>              
    ┌─────────────┬───────────┐
    │  Domain     │Sync result│
    ├─────────────┼───────────┤
    │<DOMAIN_NAME>│ok         │
    └─────────────┴───────────┘
    
    Total syncronized domains: 1
  10. Для проверки статуса георезерва и информации о времени последней синхронизации:

    admin@[restfs1@ecss1]:/$ system/geo-backup/status              
    ┌───────────┬──────┬───────┬──────────────┬───────────────────┬───────────────────┐
    │  Domain   │ Site │Replica│Replica status│ Last update time  │   Last success    │
    │           │      │       │              │                   │    update time    │
    ├───────────┼──────┼───────┼──────────────┼───────────────────┼───────────────────┤
    │p.city     │ecss10│master │syncronized   │08.09.2017 14:19:01│08.09.2017 14:19:01│
    │test.domain│nsk   │master │syncronized   │08.09.2017 14:19:03│08.09.2017 14:19:03│
    └───────────┴──────┴───────┴──────────────┴───────────────────┴───────────────────┘
    
    Total syncronized domains: 2
  11. Настройка доменов на каждом из гео-кластеров. При этом вновь создаваемые кластера помечаются replica_type = master:

    antoniy@[restfs1@ecss1]:/$ /domain/p.city/properties/info replica_type
    ┌────────────┬──────┬──────┐
    │  Property  │Domain│Value │
    ├────────────┼──────┼──────┤
    │replica_type│p.city│master│
    └────────────┴──────┴──────┘

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

    На этом настройка георезерва закончена.

Схема настройки сети для георезерва

В зависимости от геолокации параметры сети могут различаться. В связи с этим не рекомендуется использовать транки в георезервируемом домене. Связь с внешними направлениями (транки) рекомендуется осуществлять через транзитный домен по следующей схеме:

  1. Создание бриджа до транзитного домена <TRANSIT_DOMAIN_1> на <SITE_1>:

    admin@[restfs1@ecss1]:/$ bridge/declare <BRIDGE_NAME> <DUPLEX> <STRICT> <CAPACITY> <GEO_DOMAIN> <GEO_NP> <GEO_INTERFACE> <GEO_TRUNKGROUP> <GEO_ROUTING_CONTEXT> <TRANSIT_DOMAIN_1> <NP_1> <INTERFACE_1> <TRUNKGROUP_1> <ROUTING_CONTEXT_1> 
    Bridge with name <BRIDGE_NAME> declared successfully.
    
    [exec at: 25.10.2017 15:17:34, exec time: 23ms, nodes: ds1@ecss1]

    Пример:

    admin@[restfs1@ecss1]:/$ bridge/declare geo.transit true true unbounded geo.domain default bridge:transit tg:transit default_routing transit.domain1 default bridge:to.geo.1 tg:to.geo.1 default_routing              
    Bridge with name "geo.transit" declared successfully.
    
    [exec at: 27.10.2017 09:28:21, exec time: 38ms, nodes: ds1@ecss1]
  2. Создание бриджа до транзитного домена <TRANSIT_DOMAIN_2> на <SITE_2>:

    admin@[restfs1@ecss1]:/$ bridge/declare <BRIDGE_NAME> <DUPLEX> <STRICT> <CAPACITY> <GEO_DOMAIN> <GEO_NP> <GEO_INTERFACE> <GEO_TRUNKGROUP> <GEO_ROUTING_CONTEXT> <TRANSIT_DOMAIN_2> <NP_2> <INTERFACE_2> <TRUNKGROUP_2> <ROUTING_CONTEXT_2> 
    Bridge with name <BRIDGE_NAME> declared successfully.
    
    [exec at: 25.10.2017 15:17:34, exec time: 23ms, nodes: ds1@ecss1]

    Пример:

    admin@[restfs1@ecss1]:/$ bridge/declare geo.transit true true unbounded geo.domain default bridge:transit tg:transit default_routing transit.domain2 default bridge:to.geo.2 tg:to.geo.2 default_routing              
    Bridge with name "geo.transit" declared successfully.
    
    [exec at: 27.10.2017 09:28:21, exec time: 38ms, nodes: ds1@ecss1]

Параметры:

<BRIDGE_NAME> — уникальное в рамках ECSS-10 имя bridge-интерфейса (строка, без пробелов);<DUPLEX> — режим работы bridge:

  • true — двунаправленный;
  • false — однонаправленный.

<STRICT> — режим проверки номеров, проходящих через бридж;

  • true — проверка включена.
  • false — проверка выключена.

<CAPACITY> — количество одновременно активных вызовов на заданном bridge-интерфейсе, принимает значения:

  • любое положительное число;
  • unbounded — количество не ограничено.

<GEO_DOMAIN> — имя георезервируемого домена должно быть одинаковым на <SITE_1> и <SITE_2>;
<GEO_NP> — план нумерации георезервируемого домена должен быть одинаковым на <SITE_1> и <SITE_2>;
<GEO_INTERFACE> — имя интерфейса георезервируемого домена, через который будет осуществляться взаимодействие с bridge-интерфейсом, должно быть одинаковым на <SITE_1> и <SITE_2>;
<GEO_TRUNKGROUP> — идентификатор транк-группы для интерфейса георезервируемого домена должен быть одинаковым на <SITE_1> и <SITE_2>;
<GEO_ROUTING_CONTEXT> — контекст маршрутизации георезервируемого домена должен быть одинаковым на <SITE_1> и <SITE_2>;
<TRANSIT_DOMAIN_1> / <TRANSIT_DOMAIN_2> — имя транзитной виртуальной АТС на <SITE_1> / <SITE_2> , с которой устанавливает соединение bridge;
<NP_1> / <NP_2> — план нумерации транзитного домена, на <SITE_1> / <SITE_2> с которым устанавливает соединение bridge;
<INTERFACE_1> / <INTERFACE_2> — имя интерфейса транзитного домена <SITE_1> / <SITE_2>, через который будет осуществляться взаимодействие с bridge-интерфейсом;
<TRUNKGROUP_1> / <TRUNKGROUP_2> — идентификатор транк-группы для интерфейса транзитного домена на <SITE_1> / <SITE_2>;
<ROUTING_CONTEXT_1> / <ROUTING_CONTEXT_2> — контекст маршрутизации по умолчанию для интерфейса транзитного домена на <SITE_1> / <SITE_2>.