Настройка надежных служб с отслеживанием состояния

Существует два набора параметров конфигурации для надежных служб. Один набор является глобальным для всех надежных служб в кластере, а второй относится к конкретной надежной службе.

Глобальная конфигурация

Глобальная конфигурация надежных служб определяется в манифесте кластера в разделе KtlLogger. Она позволяет настраивать расположение и размер общего журнала, а также глобальные ограничения памяти для средства ведения журнала. Манифест кластера — это единственный XML-файл, содержащий параметры и настройки, которые относятся ко всем узлам и службам в кластере. Обычно он имеет имя ClusterManifest.xml. Манифест кластера можно просмотреть с помощью команды PowerShell Get-ServiceFabricClusterManifest.

Имена файлов конфигурации

Имя Unit Значение по умолчанию Remarks
WriteBufferMemoryPoolMinimumInKB Килобайты 8388608 Минимальное количество КБ, выделяемое для пула памяти буфера записи в журнал в режиме ядра. Этот пул памяти используется для кэширования сведений о состоянии перед записью на диск.
WriteBufferMemoryPoolMaximumInKB Килобайты Без ограничений Максимальный размер, до которого может увеличиваться пул памяти для буфера записи в журнал.
SharedLogId Код GUID "" Уникальный идентификатор GUID, который определяет файл общего журнала по умолчанию, используемый всеми службами Reliable Services во всех узлах кластера, для которых в конфигурации службы не указан параметр SharedLogId. Если параметр SharedLogId задан, то также необходимо задать параметр SharedLogPath.
SharedLogPath Полное имя пути "" Полный путь к файлу общего журнала, используемому всеми службами Reliable Services во всех узлах кластера, для которых в конфигурации службы не указан параметр SharedLogId. Однако если параметр SharedLogPath задан, то также необходимо задать SharedLogId.
SharedLogSizeInMB Мегабайты 8192 Определяет дисковое пространство в МБ, выделяемое для общего журнала в статическом режиме. Значение должно быть больше или равно 2048.

В Azure ARM или локальном шаблоне JSON выполните приведенный ниже пример. Этот пример показывает, как изменить общий журнал транзакций, который создается для хранения резервных копий надежных коллекций для служб с отслеживанием состояния.

"fabricSettings": [{
    "name": "KtlLogger",
    "parameters": [{
        "name": "SharedLogSizeInMB",
        "value": "4096"
    }]
}]

Пример раздела манифеста кластера для локальной среды разработки

Если вы хотите изменить это в вашей локальной среде разработки, необходимо изменить локальный файл clustermanifest.xml.

   <Section Name="KtlLogger">
     <Parameter Name="SharedLogSizeInMB" Value="4096"/>
     <Parameter Name="WriteBufferMemoryPoolMinimumInKB" Value="8192" />
     <Parameter Name="WriteBufferMemoryPoolMaximumInKB" Value="8192" />
     <Parameter Name="SharedLogId" Value="{7668BB54-FE9C-48ed-81AC-FF89E60ED2EF}"/>
     <Parameter Name="SharedLogPath" Value="f:\SharedLog.Log"/>
   </Section>

Remarks

Средство ведения журнала имеет глобальный пул памяти, который выделяется из невыгружаемой памяти ядра. Он доступен всем службам Reliable Services в узле для кэширования данных состояния перед их записью в выделенный журнал, связанный с репликой службы Reliable Services. Размер пула определяется параметрами WriteBufferMemoryPoolMinimumInKB и WriteBufferMemoryPoolMaximumInKB. Параметр WriteBufferMemoryPoolMinimumInKB определяет как начальный размер этого пула памяти, так и его минимальный размер. Значение WriteBufferMemoryPoolMaximumInKB — это максимальный размер, до которого может увеличиваться пул памяти. Каждая открываемая реплика службы Reliable Services может увеличивать размер пула памяти на определенный в системе размер, но не более чем до значения параметра WriteBufferMemoryPoolMaximumInKB. Если размера пула памяти недостаточно, запросы будут откладываться, пока не появится доступная память. Поэтому, если пул памяти буфера записи слишком мал для конкретной конфигурации, производительность может снижаться.

Параметры SharedLogId и SharedLogPath всегда используются совместно и определяют идентификатор GUID и расположение общего журнала по умолчанию для всех узлов кластера. Общий журнал по умолчанию используется для всех служб Reliable Services, для которых эти параметры не заданы в связанном со службой файле settings.xml. Для обеспечения максимальной производительности файлы общих журналов следует размещать на дисках, которые используются исключительно в этих целях. Это позволяет уменьшить конфликты.

Параметр SharedLogSizeInMB определяет объем дискового пространства, предварительно выделяемого для хранения общего журнала по умолчанию на всех узлах. При указании параметра SharedLogSizeInMB не обязательно задавать параметры SharedLogId и SharedLogPath.

Конфигурация конкретной службы

Конфигурации надежной службы с отслеживанием состояния по умолчанию можно изменить с помощью пакета конфигурации (в конфигурации) или в реализации службы (в коде).

  • Конфигурация : для настройки с помощью пакета конфигурации необходимо изменить файл Settings.xml, созданный в корне пакета Microsoft Visual Studio в папке Config каждой службы в приложении.
  • Код : для настройки с помощью кода необходимо создать ReliableStateManager с помощью объекта ReliableStateManagerConfiguration с соответствующим набором параметров.

По умолчанию среда выполнения Azure Service Fabric ищет предварительно заданные имена разделов в файле settings.xml, использует значения параметров конфигурации и создает базовые компоненты среды выполнения.

Примечание

Не удаляйте имена разделов в перечисленных ниже конфигурациях в файле Settings.xml, который создается в решении Visual Studio, если только не собираетесь настроить свою службу с помощью кода. Переименование пакета или раздела конфигурации потребует изменения кода при настройке ReliableStateManager.

Конфигурация безопасности репликатора

Конфигурации безопасности репликаторов используются для защиты канала связи, который используется во время репликации. Это означает, что службы не будут "видеть" реплицируемый трафик друг друга, что позволит обеспечить высокую доступность и высокий уровень защиты. По умолчанию пустой раздел конфигурации безопасности означает, что канал репликации не защищен.

Важно!

На узлах Linux сертификаты должны иметь формат PEM. Дополнительные сведения о поиске и настройке сертификатов для Linux см. в разделе Настройка сертификатов на Linux.

Имя раздела по умолчанию

ReplicatorSecurityConfig

Примечание

Чтобы изменить имя этого раздела, при создании ReliableStateManager для этой службы переопределите параметр replicatorSecuritySectionName конструктором ReliableStateManagerConfiguration.

Конфигурация репликатора

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

Имя раздела по умолчанию

ReplicatorConfig

Примечание

Чтобы изменить имя этого раздела, при создании ReliableStateManager для этой службы переопределите параметр replicatorSettingsSectionName конструктором ReliableStateManagerConfiguration.

Имена файлов конфигурации

Имя Unit Значение по умолчанию Remarks
BatchAcknowledgementInterval Секунды 0,015 Период времени, в течение которого дополнительный репликатор после получения операции находится в режиме ожидания, а затем отправляет подтверждение обратно основному репликатору. Любые другие подтверждения, отправляемые для операций, обработанных в течение этого интервала, отправляются как один ответ.
ReplicatorEndpoint Н/Д Значение по умолчанию не задано — обязательный параметр IP-адрес и порт, которые будут использоваться основным и дополнительным репликаторами для связи с другими репликаторами в наборе реплик. Значение должно быть ссылкой на конечную точку ресурса TCP в манифесте службы. Дополнительные сведения об определении ресурсов конечных точек в манифесте службы см. в статье Ресурсы манифеста службы.
MaxPrimaryReplicationQueueSize Количество операций 8192 Максимальное количество операций в основной очереди. Операция освобождается после того, как основной репликатор получит подтверждение от всех дополнительных репликаторов. Это значение должно быть больше 64 и представлять собой степень числа 2.
MaxSecondaryReplicationQueueSize Количество операций 16384 Максимальное количество операций в дополнительной очереди. Операция освобождается после того, как для ее состояния будет обеспечена высокая доступность посредством сохранения. Это значение должно быть больше 64 и представлять собой степень числа 2.
CheckpointThresholdInMB МБ 50 Объем места для файлов журнала, после заполнения которого создается контрольная точка состояния.
MaxRecordSizeInKB КБ 1024 Максимальный размер записи, которую репликатор может записать в журнал. Это значение должно быть кратно 4 и больше 16.
MinLogSizeInMB МБ 0 (определяется системой) Минимальный размер журнала транзакций. Журнал не разрешено усекать до размера меньше указанного значения. Значение 0 указывает, что минимальный размер журнала определяет репликатор. Увеличение этого значения повышает вероятность создания частичных копий и добавочных резервных копий, так как снижается допустимость усечения соответствующих записей журнала.
TruncationThresholdFactor Фактор 2 Определяет, при каком размере журнала будет активировано усечение. Пороговое значение усечения определяется произведением MinLogSizeInMB и TruncationThresholdFactor. Значение TruncationThresholdFactor должно быть больше 1. Значение MinLogSizeInMB * TruncationThresholdFactor должно быть меньше, чем MaxStreamSizeInMB.
ThrottlingThresholdFactor Фактор 4 Определяет, при каком размере журнала начнется регулирование реплики. Пороговое значение регулирования (в МБ) определяется по формуле Max((MinLogSizeInMB * ThrottlingThresholdFactor),(CheckpointThresholdInMB * ThrottlingThresholdFactor)). Пороговое значение регулирования (в МБ) должно быть больше порогового значения усечения (в МБ). Пороговое значение усечения (в МБ) должно быть меньше, чем MaxStreamSizeInMB.
MaxAccumulatedBackupLogSizeInMB МБ 800 Максимальный совокупный размер журналов архивации (в МБ) в заданной цепочке журналов архивации. Запросы на добавочную архивацию завершатся сбоем, если в результате добавочной архивации будет создан журнал архивации, из-за которого совокупный размер журналов архивации, созданных после последней полной архивации, превысит этот размер. В таких случаях пользователь должен выполнить полную архивацию.
SharedLogId Код GUID "" Уникальный идентификатор GUID для определения файла общего журнала, используемого с данной репликой. Обычно этот параметр в службах не используется. Однако если параметр SharedLogId задан, то также необходимо задать SharedLogPath.
SharedLogPath Полное имя пути "" Полный путь к расположению, где будет создан общий файл журнала для данной реплики. Обычно этот параметр в службах не используется. Однако если параметр SharedLogPath задан, то также необходимо задать SharedLogId.
SlowApiMonitoringDuration Секунды 300 Задает интервал мониторинга для вызовов управляемых интерфейсов API. Пример. Пользователь предоставил функцию обратного вызова резервной копии. По истечении интервала отчет-предупреждение о работоспособности отправляется диспетчеру работоспособности.
LogTruncationIntervalSeconds Секунды 0 Настраиваемый интервал, с которым инициируется усечение журнала на каждой реплике. Этот параметр также позволяет убедиться, что усечение выполняется на основе времени, а не только на основе размера журнала. Кроме того, с его помощью можно настроить принудительное своевременное очищение удаленных сущностей в надежном словаре.
EnableStableReads Логическое значение Неверно Включение стабильных операций чтения позволяет вторичным репликам возвращать значения, которые были подтверждены кворумом.

Пример настройки с помощью кода

class Program
{
    /// <summary>
    /// This is the entry point of the service host process.
    /// </summary>
    static void Main()
    {
        ServiceRuntime.RegisterServiceAsync("HelloWorldStatefulType",
            context => new HelloWorldStateful(context, 
                new ReliableStateManager(context, 
        new ReliableStateManagerConfiguration(
                        new ReliableStateManagerReplicatorSettings()
            {
                RetryInterval = TimeSpan.FromSeconds(3)
                        }
            )))).GetAwaiter().GetResult();
    }
}    
class MyStatefulService : StatefulService
{
    public MyStatefulService(StatefulServiceContext context, IReliableStateManagerReplica stateManager)
        : base(context, stateManager)
    { }
    ...
}

Образец файла конфигурации

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <Section Name="ReplicatorConfig">
      <Parameter Name="ReplicatorEndpoint" Value="ReplicatorEndpoint" />
      <Parameter Name="BatchAcknowledgementInterval" Value="0.05"/>
      <Parameter Name="CheckpointThresholdInMB" Value="512" />
   </Section>
   <Section Name="ReplicatorSecurityConfig">
      <Parameter Name="CredentialType" Value="X509" />
      <Parameter Name="FindType" Value="FindByThumbprint" />
      <Parameter Name="FindValue" Value="9d c9 06 b1 69 dc 4f af fd 16 97 ac 78 1e 80 67 90 74 9d 2f" />
      <Parameter Name="StoreLocation" Value="LocalMachine" />
      <Parameter Name="StoreName" Value="My" />
      <Parameter Name="ProtectionLevel" Value="EncryptAndSign" />
      <Parameter Name="AllowedCommonNames" Value="My-Test-SAN1-Alice,My-Test-SAN1-Bob" />
   </Section>
</Settings>

Remarks

Параметр BatchAcknowledgementInterval управляет задержкой репликации. Значение 0 обеспечивает минимальную возможную задержку за счет уменьшения скорости репликации (потому что необходимо отправлять и обрабатывать большее количество сообщений с подтверждениями, каждое из которых содержит меньше подтверждений). По мере увеличения значения BatchAcknowledgementInterval увеличивается общая скорость репликации и задержка операций. Это непосредственно перетекает в задержку фиксаций транзакций.

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

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

Параметры SharedLogId и SharedLogPath всегда используются совместно и позволяют службе использовать отдельный общий журнал из установленного по умолчанию общего журнала для узла. Для достижения наилучшей эффективности один и тот же общий журнал следует указывать в как можно большем количестве служб. Общие файлы журналов следует размещать на дисках, которые используются исключительно для хранения общих журналов. Это позволяет уменьшить конфликты перемещения головок. Это значение необходимо изменять лишь в редких случаях.

Дальнейшие действия