Тензор — CNews

Тензор - CNews Компьютер

Большой взрыв начинается

К концу осени 2022 года

мы задумали новый сервис для реализации обновления «с человеческим лицом». Сформировали команду из трех человек, и, помолясь, приступили…

Архитектура системы обновления сложилась сразу из следующих компонент:

Управляющий сервис получил название

«Хоттабыч»

, это также была аллюзия на утилиту «Jinnee», умевшую конвертировать базы.

Большой взрыв вот-вот начнется


Внезапно

в 2022 году

СБИС стал web-сервисом под IIS и сменил хранилища данных на PostgreSQL. Клиентам от этого, конечно, стало проще — у них уже не болела голова об обновлении, а мы еще не осознавали, во что вляпались и пока по старинке обновляли свой web-сервис, как это делали с desktop-приложением.

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

Но скоро web-сервисы стали плодиться, и число клиентов стремительно выросло до 300 тыс. Нужно было обновлять уже десяток сервисов, располагавшихся на полусотне серверов. Вручную это делать невыносимо, да и обновления проходили по ночам в выходные. Тогда еще во время обновления клиенты работать не могли, получая парковочную страницу с текстом «Извините, приложение временно недоступно, идут технические работы, ожидаемое время разблокировки 6:00».

Налицо нарисовались три проблемы:

  1. исключить ручную работу при обновлении, а значит, ускорить саму работу и уменьшить ошибки из-за человеческого фактора;
  2. минимизировать простои клиентов во время обновления;
  3. дать выспаться командам.

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

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

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

  1. можно конвертировать данные одного клиента независимо от другого;
  2. можно легко перегонять данные клиента из одной базы в другую;
  3. клиент никогда не сможет увидеть чужие данные.

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

Большой взрыв состоялся

Тензор - CNews

Наконец,

весной 2022

мы смогли провести

первое обновление

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

Вселенная расширяется


После первых успехов у нас вылезла

первая проблема

. На тестовых стендах дистрибутивы загружали в хранилище так часто и размера до 1.5Гб, что SVN затрещал по швам. Конечно, он не годился для хранения больших бинарных файлов, и мы быстренько ушли на хранение дистрибутивов на linux-сервере. Тоже так себе решение, т. к. пришлось с windows-серверов держать шару на linux-диск, но стало уже намного лучше.

Тензор - CNews

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

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

Летом 2022 года мы выкатили в рабочее использование уже и этот вариант обновления. И все бы было неплохо, но у нас есть некоторые сервисы, работающие не с одной базой, а с множеством, например с сотней. И когда вся эта куча баз начинала одновременно конвертироваться, на хранилища ЦОД прилетала приличная нагрузка.

До большого взрыва

Online CБИС вышел недавно — в 2022 году. До этого мы были как все приличные приложения — desktop. Сначала жили под DOS, потом под консолью Windows, затем стали полноценным Windows приложением, ну все как у людей. Данные клиентов хранили либо в СУБД «Pervasive», либо в базе собственного изготовления с загадочным названием «Muzzle».

Jinnee

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

И вновь о конвертации баз

Базы клиентов конвертировались подолгу — несколько часов. Это нас совсем не устраивало. Мы в состоянии конвертировать данные одного клиента в базе независимо от данных другого. Тогда клиент вместо часов простоя может получить приостановку работы от нескольких секунд до нескольких минут.

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

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

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

Сейчас у нас более 1 млн. клиентов, и они располагаются более чем на 650 базах. И конвертации проходят достаточно незаметно.

И пришел linux …

Годы эксплуатации сервисов под IIS, привели нас к устойчивой мысли — IIS нам не нужен, да и Windows тоже, т.к., по сути, стек технологий Microsoft мы не использовали. А под Linux меньше накладных расходов на серверную ОС, лучше оптимизируется код на С , больше выбора серверного оборудования, например, IBM Power, и т.п.

Тензор - CNewsв 2022 году наступило крупное событие. Команда, разрабатывающая ядро наших сервисов, подготовила почву для миграции на Linux, и миграция началась. Мы этим воспользовались для отказа от SSH при обновлении сервисов на Linux и портировали на него агента Хоттабыча.

Тут другая наша команда тоже сделала прорыв и разработала аналог Google Диска — СБИС Диск. Мы и этим воспользовались. Отказались от хранения дистрибутивов на выделенном Linux-сервере, стали хранить их в СБИС Диске. Процесс скачивания дистрибутива резко упростился и ускорился.

И снова возвращаемся к конвертации баз

Простой клиента

мы минимизировали и это здорово. Но все-таки как его вообще

убрать

? Частенько конвертацию можно проводить, вообще не останавливая работу базы. Например, добавляя индекс или какое-нибудь поле. Мы назвали такую конвертацию «легкой». Но вот вопрос, а как узнать можно ли «легкую» конвертацию проводить? На это нам дает ответ все та же чудодей-Jinnee.

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

О патчах

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

«патчем»

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

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

Оборудование производства АО «ТЕНЗОР» для АЭС

Все основные службы и производства компании «ТЕНЗОР» задействованы для выполнения крупных контрактов для двух атомных электростанций в России и Бангладеш.

Подробности хода реализации проектов на официальном сайте АО «ТЕНЗОР»

Первое детище..


На первой итерации нам требовалось только обновление без конвертации данных. Хранилище дистрибутивов решили делать на SVN — вот дураки!

Структурно организация хранилища была иерархической:

дистрибутив такой-то
    |- версия такая-то
        |- сам дистрибутив   файлы информации о нем
    |- версия сякая-то
        |- сам дистрибутив   файлы информации о нем

Хоттабыча решили писать на своей же платформе СБИС. Как раз это мы хорошо умели делать, тут сомнений не было. С агентом обновления были сомнения, но в итоге его тоже стали делать на платформе СБИС (это С ). Для агентов было поставлено жесткое условие — они должны регулярно и максимально информативно отчитываться Хоттабычу о своей работе.

Тензор - CNews

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

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

После большого взрыва

Тензор - CNews

Хоттабыч продолжает развиваться, переход на Linux открыл нам новые возможности, на очереди контейнеризация наших сервисов. Также мы планируем добиться, чтобы клиенты даже при агрессивной конвертации не получали простоев в работе. Из-за внедренной сети агентов Хоттабыча на сервера нашего ЦОД, мы получили дополнительные преимущества на которые сразу не рассчитывали.

Сейчас в «хозяйство» Хоттабыча входит ~ 5 тыс. серверов, и он с этим неплохо справляется. Число баз, которые периодически конвертируются ~ 2 тыс. Все это обновляется с минимумом простоя для более чем 1 млн. клиентов вот уже длительное время.

Тензор

* Страница-профиль компании, системы (продукта или услуги), технологии, персоны и т.п. создается редактором на основе анализа архива публикаций портала CNews. Обрабатываются тексты всех редакционных разделов (

новости

, включая «Главные новости»,

статьи

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

Обработан архив публикаций портала overcomp.ru c 11.1998 до 07.2022 годы.
Ключевых фраз выявлено — 1192634, в очереди разбора — 947394.
Создано именных указателей — 87048.
Редакция Индексной книги CNews — book@overcomp.ru

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

Тензор — разработчик сбис, удостоверяющий центр и поставщик it-оборудования

Тензор, ярославль — разработчик системы сбис / статьи

Я работаю уже 10 лет в компании Тензор, за это время число тестировщиков приблизилось к четырём сотням. И все эти 10 лет у нас в компании проводились различные хакатоны для студентов, соревнования для разработчиков, наши безопасники участвовали в CTF, проводились конкурсы на лучшее фото из отпуска, турниры по настольному теннису, шахматам, волейболу, пауэрлифтингу… Ну вы поняли. Всё что угодно, но не соревнования, в которых можно померяться своим навыком в нахождении ошибок. Причём не геймификацию процесса, не дружеские посиделки с ноутбуками, а по-хорошему злые забеги. Собственно такие соревнования мы и организовали и успешно проводим второй год подряд (2020 не считается за год :)). О нашем опыте, сложностях, удачах и выводах  как раз и хочу рассказать.

§

Правила игры очень просты: надо построить цепочку слов от начального (МУХА) до конечного (СЛОН), на каждом шаге меняя только одну букву. При этом могут использоваться только русские 4-буквенные нарицательные существительные в начальной форме: например, слова БАЗА, НОЧЬ, САНИ допускаются, а слова ЛИТЬ, ХОТЯ, РУКУ, НОЧИ, САНЯ, ОСЛО, АБВГ, ФЦНМ — нет.

Эта игра под названием «Дублеты» приобрела известность благодаря Льюису Кэрроллу — не только автору книг про Алису, но ещё и замечательному математику. В марте 1879 года он начал раз в неделю публиковать в журнале «Ярмарка тщеславия» по три задания в форме броских фраз: «Turn POOR into RICH» — «Преврати бедного в богатого», «Evolve MAN from APE» — «Выведи человека из обезьяны», «Make TEA HOT» — «Сделай чай горячим». В том же году он выпустил брошюру «Дублеты», подробно описал в ней правила и предложил читателям попрактиковаться на нескольких десятках примеров.

Александр Пиперски, "Из мухи — слона", «Квантик» №2, 2022 и №3, 2022

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

§

Ровно год назад с

рассказа о нашем сервисе визуализации планов запросов

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

«грабли», интересные наработки, накопившиеся рекомендации

, применяемые в разработке

«Тензора»

— те вещи, которые помогают нам делать

СБИС

более эффективным.

СБИС

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

1 500 000 клиентов-организаций

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

И все их данные надо где-то хранить и эффективно извлекать. Поэтому еще в далеком 2022 году мы сделали ставку на

PostgreSQL

, и теперь это основное хранилище данных наших сервисов:

  • почти 9000 баз общим объемом 1PB
  • свыше 200TB данных клиентов
  • 1500 разработчиков работают с БД

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

более 60 статей

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

Для удобства все статьи разбиты на несколько циклов:

  • Анализ запросов
    Наглядно демонстрируем все тайны EXPLAIN [ANALYZE].
  • SQL Antipatterns и оптимизация SQL
    Понимаем как [не] надо решать те или иные задачи в PostgreSQL и почему.
  • SQL HowTo
    Пробуем подходы к реализации сложных алгоритмов на SQL для развлечения и с пользой.
  • DBA
    Присматриваем за базой, чтобы ей легко дышалось.
  • Прикладные решения
    Решаем с помощью PostgreSQL конкретные бизнес-задачи.

§

Для пользователя

наш СБИС

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

Поэтому, когда на каком-то из тысяч подконтрольных серверов случается аномальное потребление ресурсов (CPU, памяти, диска, сети, …), возникает потребность разобраться «кто виноват, и что делать».

Для оперативного мониторинга использования ресурсов Linux-сервера «в моменте» существует

утилита pidstat

. То есть если пики нагрузки периодичны — их можно «высидеть» прямо в консоли. Но мы-то хотим эти данные

анализировать постфактум

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

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

Тензор - CNews

В этой статье рассмотрим, как все это можно экономично расположить в БД, и как максимально эффективно собрать по этим данным отчет с помощью оконных функций и GROUPING SETS.

§

Посвящается всем любителям анализировать логи.

В логах работающих систем рано или поздно появляются тексты каких-то ошибок. Чем таких систем больше в обозримом пространстве, тем больше вероятность ошибку увидеть. Серверы PostgreSQL, которые находятся под нашим мониторингом ежедневно генерируют от 300K до, в неудачный день, 12M записей об ошибках.

И такие ошибки — это не какой-то там «о, ужас!», а вполне нормальное поведение сложных алгоритмов с высокой степенью конкурентности вроде тех, о которых я рассказывал в статье про расчет себестоимости в СБИС — все эти deadlock, could not obtain lock on row in relation …, canceling statement due to lock timeout как следствие выставленных разработчиком statement/lock timeout.

Но есть ведь и другие виды ошибок — например, you don't own a lock of type ..., которая возникает при неправильном использовании рекомендательных блокировок и может очень быстро «закопать» ваш сервер, или, мало ли, кто-то периодически пытается «подобрать ключик» к нему, вызывая возникновение password authentication failed for user …

[источник КДПВ]

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

§

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

какой-нибудь новый индекс

на таблицу или

включить поле куда-нибудь

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

Тензор - CNews

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

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

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

  • неиспользуемые индексы
  • префиксные «клоны»
  • timestamp «в середине»
  • индексируемый boolean
  • массивы в индексе
  • NULL-мусор

§

Возможно, кто-то, прочитав заголовок, спросит: «Зачем что-то делать со своим кодом?! Ведь С кроссплатформенный язык!». В целом, это так… но только пока нигде нет завязок на специфичные возможности компилятора и целевой платформы…

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

В итоге получаем приложение, которое, в некоторой степени, «заточено» под конкретный компилятор (и даже под его конкретную версию!) и целевую ОС. Более того, из-за скудности стандартной библиотеки С некоторые вещи просто невозможно написать, не воспользовавшись специфичным API системы.

Так было и у нас в Тензоре. Мы писали на MS Visual Studio 2022. Наши продукты были 32-х битными Windows-приложениями. И, само собой, код был пронизан всевозможными завязками на технологии от Microsoft. Однажды мы решили, что пора осваивать новые горизонты: пора научить СБИС работать под Linux и другими ОС, пора попробовать перейти на другое «железо» (POWER).

В данном цикле статей я расскажу, как мы сделали свои продукты настоящими кроссплатформенными приложениями; как заставили их работать на Linux, MacOS и даже под iOS и Android; как запустили свои приложения на множестве аппаратных архитектур (x86-64, POWER, ARM и другие); как научили работать на big-endian машинах.
Тензор - CNews

Упорядочение неупорядоченного

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

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

Оцените статью
OverComp.ru