Высокая доступность / аварийное переключение с постоянным TCP-соединением в RHEL 7.1

Высокая доступность / аварийное переключение с постоянным TCP-соединением

Я пытаюсь найти правильные части для реализации высокодоступной и отказоустойчивой установки для серверного приложения на основе C. TCP-соединения в идеале должны быть в течение нескольких дней. Если главный сервер выходит из строя из-за неконтролируемой сетевой проблемы, то резервный сервер будет действовать как главный с подключением TCP к этому серверу.

Данные внутри соединений сокетов выглядят очень похоже на структуры данных protobuf. Это не HTTP.

До сих пор я смотрел на keepalived и HAProxy, но ни один из них, похоже, не позволяет перенаправлять / перебрасывать постоянный сеанс TCP на другой резервный сервер без отключения сеанса.

Что мне нужно, так это если главный сервер выйдет из строя, то резервный сервер будет обрабатывать все клиенты с TCP-соединениями, не отключая сеанс TCP.

Master и Standby будут иметь виртуальный IP с использованием keepalived.

        |        VIP         |
   +----+----+          +----+----+
   | Master  | <-VRRP-> | Standby |
   +----+----+          +----+----+
        |                    |               
        |                    |
  ------+---+------------+---+----------                                
            |            
        +---+---+    
        |Client |  
        +---+---+    

Какие есть варианты для переключения TCP-соединений или синхронизации сеансов TCP между главным и резервным серверами, на которых работает RHEL7.1. Таким образом, клиент, подключенный, не может знать, выходит ли из строя главный сервер, а резервный сервер стал главным сервером.

Спасибо!

1 ответ

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

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

Да, tcpcp был другим проектом для этого, но, похоже, в основном заброшен.

Как и другие спрашивали: ты уверен, что тебе это нужно? Я настоятельно рекомендую изменить архитектуру всего приложения таким образом, чтобы клиенты могли справиться с обрывом соединения при повторной попытке. Если это невозможно, рассмотрите общую архитектуру, в которой вероятность сбоя снижается до такой степени, что крайне редкая потеря соединений просто не имеет значения.

Вы пытаетесь достичь 100% безотказной работы для ваших TCP-соединений. Учтите, однако, что это, скорее всего, в любом случае недостижимо, поскольку может произойти сбой любого количества других компонентов (питание, восходящие маршрутизаторы и т. Д.)

Поэтому вам все равно нужно спроектировать это для возможного сбоя.

Другие вопросы по тегам