System.Fabric.FabricNotPrimaryException для GetStateAsync внутри Актера

Я также задавал этот вопрос на Github — https://github.com/Azure/service-fabric-issues/issues/379

У меня есть (n) актеров, которые выполняют непрерывное напоминание каждую секунду.

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

Я не могу найти никакой информации, касающейся этого исключения, с которым сталкиваются надежные участники.

Как только возникает это исключение и субъекты деактивируются, они не активируются повторно.

Каковы условия возникновения этой ошибки и как я могу дополнительно диагностировать проблему?

«System.Fabric.FabricNotPrimaryException: было создано исключение типа« System.Fabric.FabricNotPrimaryException ». в Microsoft.ServiceFabric.Actors.Runtime.ActorStateProviderHelper.d__81.MoveNext() --- Конец трассировки стека из предыдущего места, где было создано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Microsoft.ServiceFabric.Actors.Runtime.ActorStateManager.d__181.MoveNext() --- Конец трассировки стека из предыдущего расположения, где было выдано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Microsoft.ServiceFabric.Actors.Runtime .ActorStateManager.d__7`1.MoveNext()

Взглянув на обозреватель кластера, я вижу следующие предупреждения в одном из разделов для этой службы актора:

Неработоспособное событие: SourceId='System.FM', Property='State', HealthState='Warning', AcceptWarningAsError=false. Реконфигурация раздела занимает больше времени, чем ожидалось. fabric:/Ism.TvcRecognition.App/TvChannelMonitor 3 3 4dcca5ee-2297-44f9-b63e-76a60df3bc3d S/S IB _Node1_4 Up 131456742276273986 S/P RD _Node1_2 Up 131456742361691499 P/S RD _Node1_0 Down 131457861497316547 (Showing 3 out of 4 replicas. Всего доступных реплик: 1.)

С предупреждением в первичной реплике этого раздела:

Неработоспособное событие: SourceId='System.RAP', Property='IReplicator.CatchupReplicaSetDuration', HealthState='Warning', AcceptWarningAsError=false.

И предупреждение в ActiveSecondary:

Неработоспособное событие: SourceId='System.RAP', Property='IStatefulServiceReplica.CloseDuration', HealthState='Warning', AcceptWarningAsError=false. Время начала (UTC): 2017-08-01 04:51:39.740 _Node1_0

3 из 5 узлов показывают следующую ошибку:

Неработоспособное событие: SourceId='FabricDCA', Property='DataCollectionAgent.DiskSpaceAvailable', HealthState='Warning', AcceptWarningAsError=false. Агенту сбора данных (DCA) не хватает места на диске для работы. Диагностическая информация останется несобранной, если это продолжится.

Дополнительная информация:

Моя установка кластера состоит из 5 узлов виртуальных машин D1.

Ошибки средства просмотра событий в приложении Microsoft-Service Fabric:

я вижу довольно много

Не удалось прочитать некоторые или все события из файла ETL D:\SvcFab\Log\QueryTraces\query_traces_5.6.231.9494_131460372168133038_1.etl. System.ComponentModel.Win32Exception (0x80004005): дескриптор недействителен в Tools.EtlReader.TraceFileEventReader.ReadEvents(DateTime startTime, DateTime endTime) в System.Fabric.Dca.Utility.PerformWithRetries[T](Action`1 worker, T context, RetriableOperationExceptionHandler exceptionHandler, Int32 initialRetryIntervalMs, Int32 maxRetryCount, Int32 maxRetryIntervalMs) в FabricDCA.EtlProcessor.ProcessActiveEtlFile(FileInfo etlFile, DateTime lastEndTime, DateTime& newEndTime, CancellationToken CancellationToken)

и куча предупреждений вроде:

Api ISatefulServiceReplica.Close() медленно работает в разделе {4dcca5ee-2297-44f9-b63e-76a60df3bc3d} реплика 131457861497316547, StartTimeUTC = ‎2017‎-‎08‎-01T04:51:39.789083900Z

И, наконец, я думаю, что я мог быть в корне всего этого. Журналы приложений Event Viewer содержат множество ошибок, таких как:

Ism.TvcRecognition.TvChannelMonitor (3688) (4dcca5ee-2297-44f9-b63e-76a60df3bc3d:131457861497316547): Попытка записи в файл "D:\SvcFab_App\Ism.TvcRecognition.AppType_App1\work\P_2dc9b74-2f2dcca74-2f2 -76a60df3bc3d\R_131457861497316547\edbres00002.jrs" по смещению 5242880 (0x0000000000500000) для 0 (0x00000000) байт не удалось через 0,000 секунд с системной ошибкой 112 (0x00000070): "На диске недостаточно места. ". Операция записи завершится с ошибкой -1808 (0xfffff8f0). Если эта ошибка повторяется, возможно, файл поврежден и его необходимо восстановить из предыдущей резервной копии.

Итак, эта ошибка указывает на диск D, который является временным хранилищем. Из 50 ГБ свободно 549 МБ. Должна ли Service Fabric действительно сохраняться во временном хранилище?


person jflood.net    schedule 01.08.2017    source источник


Ответы (1)


Re: ошибки - да, похоже, что диск заполнен, что приводит к сбоям. Просто чтобы закрыть цикл здесь - похоже, вы обнаружили, что ваше состояние на самом деле не распределяется в кластере, и как только вы исправили это, вы перестали видеть заполненный диск. Мы надеемся, что теперь ваше планирование емкости должно иметь больше смысла.

Что касается безопасности: TLDR: использование временного диска допустимо, поскольку вы используете Service Fabric. Если бы вы не использовали этот диск для реальных данных, это было бы очень плохой идеей.

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

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

person masnider    schedule 25.08.2017
comment
Найдите этот ответ. Причиной тяжелого раздела было то, что я использовал int64 для своих идентификаторов актеров, все они попадали в один и тот же диапазон. - person jflood.net; 27.08.2017