2014-09-26 4 views
2

У меня есть 2 сервера Tibco-Ems с отказоустойчивой настройкой. Если один сервер недоступен, активный сервер переключается на сервер отказоустойчивости, как ожидалось.Проблема с отказом Tibco-Ems

Однако время от времени я получаю странные ошибки. Затем новый активный сервер говорит: «reconnect failed failed: connection unknown for id = XY»

Это происходит, только если на моем клиенте есть открытое соединение. Но это то, что я ожидаю, соединение должно также переключиться на новый активный сервер. И, как я уже сказал, иногда это работает, а иногда и нет.

Когда я регистрируюсь для EMS-Exceptions в моем клиенте, я получаю сообщение об ошибке: «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом».

StackTrace: на System.Net.Sockets.NetworkStream.Read (байты [] буфер, Int32 смещения, Int32 размер) в TIBCO.EMS.LinkTcp._readEx (байты [] буфер, Int32 смещения, Int32 размера) в TIBCO.EMS.LinkTcp._ReadWireMsg() в TIBCO.EMS.LinkTcp.LinkReader.Work()

Прямо сейчас у меня нет больше понятия, что я мог бы сделать. Может быть, кто-то может помочь мне понять, в чем проблема. Заранее спасибо

UPDATE: Поздний обновление здесь: Даже если я получаю ошибку «переподключение не удалось» он работает, как ожидалось. Второй сервер возьмет верх.

ответ

3

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

Существует момент, когда EMS очищает клиентские соединения, которые не были повторно подключены. Это время определяется параметром ft_reconnect_timeout в файле конфигурации tibemsd.conf. Значение по умолчанию для этого параметра конфигурации составляет 60 секунд. В зависимости от настроек ведения журнала, когда EMS очищает «истекшие» соединения, вы можете увидеть mssage, указывающий, что он «очистил» клиентское соединение в ваших журналах EMS.

Бывают случаи, когда клиент в конце концов пытается восстановить соединение после того, как сервер EMS уже очистил «истекшее» соединение. Это может произойти в случае, если сетевой раздел не позволяет клиенту успешно переподключиться к серверу EMS до тех пор, пока сервер EMS не очистит соединение. Когда это произойдет, вы увидите сообщение «Повторное подключение: сообщение неизвестно ...».

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

+0

звучит хорошо в теории ... но в моем случае это не работает. Я всегда получаю сообщение «Снова подключиться». Так вы понимаете, что я делаю неправильно? – DanielG

+0

Единственный способ получить сообщение «Снова подключиться» - это когда клиент пытается повторно подключить параметры повторного подключения, которые сервер уже очистил. Это почти всегда сопровождается успешным подключением, которое обычно не регистрируется, если вы не регистрируете каждое успешное соединение. Если это проблема, вы можете установить для параметра ft_reconnect_timeout значение, превышающее 60 секунд по умолчанию (значение указано в секундах). Добавление + CONNECT к вашему параметру log_trace должно помочь вам узнать больше о том, что происходит. – nochum

+0

ОК еще раз спасибо, я посмотрю. Но что мне делать после успешного повторного подключения? Должно ли мое соединение работать по-прежнему, без каких-либо действий на стороне клиента? Возможно, в этом я и ошибаюсь. После того, как сервер отказоустойчивости занял верх, мое соединение уже недействительно! Так мне нужно создать новое соединение? Разве я не должен заботиться об этом? – DanielG

0

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

Если вы используете серверы ems с сервером FT URL1: порт, server2: port, но серверы не были действительно в режиме FT, когда соединение переключается между этими двумя серверами, у вас будет эта проблема как соединение перемещается на другой сервер, но существующее соединение на поврежденном сервере не может быть уничтожено или приобретено новым активным сервером из-за некогерентной настройки FT.

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

Для нас обеспечение уровня сервера FT помогло решить эту проблему.

+0

как вы это делаете? обеспечивая уровень сервера FT? – DanielG

+0

Я только что проверил руководство пользователя, и я точно сделал то, что описано в разделе «Конфигурируемые отказоустойчивые серверы». Когда сервер запускается, сервер A сообщает мне, что он находится в состоянии «active», а сервер B сообщает мне, что он находится в режиме ожидания для сервера A. Так что я думаю, что все настроено как серверный уровень FT !? Я установил сервер и ft_active параметры в файлах tibemsd.conf, как описано в руководстве пользователя. Что мне не хватает? – DanielG

+0

Таковы конфигурации, которые я сделал, как описано в руководстве пользователя: - server = Установить этот параметр на то же имя сервера в конфигурациях файлов как основного сервера, так и вторичного сервера. - ft_active В файле конфигурации основного сервера задайте параметр для URL-адреса вторичного сервера. В файле конфигурации вторичного сервера задайте параметр URL-адреса активного сервера – DanielG

Смежные вопросы