-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Проектируем СХД для видеонаблюдения

Среда, 05 Июля 2017 г. 13:03 + в цитатник


В предыдущей статье мы говорили об особенностях организации ИТ-инфраструктуры и подсистемы хранения данных для видеонаблюдения и пришли к выводу, что в крупных проектах для организации хранилища видеоархива целесообразно использовать СХД (системы хранения данных).

В данной публикации обсудим проблему выбора СХД для видеонаблюдения, преимущества хранилищ на базе RAIDIX и примеры их реальных внедрений.

Выбор СХД для видеонаблюдения


Разновидности СХД


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

Под медленные задачи с большими объёмами обычно выбирают менее производительные решения с большими массивами на HDD (хранилища файлов и бэкапов). Для виртуализации и задач общего назначения применяют гибридные решения (flash+HDD), чтобы удовлетворить потребности и в скорости, и в объёмах. Для чувствительных к задержкам приложух и баз данных выбирают очень быстрые и дорогие хранилки — как правило, сегодня это all-flash, где на первый план выходит скорость, объёмы там в целом небольшие.

Для задач видеонаблюдения из этих трёх категорий выбирают в основном первую, ориентированную на объём, для получения низкой цены за терабайт. Также могут выбрать более дорогие гибридные решения, но толку от них будет мало, flash-кэш (или тир) забьётся от потокового (последовательного) трафика хранения и всё упрется в медленные HDD. Быстрые all-flash хранилки, ориентированные на случайный доступ, в последовательных операциях, конечно, тоже будут очень хороши, но для видеонаблюдения, требующего больших объёмов, это неоправданно дорогое и неэффективное решение.

Особенности ввода/вывода для видеонаблюдения


В контексте хранения данных для видеонаблюдения характерны многопоточные последовательные операции ввода/вывода:

  • Каждая IP-камера создаёт свой последовательный поток данных для записи в хранилище видеоархива. В результате формируется серьёзная многопоточная нагрузка на запись.
  • При просмотре видео из архива осуществляются последовательные операции чтения, состоящие из одного или нескольких потоков.

С точки зрения нагрузки на хранилище оптимально, когда проект не предполагает постоянный просмотр видео из архива множеством операторов с нескольких рабочих мест. Мониторинг в реальном времени не требует чтения данных, а просмотр из архива происходит по одной видеозаписи — изредка или даже постоянно. В таком случае основная нагрузка — 90% и более — будет приходиться на запись, СХД не будет подвергаться ощутимой нагрузке на чтение.

В противном случае, когда требуется постоянный параллельный просмотр множества видеозаписей с разных камер из архива (например, казино, стадион, торговый центр), мы получим множество конкурентных потоков на чтение и нагрузка на СХД резко возрастет. Следовательно, на то же количество камер придется ставить более крутую хранилку, производительнее как минимум вдвое, либо сокращать количество камер на массив (контроллер).

Проблема выбора


Сегодня на рынке представлено множество моделей СХД от различных производителей:

  • Есть вендоры, которые занимаются только хранением данных, и СХД являются их основными или единственными продуктами.
  • Есть гиганты ИТ-индустрии, которые делают всевозможное оборудование и ПО, при этом поддерживают и развивают собственные линейки СХД и решений для хранения.
  • Многие крупные производители ПО и железа для видеонаблюдения предлагают свои хранилки.

Условно все модели СХД можно разделить на два класса:

  • Брeндовые хранилки. Другими словами, СХД от производителей класса «А» или премиум-сегмент. Они крутые, надежные, у них хороший сервис. Ценник у них весьма недешёвый, даже на модели начального уровня, а серьёзные производительные модели стоят как самолёт. Самое обидное, что зачастую в них нельзя ставить произвольные винты (HDD), нормально в них воткнутся, станут работать и не лишат гарантии на железо только «родные» диски вендора СХД. По факту, это будут те же серверные винты от производителей, которые выпускают жесткие диски, но с фирменными салазками и фирменной наклейкой производителя СХД, только стоить они будут в разы дороже. Собственно, с винтами для брендовых серверов дела обстоят так же. Для проектов по видеонаблюдению, где люди привыкли считать деньги и не хотят переплачивать в разы за бренд, эти решения не подходят. Конечно, если заказчик «сидит на трубе» – это его случай, может себе позволить.
  • Бюджетные решения. Это готовые хранилки от «народных» СХД-вендоров либо сборные решения на недорогом стандартном (commodity) серверном оборудовании и программных СХД (SDS), платных или бесплатных. Сюда относятся и продукты от вендоров видеонаблюдения. Цены приятные, винты можно ставить любые, но могут возникнуть проблемы с надежностью, производительностью и сервисом. Такое решение подходит для небольших и некритичных проектов в условиях ограниченного бюджета. Для серьёзных систем, где нужна гарантированная надежность, производительность, отказоустойчивость и сервис, такие решения неприемлемы, это нужно понимать.

В идеале для серьёзного проекта по видеонаблюдению хотелось бы получить решение для хранения, которое бы совмещало только сильные стороны обеих категорий СХД, представленных на рынке, — должное качество за разумные деньги. В данном сегменте таким решением являются продукты на базе RAIDIX. Нескромно, но, пожалуй, это факт. Ниже раскроем истинность данного утверждения.

Особенности СХД RAIDIX


Архитектура


RAIDIX — программная СХД или SDS (Software Defined Storage), которая позволяет строить на базе стандартного серверного оборудования надежные, производительные и отказоустойчивые хранилища данных. В принципе, для этого подходят любые х64-серверы, включающие:

  • 1-2 процессора Intel Xeon подходящей модели и необходимый объем ОЗУ;
  • один или несколько SAS HBA-адаптеров для подключения внутренней и/или внешних дисковых корзин; аппаратные RAID-контроллеры не нужны и даже противопоказаны;
  • один или несколько интерфейсов для синхронизации кэша в двухконтроллерной конфигурации; есть несколько вариантов: SAS, InfiniBand, Fibre Channel (FC), Ethernet; возможно дублирование интерфейсов; в одноконтроллерном варианте они не нужны;
  • интерфейсы для подключения к сети SAN и/или NAS: Ethernet, InfiniBand, FC; возможно прямое подключения к хостам (клиентам) по SAS;
  • SAS/SATA диски (HDD) большого (3,5”) или малого (2,5”) форм-фактора; любая подходящая модель от любого производителя, без ограничений; SSD тоже поддерживаются, но в контексте видеонаблюдения они не интересны;
  • серверную платформу, подходящую для установки перечисленного выше оборудования.

Для подключения большого количества дисков предполагается использовать внешние дисковые полки (корзины), подключаемые по SAS. Рекомендуется использовать внутренние и внешние дисковые корзины с поддержкой горячей замены дисков.

Конечно, существует лист совместимости, перечень рекомендуемого и протестированного оборудования.

Варианты развертывания


RAIDIX предполагает два варианта развертывания: одно- и двухконтроллерный. В первом варианте ПО RAIDIX устанавливается на один физический сервер, выполняющий роль контроллера СХД. Диски объединяются в отказоустойчивый RAID-массив, однако сам сервер и некоторые его компоненты образуют единые точки отказа. Это может быть приемлемо для некритичных задач.

Двухконтроллерная конфигурация предполагает установку ПО RAIDIX на два идентичных физических сервера, каждый из которых становится контроллером СХД. Это могут быть отдельные серверные платформы, либо единая платформа с двумя серверными узлами (нодами, лезвиями). Оба контроллера физически подключаются к единому дисковому пулу, размещаемому на внутренних и внешних дисковых корзинах. RAIDIX объединяет два сервера в отказоустойчивый active-active кластер, кэш контроллеров синхронизируется по выделенным интерфейсам.

В нормальном режиме нагрузка равномерно распределяется по двум контроллерам — половина созданных на дисковом массиве томов обслуживается одним контроллером, другая половина — вторым контроллерам. Если по какой-то причине один из узлов–контроллеров выйдет из строя, вся нагрузка в автоматическом режиме, без прерываний и потери данных переключится на «оставшийся в живых» контроллер. Данное решение исключает наличие единых точек отказа и подходит для критичных проектов, чувствительных к простоям.

В качестве хорошего примера серверной платформы для двухконтроллерной конфигурации СХД RAIDIX можно привести решение AIC HA401-LB2. Это 4U платформа для высокодоступных серверов хранения (cluster-in-a-box) с двумя идентичными серверными узлами, дублированными блоками питания и внутренней дисковой корзиной на 24 HDD 3,5” c возможностью горячей замены. Каждый серверный узел поддерживает два процессора Xeon, до 2ТБ ОЗУ и до 6 PCIe-слотов расширения. Этого достаточно для развертывания очень производительной и ёмкой СХД на несколько сотен дисков. Данную платформу можно назвать одной из рекомендуемых, она успешно используется во многих проектах на базе RAIDIX.

Такой подход даёт возможность создать оптимальное хранилище для любого проекта, с нужными объемами и производительностью. Объемы можно варьировать от 12 (можно и меньше) до сотен дисков на одну СХД. При этом необходимая производительность определяется выбранными процессорами Intel Xeon, объемом оперативки, пропускной способностью интерфейсов и адаптеров — можно заложить их с запасом для возможности наращивания дисковой ёмкости. Выбираем то, что нужно, и ничего лишнего – гибкость максимальная и никаких переплат.

Ключевые возможности


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

Для этих ребят решающими факторами были:

  • Быстрые последовательные (потоковые) операции для работы с тяжелым несжатым видео. Потоки большие, их надо успевать записывать без потерь и читать без тормозов.
  • Большая полезная ёмкость. Объёмы большие, стандартные решения на RAID-10 слишком затратны, нужны решения с контрольными суммами а-ля RAID-5/6.
  • Отсутствие просадки производительности при отказе дисков, когда массив находится в деградированном состоянии. Стандартные RAID-массивы в обычном состоянии, когда все диски живы, могут выдать нужную производительность, однако при деградации она сильно падает, это может привести к потере кадров, жутким тормозам и невозможности работы.
  • Высокая отказоустойчивость (доступность). Отсутствие единых точек отказа, гарантия сохранности данных при одновременном выходе из строя не менее двух дисков в массиве. Цена потери данных, которые очень долго и дорого снимали и монтировали, слишком высока, терять эти данные неприемлемо.

Удовлетворить эти требования можно было только с помощью брендовых Hi-End СХД, которые стоят «синих» денег. Поэтому пришлось искать альтернативу, и был разработан продукт, который впоследствии вырос в самостоятельное решение, стал RAIDIX-ом, и теперь на нем монтируется куча фильмов на студиях по всему миру. Общие задачи хранения на RAIDIX также решаются успешно. При этом стоимость у него вполне приемлемая, можно сказать, народная.

RAIDIX для видеонаблюдения


Основные преимущества


Несложно провести параллели между медийными задачами и видеонаблюдением и прийти к выводу, что требования к инфраструктуре хранения у них одинаковы: всё, что актуально для медийного хранилища, важно и для видеоархива. Поэтому СХД на базе RAIDIX оптимальны и для проектов по видеонаблюдению.

Обработка ввода/вывода к дисковой подсистеме и расчет контрольных сумм для обеспечения избыточности в RAIDIX осуществляется посредством вычислительных ресурсов процессоров Intel Xeon, для подключения дисков используются SAS HBA-адаптеры без RAID-функций. Запатентованные алгоритмы RAIDIX за счет использования внутренних инструкций центральных процессоров выполняют эти задачи гораздо быстрее и эффективнее, чем аппаратные RAID-контроллеры и ASIC-устройства. В итоге мы получаем возможности необходимые для большой инфраструктуры видеонаблюдения:

  • Быстрые последовательные (потоковые) операции для обработки данных с большого числа IP-камер. Например, сотни и тысячи камер с разрешением FullHD и выше, частотой 25 к/с, средней или высокой сложностью сцены.
  • Большая полезная ёмкость за счет возможности эффективно работать с большими RAID-группами на 12-24 диска, обеспечивающими отработку одновременного отказа до двух и более дисков. При этом могут успешно использоваться диски большого объёма — 6-10ТБ.
  • Отсутствие просадки производительности при вылетании дисков за счет мощи процессоров Xeon и эффективного подхода к использованию их инструкций. Данные с отказавших винтов очень быстро и незаметно для конечных потребителей ресурсов СХД вычисляются из контрольных сумм.
  • Поддержка двухконтроллерной конфигурации СХД, исключающей наличие единых точек отказа.

Дополнительные возможности


Кроме того, в арсенале RAIDIX имеются следующие уникальные и полезные для сферы видеонаблюдения «плюшки»:

  • Помимо стандартных уровней RAID 10, 5, 6 поддерживаются RAID 7.3 и N+M, которые обеспечивают отработку отказов до трех (RAID-7.3) и более (RAID-N+M, N дисков — полезный объем, M дисков — могут вылетать) дисков разом.
  • Возможность восстановления скрытых повреждений данных на дисках — защита от silent data corruption.
  • Упреждающая реконструкция. СХД отслеживает производительность всех дисков. Отдельные диски в случае неисправностей могут продолжать работать, но тормозить настолько, что восстановление их данных из контрольных сумм происходит быстрее чтения с этих дисков. В таком случае запись останется без изменений, но вместо чтения с проблемных дисков данные будут принудительно вычисляться из контрольных сумм массива для получения оптимальной производительности.
  • Частичная реконструкция. При временном отключении диска после его повторного подключения будет восстанавливаться лишь недостающая часть данных. Это может быть полезно при отключении дисков по ошибке, потере соединения дисков, перемещении дисков между полками, отключении полок целиком на время проведения обслуживания (при соответствующем числе полок и распределении RAID-групп по ним).

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

Действующие проекты на RAIDIX


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

В данный момент на этапе внедрения находится крупный проект на территории РФ по видеонаблюдению в масштабах города, в котором для организации хранилища было использовано 4 двухконтроллерных СХД RAIDIX, на 200 HDD по 6ТБ каждая. Еще один серьёзный проект по видеонаблюдению на базе RAIDIX разрабатывается для европейского казино: двухконтроллерная СХД на 300 HDD по 10ТБ. О них мы сможем рассказать в последующих публикациях, после введения систем в промышленную эксплуатацию.

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

Проект на 2000 IP-камер в Корее


Исходные данные


Йонъин — один из самых быстрорастущих мегаполисов в Южной Корее, равный по площади Сеулу, население города — около миллиона человек. Для фиксации нарушений ПДД и обеспечения безопасности власти установили в городе 2000 камер видеонаблюдения. Оборудование для записи и хранения видео находилось в 5 серверных стойках и занимало целую комнату. При этом камеры снимали видео невысокого разрешения, что существенно затрудняло работу правоохранительных органов, поскольку различить номер машины или лицо на изображении такого качества не представлялось возможным. Видеозаписи хранились меньше месяца, и полиция была ограничена в ресурсах при расследовании правонарушений — по истечении этого срока дела закрывались, штрафы за нарушения в бюджет не поступали.


Для решения данной проблемы администрация города запланировала осуществлять запись и хранение видео в HD/FullHD разрешении. Режим записи камер — 24/7 (круглосуточно) с частотой 16-25 кадров в секунду. Срок хранения архива — не менее месяца. Такой подход в разы увеличивает скорость видеопотока и объем данных, следовательно, требует значительного увеличения производительности (пропускной способности — throughput) и ёмкости СХД, хранящей видеоархив.

Требования ТЗ на СХД


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

  • быстрая последовательная запись и чтение, исключение задержек и потери кадров при одновременной записи 2000 потоков HD/FullHD;
  • отсутствие просадки производительности дискового массива при выходе из строя допустимого конфигурацией количества дисков (деградация массива);
  • высокая надежность и отказоустойчивость, автоматическая отработка отказа любого элемента системы;
  • оптимальное соотношение цена/качество решения;
  • простота и удобство внедрения и сопровождения;
  • качественная техподдержка;
  • высокая плотность размещения оборудования;
  • высокая полезная ёмкость хранилища, достаточная для хранения видеоархива со всех камер глубиной не менее одного месяца;
  • возможность масштабирования.

Структура решения


В качестве потенциальных решений были рассмотрены различные варианты брендовых и бюджетных хранилищ. Первые оказывались слишком дорогими, вторые не соответствовали заявленным требованиям. Оптимальным решением среди всех рассмотренных вариантов, удовлетворяющим всем требованиям проекта, оказалась СХД на базе RAIDIX. Ниже представлены состав и структура реализованного хранилища и проекта в целом.

Помимо СХД ИТ-инфраструктура проекта включала в себя:

  • 15 физических стоечных серверов на платформе Intel под управлением Windows Server для развертывания VMS-серверов (ПО видеонаблюдения);
  • 2 коммутатора InfiniBand (IB) Mellanox с пропускной способностью портов 40Гбит/с для подключения VMS-серверов к СХД.

Для развертывания СХД была использована 4U стоечная серверная платформа AIC HA401-CP2 c двумя серверными узлами и внутренней корзиной на 24 диска 3,5’’ — аналог более новой платформы AIC HA401-LB2. Данная платформа идеально подходит для развертывания двухконтроллерной отказоустойчивой конфигурации RAIDIX, поскольку каждый вычислительный (серверный) узел представляет собой отдельный сервер, со своей материнкой, процессорами, ОЗУ, сетевыми интерфейсами и HBA-адаптерами (для подключения дисковых корзин). Блоки питания задублированы и являются общими для всех узлов. Таким образом, за счёт дублирования всех необходимых компонентов исключаются единые точки отказа платформы в целом.

Ниже представлена структурная схема решения.



Комплектующие


Аппаратная конфигурация серверных узлов — контроллеров СХД идентична, каждый контроллер включает:

  • Один процессор Intel Xeon E5-2609 (4 ядра по 2,4ГГц). Не самый свежий и мощный «проц», но его вполне хватило.
  • 128ГБ ОЗУ — много дисков и RAID-групп требуют большого объема оперативки.
  • 2 двухпортовых InfiniBand-адаптера Mellanox ConnectX-3, скорость передачи 56Гб/с на порт. 2 порта для подключения к IB-коммутаторам, 2 порта для синхронизации кэша контроллеров — 2 кроссовер-соединения между серверными узлами.
  • Один SAS HBA-адаптер Broadcom 9207-4i4e для подключения к 1 внешней (JBOD на 60 дисков) и 1 внутренней дисковой корзине (24 диска). 4 внешних (4e) и 4 внутренних линии SAS по 6 Гбит/с, 1 внешний порт Mini-SAS.
  • Один HBA-адаптер Broadcom 9207-8e для подключения трех внешних дисковых полок (3 JBOD на 60 дисков, 2 полки каскадом). 8 внешних (8e) линий SAS по 6 Гбит/с, 2 внешний порта Mini-SAS.

В проекте было использовано 208 жестких дисков корпоративного класса SAS HDD 3,5’’ 4ТБ 7200об/мин для достижения ёмкости, необходимой для хранения видеоархива. Для размещения такого количества дисков помимо внутренней дисковой корзины платформы СХД (на 24 HDD) было использовано 4 внешних дисковых полки (JBOD) AIC XJ3000-4603S:

  • форм-фактор 4U;
  • ёмкость — 60 HDD 3,5’’ с вертикальной установкой и горячей заменой;
  • 2 SAS-экспандера 6Гбит/с, 4 порта Mini-SAS на экспандер;
  • дублирование блоков питания.

Все дисковые корзины решения (внутренняя и внешние) поддерживали горячую замену дисков. Внутренняя и две внешние корзины были набиты дисками полностью (24+2х60=144HDD), согласно структурной схеме каждая из них независимо подключена к одному порту HBA-адаптера на каждом контроллере. Остальные 64 диска были поровну поделены между оставшимися двумя внешними полками (по 32 диска на полку), как показано на схеме, данные полки подключены каскадом (последовательно) — первая полка к HBA-адаптерам контроллеров, вторая — двумя путями к первой.

Возможность расширения


Решение поддерживает дальнейшее вертикальное масштабирование. Поскольку две дисковые корзины забиты не полностью, имеется возможность установить в них до 56 дополнительных дисков. При этом лучше поставить на контроллеры по дополнительному HBA-адаптеру (Broadcom 9207-8e) и подключить каскадированную дисковую полку к ним напрямую. На оставшиеся свободные порты новых адаптеров (пока заняли по одному из двух Mini-SAS портов) можно повесить ещё одну полку на 60 дисков.

В случае недостатка вычислительной мощности следует добавить по одному процессору на контроллер и увеличить объёмы ОЗУ. Таким образом, возможно наращивание ёмкости и производительности хранилища в 1,5 раза с минимальными инвестициями — существующая платформа вертикально расширяется без необходимости покупки новых серверов.

Конфигурация массива


При конфигурировании дискового массива был выбран простой и логичный подход. Каждому из 15 VMS-серверов было отдано по одному тому (LUN), каждый из которых размещался на отдельной RAID-группе из 12-15 дисков. Для создания каждой дисковой группы был выбран уровень RAID 7.3, обеспечивающий сохранность данных при одновременном отказе до трех любых дисков.

В итоге суммарная полезная ёмкость хранилища составила порядка 600ТБ.

Плотность размещения


Всё оборудование, необходимое для организации СХД, было размещено в одной стойке, как показано на рисунке ниже.



Следует отметить, что при этом значительная часть пространства стойки осталась пустой, полезное пространство, занимаемое железом СХД — 20U (5 узлов по 4U), плотность размещения довольно высокая.

Заключение


Данный проект был реализован в 2014 году, на тот момент решение было вполне современным и технологичным. Система успешно функционирует уже четвёртый год и справляется с поставленными задачами, модернизации или расширения не производилось и пока не требуется.

Сегодня оборудование, использованное в этом проекте, устарело: вышли новые поколения и модели процессоров, HBA-адаптеров, объёмы дисков выросли до 8-10ТБ. Стало быть, ёмкость проекта может быть достигнута и превышена на новом железе с плотностью размещения 8U вместо 20U.

Таким образом, на современном железе и программных СХД RAIDIX можно успешно строить эффективные хранилища данных для больших систем видеонаблюдения, которые смогут обеспечить высокую плотность размещения и объёмы до нескольких петабайт на одну СХД, при этом будут гарантировать высокую производительность и отказоустойчивость за разумные деньги.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332476/


Другой взгляд на управление персоналом в ритейле: опыт ZOZO RCAM

Среда, 05 Июля 2017 г. 12:59 + в цитатник
Статистика провальных проектов по внедрению систем планирования рабочего времени сотрудников (WFM, Workforce Management) в ритейле зашкаливает. Все потому, что вместо честного WFM создают систему планирования, оторванную от реальных задач и процессов в магазинах. Это зачастую приводит к росту затрат на неоправданные переработки, появлению избыточного персонала и снижению выручки из-за падения конверсии или ухудшения уровня сервиса. В течение 5 лет мы глубоко изучали рынок, чтобы разобраться с потребностями и запросами ритейлеров и начать менять представление о неуспешности проектов в области WFM.


«Пилот» решения мы внедряли в Inventive Retail Group
 
Штат сотрудников большинства сетевых ритейлеров превышает 1000 человек. Это те люди, которые работают непосредственно с покупателями и от которых зависит эффективность и успех розничного бизнеса. Перед управленцами постоянно встают вопросы: сколько нужно персонала, как убедиться, что график смен оптимален для достижения бизнес-целей, как быстро и эффективно реагировать на изменения? В этой статье я расскажу о том, как компания ABC Solutions (в 2017 года вошла в группу ЛАНИТ) начинала свой путь с поиска системы управления трудовыми ресурсами для ритейла, а в результате разработала собственное решение – ZOZO RCAM.
 

Зарождение идеи


Мы взялись за собственную разработку в 2016 году, когда после тщательного изучения рынка поняли, что нет платформы для решения комплексной задачи управления фронт-персоналом среднего и крупного ритейла — одновременного повышения уровня сервиса и оптимизации затрат. Помимо крупных торговых компаний, в этот же сегмент попадают и банковский ритейл, и сервисные организации с большой численностью фронт-персонала. Даже «Почта России» и РЖД в существенной своей части работают как фронт-ритейлеры.
 
На рынке массово представлены ИТ-продукты двух направлений. Первая группа — это решения планирования бригад и рабочих смен при оказании сервисных услуг (field services). Основная задача таких систем — обеспечить необходимую скорость обслуживания и требуемый уровень качества услуг в зависимости от поступающих заявок. В компании, например, работают и инженеры, обеспечивающие доступ домохозяйств к интернету, и специалисты, устраняющие последствия аварий. Система выставит приоритеты в зависимости от специфики заявок и решит спектр дополнительных задач: от планирования маршрутов до рекомендованного списка инструментов в рюкзаке мастера.
 
Вторая группа ПО — решения для колл-центров, например, банков и операторов связи. Архитектура этих ИТ-продуктов отражает особенности построения процессов в центре удаленной работы с клиентами. Предусмотрена возможность ограничить входящий поток заявок с учетом соглашения по сервисному обслуживанию (SLA) и в зависимости от среднемесячной выручки на одного абонента (АRPU).
 
Ритейлу же нужна платформа управления трудовыми ресурсами, предлагающая управленческие решения, строящая динамические прогнозы и имеющая глубокую аналитику по всем магазинам сети. ИТ-продукты мировых вендоров плохо отвечают таким запросам, поскольку разрабатывались для других задач.
 
Сейчас сложилась ситуация, когда игроки ИТ-рынка, не всегда честные, предлагают торговым компаниям один из двух перечисленных выше вариантов ИТ-решений. Однако реальные потребности ритейл-бизнеса намного шире и подходы, используемые для сервисных компаний и колл-центров, плохо уживаются с важными для торговли бизнес-показателями.
 
Изучив потребности ритейл-бизнеса (телеком, fashion, digital, продуктовый, банковская розница, профессиональные услуги, etc.) и попытавшись «натянуть» идеальный, с точки зрения ритейлера, процесс на существующие решения, мы поняли, что платформам не хватает гибкости, а в некоторых случаях и вменяемой цены. В итоге решили разработать свой ИТ-продукт, основой для которого стал бы симбиоз бизнес-моделирования, математики, BigData, масштабируемости и гибкости.


Планирование загрузки персонала выгодно не только компаниям, но и самим сотрудникам. Гибкие графики обеспечивают work-life balance, а также возможность работать в наиболее удачные для заработка часы.
 

Бизнес с особыми потребностями


Ритейл имеет ряд ключевых отличительных особенностей. Независимо от того, удалось клиенту колл-центра решить вопрос с помощью одного звонка или пришлось звонить несколько раз, он все равно вернется. В рознице все сложнее. Продавец коммуницирует с покупателем «лицом к лицу».
 
Технологии работы розничных магазинов могут кардинально отличаться. Показательный пример – это различия продуктового ритейла и магазинов электроники. Никто не ходит в продуктовый магазин, чтобы поглазеть на круасаны, но случаи, когда покупатели посещают торговые залы с телевизорами и холодильниками, чтобы убить время или прицениться (а зимой погреться :), — не редкость.
 
Различается ритейл и по бизнес-драйверам, которые диктуют потребность в персонале в конкретное время в конкретной точке. Для продуктовой сети важным будет: отсутствие очередей на кассах, своевременность поставки (логистика), количество проданных артикулов в час, перераспределение сотрудников внутри торговых залов или зон в течение дня (приехала поставка — принимаем товар, приняли — занимаемся выкладкой). Для непродовольственных магазинов важен трафик и характерно наличие большего числа персонала в залах. От эффективности работы консультантов в зале зависит конверсия (дойдет покупатель до кассы или ограничится изучением ассортимента) и средний чек.
 
Если в салоне сотовой связи один продавец-консультант и очередь из пяти человек, вероятность того, что покупатель уйдет, высока. Можно попробовать поставить пять продавцов-консультантов. Это решит проблему в конкретный момент. Но впоследствии выяснится, что столько людей не нужно. При пяти продавцах уровень сервиса будет избыточным, а компания заплатит за «простой» части сотрудников. Это только одна точка. Представьте, что у вас их тысяча, и примерно 10 000 сотрудников, у которых разные графики работы, отпуска, больничные. Добавьте к этому текучесть персонала на уровне 50% и необходимость планирования на 365 дней. Excel для этого вряд ли уже подойдет.
 
В дополнение к этому есть набор специфических показателей, обусловленных микроиндустрией (food/fashion/FSI) и стратегическими целями. Кому-то нужно конверсию удержать, кому-то — снизить затраты. Бывает, что различные стратегии нужны одновременно на разные форматы или бренды в рамках одной сети. Все это дополнительно усложняется ситуациями, когда изменили формат сети, закрыли/открыли торговую точку (в том числе конкурентную). Жизнь торговой сети всегда динамична, изменения происходят порой несколько раз за квартал. Поэтому «руками» в ритейле довольно сложно оценивать динамику изменений потребности в персонале в течение месяца, сезона, года или нескольких лет.
 
Большинство ритейлеров сейчас расставляет персонал под статичные показатели, рассчитанные на конкретный момент времени. Довольно распространена практика, когда персонал расставляет управляющий торговой точкой. И тогда остается только рассчитывать на его опыт, сознательность и беспристрастность. Часто все работают по графикам «как удобно» и «как привыкли», не учитывая описанных выше особенностей.
 
Изучив проблему, мы выделили ряд особенностей ритейл-бизнеса:

  • компаниям всегда не хватает персонала, что является нормой (overstuff — зло, с которым компании борются в рамках сети, но на торговых точках периодически может присутствовать избыток персонала, и его логично распределить туда, где его не хватает);

  • топ-менеджмент всегда просит снижать численность и затраты, но выполнять при этом план по росту продаж и/или удержанию уровня сервиса/конверсии;

  • розница на уровне торговых точек всегда просит больше персонала для выполнения KPI;

  • HR-служба балансирует между топ-менеджментом, розницей и ограничениями, в числе которых бюджет на фонд оплаты труда и ТК РФ;

  • нет инструмента, методологически и системно объединяющего процессы планирования потребности в персонале и динамического прогноза показателей, влияющих на численность.


Чтобы повысить уровень сервиса, ритейлеру необходимо понимать, сколько человек, с какими навыками и в какое время должны работать в торговой точке.

Почему WFM оказался не у дел


Главное, что умеют делать WFM-системы (Workforce Management), — планировать загрузку сотрудников на конкретный промежуток времени и на основе этого составлять расписание работы (в международной классификации систем это называется scheduling). Незаменимая вещь для колл-центров и сервисных служб, под чьи потребности и разрабатывалась.
 
Например, при определенном бюджете колл-центра, WFM-система поможет выстроить графики операторов так, чтобы обеспечить одну целевую группу обслуживанием живыми людьми, а другой части клиентов вместо «дождитесь ответа оператора» предложит интерактивное голосовое меню (IVR).
 
Методология, используемая в стандартных системах для планирования рабочих графиков бригад (field services), тоже не подходит для ритейла. Эти решения должны обеспечить планирование логистики, материалов и выполнение SLA, а для розницы бизнес-драйвер другой — выручка, которая зависит от конверсии, выбытия артикулов, времени обслуживания, лояльности клиентов.
 
В основе WFM-решений лежит процесс статичного планирования трудовых ресурсов. В них отсутствуют прогнозные модели, аналитика по бизнес-показателям, возможность составлять долгосрочную стратегию по персоналу и обеспечивать баланс персонала и доходности в динамике. Для розницы планирование графика работы сотрудников — лишь точечное решение определенной задачи.
 
Внедрив WFM-систему, ритейлер может планировать график работы сотрудников, но при этом будет отсутствовать связь с вопросами выполнения стратегических целей, управления уровнем сервиса, доходностью, динамического управления загрузкой персонала, распределения сотрудников между несколькими зонами или торговыми точками. Именно поэтому успешных внедрений WFM-систем в ритейле мало.
 
Бизнес-консультанты могут сделать замеры, провести нормирование операций, нарисовать идеальную модель и под нее построить процесс планирования расписания смен. Казалось, проблема решена. Но один сезон придет на смену другому, изменится рынок, товарно-ассортиментная матрица или услуги. Идеальная статичная модель прошлого года перестанет работать, а счастливому и гордому старыми результатами управленцу придется бороться со своими же регламентами и системами.
 
За примерами даже ходить не надо. Электронная очередь есть почти во всех отделениях банков, но часто руководители управляют потоком клиентов в ручном режиме и играют на пульте управления очередью, как на пианино, когда заходит новый посетитель. Зачем? Чтобы выполнять KPI по уровню сервиса, установленные выше. В итоге информация вроде как есть, но данные не консистентны, не понятно, какую услугу выбрал посетитель, с каким вопросом обратился, какая операция по факту была проведена, кто ее проводил и т.д.
 
Становится очевидным, что методология, заложенная в стандартных системах для управления трудовыми ресурсами, не подходит для ритейла.


Грамотное управление фронт-персоналом позволяет повысить уровень сервиса. Покупателям не придется стоять в очереди к кассам.

Что делать?


Пять лет мы были частью команды компании ABC Consulting и внедряли проекты управления талантами (Talent Management). У нас есть опыт работы с такими предприятиями, как Объединенная металлургическая компания, «Уралхим», «Касперский», «Башнефть», «Ростелеком», Inventive Retail Group, МТС, «СТС Медиа», «Сбербанк», «Декатлон», ГК «Мегаполис», «Евраз», «Газпромнефть» и др. Всего более 20 крупных компаний. Все проекты, которые мы реализовали, были разными как по проблематике, так и по предпосылкам к поиску решений.
 
Мы пришли к выводу, что универсальной системы бизнес-показателей в ритейле нет, и в 2016 году занялись разработкой своего решения. Всегда нужно искать баланс между экономической эффективностью торговой точки, сети и специфическими бизнес-драйверами, которые заложены в стратегию или являются следствием сегмента, в котором работает компания. Зачастую эти показатели и стратегии повторяются, однако имеют разный вес в оценке успешности бизнеса.
 
Менеджмент телеком-компании может ставить цель за год сократить затраты на фонд оплаты труда и при этом увеличить показатели сервиса и объемы продаж. При этом, как показал опыт нашего общения, три телеком-оператора, имеющие схожие розничные сети, по факту имеют абсолютно уникальные модели продаж и оценки эффективности бизнеса. А для банковской розницы, например, важным будет отношение операционных расходов к доходам (CIR).
 
Вывод, который напрашивался сам собой, — нам требуется современная система и методология, которая сможет использовать:
 
  • различные стратегии бизнеса и модели прогнозов показателей, от которых зависит потребность в персонале;

  • возможности больших данных и машинного обучения;

  • технологии и методы правильной балансировки факторов, проактивно реагируя на изменения,

и при этом оставаться гибкой и динамичной.
 
Модель, которую мы разрабатывали, должна была учитывать разные входные показатели и параметры, сохраняя стабильность и точность прогноза. Для этого мы методологически разделили математический аппарат системы, сохранив его универсальность, и предварительный анализ процессов клиента. Последний необходим для выявления драйверов и получения данных для наполнения и индивидуальной настройки модели.
 
В рамках проекта трансформации конкретного ритейл-бизнеса мы предварительно изучаем текущие процессы клиента, исследуем возможные источники данных, выбираем стратегию и показатели, на основании которых находим проблемные зоны и предлагаем точки оптимизации, чтобы достичь целей. Далее вместе с заказчиком формируем новый подход к модели управления. Это необходимо, чтобы снизить экономические потери от ошибок при планировании трудовых ресурсов.
 
На этой основе мы описали идеальный подход и методологию построения процесса управления уровнем сервиса и доходностью российского ритейлера. Схематично и упрощенно он выглядит так (некоторые элементы сознательно скрыты).
 

 
Принципиальным отличием нашего решения от WFM-систем стала возможность балансировки между стоимостью персонала и выручкой, которую он принесет. Это своего рода весы: на одной чаше комплексный показатель уровня сервиса (продажи, конверсия, лояльность), а на другой — затраты (прямые, косвенные, отток). Наше решение ZOZO RCAM (Revenue & Costs Assurance Management), используя динамические модели, отвечает на вопрос, какая стратегия выгоднее в указанный промежуток времени: сокращения расходов или повышения уровня сервиса.
 

Команда ZOZO за работой
 
Велосипед изобретать мы не стали. Во всех решениях применяются одни и те же математические функции. Вопрос инновационности в том, какой алгоритм для их взаимодействия выбрать. Поскольку мы строили балансир, важно было найти оптимальную взаимосвязь алгоритмов обработки внутренних и внешних (BigData) источников данных, модели бизнес-ограничений, прогнозного блока и возможности его корректировки по отношению к данным. C точки зрения математики, эта функция не идеальна. Однако нам удалось найти необходимое соотношение показателей и получить нужную математическую модель.
 
Математическая составляющая ZOZO RCAM состоит из двух частей (модулей): прогнозирование драйверов, влияющих на численность персонала и расстановку смен, а также расчет оптимальной численности персонала и построение эффективных расписаний. Существуют несколько классических моделей прогнозирования. Мы же постарались привнести опыт из других отраслей: машинное обучение, генетические алгоритмы, распознавание образов. Результат работы стандартных моделей представлен набором данных, мы взглянули на это не как на систему значений, а как на их картинки, возникающие в ответ на изменения. Нам оставалось только найти необходимые паттерны, в которые укладывались бы эти картинки. Мы получили математическую модель, которая быстро работала, и обеспечивала хорошую точность. Она и легла в основу «прогнозного» модуля нашего решения.
 
Работая над модулем планирования смен, мы смотрели на решения разных вендоров. Все они оказались негибкими, медленными в обработке заданных массивов данных и, как правило, решали иные задачи в жестко регламентированных параметрах, что приводило к потребности думать над обходными вариантами и «заплатками». Оценив риски, и изрядно помучив команду, мы пошли по пути написания собственных алгоритмов, приняв во внимание весь «выстраданный» опыт. В результате у ZOZO RCAM появился собственный «движок».


В своем решении мы используем комбинацию алгоритмов, которые позволяют системе работать быстро
 

Что получили на выходе


Итогом нашей работы стало решение ZOZO* RCAM (Revenue & Costs Assurance Management) — система управления доходностью и уровнем сервиса торговых организаций, в основе которой — оптимизация и прогнозирование потребности в трудовых ресурсах. Над ней работала и продолжает это делать команда бизнес-аналитиков, специалистов по математическому моделированию и программистов. Всего 21 человек.
 

Архитектура решения ZOZO RCAM
 
Почему ZOZO?
Начав работу над решением, мы занялись стратегией, которую отрисовали в презентации с названием «ABC Solutions. Стратегия 2020». В заголовке презентации случайно поменяли шрифт, и число 2020 визуально превратилось в ZOZO.
Идея такого названия всем понравилась. Также выяснилось, что акроним ZOZO в США означает Zombie Zone, что очень подходит под потенциальные объекты оптимизации, которыми занимается компания. No more zombies в ритейле! Так забавное слово ZOZO стало брендом.
 
ZOZO помогает менеджменту решать ряд вопросов: какая должна быть достаточность персонала, как можно качественно выстраивать смены, как быстро реагировать на изменения. В годовом горизонте можно планировать отпуска, численность персонала по точкам, бюджет на фонд оплаты труда, управлять стратегиями на уровне торговой точки и компании в целом.


ZOZO помогает менеджменту в годовом горизонте планировать численность персонала по точкам.
 
По результатам пилотного проекта на 20 торговых точках крупного оператора связи, нам удалось высвободить дополнительные трудочасы для увеличения конверсии и уровня сервиса. Первые внедрения в 5 магазинах ритейлера электроники показали, что необходимо перераспределить отпуска по иным периодам, чем планируют управляющие торговых точек. Итогом апробации ZOZO в финансовом учреждении стала 3%-ная экономия фонда заработной платы и возможность планировать группу кадрового резерва на горизонт более месяца.
 
Разработанная нами система имеет два контура управления. Оперативное, заложенное в блок ZOZO WFM, соответствует классическому подходу: позволяет составлять и управлять графиками работы персонала с учетом требований ТК РФ, квалификации, навыков. Система учитывает местоположение магазина и его формат. Расчеты эффективности для супермаркета в центре столицы и гипермаркета в одном из спальных районов будут разные.
 
ZOZO RCAM позволяет стратегически управлять трудовыми ресурсами. Система покажет узкие места и предложит варианты оптимизации в зависимости от бизнес-драйверов и условий внешней среды бизнеса.


Оперативное управление, заложенное в блок ZOZO WFM, соответствует классическому подходу.
 
ZOZO RCAM — не инструмент службы персонала, это скорее решение для руководителя розницы. Оно позволяет понимать, как покрывать потоки трафика, как извлекать выгоду и увеличить качество сервиса, как оптимизировать процессы, когда вы видите их динамику. Если в течение дня наблюдается подъем и спад трафика в магазине, система порекомендует внедрить гибкие графики или четырехчасовые смены. Требования к сменам или штату можно динамично перестроить в ответ на изменения бизнес-драйверов в торговой точке. Кадровой службе легко управлять бюджетом и отчитываться перед руководством, понимая как меняется потребность в персонале.
 
Система позволяет построить прозрачную модель мотивации, планируя сотрудника на то время, когда можно заработать, а не просто присутствовать. Учет потребности и потенциальных выгод для сотрудников внутри компании влияет на их вовлеченность, лояльность и мотивацию.
 
Гибкая параметризируемая модель движка ZOZO позволяет ставить различные цели и подключать любые внешние источники данных. Даже прогноз погоды: потеплело — жди роста продаж сарафанов, обильные осадки и температура около нуля — обрабатывай трафик в аптеки.
 
Компании могут рассчитать бизнес-показатели при изменении стратегии развития. Сегодня ты дискаунтер и конкурируешь на уровне количества магазинов, а завтра решаешь открыть новый формат с высоким уровнем сервиса — система подскажет, как спланировать численность персонала, и покажет возможные последствия принятых решений.

Какие задачи можно решить



 
По результатам пилотного проекта в телеком-секторе, только за счет баланса недоработок/переработок мы достигли экономии фонда заработной платы на уровне 20-22% при сохранении SLA. Дополнительный эффект можно получить от централизации процессов.
 
Чтобы увеличить доходность, руководство банков расширяет портфель услуг для привлечения новых клиентов. А чтобы контролировать расходы регламентирует множество процедур обслуживания в отделениях. Все это, как правило, оборачивается ростом очередей, снижением уровня конверсии и эффективности отделений. Результаты нашего «пилота» в банковском секторе показали, что к таким последствиям приводят в основном ошибки, связанные с недостоверностью данных из системы электронной очереди, когда клиентопотоком руководят вручную, проблемы с прогнозированием отпусков и своевременным учётом больничных, а также большие временные затраты на выполнение таких непрофильных задач, как планирование и согласование ежемесячных графиков. По нашей оценке, планирование графиков системой позволило бы выйти на требуемый уровень конверсии и высвободить как минимум полставки в месяц для дополнительных офисов.
 
Благодаря системе акселераторов наше решение позволяет строить модели с неполной занятостью и распределять сотрудников между офисами, а главное — получать оперативную отчетность. Частично занятых сотрудников можно использовать в период наименьшего трафика, чтобы дать основному персоналу отдохнуть.
 
Также возможен сценарий балансировки сотрудников между несколькими офисами продаж в зависимости от потребности офисов и географии доступности сотрудников. Это позволяет сократить потребность в персонале на 10-20% при сохранении уровня сервиса. Ведь часто сотрудники отрабатывают норматив времени независимо от того, нужен он в это время или нет. При этом в соседней точке людей может не хватать, но на такие короткие периоды никто новых людей набирать не будет.
 
ZOZO учитывает изменения с растром до 15 минут, а точность прогнозов составляет более 80%. И это не предел. Мы продолжаем работать над тем, чтобы повысить эти показатели.
 
Менее чем за год, наша команда реализовала успешные пилотные проекты ZOZO RCAM в таких компаниях, как «МТС ритейл», «ВымпелКом», Inventive Retail Group, ВТБ24. По результатам некоторых проектов уже идет тираж системы. О результатах мы расскажем позже.


Мы успешно стартовали, работая над системой ZOZO, и пока рано финишировать. Впереди много интересных задач.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331820/


Метки:  

Анализ бэкдора группы TeleBots

Среда, 05 Июля 2017 г. 12:48 + в цитатник
27 июня компании на Украине и в других странах стали жертвами масштабной кибератаки шифратора DiskCoder.C (он же ExPetr, PetrWrap, Petya или NotPetya). Малварь маскируется под обычный вымогатель – шифрует данные и требует выкуп за ключ расшифровки. Но, поскольку авторы стремятся нанести максимальный ущерб, шансы на восстановление данных сведены к минимуму.



В прошлом отчете мы указали на связь эпидемии DiskCoder.C с кибергруппой TeleBots и другими атаками на украинские компании. В этой статье раскроем детали о начальном векторе заражения.

История о вредоносных обновлениях


Департамент киберполиции Национальной полиции Украины подтвердил информацию ESET и других антивирусных вендоров о том, что легитимное ПО M.E.Doc использовалось злоумышленниками для запуска DiskCoder.C на начальном этапе атаки. Однако до сих пор не было подробностей о том, каким образом реализована эта операция.

В ходе нашего исследования мы обнаружили сложный скрытый бэкдор, внедренный в один из легитимных модулей M.E.Doc. Маловероятно, что злоумышленники сделали это, не имея доступа к исходному коду M.E.Doc.

Имя файла модуля бэкдора – ZvitPublishedObjects.dll. Он написан с использованием .NET Framework. Это файл размером 5 Мб, он содержит легитимный код, который может быть вызван другими компонентами, включая основной исполняемый файл M.E.Doc ezvit.exe.

Мы изучили все обновления M.E.Doc, выпущенные в 2017 году, и обнаружили, что как минимум три апдейта содержали модуль бэкдора:
  • 10.01.175-10.01.176 от 14 апреля
  • 10.01.180-10.01.181 от 15 мая
  • 10.01.188-10.01.189 от 22 июня

Сверяем даты. Атака с Win32/Filecoder.AESNI.C (XData) началась через три дня после обновления 10.01.180-10.01.181; DiskCoder.C – через пять дней после апдейта 10.01.188-10.01.189. Четыре обновления в период с 24 апреля по 10 мая и семь – с 17 мая по 21 июня не содержали вредоносный модуль.

Интересный момент связан с шифратором AESNI.C. Обновление M.E.Doc от 15 мая содержало бэкдор, а следующее, от 17 мая, – нет. Возможно, с этим связано сравнительно небольшое число заражений – атакующие запустили шифратор 18 мая, когда большинство пользователей M.E.Doc уже установили безопасное обновление.

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


Рисунок 1. Временная метка компиляции модуля обновления с бэкдором, выпущенного 15 мая.

Рисунок 2 показывает различия между списком классов версий модуля ZvitPublishedObjects.dll с бэкдором и без, с использованием ILSpy .NET Decompiler.


Рисунок 2. Список классов модуля с бэкдором (слева) и без (справа).

Класс, содержащий основной бэкдор, называется MeCom, он расположен в пространстве имен ZvitPublishedObjects.Server.


Рисунок 3. Класс MeCom с вредоносным кодом, как показано в ILSpy .NET Decompiler.

Методы класса MeCom вызываются из методаIsNewUpdate в пространстве имен UpdaterUtils и ZvitPublishedObjects.Server. Метод IsNewUpdate вызывается периодически, чтобы проверить, доступно ли обновление. Модуль с бэкдором от 15 мая реализован несколько иначе и имеет меньше функций, чем модуль от 22 июня.

Каждой украинской компании присваивается идентификатор юридического лица – код по ЕДРПОУ (Единому государственному реестру предприятий и организаций Украины). Это полезно для атакующих – по коду можно идентифицировать организацию, использующую версию M.E.Doc с бэкдором. Далее атакующие могут использовать различные тактики для работы с ее сетью – все зависит от целей.

Поскольку M.E.Doc используется для бухгалтерского учета, можно предположить, что коды ЕДРПОУ будут найдены на машинах, на которых установлено это ПО. Вредоносный код, инжектированный в метод IsNewUpdate, собирает коды из приложения. Одна учетная запись в M.E.Doc может использоваться для бухгалтерского учета нескольких организаций, поэтому код бэкдора собирает все возможные коды ЕДРПОУ.


Рисунок 4. Код, собирающий коды ЕДРПОУ.

Помимо кодов ЕДРПОУ, бэкдор собирает из приложения M.E.Doc информацию о настройках прокси и почтовой службы, включая логины и пароли.

Внимание! ESET рекомендует всем пользователям M.E.Doc сменить пароли прокси-серверов и учетных записей электронной почты.

Вредоносный код записывает информацию, собранную в реестр Windows под ключ HKEY_CURRENT_USER\SOFTWARE\WC, используя имена значений Cred и Prx. Если эти значения существуют на компьютере, вполне вероятно, что на нем побывал бэкдор.

И самая интересная часть. Бэкдор не использует внешние серверы в качестве C&C, их роль выполняют запросы M.E.Doc к своему официальному серверу upd.me-doc.com[.]ua для проверки наличия обновлений. Единственное отличие от легитимного запроса в том, что бэкдор отправляет в cookie собранную информацию.


Рисунок 5. HTTP запрос бэкдора, который содержит в cookies коды ЕДРПОУ.

Мы не проводили ретроспективный анализ сервера M.E.Doc. Тем не менее, как мы сообщили в прошлом отчете, есть признаки того, что он был скомпрометирован. Поэтому мы предполагаем, что злоумышленники задействовали серверное ПО, что позволило различать запросы от скомпрометированных и чистых машин.


Рисунок 6. Код бэкдора, который добавляет cookies в запрос.

Безусловно, авторы бэкдора предусмотрели возможность управления зараженной машиной. Код получает двоичный blob с официального сервера M.E.Doc, расшифровывает его с помощью алгоритма Triple DES, а затем распаковывает с помощью GZip. Результатом является XML-файл, который может содержать сразу несколько команд. Возможность удаленного управления превращает бэкдор в полнофункциональную платформу для кибершпионажа и саботажа.


Рисунок 7. Код бэкдора расшифровывает поступившие команды операторов.

В таблице ниже представлены возможные команды:


Стоит отметить, что команда 5, названная авторами малвари AutoPayload, полностью соответствует тому, как DiskCoder.C запускался на «нулевых пациентах» – машинах, с которых начиналось заражение сети.


Рисунок 8. Функция AutoPayload использовалась для выполнения DiskCoder.C.

Выводы


Как показывает исследование, операция была тщательно спланирована и реализована. Мы предполагаем, что атакующие имели доступ к исходному коду приложения M.E.Doc. У них было время изучить код и встроить в него скрытый сложный бэкдор. Размер приложения M.E.Doc около 1,5 Гб, и у нас пока не было достаточно времени проверить, нет ли в нем других бэкдоров.

Нам все еще предстоит ответить на ряд вопросов. Как долго использовался бэкдор? Какие команды и вредоносное ПО, помимо DiskCoder.C и AESNI.C, были направлены через этот канал? Какие еще инфраструктуры скомпрометированы, но пока не использовались кибергруппой, которая стоит за этой атакой?

Благодарим за помощь коллег Fr'ed'eric Vachon и Thomas Dupuy.

Индикаторы заражения (IoC)


Детектирование продуктами ESET:
MSIL/TeleDoor.A

Легитимный сервер, используемый авторами вредоносного ПО:
upd.me-doc.com[.]ua

Ключ реестра:
HKEY_CURRENT_USER\SOFTWARE\WC

SHA-1 hashes:
7B051E7E7A82F07873FA360958ACC6492E4385DD
7F3B1C56C180369AE7891483675BEC61F3182F27
3567434E2E49358E8210674641A20B147E0BD23C
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332472/


Метки:  

Самое время: в Digital October покажут защищённый корпоративный мессенджер от российского интегратора

Среда, 05 Июля 2017 г. 12:21 + в цитатник
Темой №1 в последний месяц вновь стали блокировки мессенджеров и, соответственно, вопросы безопасной и приватной переписки. Не дожидаясь соответствующих законов, принятых депутатами, силовые ведомства уже раздают себе полномочия блокировать анонимайзеры без суда и следствия. О том, чем это грозит рядовым пользователям и как с этим бороться, говорят сейчас все. Мы же хотим взглянуть на эту проблему с точки зрения корпораций. Защищённые коммуникации для бизнеса — вопрос, который имеет конкретную цену и в плане содержания такой защиты, и рисков, связанных с утечкой конфиденциальной информации.


Кадр из фильма «Голый пистолет 33 1/3»

12 июля, в Digital October в Москве пройдёт семинар компании «Электронное облако», более 10 лет обеспечивающей ИТ-безопасность для своих клиентов в авиаиндустрии, финансовых организаций, адвокатских бюро и юридических компаний.

Могут ли компании полагаться на сторонние, даже самые защищённые мессенджеры? Что делать, когда сторонние разработки попадают под удар блокировок? Подходят ли мессенджеры, рассчитанные на частных пользователей, для задач делового общения?

За один содержательный и насыщенный семинар мы не только ответим на все вопросы, которые возникают у руководства компаний сегодня, но и познакомим с новейшими идеями в области защищённой бизнес-коммуникации.

Технический директор компании «Электронное Облако» Александр Дмитриев расскажет о том, что практика запретов VPN, анонимайзеров, мессенджеров означает для бизнеса, какие у компаний существуют окна возможностей и что по этому поводу советуют юристы.

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

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

Но главным событием семинара станет презентация собственной разработки «Электронного облака» — защищённого мессенджера для корпоративных коммуникаций.

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

Ну и конечно же, участники семинара смогут пообщаться и завести полезные знакомства в своём кругу среди руководителей и ключевых фигуры клиентов «Электронного облака» — финансовых организаций, адвокатских и юридических контор, ритейла и строительных компаний. Количество мест ограничено: всего в семинаре смогут принять участие не более 200 человек, поэтому регистрируйтесь прямо сейчас.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332470/


Метки:  

[Перевод] 31 факт о ранней истории доллара США

Среда, 05 Июля 2017 г. 11:53 + в цитатник

Метки:  

Как пройти собеседование в компанию мечты? Советы от тимлидов IT-компаний

Среда, 05 Июля 2017 г. 11:47 + в цитатник
16-17 июля в 95 км от Москвы пройдёт конференция для python-разработчиков PYCON RUSSIA. Традиционно мы делаем серию интервью с докладчиками и организаторами.

В первом посте мы спросили тимлидов четырёх разных компаний, на что они обращают внимание во время собеседований, какие ошибки допускают кандидаты, как понять, что человек подходит в команду, и чего никогда нельзя делать во время интервью. На вопросы ответили: CTO в компании «Точка» Данила Штань, руководитель разработки в ЦИАН Михаил Юматов, руководитель группы Python-проектов в Rambler&Co Олег Чуркин и руководитель PyCharm Community в JetBrains Андрей Власовских.



— Как вы поймёте, что джуниор может быстро учиться и развиваться?

ДШ: Никак, просто даю шанс и смотрю, что происходит.

МЮ: У джуниора уже должны быть какие-то плоды его стремления учиться и развиваться — pet project'ы, багаж изучаемых технологий и т.п. Вот о них и поговорим.

ОЧ: Чтобы понять, насколько кандидат мотивирован на саморазвитие, я обычно задаю вопросы про самые сложные задачи, с которыми человек уже сумел столкнуться и слушаю, как он их в итоге решал. Чем интереснее рассказ, тем быстрее будет обучение.

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

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

ДШ: Никаких, это всё бред для потокового найма, а я не люблю потоковый найм.

МЮ: Сеньор очень хорошо знает применяемые технологии (их сильные и слабые стороны, реализацию), отслеживает жизнь компонент на бою и проактивно выходит с предложениями по оптимизации и/или решению проблем с ними. Способен разработать архитектуру приложения и найти быстрые нестандартные решения в критической ситуации, самостоятельно вести проекты. Начиная с этого уровня, problem solving, умение работать с заказчиком, умение самостоятельно принимать решения и быстро переключать контекст между задачами — это обязательные требования. Автономен в решении поставленных задач, понимает, какая цель достигается в рамках решения задачи и способен найти оптимальный путь решения задачи. Всегда принимает на себя ответственность за качество выполнения задачи и названные сроки.

ОЧ: Сеньор должен хорошо разбираться в архитектуре веб-приложений и обладать достаточными личностными качествами для руководства командой. С сеньорами техническое интервью обычно переходит в дизайн-интервью, на котором и выясняется уровень.

АВ: Сеньора отличает большой опыт принятия взвешенных архитектурных решений, умение руководить джуниорами и способствовать их росту.

— На что вы смотрите при выполнении тестового задания?

ДШ: Никогда не даю тестовые задания, максимум алгоритм написать, просто чтобы понять какие-то базовые вещи про подготовку человека.

МЮ: Тестового задания у нас нет, но на собеседовании обычно что-нибудь с кандидатом проектируем. Смотрю на то, как человек рассуждает, насколько глубоко продумывает решение, как относится к остальным невидимым участникам процесса.

ОЧ: В первую очередь на его корректность. Если дефектов в коде нет, то большое внимание уделяю правильному выбору алгоритмов, умелому использованию инструментов, читаемости и красоте кода.

АВ: Помимо корректности и выбора подходящих алгоритмов, смотрю на соответствие кода лучшим практикам software engineering: разумная структура проекта, тесты, документация и т.д.

— Ваша любимая логическая задачка, которую вы задаете на собеседовании?

ДШ: Отсутствует, логические задачки на собеседованиях — это изобретение не очень компетентных HR. Нормальным людям и без этого есть, о чём поговорить с кандидатом.

МЮ: Нет такой :)

ОЧ: Есть неотсортированный список натуральных чисел от 1 до N, числа не повторяются. Из списка извлекли одно число. Необходимо определить какое за O(N) по времени и O(1) по памяти.

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



— Наличие каких знаний/опыта необходимо и достаточно, чтобы попасть в вашу команду? И на какие «огрехи» и несовершенства вы спокойно закрываете глаза?

ДШ: Профильных знаний и профильного опыта. Желательно, в формате «сам себе режиссер».

МЮ: Про достаточные условия не скажу, а необходимые — пожалуйста. Нужно неуёмное желание уменьшать количество «магии» вокруг. Как результат — понимание используемых технологий, их устройства и работы. В том числе и Python’а.

Готовы закрывать глаза на знание используемых нами специфичных технологий. По ряду soft skills — тоже. Научим.

ОЧ: Хорошие знания Python (структуры данных, декораторы, интеграторы, генераторы, классы и наследование), понимание сложности алгоритмов, базовые знания РСУБД и *nix. Проактивность и желание развиваться.

Никогда не просил кандидатов развернуть бинарное дерево.

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

— Как вы определяете, что человек не впишется в вашу команду? Есть ли какие-то маркеры (кроме профессионального несоответствия требуемому уровню в вакансии)?

ДШ: Смотрю на soft skills, манеру общения, скорость реакции на вопросы. Не могу сказать, что есть какие-то формальные маркеры. Причем профессиональные скиллы часто отходят на второй план, если человек хороший.

МЮ: Если человек умеет слушать других, учитывает чужое мнение, ответственен, дисциплинирован — скорее всего, мы сработаемся.

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

ОЧ: Самым важным личностным качеством, на мой взгляд, является адекватное восприятие обратной связи. Если на собеседовании становится понятно, что кандидат слишком эмоционально реагирует на критику своей работы, то вряд ли он впишется в команду.

АВ: Может, это прозвучит очевидно, но человек вряд ли впишется в команду при слабых soft skills.

— Самые частые ошибки кандидатов на собеседовании? Как поведенческие, так и технические.

ДШ: Хвастаться. Заводить разговор о том, в чём плохо разбираешься. Считать собеседника идиотом.

МЮ: Опоздание на собеседование. Не люблю, когда опаздывают, это первый признак будущих проблем с дисциплиной.

Иногда кандидаты начинают рассказывать что-то, о чём их не спрашивал. Это далеко не всегда к месту — создается ощущение, что кандидат старается сбить с толку.

ОЧ: Самые частые ошибочные поведенческие паттерны: «интервьюировать интервьюера», замыкаться в себе после первого неправильного ответа, иногда кандидаты начинают уверенно говорить о теме, в которой не разбираются, и после первых неудобных вопросов становится стыдно :)

Со стороны технического интервью: почти никто не знает про frozenset и только небольшой процент кандидатов смог написать параметризированный декоратор.

АВ: Порой кандидаты переоценивают уровень своих знаний: начинают уверенно рассказывать о чём-то, но когда дело доходит до конкретики, могут «поплыть». Некоторые ничего не знают о компании или о продукте, который будут разрабатывать, хотя информация публично доступна и напрямую касается их ближайшего будущего.

— Какой совет вы бы дали соискателю на собеседовании?

ДШ: Не пытайтесь «продать» себя. Показывайте свой уровень честно, демонстрируйте широкий кругозор и желание (и умение) учиться и разбираться в незнакомых проблемах.
Это важнее, чем список «технологий» или «участия в проектах» в резюме.

МЮ: Всегда отвечай честно. Если чего-то не знаешь, стоит прямо об этом сказать. Не набивай себе цену — это видно.

ОЧ: Не теряться, размышлять вслух, потренироваться писать код на бумаге.

АВ: Для многих собеседование — это небольшой стресс: легко запутаться, забыть что-то. Старайтесь рассуждать вслух. Если вы не понимаете условия или ограничения задания, проговорите это вслух, задайте вопросы.


Еще можно почитать советы Остина Белкейка из Майкрософт о том, как легко пройти собеседование



16-17 июля со всеми ребятами можно будет познакомиться на конференции PyConRu. Андрей Власовских объяснит, что может Python на микроконтроллерах, Михаил Юматов расскажет, какие есть инструменты для слежения за производительностью веб-приложений, Олег Чуркин расскажет, какие требования к процессу разработки и инфраструктуре проекта необходимо выполнить, чтобы относительно быстро, эффективно и вполне безболезненно попробовать микро(сервисы). Данила Штань будет ведущим и модератором. Итоговая сетка со всеми докладами готова.

Спасибо нашим спонсорам, которые делают конференцию возможной: золотому спонсору — компании Adcombo, серебряным спонсорам — Rambler&Co и ДомКлик, бронзовому спонсору — MediaScope. Спасибо за поддержку партнеру энергии и хорошего настроения компании ЦИАН и Python Software Foundation.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332468/


Метки:  

[Из песочницы] Цветовая сегментация для чайников

Среда, 05 Июля 2017 г. 11:33 + в цитатник
Это статья рассчитана на новичков, которые только начинают осваивать методы обработки изображений. Сама я часто сталкиваюсь с отсутствием легких примеров, особенно на русском языке, поэтому надеюсь данный материал окажется полезным.

Как-то встала передо мной следующая задача. У меня было много фотографий болгарских перцев и необходимо было отделить растение от фона. На примере этой задачи я покажу один из самых примитивных способов как это можно сделать при помощи openCV 2.4.

Суть задачи: закрасить белым все что не является растением.


Исходная фотография (слева) и то что должно получиться (справа).

Для начала загрузим изображение:

Mat src = imread("1.jpg"); //Исходное изображение

По умолчанию в opencv цветное изображение хранится палитре BGR. Определять цвет в BGR не очень удобно, поэтому для начала переведем изображение в формат HSV.
HSV (или HSB) означает Hue, Saturation, Value (Brightness), где:
Hue — цветовой тон, т.е. оттенок цвета.

Saturation — насыщенность. Чем выше этот параметр, тем «чище» будет цвет, а чем ниже, тем ближе он будет к серому.

Value (Brightness) — значение (яркость) цвета. Чем выше значение, тем ярче будет цвет (но не белее). А чем ниже, тем темнее (0% — черный)

image

Так как искать растение мы будем именно по цвету, то больше всего нас интересует именно тон.

Преобразуем изображение в палитру HSV и разобьем на три составляющие Hue Saturation Value соответственно.

//Переводим в формат HSV
Mat hsv = Mat(src.cols, src.rows, 8, 3); //
vector splitedHsv = vector();
cvtColor(src, hsv, CV_BGR2HSV);
split(hsv, splitedHsv);

Зададим диапазон значений тона. В OpenCV зеленый находится в диапазоне от 34 до 72. Перец на фотографиях не полностью зеленый. Поэтому опытным путем я был подобран диапазон от 21 до 110.

const int GREEN_MIN = 21;
const int GREEN_MAX = 110;

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

for (int y = 0; y < hsv.cols; y++) {
	for (int x = 0; x < hsv.rows; x++) {
		// получаем HSV-компоненты пикселя
		int H = static_cast(splitedHsv[0].at(x, y));        // Тон
		int S = static_cast(splitedHsv[1].at(x, y));        // Интенсивность
		int V = static_cast(splitedHsv[2].at(x, y));        // Яркость
		
		//Если яркость слишком низкая либо Тон не попадает у заданный диапазон, то закрашиваем белым
		if ((V < 20) || (H < GREEN_MIN) || (H > GREEN_MAX)) {
			src.at(x, y)[0] = 255;
			src.at(x, y)[1] = 255;
			src.at(x, y)[2] = 255;
		}
	}
}

В результате у нас получится такое изображение:



В целом фон удалился, но остались непонятные шумы в левом углу.

Один из способов убрать мелкие несвязные частицы — это морфологическая обработка изображений.

Дилатация (морфологическое расширение) – свертка изображения или выделенной области изображения с некоторым ядром. Ядро может иметь произвольную форму и размер. При этом в ядре выделяется единственная ведущая позиция, которая совмещается с текущим пикселем при вычислении свертки. Во многих случаях в качестве ядра выбирается квадрат или круг с ведущей позицией в центре. Ядро можно рассматривать как шаблон или маску. Применение дилатации сводится к проходу шаблоном по всему изображению и применению оператора поиска локального максимума к интенсивностям пикселей изображения, которые накрываются шаблоном. Такая операция вызывает рост светлых областей на изображении. На рисунке серым цветом отмечены пиксели, которые в результате применения дилатации будут белыми.

Эрозия (морфологическое сужение) – обратная операция. Действие эрозии подобно дилатации, разница лишь в том, что используется оператор поиска локального минимума серым цветом залиты пиксели, которые станут черными в результате эрозии.

Подробнее про это дело можно почитать тут. Применим морфологические операции к нашим картинкам. В качестве структурного элемента возьмем эллипс.

int an = 5;
//Морфологическое замыкание для удаления остаточных шумов.
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(an * 2 + 1, an * 2 + 1), Point(an, an));
dilate(src, tmp, element);
erode(tmp, tmp, element);


Результат морфологической обработки.

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

Mat grayscaleMat;
cvtColor(tmp, grayscaleMat, CV_BGR2GRAY);

//Делаем бинарную маску
Mat mask(grayscaleMat.size(), grayscaleMat.type());
Mat out(src.size(), src.type());
threshold(grayscaleMat, mask, 200, 255, THRESH_BINARY_INV);

//Финальное изображение предварительно красим в белый цвет
out = Scalar::all(255);
//Копируем зашумленное изображение через маску
src.copyTo(out, mask);


Слева маска, справа результат применения маски.

Вот таким способом можно примитивно выделить объект из фона.

-> Полный код примера
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332464/


Метки:  

Что, если выкинуть все лишнее из базы в распределенный кэш – наш опыт использования Hazelcast

Среда, 05 Июля 2017 г. 11:16 + в цитатник


Так как базы данных Яндекс.Денег вынуждены хранить массу второстепенной и временной информации, однажды такое решение перестало быть оптимальным. Поэтому в инфраструктуре появился распределенный Data Grid с функциями in-memory базы данных на базе Hazelcast.


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


Зачем понадобилась In-Memory база


В Яндекс.Деньгах Hazelcast используется как in-memory база данных и, во вторую очередь, как распределенный кэш для Java-инфраструктуры. При проведении каждого платежа нужно где-то держать массу информации, которая после совершения транзакции уже не нужна, и она должна быть легко доступна. Мы называем такие данные контекстом сессии пользователя и относим к ним источник и способ перевода денег, признак перевода с карты, способ подтверждения перевода и т.п.


Помимо более долгого отклика, неудобно было поддерживать скрипт и хранить лишние данные в бэкапах. Множество разнообразных контекстов платежей, других временных данных, необходимость поддерживать автоматическую очистку, рост нагрузки на БД – все это побудило нас пересмотреть подход к хранению временных данных.


Необходимо было отдельное масштабируемое хранилище с высокой скоростью доступа. Толчком к изменением и поиску более изящного и быстрого хранилища временных данных послужила ранее случившаяся частичная замена на PostgreSQL.


Из ключевых требований к искомому решению были:


  • Отказоустойчивость как на уровне одного дата-центра (ДЦ), так и между двумя имеющимися.


  • Минимальный перерасход памяти на хранение данных (memory overhead). В первую очередь решение будет использоваться как хранилище данных, поэтому важно учесть потребление памяти самим хранилищем. В нашем случае получилось распределить некоторые локальные кеши приложений по памяти кластера, что дало выигрыш в десятки раз.


  • Стоимость масштабирования. Так как платежный сервис постоянно наращивает мышцы (не всегда линейно), новая БД должна уметь делать это максимально дешево как на продакшене, так и в тестовых или локальных окружениях.

Не буду утомлять читателя перечислением конкурентов и нашими итерациями выбора – эта информация под спойлером, если любопытно.

Если разбить три описанных выше критерия детальнее, то вот что должно было уметь искомое ПО:


  • Высокая скорость чтения/записи по сравнению с обычной БД и небольшой overhead по памяти для хранения данных.


  • Отказоустойчивость при ошибках на отдельных узлах.


  • Репликация как внутри дата-центров, так и между ними.


  • Высокий uptime в работе и возможность конфигурации на лету.


  • Возможность выставления фиксированного срока жизни объектов – TTL.


  • Распределенное хранение (шардинг) и балансировка нагрузки на узлы кластера со стороны клиента.


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


  • Простота настройки и поддержания инфраструктуры, гибкость.


  • Автоматическое расширение кластера, возможность ограничить объём кэша отдельного типа объектов.

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


Большей части этих требований удовлетворяют следующие продукты:


  1. Redis – не позволяет указывать max-idle-seconds для записей кэша, выполнять сложную репликацию и ограничивать объём памяти по отдельному типу объектов.


  2. Ehcache big memory – обладает хорошими характеристиками, но предоставляет только платную лицензию.


  3. Gridgain – тоже хорош, но репликация между ДЦ и внутри ДЦ есть только в платной версии.


  4. Infinispan – вроде бы всем хорош, но достаточно сложен в настройке и не содержит коммерческой поддержки. Что еще печальнее, в сети нет информации о поведении в продакшене, а это увеличивает наши риски.


  5. Hazelcast удовлетворяет всем требованиям и активно используется в продакшене. Более того, именно на эту систему мигрируют с Redis. Из минусов только платный management studio для мониторинга, который уравновешивает API для реализации своей системы мониторинга.


Теперь расскажу подробнее о том, как все настроили и какие выводы сделали, потому что сложности с Hazelcast были связаны как раз с «граблями» конфигурации.


Кластер о 25 нодах


Так как для инфраструктуры Яндекс.Денег необходима локальная и геоизбыточность, мы включили в кластер Hazelcast ноды в двух дата-центрах, как изображено на рисунке ниже.



На схеме изображен кластер Hazelcast, распределенный между двумя удаленными ДЦ.


Всего он состоит из 25 нод, разбитых на две группы. Hazelcast хранит данные в кластере в партициях, распределяя эти партици между нодами. Объединение партиций в группы позволяет Hazelcast осуществлять бэкапирование партиций между группами. Мы объединили в группы ноды кластера каждого ДЦ и получили простое и прозрачное резервное копирование данных между ДЦ.


Пример конфигурации:





    
    
        5701
        
            
           
            
                
                192.168.0.0-255
                
                192.168.1.0-255
            
        
    

   
    
        
            
            192.168.0.*
        
        
            
            192.168.1.*
        
    

    
        slf4j
       
        NOISY
       
        true
        
        false
    

Блок network отвечает за настройку адресов серверов, которые будут образовывать кластер (в нашей инфраструктуре это отдельные диапазоны под два ДЦ). Partition-group содержит настройки групп партиций, между которыми осуществляется резервное копирование данных. Здесь тоже привязка к двум ДЦ для дублирования данных в обоих.


Что, если перегрузить Hazelcast в 80 раз


После настройки системы и некоторого наблюдения за ней я могу отметить высокую скорость чтения-записи, которая не меняется даже при повышенных нагрузках (данные хранятся в памяти). Но, как и любая другая распределенная система, Hazelcast чувствительна к пропускной способности и отклику сети. Hazelcast – это Java-приложение, а значит, требует тонкой настройки сборщика мусора (Garbage Collector), согласно профилю нагрузки.


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



На графике представлено среднее время выполнения операций вставки и получения данных в Hazelcast для одного из клиентов. Среднее время вставки данных составило 2.1 мс, а чтения – 1.6 мс. Эти цифры отражают общую производительность системы: отправка запроса, его выполнение в кластере, сетевое взаимодействие и десериализация ответа.


Но при общем положительном фоне есть несколько областей, на которые стоит обратить особое внимание. Например, мы столкнулись со следующими проблемами при использовании Hazelcast:


  • Развал кластера и Split Brain, чреватый простоями и нарушением SLA.


  • Ложные срабатывания политик эвикта данных, которые приводят к потере данных.


  • Загрузка данных без учета настроек IMap приводит к засорению хранилища.


  • Долго выполняются команды в момент изменения структуры кластера. При штатной перезагрузке команды вставки и получения данных тормозят нод кластера.

А раз документации к продукту немного, то подробнее остановлюсь на решениях.


Развал кластера и Split Brain


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


Приложение запускается Spring Boot, который реализует свой classLoader. А между тем самописный classLoader Spring Boot имеет один очень нехороший баг. В случае нештатной ситуации кластер отправляет своим нодам идентификатор исключения для обработки ситуации. Ноды получают сообщения с ошибками и пытаются десериализовать классы исключений. Загрузчик класса Spring Boot не успевает загружать классы при высокой нагрузке и выдает ошибку NoClassDefFoundError.


В конечном итоге кластер может развалиться, преобразовавшись в несколько более мелких самостоятельных «кластеров». У нас такое как раз и произошло под нагрузкой, а в логах были лишь NoClassDefFoundError классов самого Hazelcast. В качестве лечения перед запуском приложения пришлось принудительно распаковывать классы всех библиотек следующей командой:


(springBoot  
    {requiresUnpack = ['com.hazelcast:hazelcast', 'com.hazelcast:hazelcast-client']}
)

Чтобы такого не происходило в будущем, просто отключили в spring boot его сборщик пакетов:


apply plugin: 'spring-boot'
bootRepackage {
    enabled = false
}

Тогда при запуске приложения необходимо явно выгружать все содержимое .jar при старте:


-Dsun.misc.URLClassPath.disableJarChecking=true \$JAVA_OPTS -cp \$jarfile:$libDirectory/*:. $mainClassName

Использование стандартного Class Loader исключило ошибки загрузки классов при работе приложения, но потребовало написания кода по сборке пакета для установки.


Ложные срабатывания политик эвикта данных


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



Garbage Collector за работой.


Чтобы корректно удалять ненужную информацию, мы используем связку из параметров TTL и MaxIDLE () для ограничения времени жизни данных в этих коллекциях, а также ограничение размера хранимых данных на каждой ноде.


Политик ограничения коллекции по размеру (MaxSizePolicy) несколько:


  • PER_NODE: Максимальное число записей для каждой JVM.


  • PER_PARTITION: Максимальное число записей для одной партиции.


  • USED_HEAP_SIZE: Максимальный размер памяти, который могут занять записи конкретной коллекции – сумма вычисленных размеров каждой записи.


  • USED_HEAP_PERCENTAGE: То же самое что USED_HEAP_SIZE, только в процентах.


  • FREE_HEAP_SIZE: Минимальный размер оставшейся выделенной JVM памяти, на основе данных самой JVM.


  • FREE_HEAP_PERCENTAGE: то же самое что и FREE_HEAP_SIZE, только в процентах).

Изначально использовали FREE_HEAP_PERCENTAGE, но в итоге переключились на USED_HEAP_PERCENTAGE. Дело в том, что эти похожие по назначению политики работают совершенно по-разному:


  • FREE_HEAP_PERCENTAGE – начинает очищать данные в коллекциях при Runtime.getRuntime().freeMemory() менее установленного лимита. Допустим, я хочу начать паниковать и удалять данные если осталось менее 10% доступной приложению памяти. Тогда получится постоянное срабатывание этой политики под нагрузкой. И это нормально, потому что так работает Java-машина при выделении и освобождении памяти.


  • USED_HEAP_PERCENTAGE – работает совершенно по-другому (и это можно понять, только внимательно изучив исходный код Hazelcast, хорошо, что он есть в свободном доступе), эта политика срабатывает на каждую коллекцию в отдельности, а фактором является рассчитанная стоимость хранимых данных, которая примерно равна реальному значению. Так как это не показания JVM, а рассчитанные данные – график изменения EntryCost не выглядит как кардиограмма, а датчик не срабатывает ошибочно и процесс удаления данных не запускается.

Что касается FREE_HEAP_PERCENTAGE, мы пробовали настраивать GC так, чтобы порог доступной памяти никогда не достигался, но в лучшем случае ничего не менялось. Либо возникали проблемы с OldGen и Stop-the-World.


Использовав USED_HEAP_PERCENTAGE, удалось полностью избавиться от проблем с преждевременным эвиктом данных из коллекций. Одной из особенностей работы эвикта является механизм отбора элементов на удаление (EvictionPolicy: LRU, RANDOM и т.д.). Нам нужен LRU (Last Recently Used), но, с его точки зрения, только что загруженные данные и ни разу не запрошенные данные имеют одинаковый вес, что нужно учитывать.


Загрузка данных без учета настроек IMap


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


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


Долго выполняются команды в момент изменения структуры кластера


Hazelcast адекватно реагирует на выключение одной ноды или даже половины всего кластера, ведь данные реплицируются между всеми участниками. Но штатное поведение для Hazelcast не так хорошо для его клиентов. У клиента есть замечательная настройка smartRouting, которая позволяет ему самостоятельно переключится на другую ноду при потере соединения по умолчанию.


Она работает, но недостаточно быстро и все запросы на добавление или получение данных приходят на другие ноды кластера с предварительной установкой соединения. Задержки на установку соединения и операции с данными под нагрузкой не укладываются в таймауты клиентов (мы ограничили время операций 400 мс), и проводимые ими операции прерываются. Поэтому важно научить клиентскую часть обрабатывать такие ошибки и пытаться повторить операцию.


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


Мониторинг кластера


У Hazelcast есть собственное средство мониторинга – Management Center, доступный в лицензии Enterprise. Но все метрики доступны по JMX и их можно собирать, например, с помощью Zabbix. Так в нашей сети и мониторится занимаемая приложением память и, при необходимости, любая другая доступная метрика.


Тем не менее Zabbix беден в части возможностей по составлению запросов, построению и оформлению графиков, поэтому в большей степени он годится как источник данных для Grafana. Для мониторинга размеров коллекций, hit rate, latency их значения пересылаются в Graphite из компонента, управляющего запуском ноды Hazelcast.


Временные данные требуют автоматической очистки, и за ней тоже нужно приглядывать. Поэтому в логи попадает каждое добавление, удаление или эвикт данных из коллекций. Оперативные логи доступны в Kibana – Адель об этом недавно рассказал – и отлично подходят для расследования инцидентов или отслеживания эффективности кэшей. Такое логирование можно реализовать с помощью MapListener, что полностью покрывает потребности нашей команды в мониторинге кластера.


Перезапуск нод кластера


Для того чтобы сделать процесс перезапуска всех нод кластера максимально безболезненным для системы, мы применяем следующий подход:


  • Каждое изменение настроек Hazelcast – настройку новых или существующих коллекций, мониторинг, выделение памяти приложению – выполняется в рамках процесса релиза кластера как компонента нашей системы.


  • Для автоматизации процесса перезапуска всех нод с новыми настройками написан скрипт, который на основе данных мониторинга ноды принимает решение о возможности ее перезапуска с новой версией. У Hazelcast есть PartitionService с информацией о состоянии партиций кластера, включая информацию о бэкапах всех данных, isLocalMemberSafe(). Этот флаг скрипт интерпретирует как признак возможности безопасного перезапуска ноды – все ее данные могут быть восстановлены из бэкапов других нод.


  • Сам по себе флаг isLocalMemberSafe() не гарантирует, что в следующую миллисекунду все не развалится. Поэтому мы запускаем Hazelcast со следующим параметром:
    false

Это позволяет отключить Terminate (жесткое отключение) ноды при получении сигнала SEGTERM. Скрипт посылает SEGTERM ноде, контекст приложения закрывается с вызовом Graceful Shutdown.


Такой способ гарантирует штатный вывод ноды из кластера, ожидающего полной синхронизации данных перед выключением ноды. Процесс релиза кластера у нас занимает около часа в полуавтоматическом режиме, причем ввод ноды в кластер происходит в среднем за 5 секунд.


Потеря половины нод кластера


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



При полном выключении одного ДЦ Hazelcast репартиционировал данные на оставшиеся ноды, а скорость работы возросла почти в 2 раза.


Возникает вопрос: почему бы нам не оставить в 2 раза меньше нод? Здесь как раз пространство для исследований – будем подбирать конфигурацию, которая обеспечит максимальную скорость без вреда для отказоустойчивости.


Стоило ли оно того


Распределенная in-memory база позволила организовать удобное и «красивое» хранение массы временной информации. Кроме того, архитектура получилась не только производительной, но и неплохо масштабируемой. Но я бы поостерегся советовать подобные распределенные системы всем подряд, так как они довольно сложны в поддержке, преимущества которой можно ощутить только на действительно большом потоке данных.


Кроме того, по результатам проекта мы научились не доверять решениям только на основе их популярности (привет Spring Boot), а также тщательно испытывать новый продукт перед внедрением. Но даже после всех описанных в статье настроек придется что-то докручивать и менять: например, мне еще предстоит познать «радость» обновления с Hazelcast 3.5.5 до свежей версии 3.8. Соль в том, что версии обратно несовместимы и потому острые ощущения гарантированы. Но об этом я расскажу как-нибудь в другой раз.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332462/


Знакомство со стандартом ISO 20000: Откуда он взялся и как сертифицировать компанию

Среда, 05 Июля 2017 г. 11:09 + в цитатник
В 2005 году Британский институт стандартов (BSI) выпустил новый стандарт ISO/IEC 20000:2005, который предъявляет требования к качеству предоставления IT-услуг. Принятие стандарта позволило оценить эффективность предоставляемых пользователям сервисов.

Стандарт опирается на лучшие мировые практики управления IT-сервисами и подходит для организаций любых размеров — от небольших контор до крупных технологических [и не только] компаний. В этом материале мы совершим небольшой экскурс в историю создания ISO 20000 и поговорим о том, каким образом проводится сертификация компании.

/ фото WOCinTech Chat CC

Развитие стандарта


Идея об обобщении лучших практик IT-сервисов в едином документе принадлежала британскому правительству, которое в 1989 году поручило начать разработку «Библиотеки инфраструктуры информационных технологий», или ITIL. Первый этап проекта реализовало агентство British Central Computer & Telecommunications, на базе которого было создано сообщество представителей IT-провайдеров, корпораций и консультантов. Результатом их деятельности стал семитомный свод рекомендаций, в котором были проработаны комплексные методики управления IT-инфраструктурой.

Основой же для ISO 20000 послужила последняя версия британского стандарта BS 15000, разработанного BSI и содержащего описание универсальных критериев для оценки системы управления IT-сервисами организации. ISO 20000 изначально готовился для применения в технической области, поэтому был сформирован с учетом запросов и специфики работы IT-компаний — он содержит ссылки на методологию оценки IT-рисков и применим для оценки систем информационной безопасности.

ISO 20000 состоит из двух частей: Information technology: Specification и Information technology: Code of Practice. Первая часть содержит подробное описание требований к системе управления IT-сервисами, а также ответственность за них. В ней определены 13 самых важных IT-процессов, разбитых на пять групп:

  • Процессы предоставления услуг (Service delivery process). В неё входят управление уровнем услуг (Service Level Management), управление доступностью (Availability Management) и управление возможностями сервисов (Capacity Management). Сюда также относятся отчетность по предоставлению сервисов, управление информационной безопасностью, бюджетирование.
  • Процессы управления взаимодействием (Relationship processes). Эта область включает в себя управление процессами, происходящими между поставщиком сервисов, клиентом и подрядчиками.
  • Процессы разрешения инцидентов (Resolution processes). Сюда входят процессы решения проблем, сфокусированные на критических событиях в IT-структуре компании.
  • Процессы контроля (Control processes). Здесь рассматриваются процессы управления изменениями и конфигурациями. Руководители компании должны иметь представление не только о ключевых параметрах качества, но и о методиках их сбора.
  • Процессы управления релизами (Release process). Речь идет о выработке новых и коррекции уже имеющихся решений.

Вторая часть стандарта — Information technology: Code of Practice — является практической и содержит рекомендации по процессам и требованиям, описанным в первой части. Она предназначена для аудиторов и компаний, намеренных пройти сертификацию. Оценка IT-сервисов, согласно требованиям ISO 20000, дает возможность увидеть объем нереализованности управления, что, в свою очередь, позволяет запланировать его выполнение по рекомендациям стандарта, библиотеки ITIL или любой другой методологии.

В 2011 году стандарт ISO 20000 получил обновление — вышла новая редакция ISO/IEC 20000:2011. В новой версии стандарта расширились требования к проектированию и внедрению IT-услуг и расширился глоссарий, что сделало подачу информации более понятной.

Все стандарты ISO [ISO 20000] взаимосвязаны. Это «строительные блоки», которые ложатся в основу адаптивной структуры любой организации. Инициатива создания новых стандартов исходит от компаний, пользующихся этими нормативными документами. Они формируют базовые требования к стандарту и передают их региональным ISO-представителям. После этого решается вопрос о целесообразности разработки новых стандартов.

Таким образом, система менеджмента информационных сервисов может быть интегрирована с другой системой менеджмента, например, с системой менеджмента качества в соответствии с ISO 9001, системой экологического менеджмента в соответствии с ISO 14001, системой менеджмента информационной безопасности в соответствии с ISO 27001 и другими.

Также отметим, что в 2010 году был утвержден российский ГОСТ Р ИСО/МЭК 20000 «Информационная технология. Менеджмент услуг», который тоже имеет две части. Российский ГОСТ является точным переводом оригинального текста ISO 20000 (по сути, эти стандарты равны), но выполняться он может организациями, не имеющими никакого отношения к структуре регистраторов ISO.

Сертификация компании


В такой процедуре, как оформление стандарта ISO/IEC 20000-1:2011, в первую очередь заинтересованы владельцы сервисных организаций и компаний, оказывающих услуги хостинга. Это могут быть компании, занимающиеся разработкой программного обеспечения или веб-сайтов. Сам процесс сертификации компании представляет собой проверку ее политик, целей, системы оценки рисков IT-сервисов и используемых процедур на соответствие требованиям стандарта.

У компаний есть два варианта прохождения сертификации. Первый — расширение области регистрации, когда организация после получения ISO 9001:2000 проверяется на соответствие требованиям ISO 20000. Второй — компания проходит сертификацию на соответствие стандарту ISO 20000 отдельно.

Чтобы получить сертификат ISO/IEC 20000 организации нужно обратиться в аттестационный центр, то есть компанию, ответственную за предоставление сертификатов. Отметим, что аттестационные центры также должны быть сертифицированы по стандарту ISO 17021 и аккредитованы локальной сертификационной лабораторией.

Для получения сертификата необходимо пройти следующие этапы:

а) оформление запроса
Компания, которая хочет сертифицироваться по ISO/IEC 20000, подает запрос в аттестационный центр. В нем отражается информация о компании: количество человек, которых затронет аккредитация, основной вид деятельности, объемы работ и др. На основании этих данных центр аттестации вычисляет количество требуемых дней на проведение аудита и высылает руководству организации расчет стоимости процедуры.

б) аудит
Если компания принимает предложение сертификационного центра, его представители начинают аудит. Эта фаза разбивается на два этапа. Сперва группа аудиторов подготавливает план, регламентирующий все аспекты, которые должны быть подвергнуты проверке. Также в нем указываются ответственные лица, дата и время проведения аудита. На этом этапе проводится проверка документации, формируемой компанией: главные процессы, технические инструкции и так далее. Также проверяется все, что связано с системой менеджмента (PDCA). После первой фазы группа аудиторов составляет отчет, который отражает все обнаруженные отклонения в процессах.

На втором этапе группа аудиторов проводит анализ системы оценки рисков IT-услуг, политик компании и бизнес-процессов на соответствие стандарту. Во время проведения второй фазы аудита составляется отчет, в котором отмечаются все отклонения, в том числе пропущенные во время первой фазы.

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

Сертификация организации на соответствие требованиям ISO 20000 имеет как минимум два преимущества. Она дает возможность оценить эффективность деятельности IT-подразделения и помочь перейти на сервисную модель предоставления услуг в сфере информационных технологий. Еще независимая сертификация позволяет компании продемонстрировать своим клиентам, что качество процессов предоставления услуг соответствует ведущим мировым практикам — это положительно сказывается на престиже организации.

Если у вас есть вопросы, то узнать подробнее о сертификации компании на соответствие стандарту ISO 20000 вы можете у специалистов компании «ИТ Гильдия» — официального сертифицированного партнера ServiceNow.

Если у вас есть вопросы, будем рады ответить в комментариях. Немного подробнее о сертификации компании и соответствии стандарту ISO 20000 — здесь.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331378/


Метки:  

Анализ CDR Cisco и Asterisk телефонии с помощью Splunk

Среда, 05 Июля 2017 г. 10:47 + в цитатник
На сегодняшний день существует классическая, с точки зрения аналитики, задача — анализ CDR телефонии. В рамках данной статьи мы расскажем о том, как две разные компании решали две совершенно разные задачи. Компания X анализировала CDR Cisco телефонии, а компания Y — CDR Asterisk телефонии. Почему мы пишем об этом в одной статье? Потому что в качестве инструмента для анализа обе компании используют Splunk, о котором мы много писали ранее.


Под катом вы найдете подробное описание задач и их решения с картинками и запросами.


Задачи


Компания X имеет порядка 30 департаментов, в которых порядка 400 внутренних номеров и около 100 000 звонков в месяц.

  • Компания X хочет получать аналитику звонков внутренних пользователей как наружу так и между собой. Необходимо получать информацию о количестве телефонных звонков, количестве звонящих пользователей, распределении входящих и исходящих звонков, самых звонящих абонентах внутри/извне.
  • Необходимы отчеты, показывающие как сотрудники из различных департаментов взаимодействуют с контрагентами. Зачастую такую задачу тяжело объективно решить на основании опросов, а благодаря анализу телефонных звонков можно получить максимально объективную картину.
  • Необходимо оценить интенсивность звонков, для понимания активности работы менеджеров внутри организации.

Компания Y имеет колл-центр на базе Asterisk телефонии с 1 млн звонком в день и хочет получать аналитику о его работе. Больше всего компания Y хочет знать количество конкурентных звонков (занятых time слотов) в определенный квант времени (например в каждый час), с распределением по внешним потокам. Плюс базовые kpi, такие как: средняя продолжительность звонков, средняя продолжительность разговора, процент отвеченных вызовов и прочее.

Решения задач


В данной статье мы не будем рассказывать о том как подключить данные Splunk и как сделать разбор полей (если интересно именно это, напишите нам — и мы сделаем отдельную статью об этом, но на самом деле никакого rocket science там нет). Мы покажем основные запросы, графики и дашборды.

Компания X
Аналитика по всей организации


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

Аналитика в рамках отдельного департамента


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

Аналитика по конкретному пользователю

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

Запросы
На самом деле все эти графики построены на достаточно простых запросах, уровень сложности сравним с теми, что мы обсуждали в наших предыдущих статьях. Ниже один из наиболее сложных:

|inputlookup lookup.csv
| where unit = "MGMI" 
| table ext 
| join ext type=left  
[search index=test sourcetype = csv Department = "MGMI" | stats count AS "colorig" by callingPartyNumber| rename callingPartyNumber as ext]
| join ext type=left 
[search index=test sourcetype = csv DepartmentDest = "MGMI" | stats count AS "coldest" by originalCalledPartyNumber| rename originalCalledPartyNumber as ext ]
| eval C=if(isnull(colorig), 0,colorig)
| eval D = if(isnull(coldest), 0,coldest) 
| table ext C D 
|rename ext as "Сотрудники" C as "Количество исходящих вызовов" D as "Количество входящих вызовов"



Компания Y
Здесь все намного проще, так как у колл-центра есть только один тип звонков, да и компанию в большей степени интересует только сводная информация. Однако, возможность дороботки и детализации не исключена, например по конкретному сотруднику. Ниже основной дашборд на основе CDR Asteriska:

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

Запросы
Ниже один из наиболее сложных запросов, как раз про конкурентные сессии:
index="aster2" dstchannel="Beeline" | concurrency duration=duration | timechart span=1h max(concurrency) as Beeline 

| join _time type=left

[search index="aster2" dstchannel="MTS" | concurrency duration=duration | timechart span=1h max(concurrency) as MTS 

| join _time type=left

[search index="aster2" dstchannel="Megafon" | concurrency duration=duration | timechart span=1h max(concurrency) as Megafon 
 
| join _time type=left

[search index="aster2" dstchannel="TTK" | concurrency duration=duration | timechart span=1h max(concurrency) as TTK ]]]



Заключение


Мы рады ответить на все ваши вопросы и комментарии по данной теме. Также, если вас интересует что-то конкретно в этой области, или в области анализа машинных данных в целом — мы готовы доработать существующие решения для вас, под вашу конкретную задачу. Для этого можете написать об этом в комментариях или просто отправить нам запрос через форму на нашем сайте.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332426/


Метки:  

[Перевод] Запуск Zelle — доказательство того, что финтех-компании могут оказывать влияние на крупные банки

Среда, 05 Июля 2017 г. 10:44 + в цитатник

Метки:  

VeeamON 2017: о чём не пишут маркетологи в блогах

Среда, 05 Июля 2017 г. 10:44 + в цитатник
Уже в третий раз прошла конференция посвящённая доступности данных — VeeamON. В этом году её посетило около 3500 человек, а всё действие происходило в городе Новый Орлеан, что в штате Луизиана, который в свою очередь находится в США.

Ниже будет небольшой отчёт о произошедшем, так сказать, из уст рядового инженера, которому выпало поучаствовать в данном мероприятии. Само собой, он,  будучи живым человеком с бурной фантазией, всячески старался увидеть максимум, затратив минимум.

Чего здесь не будет


Пересказов анонсов, пресс-релизов и историй о том, как мы все здорово заживём в ближайшем будущем, и тому подобного. Кому интересно — все маркетинговые материалы крайне легкодоступны и заниматься их пересказом мне видится весьма сомнительным занятием.

Что здесь будет?


Впечатления от города и мысли, так сказать, «цыганщина».





А с чего тебя туда понесло?


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

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

Затем, когда стартовало основное мероприятие, мы с коллегами организовали мобильный сертифицированный тест-центр Pearson Vue, где желающие могли пройти тестирование и получить соответствующие сертификаты. Бюрократия в чистом виде, но заниматься подобным могут только сертифицированные Pearson Vue люди.


Когда почти всё уже готово

И на сладкое — Labwarz. Игра, в которой, используя наши продукты, надо выполнить ряд заданий. Кто лучше, читай — быстрее всех выполнил, тот получил 10 000$ и молодец.

Добираемся


Добираться до места действия предстояло из Санкт-Петербурга.

Смело забыв варианты с поездами/машинами, было принято стратегическое решение добираться на самолёте. Изучив варианты, делаем вывод, что в пути придётся провести минимум 20 часов и совершить две пересадки. Как выяснилось немного позднее благодаря менее расторопным коллегам, 20 часов — это ещё ничего, ибо некоторые познали радости 30-ти часового перелёта с просиживанием в аэропорту по 10 часов.

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


Сонная утренняя Ново-Орлеанщина

Про такси. Мы люди простые, поэтому был вызван uber, заказ моментально приняли, и мы стали ждать. Минут через пять мы стали догадываться, что происходит что-то не совсем правильное, и выяснилось вот что: в мире победившего капитализма просто так подъехать к зданию аэропорта можно только к терминалам отправления. В случае прибытия заехать можно только на специальную стоянку для встречающих, на которой выделен спецзагон для уберов, где их гоняет специальный человек, не позволяющий им там стоять дольше 10 минут. И вишенкой на торте оказалось, что коллега, призвавший убер, вбил своё имя на русском, и девушка принявшая заказ никак не могла понят, ь кого искать. Ну и у него не работал роуминг, местной связи не было, и вообще мы молодцы.

Но, заметив человека, лихорадочно бегающего между группками прибывших, и не в силах устоять перед природным любопытством, мы поинтересовались, а что вообще происходит, и всё закончилось удачно – мы наконец поехали в отель.

Отель


Поскольку для меня это не первая поездка в Штаты, то считаю, что имею полное право сделать небольшое обобщение своих наблюдений.


Ночные виды с высоты 16го этажа

·    Номер с включённым завтраком — это что-то из разряда фантастики. Корни этого явления неизвестны, но факт есть факт: 9 из 10 отелей в штатах не включают завтрак в стоимость номера, независимо от звёздности. Хочешь утром есть в отеле — готовь деньги.

·    Среднестатистический американский номер всегда будет больше, чем в Европе. И чем дальше от большого города, тем он будет больше. Минутах в 10 по трассе в сторону от центра можно запросто снять нечто с кухней, огромным залом и двумя спальнями по цене одноместного номера. Логика тут простая — номера должны работать. Нет желающих снять номер как семейный? Тогда мы сдадим его этому странному товарищу по цене одноместного.

·    А, и кровати. Они всегда безгранично огромны и обложены подушками в два слоя. Что надо делать с таким количеством подушек — тайна великая. Зато свои метр девяносто всегда получается  расположить хоть вдоль, хоть поперёк, хоть как безо всяких проблем. А то ещё и руки вытянуть.

Город Новый Орлеан


Жить нам довелось в самом центре, который называется Французский квартал.
Место невероятного колорита и самобытности. Это подтверждают сами американцы, как местные, так и из других городов, утверждающие, что Новый Орлеан не похож ни на один другой город США и уверенно держится особняком.


Типичные виды исторического центра

Город производит впечатление тотальной беззаботности, всеобщей ленности и победившего счастья. Косвенно это подтверждается самым популярным прозвищем города — The Big Easy. Новый Орлеан известен своей ночной жизнью, карнавалом, клубами, алкоголем и вообще «взрослостью», т.к. найти любые 33 удовольствия можно практически на каждом углу. Иногда даже искать не надо — подходят и предлагают прямым текстом.

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

Уж простите, но в бедные районы автор решил свой нос не совать, т.к. местные рекомендуют даже на центральных улицах в ночное время, особенно не расслабляться, если идёшь один. И, честно говоря, за границами исторических кварталов Новый Орлеан представляет собой крайне унылое зрелище типичного Американского города, так что делать там нечего в квадрате.

Климат


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


Нам нужно больше кованых мансард!!!

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

Местные


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


Первое место по сувенирке, вызывающей неосознанное желание её купить

По статистике 60% населения города афроамериканцы. По наблюдениям, все 80%. По факту, если зайти в любое офисное здание, то кажется, что город состоит на 90% из белых.
Город расслоён настолько, насколько это вообще можно представить. Вспомните все, какие только сможете, стереотипы и шутки про расовый состав США, чем они занимаются, как они говорят, как одеваются и как должны себя вести. Вот это всё есть тут и выплёскивается прямо вам в лицо с вялой попыткой изобразить толерантность сквозь зубы.

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


Типичная американская очередь

Ещё тут очень уважительно относятся к личному пространству, что планомерно вымирает в больших городах. Американская очередь — это люди, стоящие на расстоянии около метра друг от друга. Прижаться друг к другу, старательно дыша в затылок впередистоящего — тут так делать никому даже в голову не придёт. Американская пробка — это когда между машинами легко влезает ещё одна, а процесс перестроения между рядами вводит в ступор неподготовленного россиянина. Никаких рывков, прыжков и ловких манёвров. Всё настолько плавно и тягуче, что иногда вызывает раздражение.

Еда


Традиционно для Штатов кормят тут на убой, не забывая всё полить метровым слоем газировки с килограммом льда. Но и тут Новый Орлеан выбивается из колеи стандартного американского города — кормят тут действительно вкусно. Возможно, это всё из-за французских корней и рабов с плантаций, но местная креольская кухня достойна того, чтобы отказаться от посещения сетевых бигмачных.


Немного небоскрёбов для контраста

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

Алкоголь


С алкоголем тут ситуация интересная.

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

Теперь про клубные заведения. Во всех барах, где удалось побывать, будь то джаз-клуб, обычная дискотека или крафтовый пивняк, барная карты выглядит так: лонг столько-то, шотик столько-то, пиво столько-то. И всё! Поразительно удобно и невероятно помогает планировать бюджет.


Учимся называть кабаки правильно

Кстати, с пивом ещё смешнее. Ценник на пиво разделён на три части. Местное плохенькое, местное крафтовое и самое дорогое — это всегда пиво заморское. Так в меню и пишут. Причём это абсолютно всегда история про «икра красная, икра чёрная, икра заморская, баклажанная». Хотите балтику «девятку» этак за 8$? Вам сюда!

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

Главный местный коктейль — это Hand Grenade, названный так исключительно за внешний вид тары, представляющей собой корпус от американской MK2, в которому приделали верхнюю часть от бонга. Второй по популярности это Fish Bowl, который также не представляет из себя ничего интересного кроме тары. Как можно догадаться из названия, это пластиковый аквариум, куда влезает литр-два-сколько унесёте.


Памятники музыкальным функционерам прямо в ресторане это норма

И что хочется отметить — все местные коктейли полная дрянь! Лёд, невероятной приторности сироп и малюсенькая капелька алкоголя сверху для запаха. Пить такое решительно невозможно, хотя местные употребляют и даже умудряются хмелеть.

Жизнь дневная, культурная


Скажу ещё раз, что для глаз Новый Орлеан прекрасен!
Дома в историческом центре — это двух- или трёхэтажные постройки, с огромными мансардами по всему периметру, коваными решётками и неизменно высокими окнами. Колониальная буржуазия как есть.

Рядом с ними соседствуют одноэтажные дома Bracket Shotgun, где нет ни мансард, ни решёток, зато есть крайне милые узкие окна с минимальным расстояние между ними. Главное — это чтобы были большие окна, а значит, свет внутри, мансарды с балконами, невероятной затейливости лёгкие решётки и обязательно несколько колонн. Дом без колонн — это как-то несрьёзно даже. А потом снова начинаются шикарные особняки, где намешано всего, от французской до итальянской и кто его знает ещё какой архитектуры.


Под каждый деревом в парке обязательно будет спать бездомный

Прямо рядом с основной улицей всех алкотрипов находится улица Рояль, главное пристанище художественных галерей и уличных музыкантов. Но особо высокая концентрация творческих личностей находится в районе Джексон-сквер и прекрасной базилики Сент-Луи.

Там же можно арендовать конную повозку и красиво раскатывать по улицам. А когда захочется поднять антураж на новый уровень, надо ехать на набережную Миссисипи и садиться на аутентичный трехэтажный колёсный пароход и под мерный шум его механизмов (кстати, в машинное отделение можно зайти) два часа изображать из себя плантатора. Говорят, что на этих прогулках особенно хорошо идут книги Марка Твена, т.к. писал он их именно на таких пароходах. Но, честно говоря, смотреть на этих прогулках особо нечего — индустриальный пейзаж от и до. Хотя если вам нравится вид ржавой нефтебазы, то кораблик — это первое место, куда надо бежать.
 

Жизнь вечерняя — клубы и бары


Даже если вы завзятый трезвенник и вечер с книгой для вас лучшее из всех благ мира, вы просто обязаны пройтись по главной клубной улице Бурбон-стрит вечером хотя бы только для того, чтобы пропитаться её атмосферой и почувствовать город.

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


Если в баре нет живой музыки, значит что-то вы делаете совершенно неправильно

Но никакой проблемы найти традиционную дискотеку или рОковое заведение тут нет. Действительно, на любой цвет и вкус: куда бы вы ни пошли, рядом будет стриптиз, напротив гейклуб, а посреди улицы будет сидеть колоритная мадам, предлагающая свои услуги по гаданию на таро, и она обязательно знает, где тут находится настоящий вуду-шоп, а не вот эти вот туристические подделки.

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

Интернет


Если вы где-то слышали, что в штатах очень плохо с интернетом, а Wi-Fi это редкость, то забудьте эту глупость! Чтобы найти место в центре города, где нет какой-то открытой сетки, это надо очень постараться. Притом сделано это вовсе не так, как у нас, когда надо зайти внутрь и спросить пароль. Нет, сети тут открытые или с минимальной авторизацией, состоящей из одной галочки.
 

Вместо заключения


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


Джаз тут везде

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

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


Когда всё закончилось и пора уезжать

Что касается самого города. Есть ли смысл ехать в Новый Орлеана через всю планету специально и за свои деньги? Однозначно нет.

А вот если вы по случаю\с оказией оказались в Штатах, то потратить день-два на посещение — самое то.

ССылочки в конце. Как же без них


 
 
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332200/


Метки:  

[Перевод] Введение в процедурную анимацию: инверсная кинематика

Среда, 05 Июля 2017 г. 10:31 + в цитатник


Часть 4. Введение в градиентный спуск


Эта часть представляет собой теоретическое введение в инверсную кинематику и содержит программное решение, основанное на градиентном спуске (gradient descent). Эта статья не будет всеобъемлющим руководством по этой теме, это всего лишь общее введение. В следующей части мы покажем настоящую реализацию этого алгоритма на C# в Unity.

Серия состоит из следующих частей (части 1-3 представлены в предыдущем посте):


Введение


В предыдущей части серии («Реализация прямой кинематики») представлено решение проблемы прямой кинематики. У нас получилась функция ForwardKinematics, определяющая точку в пространстве, которой в данный момент касается робот-манипулятор.

Если у нас есть конкретная точка в пространстве, которой мы хотим достичь, то можно использовать ForwardKinematics для оценки близости к ней манипулятора с учётом текущей конфигурации соединений. Расстояние от цели — это функция, которую можно реализовать следующим образом:

public Vector3 DistanceFromTarget(Vector3 target, float [] angles)
{
    Vector3 point = ForwardKinematics (angles);
    return Vector3.Distance(point, target);
}

Нахождение решения проблемы инверсной кинематики означает, что нам нужно минимизировать значение, возвращаемое функцией DistanceFromTarget. Минимизация функции — это одна из широко известных проблем, и в программировании, и в математике. Подход, который мы будем использовать, основан на технике под названием градиентный спуск (Wikipedia). Несмотря на то, что она не является самой эффективной, техника имеет свои преимущества: она не специфична для решения конкретной проблемы и для неё достаточно знаний, имеющихся у большинства программистов.

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



Расстояние от целевой точки задаётся как:



где — это евклидова норма вектора .

Аналитическое решение этой проблемы можно найти минимизацией , которая является функцией .

Есть и другие, более структурированные подходы к решению проблемы инверсной кинематики. Для начала стоит взглянуть на матрицы Денавита-Хартенберга (Wikipedia).

Градиентный спуск


Простейший способ разобраться в работе градиентного спуска — представить холмистый рельеф. Мы находимся в случайном месте и хотим достигнуть самой низкой точки. Назовём её минимумом рельефа. На каждом шаге градиентный спуск говорит нам двигаться в направлении, снижающем нашу высоту. Если геометрия рельефа относительно проста, то такой подход приведёт нас к самому низу долины.

На графике ниже показан стандартный случай, в котором градиентный спуск будет успешным. В этом простейшем примере у нас есть функция. Она получает один параметр (ось X) и возвращает значение ошибки (ось Y). Мы начинаем со случайной точки на оси X (синяя и зелёная точки). Градиентный спуск должен заставить нас двигаться в направлении минимума (синяя и зелёная стрелки).



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



Насколько хорошо выглядит рельеф?
Чтобы градиентный спуск был эффективным, минимизируемая нами функция должна удовлетворять определённым требованиям. Если рельеф функции относительно плавный, то вероятность успешного применения градиентного спуска выше. Если у функции есть разрывы или множество максимумов, то это особенно сложно, потому что для достижения дна долины потребуется гораздо более долгое путешествие.

Вот как может выглядеть рельеф для робота-манипулятора с двумя соединениями (управляемыми и ):



Оценка градиента


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

Во всех таких случаях невозможно найти истинную производную функции. Решением является приблизительная оценка её значения. На графике ниже показано, как она находится в одном измерении. Дискретной выборкой близлежащих точек можно приблизительно получить локальный градиент функции. Если функция ошибок меньше слева, то мы двигаемся влево, если справа — то вправо.

image


В чём разница между градиентом и производной?
Понятия градиента и произвольной тесно связаны.

Градиент или косая производная функции — это вектор, указывающий в направлении наискорейшего подъёма. В случае одномерных функций (как на наших графиках) градиент равен или , если функция идёт вверх, или , если функция идёт вниз. Если функция определена через две переменные (например, робот-манипулятор с двумя соединениями), то градиент является «стрелкой» (единичным вектором) двух элементов, направленным в сторону наискорейшего подъёма.

Производная функции, в отличие от градиента — это просто число, определяющее скорость подъёма функции при движении в направлении градиента.

В этой статье мы не будем стремиться вычислить настоящий градиент функции. Вместо этого мы создадим оценку. Наш приблизительный градиент — это вектор, который, как мы надеемся, указывает в направлении наискорейшего подъёма. Как мы увидим, это необязательно будет единичный вектор.

Насколько важно создание выборки?
Оно очень важно. Выборка близлежащих точек требует оценки функции на определённом расстоянии от текущего положения. Это расстояние критически важно.

Посмотрите на график:



Это расстояние выборки, использованное для оценки градиента, слишком велико. Градиентный спуск ошибочно «предполагает», что правая сторона выше, чем левая. В результате алгоритм будет двигаться в неправильном направлении.

Снижение расстояния выборки позволяет уменьшить эту проблему, но избавиться от неё никогда не удастся. Более того, меньшее расстояние выборки приводит ко всё более медленному приближению к решению.

Эту проблему можно решить с помощью более сложных вариаций градиентных спусков.

Что если у функции есть несколько локальных минимумов?
В общем случае такой «жадный» подход не даёт нам никаких гарантий, что мы на самом деле достигнем самой низкой точки долины. Если есть другие долины, то мы можем застрять в одной из них и не сможем достичь нашей истинной цели.



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

Все эти проблемы тоже можно решить с помощью усложнённых вариаций градиентного спуска.

Математика


Теперь, когда у нас есть общее понимание графической работы градиентного спуска, давайте посмотрим, как перевести его на язык математики. Первый этап — вычисление градиента нашей функции ошибок в конкретной точке . Нам требуется найти направление, в котором растёт функция. Градиент функции тесно связан с её производной. Поэтому неплохо бы начать создание нашей оценки с изучения того, как вычисляется производная.

С математической точки зрения производная функции называется . Её значение в точке равно , и оно показывает, насколько быстро растёт функция. Согласно ей:

  • локально растёт вверх;
  • локально опускается вниз;
  • локально плоская.

Идея заключается в том, чтобы использовать оценку для вычисления градиента, обозначаемого . Математически определяется как:



На графике ниже показано, что это значит:



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

Подведём итог. Для вычисления истинной производной функции необходимо использовать предел. Наш градиент является приблизительной оценкой производной, созданной с помощью достаточно небольшого расстояния выборки:

  • Производная

  • Приблизительный градиент

В следующем разделе мы увидим, чем эти два понятия отличаются при нескольких переменных.

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



Константу часто называют learning rate. Она определяет, как быстро мы будем двигаться по градиенту. Чем больше значения, тем быстрее найдётся решение, но тем больше вероятность пропустить его.

lim?
Если вы не изучали математический анализ, то можете быть не знакомы с понятием пределов. Пределы — это математическое средство, позволяющее нам достичь бесконечности.

Рассмотрим наш условный пример. Чем меньше расстояние выборки , тем лучше мы можем оценить истинный градиент функции. Однако мы не можем задать , потому что деление на ноль не разрешено. Пределы позволяют нам обойти эту проблему. Мы не можем делить на ноль, но с помощью пределов мы можем задать число, условно близкое к нулю, но на самом деле ему не равное.

Несколько переменных


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

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

Мы можем ввести понятие частных производных, которые, в сущности, являются «традиционными» производными, вычисляемыми для каждой из переменных:







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







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



Это не единичный вектор!
Косая производная функции — это единичный вектор, показывающий направление наискорейшего подъёма. Направления — это векторы единичной длины. Однако можно легко заметить, что вычисленный градиент необязательно является единичным вектором.

Хотя это и может выглядеть как насилие над математикой (а возможно, так оно и есть!), но при этом оно не обязательно станет проблемой для нашего алгоритма. Нам нужен вектор, указывающий в направлении наискорейшего подъёма. Использование приблизительных значений частных производных в качестве элементов такого вектора удовлетворяет нашим ограничениям. Если нам нужно, чтобы это был единичный вектор, то можно просто нормализовать его, поделив на его длину.

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

Часть 5. Инверсная кинематика для робота-манипулятора


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

image

Введение


В предыдущей части изложены математические основы техники под названием градиентный спуск. У нас есть функция , получающая параметр каждого сочленения робота-манипулатора. Этот параметр является текущим углом сочленения. Для заданной конфигурации сочленений функция возвращает одно значение, показывающее, насколько далеко конечное звено робота-манипулятора находится от целевой точки . Наша задача — найти значения , минимизирующие .

Для этого мы сначала вычислим градиент функции при текущем . Градиент — это вектор, показывающий направление наискорейшего подъёма. Проще говоря, это стрелка, указывающая нам направление, в котором растёт функция. Каждый элемент градиента — это приблизительное значение частной производной .

Например, если у робота-манипулятора есть три сочленения, то у нас будет функция , получающая три параметра: , и . Тогда наш градиент задаётся как:



где:







а , и — достаточно малые значения.

Мы получили приблизительный градиент . Если мы хотим минимизировать , то необходимо двигаться в противоположном направлении. Это означает обновление , и следующим образом:







где — это learning rate, положительный параметр, управляющий скоростью удаления от поднимающегося градиента.

Реализация


Теперь у нас есть все знания, необходимые для реализации простого градиентного спуска на C#. Давайте начнём с функции, вычисляющей приблизительное значение частного градиента i-того сочленения. Как говорилось выше, для этого нам нужно создать выборку функции (которая является нашей функцией ошибок DistanceFromTarget, описанной во «Введении в градиентный спуск») в двух точках:

public float PartialGradient (Vector3 target, float[] angles, int i)
{
    // Сохраняет угол,
    // который будет восстановлен позже
    float angle = angles[i];
 
    // Градиент: [F(x+SamplingDistance) - F(x)] / h
    float f_x = DistanceFromTarget(target, angles);
 
    angles[i] += SamplingDistance;
    float f_x_plus_d = DistanceFromTarget(target, angles);
 
    float gradient = (f_x_plus_d - f_x) / SamplingDistance;
 
    // Восстановление
    angles[i] = angle;
 
    return gradient;
}

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

Нам нужно обработать в цикле все сочленения, вычисляя их влияние на градиент.

public void InverseKinematics (Vector3 target, float [] angles)
{
    for (int i = 0; i < Joints.Length; i ++)
    {
        // Градиентный спуск
        // Обновление : Solution -= LearningRate * Gradient
        float gradient = PartialGradient(target, angles, i);
        angles[i] -= LearningRate * gradient;
    }
}

Многократный вызов InverseKinematics перемещает робот-манипулятор ближе к целевой точке.

Преждевременное завершение


Одна из основных проблем инверсной кинематики, реализованной этим наивным подходом — малая вероятность окончательного схождения градиента. В зависимости от выбранных для LearningRate и SamplingDistance значений очень возможно, что манипулятор будет «качаться» рядом с истинным решением.



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

public void InverseKinematics (Vector3 target, float [] angles)
{
    if (DistanceFromTarget(target, angles) < DistanceThreshold)
        return;
 
    for (int i = Joints.Length -1; i >= 0; i --)
    {
        // Градиентный спуск
        // Обновление : Solution -= LearningRate * Gradient
        float gradient = PartialGradient(target, angles, i);
        angles[i] -= LearningRate * gradient;
 
        // Преждевременное завершение
        if (DistanceFromTarget(target, angles) < DistanceThreshold)
            return;
    }
}

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

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

Ограничения


Одна из характеристик реальных сочленений заключается в том, что у них обычно есть ограниченный диапазон возможных углов поворота. Не все сочленения могут вращаться на 360 градусов вокруг своей оси. Пока мы не наложили никаких ограничений на наш алгоритм оптимизации. Это значит, что мы, скорее всего, получим вот такое поведение:

image

Решение достаточно очевидно. Мы добавим в класс RobotJoint минимальные и максимальные углы:

using UnityEngine;
 
public class RobotJoint : MonoBehaviour
{
    public Vector3 Axis;
    public Vector3 StartOffset;
 
    public float MinAngle;
    public float MaxAngle;
 
    void Awake ()
    {
        StartOffset = transform.localPosition;
    }
}

затем нужно убедиться, что мы ограничиваем углы нужным диапазоном:

public void InverseKinematics (Vector3 target, float [] angles)
{
    if (DistanceFromTarget(target, angles) < DistanceThreshold)
        return;
 
    for (int i = Joints.Length -1; i >= 0; i --)
    {
        // Градиентный спуск
        // Обновление : Solution -= LearningRate * Gradient
        float gradient = PartialGradient(target, angles, i);
        angles[i] -= LearningRate * gradient;
 
        // Ограничение
        angles[i] = Mathf.Clamp(angles[i], Joints[i].MinAngle, Joints[i].MaxAngle);
 
        // Преждевременное завершение
        if (DistanceFromTarget(target, angles) < DistanceThreshold)
            return;
    }
}

Проблемы


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

Посмотрите на анимацию:



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

Часть 6. Инверсная кинематика щупалец


Введение


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

У некоторых существ есть части тела, имеющие несколько степеней свободы. Примером могут служить хобот слона и щупальце осьминога. Моделирование таких частей тела — особо сложная задача, потому что приведённые выше традиционные техники не смогут создать реалистичных результатов.

Мы начнём с примера из предыдущей части и постепенно придём к поведению, которое для наших целей окажется достаточно реалистичным.

Риггинг щупальца


В созданном нами роботе-манипуляторе каждая часть двигалась независимо от других. Щупальца, в отличие от робота, могут изгибаться. Это необходимая особенность, которую нельзя игнорировать, если мы хотим нацелены на реализм. Наше щупальце должно уметь изгибаться.

Компонент Unity, позволяющий реализовать эту функцию, называется Skinned Mesh Renderer:



К сожалению, Unity не предоставляет возможности создания рендерера сеток со скиннингом в редакторе. Необходим редактор 3D-моделей, например, Blender. На изображении ниже показана модель щупальца, которое мы будем использовать в этой части. Внутри видно несколько костей, соединённых друг с другом. Это объекты, позволяющие нам изгибать модель.



В этом туториале мы не будем изучать добавление костей к моделям, также называемое риггингом. Хорошее введение в предмет можно прочитать в статье Blender 3D: Noob to Pro/Bones.

Кости и сочленения


Следующий этап реализации инверсной кинематики щупальца — прикрепление к каждой кости скрипта RobotJoint. Благодаря этому мы даём нашему алгоритму инверсной кинематики возможность сгибать щупальце.

У обычного осьминога каждое сочленение может свободно поворачиваться по всем трём осям. К сожалению, код написанный для робота-манипулятора, позволяет вращать сочленения только по одной оси. Если попытаться изменить это, то мы добавим нашему коду новый уровень сложности. Вместо этого мы можем циклично менять ось сочленений, чтобы сочленение 0 поворачивалось по X, сочленение 1 — по Y, сочленение 2 — по Z, и так далее. Это может привести к неестественному поведению, но такая проблема у вас может никогда не возникнуть, если кости достаточно малы.

В скачиваемом проекте Unity, продаваемом с этим туториалом, скрипт SetRobotJointWeights автоматически инициализирует параметры всех сочленений щупальца. Вы можете делать это вручную, чтобы иметь более точный контроль над движением каждой кости.

Функция комфорта


На представленной ниже анимации показано два щупальца. Щупальце слева тянется к красной сфере с помощью алгоритма из «Инверсной кинематики для робота-манипулятора». Правое щупальце добавляет совершенно новый уровень реализма, закручиваясь спирально, в более органическом стиле. Этого примера должно быть достаточно, чтобы понять, почему для щупалец нужен свой собственный туториал.



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

Щупальце справа минимизирует другую функцию. Функция DistanceFromTarget, использованная для манипулятора, заменена на новую, более сложную функцию. Мы можем заставить эту новую функцию ErrorFunction учитывать и другие параметры, которые нам важны. Показанные в этом туториале щупальца минимизируют три различные функции:

  • Расстояние до цели: уже готова,
  • Поворот конечного звена: конец щупальца пытается соответствовать повороту объекта, к которому мы хотим приблизиться. Такое поведение можно заметить в анимации выше, когда правое щупальце спирально загибается вокруг сферы. Поскольку каждое сочленение имеет ограниченный диапазон движений, это создаёт пульсации, распространяющиеся вниз по кинетической цепи костей. Мы можем заставить щупальце соответствовать повороту объекта, к которому она стремится. Для этого мы можем измерить угол между поворотом конечного звена и поворотом цели. В Unity есть для этого удобная функция — Quaternion.Angle:

    float rotationPenalty =
        Mathf.Abs
        (
             Quaternion.Angle(EndEffector.rotation, Destination.rotation) / 180f
        );

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

    float torsionPenalty = 0;
    for (int i = 0; i < solution.Length; i++)
         torsionPenalty += Mathf.Abs(solution[i]);
    torsionPenalty /= solution.Length;

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

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

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

public float ErrorFunction (Vector3 target, float [] angles)
{
    return
        NormalisedDistance(target, angles) * DistanceWeight +
        NormalisedRotation(target, angles) * RotationWeight +
        NormalisedTorsion (target, angles) * TorsionWeight  ;
}

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

У нас нет аналитического определения!
Традиционную проблему прямой кинематики можно смоделировать аналитически. Это значит, что мы можем вывести уравнение, которое её решает. Мы уже упоминали о существовании аналитических методов решения двойственной проблемы инверсной кинематики.

На данный момент у нас есть функция, которую, возможно, не получится описать аналитически. Если бы мы выбрали традиционный, аналитический подход к решению инверсной кинематики, то нам не удалось бы добавить такие нюансы поведения щупальца. Использование градиентного спуска означает, что теперь мы можем минимизировать (почти!) любую произвольную функцию, есть у неё уравнение или нет.

Усовершенствования


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

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

[Готовый проект Unity со скриптами и 3D-моделями можно приобрести за 10 долларов на странице Patreon автора оригинала статьи.]

К сожалению, оказалось, что седьмая часть про поведение паучьих лап у автора ещё не готова. В связи с этим добавил опрос:
Нужно ли отдельно переводить статью про инверсную кинематику лап паука, когда она появится?

Никто ещё не голосовал. Воздержавшихся нет.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332198/


Метки:  

Про аналитику и серебряные пули или «При чем здесь Рамблер/топ-100?»

Среда, 05 Июля 2017 г. 10:19 + в цитатник


Всем привет! Я тимлид проекта Рамблер/топ-100. Это лонгрид о том, как мы проектировали архитектуру обновлённого сервиса веб-аналитики, с какими сложностями столкнулись по пути и как с ними боролись. Если вам интересны такие базворды как ClickhouseAerospikeSpark, добро пожаловать под кат.

В прошлом году Рамблеру и Топ-100 исполнилось 20 лет – достаточно большой срок, за который на сервисе было несколько крупных обновлений и последнее из них случилось достаточно давно. Предыдущая версия Рамблер/топ-100 морально устарела, с точки зрения интерфейсов, кода и архитектуры. Планируя перезапуск, мы отдавали себе отчёт в том, что косметическим ремонтом не обойтись – нам надо было выстроить новый сервис практически с нуля.

Поиски решения


Вернёмся ненадолго в прошлое, в начало 2016 года, когда были определены состав перезапуска Рамблер/топ-100 и намечена дата релиза. К перезапуску мы должны были повторить функционал предыдущей версии Топ-100, а также дополнить сервис несколькими новыми отчётами о поведении посетителей, нужных для решения аналитических задач сервисов Rambler&Co.

На тот момент у нас было понимание, как выстроить архитектуру с батч-обсчётами раз в сутки. Архитектура была простая как три копейки: ночью запускается набор Hive-скриптов, читает сырые логи, генерирует по ним предопределенный набор агрегатов за предыдущий день и заливает это все в HBase.

Прекрасно понимая, что статистика на утро следующего дня, это буквально вчерашний день, мы искали и исследовали различные варианты систем, которые позволят обеспечить доступность данных для аналитики с небольшим интервалом (5-10 минут и меньше). Чтобы достичь этого, необходимо было решить целый ряд проблем:

  • обсчёт постоянно дополняющихся данных в близком к реальному времени;
  • склеивание целевых событий с просмотрами страниц и сессиями;
  • обработка запросов с произвольной сегментацией данных;
  • все вышеперечисленное нужно делать быстро и держать много одновременных запросов.

Давайте подробнее рассмотрим каждую проблему.

Данные от пользователей приходят постоянно, и они должны быть доступны как можно быстрее. Значит, движок базы данных должен быстро вставлять данные, и они должны быть сразу доступны для запросов. Есть необходимость считать сессии пользователей, которые сильно выходят за временные рамки одного микро-батча. То есть нам нужен механизм хранения сессий, а сами данные должны заливаться в базу не в конце пользовательской сессии, а по мере поступления событий. При этом база должна уметь группировать эти данные по сессиям и просмотрам страниц. Важно также, чтобы движок базы данных обеспечивал возможность склейки и изменения сущностей после записи (например, в рамках сессии произошло целевое событие, пользователь кликнул на какой-то блок).

Бывают ситуации, в которых необходимо быстро делать агрегирующие запросы с заданной пользователем сегментацией. Например, пользователь аналитики хочет узнать, сколько людей заходят с IE6 из Удмуртии, мы должны это посчитать и показать. Это значит, что база должна позволять хранение достаточно слабоагрегированных или вовсе не агрегированных сущностей, а отчёты по ним должны строиться на лету. Учитывая общий объём данных, необходим механизм сэмплирования (построения выборки и обсчёта данных из этой выборки вместо обсчёта по всей совокупности).

При этом нельзя забывать о росте объёма данных в будущем: архитектура должна держать нашу нагрузку на старте и горизонтально масштабироваться. Нагрузка на момент проектирования архитектуры – 1.5-2TB сырых логов и 700 млн — 1 млрд событий в день. Дополнительно очень важно, чтобы база хорошо сжимала данные.

Просмотрев кучу статей, документации, поговорив с ушлыми продажниками и пересмотрев пару десятков докладов с разных BigData конференций, мы пришли к не слишком радостному выводу. На тот момент на рынке были три удовлетворяющие нашим требованиям системы: Druid, HP Vertica и Kudu + Impala.

Druid был opensource’ный и по отзывам достаточно шустрый, но очень сырой. Vertica подходила по всем параметрам и была гораздо круче друида в плане функционала, но стоимость базы на наших объемах данных была неподъемная. Про Kudu + Impala нашли очень мало информации, использовать в продакшене проект с таким кол-вом документации страшновато.

Ещё один ограничивающий фактор – время. Мы не могли позволить себе несколько лет разрабатывать новую систему: нас бы не дождались существующие пользователи Топ-100. Действовать надо было быстро.

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

Новая архитектура или «вот это поворот!»


Время шло, дата перезапуска приближалась, Druid и Kudu медленно обзаводились документацией, Vertica не собиралась дешеветь. Мы практически решились делать монстра из комбинации Druid'а и батч-обсчета, когда ВНЕЗАПНО Яндекс выложил в opensource Сlickhouse.

Естественно, мы обратили внимание на новую возможность – на первый взгляд она идеально решала нашу задачу. Внимательно изучив документацию, поговорив со знакомыми из Яндекса и проведя нагрузочные тесты, мы пришли к выводу, что будем рассматривать Clickhouse в качестве основного варианта для второго этапа обновления Топ-100.
В итоге у нас получилась следующая архитектура:

image

По порядку.
Nginx – принимает события от посетителей веб-страниц, передаваемые счётчиком, записывает их в очередь событий.

Kafka – очень быстрая очередь событий, с репликацией, умеющая работать сразу с несколькими клиентами.

Spark-streaming – выполняет обработку потоковых данных, python-реализация.

Aerospike - выступает качестве хранилища сессий выбрали именно Aerospike потому, что данных достаточно много (в среднем отметка держится на 250-300гб хранимых сессий), а у Aerospike достаточно хорошее соотношение стоимости железа к объему хранимых данных.
Почему именно Aerospike, ведь у Spark есть checkpoint (встроенный вариант хранения состояний объектов)? Дело в том, что документация по checkpoint’ам в Spark достаточно сырая и неинформативная. Например, не до конца понятно, как следить за истечением времени жизни сессий, а также количеством используемой памяти и диска для хранения чекпойнтов. Aerospike же из коробки умеет автоматически удалять истекшие сессии, его относительно легко мониторить и масштабировать.

ClickHouse – колоночная база данных и механизм построения отчетов в одном флаконе.

Немного подробнее о связке Spark + Aerospike + Clickhouse, чтобы не получилось, как на старой картинке.

image

События от посетителей читаются Spark’ом из Kafka, микро-батч включает 5 минут данных. Данные группируются по проектам и уникальным посетителям (кукам) внутри проектов. Для каждого посетителя проверяется, есть ли активная сессия в рамках данного проекта и, если есть, из этой сессии берутся данные для склейки с новыми данными. Сессии и данные сессий хранятся в Aerospike с некоторым временем жизни. После склейки сессий нам нужно сохранить их в Clickhouse. В этом нам идеально подходит движок CollapsingMergeTree: когда к нам приходят новые данные, мы делаем в Clickhouse две записи – старую, если она есть, со знаком (-) и новую со знаком (+).

С посетителями разобрались, теперь подробнее про сессии. Для первого встреченного события от посетителя мы генерируем session_id, сохраняем этот id и время последнего события в Aerospike. Всем дальнейшим событиям в рамках этой сессии присваивается этот id. Если промежуток времени между последним событием сессии из Aerospike и новым событием больше 30 минут, считаем это событие началом новой сессии, и всё начинается заново.
Такая архитектура решает все проблемы, описанные в начале статьи, достаточно легко масштабируется и тестируется.

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

  • нагрузочное тестирование Clickhouse с сэмплом данных и предолагаемой схемой таблиц;
  • нагрузочное тестирование связки Kafka-Aerospike-ClickHouse;
  • проверили работающий прототип связки под продакшн нагрузкой.

Все тесты закончились успешно, мы обрадовались и приступили к реализации.

Преодолевая трудности


В ходе реализации придуманной схемы мы, естественно, встретили некоторое количество граблей.

Spark
Иногда не слишком информативные логи, приходится копаться в исходниках и трейсбэках Spark на Scala. Нет восстановления с offset’ов в Kafka из коробки, пришлось писать свой велосипед. К тому же мы не нашли нормальный механизм graceful shutdown’а реалтайм обсчета, тоже пришлось писать свой велосипед (немного информации об этой проблеме).

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

Clickhouse
Почти нет автоматизации DDL для кластера (например, чтобы сделать alter table на distributed таблице нужно зайти на все ноды и сделать на каждой ноде alter table). Много недокументированных функций — нужно лезть в код и разбираться или спрашивать напрямую у разработчиков CH. Слабо автомазизирована работа с репликами и шардами, партиционирование только по месяцам.

It's alive, ALIVE!


Что получилось в результате. Схема базы.

CREATE TABLE IF NOT EXISTS page_views_shard(
    project_id Uint32,

    page_view_id String,
    session_id String,
    user_id String,

    ts_start Float64,
    ts_end Float64,

    ua String,
    page_url String,
    referer String,

    first_page_url String,
    first_page_referrer String,
    referer String,

    dt Date,

    sign Int8
) ENGINE=CollapsingMergeTree(
    dt,
    sipHash64(user_id),
    (project_id, dt, sipHash64(user_id), sipHash64(session_id), page_view_id),
    8192,
    sign
);


Строкой в схеме базы данных является просмотр страницы со всеми ассоциированными с ним параметрами. (Схема намеренно упрощена, нет большого количества дополнительных параметров).

Разберем по порядку:
• dt – дата, обязательное требование для MergeTree таблиц;
• sipHash64(user_id) – для поддержки сэмплирования;
• (project_id, dt, sipHash64(user_id), sipHash64(session_id), page_view_id) – первичный ключ, по которому отсортированы данные и по которому производится схлопывание значений с разным sign;
• 8192 – гранулярность индекса;
• sign – описывал выше.
Примеры запросов для одного из проектов:
Количество просмотров страниц и сессий за месяц с группировкой по датам.

SELECT SUM(sign) as page_views, uniqCombined(session_id) as sessions, dt
FROM page_views
WHERE project_id = 1
GROUP BY dt
ORDER BY dt
WHERE dt >= '2017-02-01' AND dt <= '2017-02-28'
FORMAT JSON;


2-5 секунд на полных данных (127кк строк)
0.5 секунды на сэмпле 0.1
0.1 секунды на сэмпле 0.01



Посчитать все page_views, visits с группировкой по части урл.

SELECT SUM(sign) as page_views, uniqCombined(session_id) as sessions, URLHierarchy(page)[1] 
FROM page_views
GROUP BY URLHierarchy(page)[1]
ORDER BY page_views DESC
WHERE dt >= '2017-02-01' AND dt <= '2017-02-28' and project_id = 1
LIMIT 50
FORMAT JSON;


10 секунд на полных данных
3-5 секунд на сэмпле 0.1
1.5 секунд на сэмпле 0.01



Kafka
Даже не напрягается.
Spark
Работает достаточно быстро, на пиковых нагрузках отстает, потом постепенно догоняет очередь.
ClickHouse, Сжатие данных
1.5-2ТБ данных сжимаются до 110-150 ГБ.
ClickHouse, Нагрузка на запись
1-4 RPS батчами по 10000 записей.
ClickHouse, Нагрузка на чтение
В данный момент сильно зависит от запрашиваемых проектов и типа отчета, от 5 до 30 RPS.
Эту проблему должно решить сэмплирование в зависимости от размера проекта и квоты.

Результаты и впечатления


M-m-m-magic. Мы выкатили в продакшен первый отчет, работающий с ClickHouse – «Сегодня детально». Пожелания и конструктивная критика приветствуются.
To be continued. Буду рад, если напишете в комментах, о чем было бы интересно почитать в будущем: тонкости эксплуатации, бенчмарки, типовые проблемы и способы их решения, ваш вариант.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332202/


Метки:  

Дайджест продуктового дизайна, июнь 2017

Среда, 05 Июля 2017 г. 10:05 + в цитатник
Уже семь лет я публикую регулярные обзоры свежих статей по теме интерфейсов, новых инструментов и коллекций паттернов, интересных кейсов и исторических рассказов. Из лент нескольких сотен тематических подписок отбирается примерно 5% стоящих публикаций, которыми интересно поделиться. Предыдущие материалы: апрель 2010-май 2017.

Дайджест продуктового дизайна, июнь 2017

Паттерны и лучшие практики


All Thumbs, Why Reach Navigation Should Replace the Navbar in iOS Design
Brad Ellis разбирает способы отказа от верхней панели навигации в мобильных — с современными размерами телефонов работать с ней непросто.

All Thumbs, Why Reach Navigation Should Replace the Navbar in iOS Design

Dashboards — Making Charts and Graphs Easier to Understand
Отличный обзор сложности восприятия способов представления информации на дашбордах от Page Laubheimer из Nielsen/Norman Group.

Dashboards — Making Charts and Graphs Easier to Understand

Best Practices For Hero Images
Николай Бабич даёт советы по использованию крупных изображений в шапке сайта.

Исследования Baymard Institute

Wizards — Definition and Design Recommendations
Raluca Bidiu из Nielsen/Norman Group описывает лучшие практики использования пошаговых помощников.

Юзабилити-рейтинг iOS-приложений банков, 2017
Рейтинг мобильных приложений российских банков для iOS от USABILITYLAB. Пятёрка лидеров: Тинькофф Банк, Банк ВТБ 24, Сбербанк, Альфа-Банк, Промсвязьбанк.





Дизайн-системы и гайдлайны


iOS 11
Анонсирована iOS 11. На самой презентации WWDC деталей про обновление мобильной ОС было немного, зато в бета-версии видно, что стилистика приложения Apple Music становится основой визуального языка платформы:
  • Крупные заголовки экрана и в целом уход от тонких шрифтов.
  • Залитые иконки вместо контурных: наконец-то можно будет унифицировать Android- и iOS-приложения. Стали залитыми и круги вокруг цифр при наборе номера (а также скруглились в калькуляторе).
  • Оркестровка анимации в духе Material Design: например, крупный заголовок превращается в кнопку «назад» при уходе вглубь навигации, а переход в информацию о приложении в магазине совсем уж похоже на то, что делает Google.
  • Сочные изображения используются всё чаще: обновлённый AppStore теперь похож по компоновке экранов на Google Play (хотя экран приложения жутко перегружен).
  • Все всплывающие слои строятся по принципу уведомлений и меню: например, написание письма в стандартном почтовом клиенте.
  • Полноценная работа со скриншотами, включая их редактирование — здорово упростится жизнь тех, кто работает над продуктами.

iOS 11

Здорово, что после безликого iOS 7, которая скопировала проблемы Windows Phone и его тысяч однояйцевых приложений, у платформы появляется яркое лицо.

iPad продолжает пытаться развиваться в сторону замены компьютера (drag&drop между двумя открытыми рядом приложениями, панель задач а-ля doc в MacOS, файловая система, расширенная работа с пером (ещё), хотя постоянное падение продаж в последние годы говорит о том, что развивается он не совсем туда. Единственное, что показывает проблески светлого будущего — появление почти полноценного аналога Affinity Photo.

Из других интересных моментов: стандартная камера научилась читать QR-коды (что должно сделать их популярнее), развитие возможностей машинного обучения, запоздалое появление возможностей работы с дополненной реальностью, режим «не беспокоить» во время вождения, бесконечно уродливая панель быстрых настроек. Материалы для дизайнеров:

Apple Watch
  • Вышла watchOS 4. Из относительно явных интерфейсных изменений — список запущенных и недавних приложений превратился в вертикальную ленту.

In the future, design principles won’t be about design
Шикарный анализ принципов дизайна крупных компаний от Jerome de Lafargue. Он выделил наиболее популярные (они одинаковы у многих организаций) и отметил, что хорошие принципы должны быть не просто абстрактным манифестом ценностей дизайн-команды, а давать чёткие ценности, связанные с ценностями бизнеса и пользователей.

In the future, design principles won’t be about design

В продолжение темы:

Microsoft Mixed Reality Design Guidelines
Microsoft опубликовали дизайн-гайдлайны по проектированию интерфейсов смешанной реальности. Анонс.

Alla Kholmatova — Design Systems
В сентябре Smashing Magazine выпускают книгу Аллы Холматовой «Design Systems». Её можно пред-заказать и прочитать первую половину уже сейчас, плюс бесплатно доступна глава 2.

Alla Kholmatova — Design Systems

Другие новости дизайн-систем:

Building great user experiences on Slack
Гайдлайны Slack по проектированию приложений и ботов для мессенджера.

Понимание пользователя


Cognitive bias cheat sheet
Крутейшая модель классификации когнитивных искажений от Buster Benson. Он разложил их по 4 категориям — слишком много информации, недостаточно смысла, нужно быстро принять решение, избирательная память. Перевод.

Cognitive bias cheat sheet

Increase funnel conversion with Psych
Darius Contractor из Dropbox предложил необычный подход для оценки когнитивной нагрузки интерфейса — он оценивает все элементы интерфейса с помощью условной единицы «psych». Если цифра больше нуля — интерфейс хороший. Это чем-то похоже на модель «3 банок» от Google. Перевод.

Who plays mobile games?
Команда Google Play и SKIM Analytics провели исследование поведения людей, играющих на мобильных. Они выделили 5 сегментов в зависимости от вовлечённости и социальности.

Подход Jobs To Be Done
Отличная сводная памятка по методике определения потребностей пользователей Jobs to Be Done от Анны Булдаковой.

Информационная архитектура, концептуальное проектирование, контент-стратегия


Blind Spot — Illuminating the Hidden Value of Business
В прошлом году Rosenfeld Media выпустили книгу Steve Diller, Nathan Shedroff и Sean Sauber «Blind Spot: Illuminating the Hidden Value of Business». UXmatters публикует отрывок из неё, посвящённый современному процессу дизайна продуктов.

UX Writing — How to do it like Google with this powerful checklist
Конспект сессий конференции Google I/O 2017, посвящённых написанию интерфейсных текстов. Во второй половине неплохой подход к формированию тональности бренда.

Provoking Difficult Design Conversations
Dan Brown делится опытом решения сложных проектных ситуаций, когда сложно трактовать правки заказчика однозначно. Он предлагает подход, в котором делается часть изменений с тем, чтобы начать более предметный разговор.

Using UX design to reduce the risk of innovation failure
Занятная модель «тройного алмаза» от Nomensa — они добавили ещё один этап в начале, отвечающий за поиск ценности для пользователей и бизнеса.

Design principle: Organizing information
Антон Николов перечисляет пять подходов к организации информации: по местоположению, алфавиту, времени, категориям и иерархии. Перевод.

Проектирование и дизайн экранов интерфейса


Sound Kit for Prototypes
Библиотека интерфейсных звуков от дизайн-команды Facebook. Лицензия позволяет использовать их только в прототипах. Советы по работе со звуком в интерфейсе от Will Littlejohn.

Facebook Sound Kit for Prototypes

Adobe XD
  • В июньской бете наконец-то появились символы, включая переопределение состояния конкретной копии. Улучшена работа со слоями и градиентами.

Июньское обновление Adobe XD

InVision Craft

Sketch 45
Улучшена работа с плагинами (для автообновления не нужны сторонние утилиты) и много интерфейсного тюнинга (перевод).

Sketch 45

Плагины и полезные статьи:

Framer

Gravit


Пользовательские исследования и тестирование, аналитика


How to Turn UX Research Into Results
Памятка Cindy McCracken для пользовательских исследователей о том, как правильно донести результаты до продуктовой команды и участвовать в дизайн-процессе, который вносит исправления на базе найденных выводов. В продолжение темы:

Lab Testing Beyond Usability — Challenges and Recommendations for Assessing User Experiences
Много говорится о том, что лабораторное юзабилити-тестирование имеет свои ограничения и подходит не для всех ситуаций, но разборы конкретных проблем случаются реже. Carine Lallemand и Vincent Koenig провели серию тестов и достаточно подробно описали конкретные проблемы в интерпретации поведения пользователей.

7 Questions About User-Research Panels
Caroline Jarrett и Naintara Land описывают плюсы, минусы и подводные камни создания собственной панели респондентов. Хорошая памятка для тех, кто готов.

Why the SUPR-Q is better than the SUS for websites
Jeff Sauro считает, что комбинированная метрика SUPR-Q лучше подходит для оценки сайтов, чем SUS — она проще, даёт итоговую оценку нужных факторов, а результаты можно сравнивать с аналогичными продуктами.

Визуальное программирование и дизайн в браузере


Master React — Unleash Your Design Superpower
Онлайн-курс по React для дизайнеров.

Master React — Unleash Your Design Superpower

A day without Javascript
Sonnie Sledge проверил, что происходит с известными сайтами при выключенном JavaScript — многие становится сложновато использовать.

Handling Long and Unexpected Content in CSS
Ahman Shaheed показывает, как обрабатывать краевые ситуации в элементах интерфейса, когда реальный контент ломает их структуру.

Новые скрипты

Веб-типографика

Flexbox и CSS Grid


Метрики и ROI


UX & NPS Benchmarks for Consumer Software (2017)
Jeff Sauro опубликовал результаты исследования NPS для 17 популярных профессиональных программ и веб-сервисов. Исследование говорит, что показатель SUS отвечает примерно за треть оценки рекомендующих продукт пользователей.

UX & NPS Benchmarks for Consumer Software (2017)

UX-стратегия и менеджмент


Humanizing the Enterprise
Pabini Gabriel-Petit пишет о том, как повысить вовлечённость продуктовой команды с помощью матрицы социальных потребностей. Концепция базируется на книге Paul Herr «Primal Management».

Crafting an Effective Working Group
Jessica Harllee рассказывает о формате ситуативных рабочих групп для решения сложных дизайнерских задач в Etsy. Мы используем похожий подход и он здорово показал себя.

Crafting an Effective Working Group

Ещё о структуре дизайн-команд:

Wake

Kit Oliynyk — The Colors of Design Cultures
Выступление Кирилла Олейниказ Capital One на SXSW об их подходе к определению сильных и слабых сторон дизайнера.





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


The Potential of Agile
Scott Sehlhorst сделал отличный разбор целей работы по agile и выгод для продукта от этого. Как именно он помогает проверить продуктовые инсайты.

Методологии, процедуры, стандарты


Game Thinking
Методология Game Thinking предполагает использование опыта работы над играми при создании более привычных цифровых продуктов. Обзор методологии от Amy Jo Kim.

Game Thinking

Дизайн-спринты


Кейсы


Designing Facebook Spaces
Christophe Tauziet подробно рассказывает о работе над Facebook Spaces, попытке создать социальную сеть в виртуальной реальности. Особенно интересна последняя часть, где показывают эксперименты с разными интерфейсными подходами.

Designing Facebook Spaces

Transforming Data to Insights
Anwesha Samanta из Salesforce рассказывает, как проектировали аналитический сервис и облегчили пользователям поиск инсайтов среди сырых данных.

Redesigning a Remote
Простой и симпатичный кейс работы над мобильным приложением от Eli Rousso.

Непрошенные редизайны


История


Web Design Museum
Коллекция старых сайтов с 1996 по 2005 год. Накоплено 800 примеров.

Web Design Museum

Across the Computer Divide, The Nerds Face the Dummies
Статья New York Times 1993 года, в которой поднимаются проблемы в использовании компьютеров, говорится о юзабилити и инициативах Microsoft и других компаний.

Тренды


KBCP Internet Trends 2017 Report от Mary Meeker
Ежегодный прогноз трендов развития интернета от Mary Meeker из KPCB (избранное). Слайд № 188 посвящён росту количества дизайнеров в крупных компаниях — хороший индикатор зрелости отрасли.





KBCP Internet Trends 2017 Report от Mary Meeker

The State Of Advanced Website Builders
Drew Thomas размышляет на тему того, заменят ли конструкторы сайтов дизайн-студии. Он смотрит на их сильные и слабые стороны и предлагает новые форматы работы для агентств, которые позволят остаться нужными.

How Logos Became the Most Important Quarter-Inch in Business
Интересный взгляд Fortune на историю брендинга — они пишут о том, как цифровой продукт и интерфейс со временем стали определяющими для него.

How Logos Became the Most Important Quarter-Inch in Business

What On Earth Is A Brutalist Website? 5 Things Today’s Designers Can Learn From Brutalism
Andrew Wilshere разбирает сайты в духе брутализма относительно принципов, заложенных в такой архитектуре. Под это понятие подмешивают просто нарочито грубый или гранжевый дизайн, хотя изначальная идея брутализма была в простоте и максимальной открытости структуры.

What On Earth Is A Brutalist Website? 5 Things Today’s Designers Can Learn From Brutalism

Algorithm designs seven million different jars of Nutella
Итальянское подразделение Ogilvy & Mather сделало алгоритмическую упаковку для Nutella. Они сгенерировали 7 миллионов паттернов для этикетки, тираж разлетелся за месяц.





Другие материалы об алгоритмическом дизайне:






Design in the Era of the Algorithm
Развитие статьи Josh Clark об этике современных продуктов, полагающихся на алгоритмы и машинное обучение.

Designing experiences for Virtual Reality — Lessons from the physical world
Принципы дизайна интерфейсов виртуальной реальности от Yisela Alvarez Trentini.

Для общего и профессионального развития


Как я прочитал все выпуски продуктового дайджеста
Кирилл Улитин сделал крутейший анализ дайджеста продуктового дизайна за 7 лет — основные темы, ключевые слова, упоминаемые люди и компании и т.п. Вместе с названием (изначально всё называлось «Обзор свежих материалов по проектированию интерфейсов», позже перешло в более широкое «Дайджест продуктового дизайна») менялись рубрики (стало обширнее), степень фильтрации (меньше публикаций на совсем базовые темы), подход к подготовке (сотрудничество с vc.ru мотивировало к регулярности, а она мотивировала к упрощению подготовки), добавилась рассылка. На сайте UX Buzzwords есть интерактивная версия. Всегда хотел проанализировать архив выпусков, но не хватало времени и навыков.

Как я прочитал все выпуски продуктового дайджеста

На прошлой неделе количество подписчиков пробило 15 000 — новая планка для отечественных групп по дизайну в Фейсбуке (за исключением поиска работы).

A Turn of Phrase — The Politics of UX Language
Carol J. Smith пишет о том, как UX-специалисту говорить на понятном клиенту языке. Она не считает зазорным не убиваться о том, что кто-то называет юзабилити-тестирование «фокус-группой» — зачастую лучше начать работу, а уже потом объяснить разницу.

Пользователи Reddit предложили самые нелепые варианты интерфейса регулировки звука
Флеш-моб на Reddit, в котором сообщество предложило самые ущербные подходы к интерфейсу регулировки громкости.

Book Review: Practical UX Design
Обзор книги Scott Faranello «Practical UX Design», которая вышла в прошлом году в издательстве Packt Publishing.

No No No
Julie Zhuo учит дизайнеров говорить «нет» в нужный момент и в нужном ключе.

20 лекций TED для дизайнеров
В блоге Tilda собрали добротные выступления на TED, относящиеся к дизайну.

20 лекций TED для дизайнеров

Люди и компании в отрасли


Google Design
Обновился сайт Google Design.

Материалы конференций


UXSTRAT 2017
В 2017 году пройдут две части конференции UXSTRAT 2017: 15-16 июня в Амстердаме и 18-20 сентября в Boulder, США. Она посвящена дизайн-стратегии и собирает мощный состав тематических спикеров. Презентации с европейской части конференции. Наиболее интересные презентации:



















Enterprise UX 2017
Конференция Enterprise UX 2017 прошла 7-9 июня в Сан-Франциско, США. Natalie Hanson сделала шикарный подробнейший конспект выступлений:

LX Conference 2017
Конференция LX Conference 2017 прошла 24-25 апреля в Сан-Франциско, США. Она посвящена дизайн-менеджменту и UX-стратегии (видео выступлений). Обзоры:





Подписывайтесь на рассылку! Письмо приходит один раз в месяц.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332124/


Метки:  

Обновление Deskun: из тикет-системы внутри Gmail в мультиканальную систему поддержки

Среда, 05 Июля 2017 г. 09:12 + в цитатник
Хотим представить вам большое обновление Deskun – мультиканальную систему поддержки клиентов. Мы объединили наиболее популярные каналы общения с клиентами в одном окне – внутри почты Gmail.





Теперь помимо e-mail, в Deskun можно подключить такие каналы для поддержки клиентов, как онлайн чат на сайте и мессенджеры ВКонтакте, Facebook, Twitter, Telegram, Viber и Skype. Далее мы более подробно расскажем о новых возможностях Deskun для организации поддержки клиентов.

Виджет онлайн чата на сайте


С помощью Deskun вы можете добавить виджет онлайн чата на свой сайт, настроить его внешний вид, расположение на странице, и задать текст приветственного сообщения для клиентов. Работать с диалогами из онлайн чата вы будете прямо в интерфейсе Gmail. Кстати, если у вас небольшой проект, и вы будете обрабатывать обращения из чата в одиночку, Deskun для вас будет полностью бесплатным. Да, мы не шутим. Но про тарифный план расскажем чуть позже.

Чтобы добавить онлайн чат к себе на сайт, создайте новый проект или в уже существующем проекте добавьте канал типа «Чат и мессенджеры» в Личном кабинете Deskun. Проект – это пространство, в рамках которого можно создавать каналы и приглашать агентов. Как правило, проект соответствует либо всей компании целиком, либо отдельному направлению ее деятельности или продукту. Чтобы разделить заявки клиентов и задачи в рамках одного проекта, реализованы каналы. Вы можете создать каналы по типу «Чат и мессенджеры», «E-mail поддержка» или «Управление задачами».

Проекты и каналы являются структурными элементами системы, которые представлены в интерфейсе Gmail как отдельные папки.



Укажите уникальное название канала, а затем выберите тип канала «Чат на сайте». Далее вы сможете настроить такие параметры, как автооткрытие, приветственное сообщение для клиентов, место расположение чата на вашем сайте и его внешний вид.



Также можно добавить агентов поддержки, которые будут работать с диалогами клиентов из чата. После завершения настройки и добавления кода во все страницы сайта, можно переходить в Gmail – все сообщения от клиентов будут отображаться в отдельной вкладке. Для эффективности работы с чатом в Личном кабинете можно включить звуковые уведомления, чтобы не пропускать новые сообщения и моментально реагировать на них. Также для автоматизации работы можно использовать настраиваемые шаблоны сообщений – они также создаются в Личном кабинете. В шаблонах доступны специальные теги, например {my_name} – туда будет подставляться имя агента, который использует шаблон.

В чате можно оставить заметку (она будет видна только другим агентам), передать диалог другому агенту, а также заблокировать клиента на случай особой необходимости. Кроме того, на основе диалога из чата можно создать тикет – задачу для сотрудников. Подробнее об управлении тикетами вы можете прочитать здесь.

Популярные мессенджеры


На сегодняшний день важность социальных сетей для бизнеса сложно переоценить. Было подсчитано, что клиенты в среднем готовы платить до 40% больше тем компаниям, которые вовремя отвечают в социальных сетях. В этой тенденции мы решили не отставать от зарубежных коллег и объединили наиболее популярные мессенджеры, где возможен диалог с клиентами: группы и публичные страницы ВКонтакте, сообщества на Facebook, аккаунты Twitter, боты Telegram, Viber и Skype.
Чтобы подключить мессенджер к Deskun, необходимо создать проект и добавить канал (так же, как и при подключении онлайн чата), а затем выбрать нужный мессенджер и подтвердить права доступа на него.



Все поступающие сообщения вы также будете обрабатывать прямо в интерфейсе Gmail.



Еще Deskun можно использовать для e-mail поддержки клиентов. Сервис позволяет принимать заявки на любой e-mail, устанавливать автоматический ответ, делегировать заявки и многое другое.

Сколько это стоит?


Всем пользователям Deskun доступен бесплатный пробный период – 21 день, в течение которого можно изучать все возможности системы без ограничений, и понять, какое количество агентов и каналов потребуется. Мы сделали гибкий тарифный план, чтобы пользователи могли сами выбирать и оплачивать необходимое ($2.99 в мес.) и каналов ($1.99 в мес.). Один агент поддержки и один канал доступны бесплатно навсегда. Кроме того, бесплатно доступны функции для продуктивной работы в Gmail, о которых мы писали в этой статье.

В ближайшем будущем мы запустим кроссплатформенную веб-версию, которая сейчас находится в активном тестировании. У проекта большие и серьезные планы – мы поставили себе задачу выйти на зарубежный рынок и составить достойную конкуренцию подобным SaaS решениям. И, конечно, мы продолжаем прислушиваться к мнению пользователей, и будем добавлять новые полезные функции, чтобы поддержка клиентов с помощью Deskun становилась все более продуктивной.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331846/


Метки:  

Анализ в управлении системами

Среда, 05 Июля 2017 г. 09:01 + в цитатник

Метки:  

Трансляция HPE Digitize: рассказываем о наших новых продуктах и решениях

Среда, 05 Июля 2017 г. 08:58 + в цитатник
Доброе утро, Хабр!
У нас оно действительно доброе – сегодня мы проводим HPE Digitize, мероприятие, посвященное инновационным архитектурным решениям, обновлениям продуктовых линеек и услуг Hewlett Packard Enterprise. И пока на площадке в Москве идут последние приготовления, приглашаем вас на онлайн-трансляцию, которая будет идти с 10:00 по 18:00 по МСК и охватит все ключевые презентации.
Расписание и плеер под катом:







Программа трансляции (по МСК):
10:00 Открытие мероприятия, приветственное слово
10:15 Стратегия HPE: ИТ-инфраструктура для экономики идей
11:00 Решения Intel
11:15 Обзор портфеля сетевого оборудования HPE для ЦОД. Решения Arista, FlexFabric, Altoline
12:00 Инновации в сетевых решениях Aruba
12:30 The Machine: архитектура, ориентированная на память
13:00 HPE PointNext: Превращение мечты в реальность. Финансирование ИТ-проектов с HPE FS

14:30 Системы хранения HPE 3PAR и технология HPE Nimble InfoSight
15:15 HPE Pointnext – услуги и техническая поддержка для систем хранения
15:30 Повышение доступности современных ЦОД с Veeam
16:15 Уникальные технологии HPE в новом поколении серверов ProLiant Gen10
16:45 Новости Brocade. Мировой рынок FC, динамика и перспективы
17:15 HPE SimpliVity 380 – наиболее полная гиперконвергентная платформа на рынке

Кроме того, присоединяйтесь к нашему каналу в Telegram, в котором будут доступны материалы презентаций и есть возможность задать вопрос спикерам (многие из которых вам уже знакомы по Хабру). А после трансляции мы также поделимся записями выступлений.

Ждем вас на трансляции!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332458/


Метки:  

[Перевод] Доставка миллиардов сообщений строго один раз

Среда, 05 Июля 2017 г. 08:45 + в цитатник
Единственное требование ко всем системам передачи данных состоит в том, что нельзя потерять данные. Данные обычно могут поступить с опозданием или их можно запросить заново, но их никогда нельзя терять.

Чтобы удовлетворить этому требованию, большинство распределённых систем гарантирует по крайней мере однократную доставку. Техники обеспечения «по крайней мере однократной доставки» обычно сводятся к «повторам, повторам и повторам». Вы никогда не считаете сообщение доставленным, пока не получите чёткое подтверждение от клиента.

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

К сожалению, для достижения чего-то близкого к точно однократной доставке нужен непробиваемый дизайн. Архитектура предусматривает, что каждый случай сбоя нужно тщательно обдумывать — нельзя будет просто прописать его как часть существующей реализации после самого факта сбоя. И даже тогда практически невозможно реализовать систему, в которой сообщения доставляются только один раз.

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

Новая система способна отслеживать в 100 раз больше сообщений, чем старая, отличается от неё повышенной надёжностью и более низкой стоимостью. Вот как мы это сделали.

Проблема


Большинство внутренних систем Segment изящно обрабатывают сбои с помощью повторов, вторичной отправки сообщений, блокировки и двухэтапных коммитов. Но есть одно примечательное исключение: клиенты, которые присылают данные напрямую в наш публичный API.

У клиентов (особенно мобильных) часто возникают перебои со связью, когда они могут отправить данные, но пропустить ответ от нашего API.

Представьте, что вы едете на автобусе и забронировали комнату из приложения HotelTonight на своём iPhone. Приложение начинает загружать данные на серверы Segment, но автобус неожиданно въезжает в тоннель и вы теряете связь. Некоторые из событий, которые вы отправили, уже обработаны, но клиент никогда не получит ответ от сервера.

В таких случаях клиенты повторяют отправку тех же событий в Segment API несмотря на то, что сервер технически уже получил ранее в точности такие же сообщения.

Судя по статистике нашего сервера, примерно 0,6% полученных событий за последние четыре недели — это повторные сообщения, которые мы уже получали.

Уровень ошибок может показаться незначительным. Но для приложения электронной коммерции, которое генерирует миллиарды долларов дохода, разница в 0,6% может означать разницу между прибылью и убытками в миллионы долларов.

Дедупликация сообщений


Итак, мы понимаем суть проблемы — нужно удалить дубликаты сообщений, которые отправляются в API. Но как это сделать?

На теоретическом уровне высокоуровневый API любой системы дедупликации кажется простым. На Python (aka псевдо-псевдокод) мы можем представить его следующим образом:

def dedupe(stream):
  for message in stream:
    if has_seen(message.id): 
      discard(message)
    else:
      publish_and_commit(message)

Для каждого сообщения в потоке сначала проверяется, встречалось ли такое сообщение раньше (по его уникальному идентификатору). Если встречалось, то отбрасываем его. Если не встречалось, то перевыпускаем сообщение и атомарно осуществляем передачу.

Чтобы не хранить постоянно все сообщения, действует «окно дедупликации», которое определяется как время хранения наших ключей до истечения их срока действия. Если сообщения не вписываются в окно, они считаются устаревшими. Мы хотим гарантировать, что в окне отправляется только одно сообщение с данным ID.

Такое поведение легко описать, но есть две детали, требующие особого внимания: производительность чтения/записи и точность.

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

Более того, мы хотим убедиться, что информация о зарегистрированных событиях надёжно сохраняется, так что мы можем восстановить её в случае сбоя, и что в выдаче никогда не встретятся повторные сообщения.

Архитектура


Чтобы добиться такого, мы создали «двухэтапную» архитектуру, которая считывает данные из Kafka и удаляет дубликаты событий, уже зарегистрированных в четырёхнедельном окне.


Высокоуровневая архитектура дедупликации

Топология Kafka


Для понимания работы такой архитектуры сначала взглянем на топологию потока Kafka. Все входящие вызовы API разделяются на отдельные сообщения и чётко выражают входной раздел Kafka.

Сначала каждое входящее сообщение помечается уникальным messageId, который генерируется на стороне клиента. Обычно это UUIDv4 (хотя мы рассматриваем переход на ksuid). Если клиент не сообщает messageId, то мы автоматически присваиваем его на уровне API.

Мы не используем векторные часы или порядковые номера, потому что не хотим усложнять клиентскую сторону. Применение идентификаторов UUID позволяет кому угодно легко отправить данные в наш API, потому что почти каждый основной язык программирования поддерживает их.

{
  "messageId": "ajs-65707fcf61352427e8f1666f0e7f6090",
  "anonymousId": "e7bd0e18-57e9-4ef4-928a-4ccc0b189d18",
  "timestamp": "2017-06-26T14:38:23.264Z",
  "type": "page"
}

Отдельные сообщения заносятся в журнал Kafka для долговечности и возможности повтора. Они распределяются по messageId, так что мы можем быть уверенными, что один и тот же messageId всегда поступит одному и тому же обработчику.

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

Воркер дедупликации — это программа на Go, которая считывает входные разделы Kafka. Она отвечает за чтение сообщений, проверку дубликатов, а если сообщения новые — за отправку их в выходную тему Kafka.

По нашему опыту, воркерами и топологией Kafka исключительно просто управлять. У нас больше нет множества больших инстансов Memcached, которым требуются отказоустойчивые реплики. Вместо этого мы применили встроенные базы данных RocksDB, которые вообще не нуждаются в координации и дают нам стойкое хранилище по исключительно низкой цене. Сейчас подробнее об этом.

Воркер RocksDB


Каждый воркер хранит локальную базу данных RocksDB на своём локальном жёстком диске EBS. RocksDB — это встроенное key-value хранилище, разработанное в Facebook, и оно оптимизировано для экстремально высокой производительности.

Всякий раз, когда событие извлекается из входных разделов, потребитель запрашивает RocksDB на предмет того, встречался ли ранее такой messageId.

Если сообщение отсутствует в RocksDB, мы добавляем ключ в базу данных, а затем публикуем сообщение в выходных разделах Kafka.

Если сообщение уже имеется в RocksDB, воркер просто не публикует его в выходные разделы и обновляет данные входного раздела с уведомлением, что он обработал сообщение.

Производительность


Чтобы добиться от нашей базы данных высокой производительности, мы должны соответствовать трём типам запросов для каждого обрабатываемого события:

  1. Обнаружение существования случайных ключей, которые поступают на входе, но вряд ли хранятся в нашей БД. Они могут располагаться где угодно в пространстве ключей.
  2. Запись новых ключей с высокой производительностью.
  3. Признание устаревшими старых ключей, которые не попали в наше «окно дедупликации».

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


Наша база данных должна удовлетворять трём очень разным типам запросов

Вообще говоря, основную часть прироста производительности даёт производительность БД — так что имеет смысл разобраться в устройстве RocksDB, из-за чего она настолько хорошо выполняет работу.

RocksDB — это журнально-структурированное дерево (LSM-дерево), то есть оно непрерывно добавляет новые ключи в журнал опережающей записи на диске, а также хранит отсортированные ключи в памяти как часть memtable.


Ключи отсортированы в памяти как часть memtable

Запись ключей — чрезвычайно быстрый процесс. Новые элементы записываются прямо на диск путём добавления к журналу (для непосредственного сохранения и восстановления в случае сбоя), а записи данных сортируются в памяти, чтобы обеспечить быстрый поиск и порционную запись.

Всякий раз, когда достаточное количество записей поступают в memtable, они сохраняются на диск как SSTable (таблица сортированных строк). Поскольку строки уже были отсортированы в памяти, их можно напрямую сбросить на диск.


Текущее состояние memtable сбрасывается на диск как SSTable на нулевом уровне (Level 0)

Вот пример такого сброса из наших рабочих логов:

[JOB 40] Syncing log #655020
[default] [JOB 40] Flushing memtable with next log file: 655022
[default] [JOB 40] Level-0 flush table #655023: started
[default] [JOB 40] Level-0 flush table #655023: 15153564 bytes OK
[JOB 40] Try to delete WAL files size 12238598, prev total WAL file size 24346413, number of live WAL files 3.


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



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

/data/dedupe.db$ head -1000 LOG | grep "JOB 41"
[JOB 41] Compacting 4@0 + 4@1 files to L1, score 1.00
[default] [JOB 41] Generated table #655024: 1550991 keys, 69310820 bytes
[default] [JOB 41] Generated table #655025: 1556181 keys, 69315779 bytes
[default] [JOB 41] Generated table #655026: 797409 keys, 35651472 bytes
[default] [JOB 41] Generated table #655027: 1612608 keys, 69391908 bytes
[default] [JOB 41] Generated table #655028: 462217 keys, 19957191 bytes
[default] [JOB 41] Compacted 4@0 + 4@1 files to L1 => 263627170 bytes


После завершения уплотнения объединённые таблицы SSTable становятся окончательным множеством записей базы данных, а старые таблицы SSTable расцепляются.

Если посмотреть на рабочий инстанс, то мы увидим, как обновляется этот журнал опережающей записи, а также как записываются, считываются и сливаются отдельные таблицы SSTable.


Журнал и самые последние таблицы SSTable занимают львиную долю операций I/O

Если посмотреть на статистику SSTable на рабочем сервере, то увидим четыре «уровня» файлов, с увеличением размеров файлов на каждом более высоком уровне.

** Compaction Stats [default] **
Level    Files   Size(MB} Score Read(GB}  Rn(GB} Rnp1(GB} Write(GB} Wnew(GB} Moved(GB} W-Amp
--------------------------------------------------------------------------------------------
  L0      1/0      14.46   0.2      0.0     0.0      0.0       0.1      0.1       0.0   0.0
  L1      4/0     194.95   0.8      0.5     0.1      0.4       0.5      0.1       0.0   4.7
  L2     48/0    2551.71   1.0      1.4     0.1      1.3       1.4      0.1       0.0  10.7
  L3    351/0   21735.77   0.8      2.0     0.1      1.9       1.9     -0.0       0.0  14.3
 Sum    404/0   24496.89   0.0      3.9     0.4      3.5       3.9      0.3       0.0  34.2
 Int      0/0       0.00   0.0      3.9     0.4      3.5       3.9      0.3       0.0  34.2
Rd(MB/s} Wr(MB/s} Comp(sec} Comp(cnt} Avg(sec} KeyIn KeyDrop
    0.0     15.6         7         8    0.925       0      0
   20.9     20.8        26         2   12.764     12M     40
   19.4     19.4        73         2   36.524     34M     14
   18.1     16.9       112         2   56.138     52M  3378K
   18.2     18.1       218        14   15.589     98M  3378K
   18.2     18.1       218        14   15.589     98M  3378K

RocksDB хранит индексы и фильтры Блума конкретных таблиц SSTable в самих этих таблицах — и они загружаются в память. Эти фильтры и индексы потом опрашиваются для поиска конкретного ключа, а затем полная таблица SSTable загружается в память как часть LRU.

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

Фильтры Блума говорят, находится ли ключ «вероятно принадлежит множеству» или «определённо не принадлежит множеству». Чтобы выдать ответ, фильтр сохраняет множество битов после применения различных хеш-функций для каждого элемента, который встречался ранее. Если все биты от хеш-функции сходятся с множеством, то он выдаёт ответ «вероятно принадлежит множеству».


Запрос буквы w в фильтре Блума, когда наше множество содержит только {x, y, z}. Фильтр возвращает ответ «не принадлежит множеству», поскольку один из битов не сходится

Если получен ответ «вероятно принадлежит множеству», то RocksDB может запросить исходные данные из наших таблиц SSTable и определить, действительно ли элемент присутствует в множестве. Но в большинстве случаев мы можем вообще избежать запросов к любым таблицам, потому что фильтр возвращает ответ «определённо не принадлежит множеству».

Когда мы обращаемся к RocksDB, то создаём запрос MultiGet для всех релевантных messageId, которые хотим запросить. Мы создаём его в составе пакета ради производительности и чтобы избежать многих параллельных блокирующих операций. Он также позволяет нам пакетировать данные, поступающие от Kafka, и обычно избегает случайных записей в пользу последовательных.

Это объясняет, как задачи чтения/записи демонстрируют высокую производительность — но всё ещё остаётся вопрос, как несвежие данные признаются устаревшими.

Удаление: привязка к размеру, а не ко времени


В нашем процессе дедупликации нужно определиться, ограничивать систему по строгому «окну дедупликации» или по общему размеру базы данных на диске.

Чтобы избежать падения системы из-за чрезмерной дедупликации для всех пользователей, мы решили выбрать ограничение по размеру, а не ограничение по интервалу времени. Это позволяет установить максимальный размер для каждого инстанса RocksDB и справляться с внезапными скачками или увеличением нагрузки. Побочный эффект состоит в том, что интервал времени может сократиться менее чем до 24 часов, а на этой границе происходит вызов нашего дежурного инженера.

Мы периодически признаём устаревшими старые ключи из RocksDB, чтобы не дать её увеличиться до безграничного размера. Для этого мы храним вторичный индекс ключей по порядковому номеру, так что можем удалять первыми самые старые ключи.

Вместо использования RocksDB TTL, что потребовало бы сохранения фиксированного TTL при открытии базы данных, мы удаляем сами объекты по порядковому номеру каждого вложенного ключа.

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

func (d *DB) delete(n int) error {
        // open a connection to RocksDB
        ro := rocksdb.NewDefaultReadOptions()
        defer ro.Destroy()

        // find our offset to seek through for writing deletes
        hint, err := d.GetBytes(ro, []byte("seek_hint"))
        if err != nil {
                return err
        }

        it := d.NewIteratorCF(ro, d.seq)
        defer it.Close()

        // seek to the first key, this is a small
        // optimization to ensure we don't use `.SeekToFirst()`
        // since it has to skip through a lot of tombstones.
        if len(hint) > 0 {
                it.Seek(hint)
        } else {
                it.SeekToFirst()
        }

        seqs := make([][]byte, 0, n)
        keys := make([][]byte, 0, n)

        // look through our sequence numbers, counting up
        // append any data keys that we find to our set to be
        // deleted
        for it.Valid() && len(seqs) < n {
                k, v := it.Key(), it.Value()
                key := make([]byte, len(k.Data()))
                val := make([]byte, len(v.Data()))

                copy(key, k.Data())
                copy(val, v.Data())
                seqs = append(seqs, key)
                keys = append(keys, val)

                it.Next()
                k.Free()
                v.Free()
        }

        wb := rocksdb.NewWriteBatch()
        wo := rocksdb.NewDefaultWriteOptions()
        defer wb.Destroy()
        defer wo.Destroy()

        // preserve next sequence to be deleted.
        // this is an optimization so we can use `.Seek()`
        // instead of letting `.SeekToFirst()` skip through lots of tombstones.
        if len(seqs) > 0 {
                hint, err := strconv.ParseUint(string(seqs[len(seqs)-1]), 10, 64)
                if err != nil {
                        return err
                }

                buf := []byte(strconv.FormatUint(hint+1, 10))
                wb.Put([]byte("seek_hint"), buf)
        }

        // we not only purge the keys, but the sequence numbers as well
        for i := range seqs {
                wb.DeleteCF(d.seq, seqs[i])
                wb.Delete(keys[i])
        }

        // finally, we persist the deletions to our database
        err = d.Write(wo, wb)
        if err != nil {
                return err
        }

        return it.Err()
}

Для дальнейшей гарантии высокой скорости записи RocksDB не возвращается немедленно и не удаляет ключ (вы же помните, что таблицы SSTable неизменные!). Вместо этого RocksDB добавляет ключу «надгробие», которое затем удаляется в процессе уплотнения базы. Поэтому мы можем быстро признавать устаревшими записи во время последовательных операций записи и избегать засорения памяти при удалении старых элементов.

Обеспечение корректности данных


Мы уже обсудили, как обеспечивается скорость, масштабирование и дешёвый поиск в миллиардах сообщений. Остался последний фрагмент — как обеспечивается корректность данных при различных сбоях.

EBS-снимки и приложения


Чтобы защитить наши инстансы RocksDB от повреждения из-за ошибки программиста или сбоя в работе EBS, мы периодически делаем снимки каждого из наших жёстких дисков. Хотя EBS реплицируется сама по себе, но эта мера защищает от повреждения, вызванного неким внутренним механизмом. Если нам нужен конкретный инстанс — клиента можно поставить на паузу, а в это время соответствующий диск EBS открепляется, а затем повторно прикрепляется уже к новому инстансу. До тех пор, пока мы сохраняем неизменным ID раздела, повторное прикрепление диска остаётся вполне безболезненной процедурой, которая по-прежнему обеспечивает корректность данных.

В случае сбоя воркера мы полагаемся на встроенный в RocksDB журнал опережающей записи, чтобы не терять сообщения. Сообщения не допускаются из входного раздела, пока у нас нет гарантии, что RocksDB надёжно сохранила сообщение в журнале.

Чтение выходного раздела


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

Нам нужна атомарная точка «фиксации», которая будет однозначно покрывать транзакции для всех этих отдельных систем. Требуется некий «источник истины» для наших данных.

Вот где вступает в дело чтение из выходного раздела.

Если по какой-то причине происходит сбой воркера или ошибка в Kafka с последующим перезапуском, первым делом осуществляется сверка с «источником истины» по поводу того, произошло ли событие: этим источником является выходной раздел.

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

В реальной работе


Сейчас наша система дедупликации работает в продакшне уже три месяца, и мы невероятно довольны результатами. Если в цифрах, то у нас:

  • 1,5 ТБ ключей хранится на диске в RocksDB
  • 4-недельное окно дедупликации перед признанием устаревшими старых ключей
  • примерно 60 млрд ключей хранится в инстансах RocksDB
  • 200 млрд сообщений проходят через систему дедупликации

Система в целом работает быстро, эффективно и устойчива к сбоям — и при этом с очень простой архитектурой.

В частности, у второй версии нашей системы есть ряд преимуществ перед старой системой дедупликации.

Раньше мы хранили все ключи в Memcached и использовали атомарный оператор проверки и установки значения записи CAS (check-and-set) для установки несуществующих ключей. Memcached выполняла роль точки фиксации и «атомарности» при публикации ключей.

Хотя такая схема довольно хорошо работала, но требовала большого объёма памяти, чтобы поместились все наши ключи. Более того, нужно было выбирать между принятием случайных сбоев Memcached или удвоением наших затрат на создание прожорливых к памяти отказоусточивых копий.

Схема Kafka/RocksDB даёт почти все преимущества старой системы, но с увеличением надёжности. Подводя итоги, вот главные достижения:

Хранение данных на диске: сохранение всего набора ключей или полная индексация в памяти были недопустимо дороги. Перенеся больше данных на диск и задействуя различные уровни файлов и индексов, мы смогли значительно снизить стоимость. Теперь мы можем переключаться при сбое на «холодное» хранилище (EBS), а не поддерживать работу дополнительных «горячих» инстансов на случай сбоя.

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

Точное признание устаревших ключей: в Memcached мы бы установили TTL для каждого ключа, чтобы определять срок его жизни, а затем полагались бы на процесс Memcached для исключения ключей. В случае больших пакетов данных это угрожало бы нехваткой памяти и скачками в использовании CPU из-за большого количества исключений ключей. Поручив клиенту удаление ключей, мы можем изящно избежать проблемы, уменьшив «окно дедупликации».

Kafka как источник истины: чтобы по-настоящему избежать дедупликации при наличии нескольких точек фиксации нам нужно использовать источник истины, общий для всех наших клиентов внизу по потоку данных. Kafka в качестве такого «источника истины» работает на удивление здорово. В случае большинства сбоев (кроме сбоев самой Kafka) сообщения или записываются в Kafka, или не записываются. И использование Kafka гарантирует, что опубликованные сообщения доставляются надлежащим образом и реплицируются по дискам на многочисленных машинах, без необходимости хранить большое количество данных в памяти.

Пакетные чтение и запись: сделав пакетные операции I/O для вызовов к Kafka и RocksDB, мы смогли сильно повысить производительность, используя последовательные чтение и запись. Вместо случайного доступа, который был раньше с Memcached, мы добились гораздо более высокой пропускной способности за счёт повышения производительности дисков и хранения в памяти только индексов.

В целом, мы вполне довольны теми гарантиями, которые даёт созданная нами система дедупликации. Использование Kafka и RocksDB в качестве основы потоковых приложений всё больше и больше становится нормой. И мы с радостью продолжим разработку новых распределённых приложений на этом фундаменте.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332448/


Интеграция ХостТрекера со Slack. Стабильность сайта: как держать всех в курсе

Среда, 05 Июля 2017 г. 07:45 + в цитатник
Slack все более набирает популярность в качестве инструмента для коммуникации внутри команд. Сервис мониторинга сайтов ХостТрекер предоставляет возможность добавить оповещения о работе подопечных ИТ-систем непосредственно в чат Slack для более удобного контроля и быстрого реагирования.



В чем, собственно, суть? Теперь о многих проблемах, связанных с сайтами, серверами и другими объектами ИТ инфраструктуры, можно получить оповещение прямо в Slack. В чат разработчиков, админов или любую другую группу по интересам. Для этого существуют специальные предопределенные шаблоны в параметрах POST-запроса:



Впрочем, кому очень нужно, в доступ также предоставляется набор переменных, которые можно использовать для составления своих личных шаблонов:



Как и многие другие функции сервиса мониторинга сайтов ХостТрекер, интеграция со Slack состоялась благодаря нескольким запросам клиентов. Поэтому напомню — мы всегда рады комментариям и предложениям!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332422/



Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1037 1036 [1035] 1034 1033 ..
.. 1 Календарь