Child pages
  • Высокопроизводительный SA
Skip to end of metadata
Go to start of metadata

Общие задачи

Описание проблемы 

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

Требования

#ТребованияUser StoryВажностьПримечания
1

     

Общий дизайн

 Коллекция Scripts

Таблица sa_maptask заменяется на коллекцию noc.scripts в mongodb. Каждый скрипт, запланированный к выполнению, оформляется как отдельный документ.

Поля документа

ПолеТипОписание
idObjectIDID задачи
groupObjectIDID группы задач, если задан
timestampDateTimeFieldВремя создания скрипта
expiresDateTimeFieldКрайний срок выполнения скрипта
statusStringField

Статус задачи. Значения:

  • W - waiting
  • F - failed
  • R - running
  • C - complete
result_codeIntFieldКод завершения скрипта
max_retries IntField Максимальное количество попыток
retries IntField Текущее количество попыток
objectForeignKeyField Ссылка на ManagedObject 
script StringField Название скрипта
access_profile EmbeddedDocumentField

Параметры доступа. Вложенный документ вида

ПолеТипОписание
addressStringFieldАдрес объекта
portIntegerFieldПорт объекта
profileStringFieldПрофиль объекта
userStringFieldCLI user
passwordStringFieldCLI password
super_passwordStringFieldenable password
snmp_versionStringFieldsnmp version
snmp_ro_communityStringFieldsnmp RO community
snmp_rw_communityStringFieldsnmp RW community
args DictField Входные параметры скрипта
activatorStringField  Название пула активаторов
shardIntFieldID шарда
instanceStringField Название instance активатора в пуле, который выполняет задачу
debug BooleanField True, если необходимо создать тушенку
capsDictFieldObject capabilities в формате Ключ -> значение

Результат работы записывается в GridFS в формате JSON (как получено с активатора). В качестве ключа используется id скрипта

Куда записывать тушенку?

API для запуска скрипта

task = managed_object.scripts.get_interfaces(name="Gi 0/1")

Возвращаемая задача имеет тип Future

Использовать ли механизм long running jobs?

API для запуска группы задач

Аналог старых ReduceTask. Используется при необходимости запуска сразу нескольких задач

group = GroupTask()
group.add(managed_object.scripts.get_interfaces(name="Gi 0/1", group=group) # Добавить одну задачу
group.add(selector, "get_interfaces", name="Gi 0/1") # Добавить несколько задач
task = group.run()

Возвращаемая задача имеет тип Future. При запуске задачи создается соответсвующая запись в коллекции Scripts. Зап

Возможно использование нескольких вложенных групп:

group1 = GroupTask()
group2 = GroupTask()
group1.add(group2)
task = group1.run()

Переделка SAE

 SAE реализован как HTTP-сервер на базе tornado. В качестве протокола по взаимодействию с активаторами используется JSON-RPC. SAE пассивен, задачи выдаются по запросу активатора. Используется механизм long polling, при котором активаторы, для которых нет задач, зависают на незакрытом коннекте, пока не появятся задачи. Данный механизм позволяет сократить задержку на передачу задания на активатор.


Реализуемые сервисы:

SAService (/SAService/)

МетодВходные параметрыВыходные параметрыОписание
get_tasks
ИмяТипОписание
instanceintinstance id
nintколичество задач, которые активатор готов взять на выполнение

Список значений, длиной не более n

ИмяТипОписание
idstrID задачи
scriptstrИмя скрипта
access_profiledictСодержание access_profile из коллекции scripts
argsdictВходные параметры скрипта
capsdictCapabilities

 

 

Активатор получает новые задачи, вызывая функцию get_tasks. Для снижения количества HTTP-запросов активатор может запросить несколько задач сразу. Метод подвисает на long polling. Обрыв по таймауту означает, что на данный момент задач нет и необходимо повторить попытку.

Для поиска новой задачи используется функция mongodb findAndModify. Запрос для поиска:

{
   status: "W",
   activator: <activator name>,
   shard: <shard id>
}

Для модификации данных используется

$set: {
    status: "R",
    instance: <activator instance>
}
set_result
ИмяТипОписание
idstrid задачи
result_codeintСтатус завершения. 0 - успешное завершение
resultobjectСериализованный результат работы

boolean

True - результат записан

False - ошибка записи

Результат выполнения скрипта. Функция вызывается на каждого скрипта по раздельности
    

??? throttling


??? Как учитывать object status?

 

  • Сервис /register/ - дергается активатором для мониторинга
    • POST /register/
      • -> {"expires": seconds}
    • Получив ответ активатор должен повторно дернуть /register/ через seconds/2, в случае ошибки - через seconds/8
  • POST /ping/ - дергается NOC-ping с изменениями статуса
    • На входе список
      • timestamp
      • object id
      • status

 

Переделка активатора

 

  • AutoConf daemon, получает в качестве конфига JSON
    • max_sessions
  • http client регистрации, крутится в отдельном потоке, реализует сервис /register/
  • threadpool - выполняет script runner
  • network -- поток с SocketFactory
  • dispatcher - отдельный поток, который по запросу script_runner'а запрашивает новые задачи и пересылает на SAE результат (через сервис /task/)

 

 

noc-ping

 

Задача пингования хостов перекладывается на отдельный демон noc-ping

 

  • AutoConf daemon, получает в качестве конфига хосты для пропинговки
  • SocketFactory с ping socket'ом, которые занимаются пропинговкой
  • sender - отсылает изменения статусов объектов на SAE

 

 

noc-collector

 

 


 

Удаляемые зависимости

 

  • protocol buffers

 


 

Открытые вопросы

Отрытые вопросы, не решенные проблемы:

ВопросВарианты решения

Related Issues

NOC-291, NOC-1495

Отложенные задачи

ЗадачаПричина переносаПримечания
   

Translate to English

Свойства

Epic
TypeFEATURE
StatusDRAFT
Open Date2014-01-29
ModulesSA
Language

Russian

Owner
DesignerUnknown User (dv)
DevelopersUnknown User (dv)
QA
Close Date

Оглавление

История изменений

Version Date Comment
Current Version (v. 6) 29.01.2015 08:27 Unknown User (gnu-linux)
v. 5 29.01.2015 06:42 Unknown User (dv)
v. 4 29.01.2015 06:33 Unknown User (dv)
v. 3 29.01.2015 06:29 Unknown User (dv)
v. 2 29.01.2015 05:54 Unknown User (dv)
v. 1 29.01.2015 05:49 Unknown User (dv)