...

суббота, 8 февраля 2020 г.

[Из песочницы] VMware vSAN 6.7 — И грянул гром

Заканчивался 2018-й год…

Однажды, ясным декабрьским днём, решила наша Компания приобрести новое «железо». Нет, конечно, это не случилось в одночасье. Решение было принято раньше. Намного раньше. Но, как водится, не всегда наши желания совпадают с возможностями акционеров. И денег не было, и мы держались. Но наконец-то наступил тот радостный момент, когда приобретение было одобрено на всех уровнях. Всё было хорошо, «белые воротнички» радостно аплодировали, надоело им на серверах 7-ми летней давности ежемесячно обрабатывать документы по 25 часов и они очень настойчиво просили Департамент ИТ придумать что-нибудь, чтобы подарить им больше времени для других, не менее важных дел.

Мы пообещали сокращение времени обработки документов в 3 раза, до 8 часов. Для этого выстрелили из пушки по воробьям. Этот вариант казался единственным, поскольку в нашей команде нет, и никогда не было, администратора баз данных для применения всевозможных оптимизаций запросов (DBA).
Конфигурация выбранного оборудования была, конечно, заоблачной. Это были три сервера от компании HPE — DL560 Gen10. Каждый из них мог похвастаться 4-я процессорами Intel Xeon Platinum 8164 2.0Ghz по 26 ядер, 256 DDR4 ОЗУ, а также 8 SSD 800Gb SAS (SSD 800Gb WD Ultrastar DC SS530 WUSTR6480ASS204) + 8 SSD 1,92Tb (Western Digital Ultrastar DC SS530).

Эти «железки» предназначались для кластера VMware (HA+DRS+vSAN). Который уже работал у нас почти 3 года на аналогичных серверах 7-го и 8-го поколений, тоже от компании HPE. К слову, никаких проблем не было до тех пор, пока компания HPE не отказалась от их поддержки и обновить ESXi с версии 6.0, хотя бы до 6.5, без бубна не получилось. Ну да ладно, обновить в итоге удалось. Путем изменения установочного образа, удаления из установочного образа несовместимых проблемных модулей и т.д. Это тоже подлило масла в огонь нашего желания соответствовать всему новому. Конечно, если бы не новые «фишки» vSAN, в гробу мы видели обновление всей системы с версии 6.0 до более новой, и статью писать было бы незачем, но мы легких путей не ищем же…

Значит, приобрели мы данное оборудование и решили заменить давно устаревшее. Применили последний SPP к каждому новому серверу, установили в каждый из них по две сетевые карты Ethernet 10G (одну для пользовательских сетей, а вторую — для SAN, 656596-B21 HP Ethernet 10Gb 2-port 530T). Да, в комплекте с каждым новым сервером шла сетевая карта SFP+ без модулей, но у нас сетевая инфраструктура подразумевала Ethernet (два стэка коммутаторов DELL 4032N для сетей LAN и SAN), а модулей HPE 813874-B21 у дистрибьютора HP в Москве не оказалось и мы их так и не дождались.

Когда наступила пора установки ESXi и включения новых узлов в общий датацентр VMware, случилось «чудо». Как оказалось, HPE ESXi Custom ISO версии 6.5 и ниже не предназначен для установки на новые серверы Gen10. Только «хардкор», только 6.7. И пришлось нам невольно следовать заветам «виртуальной компании».

Был создан новый кластер HA+DRS, создан кластер vSAN, всё в непреклонном соответствии с VMware HCL и данным документом. Все было настроено по «феншую» и вызывали подозрение лишь периодические «тревоги» в мониторинге vSAN о ненулевых значениях параметров в данном разделе:

image

Мы, со спокойной душой, переместили все виртуальные машины (около 50 штук) на новые серверы и в новое хранилище vSAN, построенное уже на SSD дисках, проверили производительность обработки документов в новой среде (к слову, получилось сэкономить намного больше времени, чем планировали). Пока не перенесли самую тяжелую базу в новый кластер, операция, о которой упоминалось в начале статьи, заняла примерно 4 часа вместо 25-и! Это был весомый вклад в предновогоднее настроение всех участников процесса. Некоторые, наверное, начали мечтать о премии. Потом все радостно ушли на новогодние праздники.

Когда начались будни нового, 2019 года, ничто не предвещало катастрофы. Все сервисы, перенесенные на новые мощности, без преувеличения, взлетели! Только событий в разделе повторной синхронизации объектов стало намного больше. А через пару недель произошла беда. Ранним утром, практически все ключевые сервисы Компании (1с, MSSQL, SMB, Exchange и т.д.) перестали отвечать, либо начали отвечать с большой задержкой. Вся инфраструктура погрузилась в полный хаос, и никто не знал что произошло и что делать. Все виртуальные машины в vCenter выглядели «зелеными», никаких ошибок в их мониторинге не было. Перезагрузка не помогала. Более того, после перезагрузки, некоторые машины даже не смогли загрузиться, выдавая различные ошибки процесса в консоли. Казалось, Ад пришел к нам и дьявол потирал руки в предвкушении.

Находясь под давлением серьезного стресса, удалось определить источник беды. Этой проблемой оказалось распределенное хранилище vSAN. Случилось неконтролируемое повреждение данных на дисках виртуальных машин, на первый взгляд — безо всяких на то причин. На тот момент единственным решением, которое казалось рациональным, было обратиться в техническую поддержку VMware с криками: SOS, спасите-помогите!

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

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

Что произошло дальше:

  1. Технической поддержке VMware были поставлены два главных вопроса: как восстановить данные и как решить проблему «фантомного» повреждения данных в дисках виртуальных машин в «боевом» кластере vSAN. Кстати, данные некуда было восстанавливать, поскольку дополнительное хранилище было занято резервными копиями и разворачивать «боевые» службы было просто некуда.
  2. Пока я, совместными усилиями с VMware, пытался собрать воедино «поврежденные» объекты в кластере vSAN, мои коллеги в срочном порядке добывали новое хранилище, способное вместить все 30+ терабайт данных Компании.
  3. Меня ждали пять, почти бессонных ночей, когда сотрудники круглосуточной поддержки VMware из трех часовых поясов спрашивали меня, почему их встречаю лишь я и беспокоились насчет эффективности такого подхода, мол можно еще больше «накосячить» и совершить много лишних ошибок из-за сверх-сверх нормативного рабочего дня. Но ведь наши реалии вряд ли соответствуют западному пониманию, да?
  4. Я обзавелся готовыми инструкциями в случае повторения данной ситуации.
  5. Пришло понимание, где «собака зарыта» в данной проблеме.
  6. Были восстановлены все виртуальные машины на появившееся благодаря подвигу коллег хранилище, кроме пары несущественных, которые были «воскрешены» из резервных копий на теперь доступное дисковое пространство.
  7. Пришлось временно (на пару дней) пожертвовать работоспособностью почты, ради дополнительных 6 терабайт свободного пространства в хранилище, чтобы запустить ключевые сервисы, от которых зависел доход Компании.
  8. Сохранены «на память» тысячи строк чата с англоязычными коллегами из VMware, вот коротенькая выдержка из наших разговоров:
I understood that you are now migrating all the VMs out of vSAN datastore.
May I know, how the migration task is going on.? How many VMs left and how much time is expected to migrate the remaining VMs. ?
There are 6 vms still need to be migrated. 1 of them is fail so far.
How much time is expected to complete the migration for the working VMs..?
I think atleast 2-3 hours
ok
Can you please SSH to vCenter server ?
you on it
/localhost/Datacenter ###CLUB/computers/###Cluster> vsan.check_state .
2019-02-02 05:22:34 +0300: Step 1: Check for inaccessible vSAN objects
Detected 3 objects to be inaccessible
Detected 7aa2265c-6e46-2f49-df40-20677c0084e0 on esxi-dl560-gen10-2.####.lan to be inaccessible
Detected 99c3515c-bee0-9faa-1f13-20677c038dd8 on esxi-dl560-gen10-3.####.lan to be inaccessible
Detected f1ca455c-d47e-11f7-7e90-20677c038de0 on esxi-dl560-gen10-1.####.lan to be inaccessible
2019-02-02 05:22:34 +0300: Step 2: Check for invalid/inaccessible VMs
Detected VM 'i.#####.ru' as being 'inaccessible'
2019-02-02 05:22:34 +0300: Step 3: Check for VMs for which VC/hostd/vmx are out of sync
Did not find VMs for which VC/hostd/vmx are out of sync
/localhost/Datacenter ###CLUB/computers/###Cluster>
Thank you
second vm with issues: sd.####.ru

Как эта проблема проявлялась (помимо наглухо упавших сервисов организации).

Экспоненциальный рост ошибок контрольной суммы (CRC) «на ровном месте» в процессе обмена данными с дисками в режиме HBA. Как это можно проверить — в консоли каждого узла ESXi ввести следующую команду:

while true; do clear; for disk in $(localcli vsan storage list | grep -B10 'ity Tier: tr' |grep "VSAN UUID"|awk '{print $3}'|sort -u);do echo ==DISK==$disk====;vsish -e get /vmkModules/lsom/disks/$disk/checksumErrors | grep -v ':0';done; sleep 3; done

В результате выполнения, вы сможете увидеть ошибки CRC по каждому диску в vSAN кластере данного узла (нулевые значения не будут отображаться). Если у вас имеются положительные значения, и более того, они постоянно растут, значит появилась причина постоянно возникающих задач в разделе Monitor -> vSAN -> Resincing objects, в кластере.

Как восстанавливать диски виртуальных машин, которые никак не клонируются и не мигрируют стандартными средствами?

Кто бы мог подумать, с помощью мощной команды «cat»:

1. cd в директорию виртуальной машины на vSAN
[root@esxi-dl560-gen10-1:~] cd /vmfs/volumes/vsanDatastore/estaff

2. grep vmdk объектов для получения их uuid

[root@esxi-dl560-gen10-1:/vmfs/volumes/vsan:52f53dfd12dddc84-f712dbefac32cd1a/2636a75c-e8f1-d9ca-9a00-20677c0084e0] grep vsan *vmdk
estaff.vmdk:RW 10485760 VMFS "vsan://3836a75c-d2dc-5f5d-879c-20677c0084e0"
estaff_1.vmdk:RW 41943040 VMFS "vsan://3736a75c-e412-a6c8-6ce4-20677c0084e0"
[root@esxi-dl560-gen10-1:/vmfs/volumes/vsan:52f53dfd12dddc84-f712dbefac32cd1a/2636a75c-e8f1-d9ca-9a00-20677c0084e0]

3. создать директорию для VM в хранилище, куда восстанавливаем:

mkdir /vmfs/volumes/POWERVAULT/estaff

4. Скопировать туда vmx и дескрипторы

cp *vmx *vmdk /vmfs/volumes/POWERVAULT/estaff

5. начать копировать данные с помощью средства, которому наплевать на их целостность ^_^

/usr/lib/vmware/osfs/bin/objtool open -u 3836a75c-d2dc-5f5d-879c-20677c0084e0; sleep 1; cat /vmfs/devices/vsan/3836a75c-d2dc-5f5d-879c-20677c0084e0 >> /vmfs/volumes/POWERVAULT/estaff/estaff-flat.vmdk

6. cd в директорию назначения:

 cd /vmfs/volumes/POWERVAULT/estaff

7. поменять в дескрипторе - estaff.vmdk путь к файлу самого диска

[root@esxi-dl560-gen10-1:/tmp] cat estaff.vmdk
# Disk DescriptorFile
version=4
encoding="UTF-8"
CID=a7bb7cdc
parentCID=ffffffff
createType="vmfs"

# Extent description
RW 10485760 VMFS "vsan://3836a75c-d2dc-5f5d-879c-20677c0084e0"      <<<<< вот тут меняем на "estaff-flat.vmdk"

# The Disk Data Base
#DDB

ddb.adapterType = "ide"
ddb.deletable = "true"
ddb.geometry.cylinders = "10402"
ddb.geometry.heads = "16"
ddb.geometry.sectors = "63"
ddb.longContentID = "6379fa7fdf6009c344bd9a64a7bb7cdc"
ddb.thinProvisioned = "1"
ddb.toolsInstallType = "1"
ddb.toolsVersion = "10252"
ddb.uuid = "60 00 C2 92 c7 97 ca ae-8d da 1c e2 3c df cf a5"
ddb.virtualHWVersion = "8"
[root@esxi-dl560-gen10-1:/tmp]

Как узнать naa.хххх… дисков в дисковых группах:
[root@esxi-dl560-gen10-1:/vmfs/volumes] vdq -Hi
Mappings:
   DiskMapping[0]:
           SSD:  naa.5000c5003024eb43
            MD:  naa.5000cca0aa0025f4
            MD:  naa.5000cca0aa00253c
            MD:  naa.5000cca0aa0022a8
            MD:  naa.5000cca0aa002500

   DiskMapping[2]:
           SSD:  naa.5000c5003024eb47
            MD:  naa.5000cca0aa002698
            MD:  naa.5000cca0aa0029c4
            MD:  naa.5000cca0aa002950
            MD:  naa.5000cca0aa0028cc

   DiskMapping[4]:
           SSD:  naa.5000c5003024eb4f
            MD:  naa.5000c50030287137
            MD:  naa.5000c50030287093
            MD:  naa.5000c50030287027
            MD:  naa.5000c5003024eb5b
            MD:  naa.5000c50030287187

Как узнать UUIDы vSAN по каждому naa....:
[root@esxi-dl560-gen10-1:/vmfs/volumes] localcli vsan storage list | grep -B15 'ity Tier: tr' | grep -E '^naa|VSAN UUID'

naa.5000cca0aa002698:
   VSAN UUID: 52247b7d-fed5-a2f2-a2e8-5371fa7ef8ed
naa.5000cca0aa0029c4:
   VSAN UUID: 52309c55-3ecc-3fe8-f6ec-208701d83813
naa.5000c50030287027:
   VSAN UUID: 523d7ea5-a926-3acd-2d58-0c1d5889a401
naa.5000cca0aa0022a8:
   VSAN UUID: 524431a2-4291-cb49-7070-8fa1d5fe608d
naa.5000c50030287187:
   VSAN UUID: 5255739f-286c-8808-1ab9-812454968734
naa.5000cca0aa0025f4: <<<<<<<
   VSAN UUID: 52b1d17e-02cc-164b-17fa-9892df0c1726
naa.5000cca0aa00253c:
   VSAN UUID: 52bd28f3-d84e-e1d5-b4dc-54b75456b53f
naa.5000cca0aa002950:
   VSAN UUID: 52d6e04f-e1af-cfb2-3230-dd941fd8a032
naa.5000c50030287137:
   VSAN UUID: 52df506a-36ea-f113-137d-41866c923901
naa.5000cca0aa002500:
   VSAN UUID: 52e2ce99-1836-c825-6600-653e8142e10f
naa.5000cca0aa0028cc:
   VSAN UUID: 52e89346-fd30-e96f-3bd6-8dbc9e9b4436
naa.5000c50030287093:
   VSAN UUID: 52ecacbe-ef3b-aa6e-eba3-6e713a0eb3b2
naa.5000c5003024eb5b:
   VSAN UUID: 52f1eecb-befa-12d6-8457-a031eacc1cab

И самое главное.

Проблема оказалась в некорректной работе прошивки RAID контроллера и драйвера HPE с vSAN.
Ранее, в VMware 6.7 U1, совместимая прошивка для контроллера HPE Smart Array P816i-a SR Gen10 в vSAN HCL значилась версии 1.98 (которая оказалась фатальной для нашей организации), а теперь там указана 1.65.
Более того, версия 1.99, которая решала проблему на тот момент (31 января 2019 года) уже была в закромах HPE, но они ее не передавали ни VMware ни нам, ссылаясь на отсутствие сертификации, несмотря на наши увещевания об отказе от ответственности и всё такое, мол нам главное решить проблему с хранилищем и всё.

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

Какие выводы я сделал?

  1. У нас есть дополнительное хранилище (помимо обязательных резервных копий), на которое в случае чего можно мигрировать всем колхозом.
  2. Не буду покупать самое свежее железо! Лучше годик подождать.
  3. Не буду использовать всё доступное пространство ради «хотелок» бизнеса, буду начинать «ныть» о покупке новых «хранилок» сразу после того, как останется менее 30% свободного пространства на всех доступных «железках».
  4. HPE, в лице местного представителя, так и не признала свою ошибку и ничем нам не помогла.
  5. Я считаю, что вина в случившемся лежит полностью на:
    • HPE -эта компания показала во всей красе качество своей поддержки в критической ситуации. И в целом, количество багов в оборудовании Enterprise сегмента заставляет меня тревожиться за наше будущее. Конечно, это лишь моё мнение, и оно ни к чему не подталкивает).
    • Мне — не предусмотрел ситуацию, когда может понадобиться дополнительное дисковое пространство для размещения копий всех серверов Компании в случае нештатных ситуаций.
  6. Дополнительно, в свете всего произошедшего, для VMware я больше не буду покупать железки для крупных компаний, каких-либо вендоров, отличных от DELL. Почему, потому что DELL, насколько мне известно, приобрела VMware, и теперь интеграция железа и софта в данном направлении ожидается максимально тесная.

Как говорится, обжегся на молоке, дуй на воду.

Вот и всё, ребята. Желаю вам никогда не попадать в такие жуткие ситуации.

Как вспомню, аж вздрогну!

Let's block ads! (Why?)

ФАС запретила РЖД покупать 15 тысяч «Эльбрусов» за 1 млрд рублей


На днях стало известно о том, что РЖД не сможет закупить 15 тысяч компьютеров на «Эльбрусах» за 1 млрд рублей. Причина — запрет со стороны ФАС, служба посчитала, что РЖД неверно прописала процессор конкретного производителя. Так, в одной части документа прописаны характеристики серверных восьмиядерных процессоров «Эльбрус-8С». А вот в другой части описываются уже процессы «Эльбрус 1С+» — это маломощный одноядерный чип.

Ранее на закупку РЖД российских чипов было выделено 1,08 млрд рублей. Соответствующие торги были назначены на 5 февраля, победитель аукциона должен был поставить заказчику оборудование до 25 мая. Всего отечественные ПК должны были получить 230 подразделений РЖД по всей России. В том случае, если бы все прошло хорошо, это стало бы крупнейшей госзакупкой техники на «Эльбрусах».
К слову, ФАС обратила внимание на проблему только после поступления в службу жалобы от компании «Смарт текнолоджис». Это структура, которая связана с НКК, и у которой есть опыт контрактования с РЖД и другими госзаказчиками.

По итогам жалобы ФАС согласилась с тем, что заказчик неправомерно установил требования к техническим и функциональным характеристикам товара. Эти требования прямо указывали на на конкретного производителя товара АО “МЦСТ”. То есть, на разработчика процессоров «Эльбрус».

После этого ФАС направила в РЖД обязательное к исполнению предписание устранить нарушения закупочного законодательства. После его получения РЖД разместили на сайте государственных закупок уведомление о возвращении аукционных заявок претендентам.

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

Кроме того, в жалобе «Смарт текнолоджис» указано, что в ТЗ тендера установлено требование к чипу в ПК, в соответствии с которым участник закупки должен был указать порядковый номер микропроцессора в реестре радиоэлектронной продукции РФ.

«На заседании комиссии ФАС представитель заказчика представил материалы, реестр и пояснил, что единственным микропроцессором, зарегистрированным в реестре является микропроцессор “Эльбрус-8С” — 1891ВМ028 и его модификации 1891ВМ10Я, 1891ВМ10АЯ, 1891ВМ10БЯ за порядковым номером реестровой записи РЭ-59/19 — говорится в решении ФАС. — При этом указанные положения ТЗ документации не позволяют участнику представить эквивалентный товар, поскольку изменение технического предложения участника является основанием для отклонения заявки участника аукциона».

Но это сделано не было. Зато характеристики процессора, прописанные в заявке, прямо указывали на «Эльбрус 1С+», который производится по 40-нм техпроцессу.

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

Кроме того, в системе должна была быть предустановлена ОС Linux. Но не любая, а только та, что есть в реестре отечественного ПО при Минкомсвязи. В составе ОС ожидалось видеть текстовый редактор, графический редактор, редактор таблиц и браузер.

Let's block ads! (Why?)

[Перевод] Пол Грэм: «Дети и стартапы»

image

Я боялся заводить детей до тех пор, пока я их не завел. До этого момента, я относился к детям, как юный Августин к добродетельной жизни. Мне было бы грустно думать, что у меня никогда не будет детей. Но хотел ли я их в тот момент? Нет.

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

Когда знакомые заводили детей, я с энтузиазмом поздравлял их, потому что, похоже, именно так все и поступали. Но я этого совсем не чувствовал. «Лучше у вас, чем у меня», — думал я.

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

Что изменилось, так это то, что у меня появились дети. То, чего я боялся, оказалось чудесным.
Отчасти, и я не буду отрицать того, что это связано с серьезными химическими изменениями, которые произошли почти мгновенно, когда родился наш первый ребенок. Как будто кто-то щелкнул выключателем. Я вдруг почувствовал себя защитником не только по отношению к нашему ребенку, но и по отношению ко всем детям. Когда я вез жену и новорожденного сына домой из больницы, мы подъехали к пешеходному переходу, полному пешеходов, то поймал себя на мысли: «я должен быть очень осторожен со всеми этими людьми. Каждый из них чей-то ребенок!»

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

Мои наблюдения за родителями и детьми были очень сильно подвержены когнитивному искажению "Систематической ошибке отбора" (Selection bias). Некоторые родители, наверно, замечали что я пишу “Всякий раз, когда замечал родителя с ребенком.” Конечно, когда я замечал, что дети делают что-то плохое. Я замечал их только тогда, когда они шумели. И где я был. Когда замечал их? Как правило, я не хожу в места с детьми, поэтому единственные случаи, когда я сталкиваюсь с ними, это общественные места, такие как самолет. Что не совсем типичный случай. Полеты с ребенком — это то, что мало нравится родителям.

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

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

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

Я помню, как однажды, когда мне было около 30 лет, мама сказала, что была счастлива растить меня и мою сестру. Боже мой, подумал я, эта женщина — святая. Она не только терпела всю ту боль, которой мы ее подвергали, но и наслаждалась ею? Теперь я понимаю, что она просто говорила правду.

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

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

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

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

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

Не приятно такое говорить, ведь мне всегда были присущи амбиции, но появление детей поубавит у вас амбиций. Больно видеть это написанным. Я мучительно избегаю этого. Но если бы здесь не было чего-то серьезного, с чего бы мне избегать? Дело в том, что когда у тебя есть дети, ты заботишься о них больше, чем о себе. А внимание — это игра с нулевой суммой. Только одна мысль в единицу времени может быть «в топе». И если уж у тебя дети, скорее всего это будет мысль о них, и уж потом только проект, над которым ты работаешь.

Есть у меня кое-какие хаки, чтобы балансировать на этом пути. Например, когда я пишу эссе, то думаю о том, чему бы хотел тем самым поведать своим детям. И это заставляет правильнее смотреть на вещи. Когда я писал Bel, то сказал детям, что возьму их в Африку, как только закончу эту работу. Когда ты такое говоришь маленькому ребёнку, он воспринимает это как обещание. То есть, я должен был или закончить, или оставить их без поездки. И будь я везунчиком, такие вещи could put me net ahead. Но проблема все ещё существует, без сомнения.

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

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

Видите, что я там сделал? Дело в том, что большую часть свободы, которую я имел до детей, я никогда не использовал. Я заплатил за это в одиночестве, но я никогда не использовал это.

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

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

Примечание


[1] Взрослые уже слишком изощрены видеть в двух-летних детях сложный и очаровательный характер, в то время, как для большинства шестилетних детей они просто “неполноценные” шестилетки.

Let's block ads! (Why?)

Официальный аккаунт Facebook в Twitter был взломан хакерами

В сервисе Twitter подтвердили, что 8 февраля 2020 года официальный аккаунт Facebook в Twitter был взломан хакерами. Там злоумышленники опубликовали несколько повторяющихся сообщений. Через некоторое время специалисты Facebook смогли получить обратно управление над аккаунтом.
Представитель сервиса Twitter заявил, что учетные записи Facebook были взломаны с помощью сторонней платформы Khoros, не уточнив деталей инцидента. Khoros — это маркетинговая платформа, которую компании используют для управления своими коммуникациями в социальных сетях. Обычно у таких платформ есть доступ к паролям и регистрационным данным своих клиентов. Представитель компании Khoros отказался от комментариев после обнародования этой информации.

«Как только мы узнали об этой проблеме, мы заблокировали скомпрометированные учетные записи, а наши специалисты тесно сотрудничали с нашими партнерами в Facebook, чтобы восстановить их», — дополнил представитель Twitter.

«Некоторые из наших корпоративных социальных аккаунтов были на короткое время взломаны, но смогли восстановить к ним доступ», — рассказал Джо Осборн, представитель Facebook.

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

Повторяющееся несколько раз сообщение во взломанном аккаунте гласило: «Hi, we are O u r M i n e. Well, even Facebook is hackable but at least their security is better than Twitter». (перевод — «Привет, мы OurMine. Ну, хотя и даже Facebook можно взломать, их система безопасности лучше, чем у Twitter»).

Один из пользователей Twitter даже успел написал в ответ, чтобы хакеры остановились, когда увидел происходившее в аккаунте Facebook в Twitter:


Также была взломана в сервисе Twitter учетная запись Facebook Messenger. А в аккаунтах Facebook и Messenger в Instagram были опубликованы картинки с логотипом группы хакеров OurMine.
Ранее группа хакеров OurMine взяла на себя ответственность за взлом аккаунтов Марка Цукерберга, HBO, основателя Twitter Джека Дорси, исполнительного директора Google Сундара Пичаи, а также в корпоративных аккаунтов Netflix и ESPN. Хакеры утверждают, что их атаки призваны показать отсутствие должного уровня безопасности в различных соцсетях.

Let's block ads! (Why?)

HighLoad++, Анастасия Цымбалюк, Станислав Целовальников (Сбербанк): как мы стали MDA

Следующая конференция HighLoad++ пройдет 6 и 7 апреля 2020 года в Санкт-Петербурге
Подробности и билеты по ссылке. HighLoad++ Siberia 2019. Зал «Красноярск». 25 июня, 14:00. Тезисы и презентация.

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

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

Наш подход использует все преимущества метаданных, динамического кода SQL и кодогенерации на основе Swagger codegen и handlebars. Это решение сокращает время разработки и переконфигурации системы, а добавление новых объектов управления не требует ни единой строки нового кода.

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

Анастасия Цымбалюк (далее – АЦ): – Меня зовут Настя, а это – Стас!

Стас Целовальников (далее – СЦ): – Всем привет!

АЦ: – Сегодня мы расскажем вам про MDA, и как мы с помощью этого подхода сократили время на разработку и явили миру промышленную масштабируемую систему управления метаданными. Ура!

СЦ: – Настя, что такое MDA?

АЦ: – Стас, я думаю, мы к этому сейчас плавно перейдём. Точнее, об этом расскажу чуть-чуть в конце презентации. Давай сначала расскажем о нас:

Себя я могу охарактеризовать как искатель синергии в промышленных IT-решениях.

СЦ: – А меня?

Чем занимается команда SberData?


АЦ: – А ты просто промышленный мастодонт, потому что вывел в пром не одно решение!

СЦ: – На самом деле мы работаем вместе в «Сбербанке» в одной команде и занимаемся управлением метаданными SberData:

АЦ: – SberData, если по-простому – это аналитическая платформа, куда стекаются все цифровые следы каждого клиента. Если вы клиент «Сбербанка», вся информация о вас стекается именно туда. Там хранится множество dataset, но мы понимаем, что объём данных не означает их качества. А данные без контекста иногда бывают вовсе бесполезны, потому что мы не можем их применить, интерпретировать, защитить, обогатить.

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

СЦ: – Другими словами, миссия наше й команды – повышение коэффициента полезного действия информационной аналитической платформы «Сбербанка» за счет того, что информация, о которой, ты только что рассказала, должна быть доставлена нужным людям в нужное время в нужном месте. А помнишь, ты ещё говорила о том, что, если данные – это современная нефть, то метаданные – карта месторождений этой нефти.

АЦ: – Действительно, это одно из моих гениальных высказываний, которым я очень сильно горжусь. Технически эта задача сводилась к тому, что мы должны были создать инструмент управления метаданными внутри нашей платформы и обеспечить его полный жизненный цикл.
Но для того, чтобы погрузиться в проблематику нашей предметной области и понять, в какой точке мы находимся, я предлагаю откатиться на 9 месяцев назад.

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

Система управления метаданными моделей


СЦ: – Там у тебя ещё что-то было о том, что мы пребывали в зоне комфорта… Фактически нам была поставлена задача создания Metadata Broker, который должен был дать возможность общения с нашими клиентами, программами, системами. Наши клиенты должны были иметь возможность на уровне бэкенда либо отправить какой-то пакет метаданных, либо получить. И мы, обеспечивая эту функцию, на своём уровне должны были аккумулировать максимально согласованную, актуальную информацию по метаданным на четырёх логических уровнях:

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

И всё это должно быть согласованно.

АЦ: – Да, действительно. Но здесь я бы тоже как-то объяснила по-простому, поскольку не исключаю, что предметная область неясна и непонятна…

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

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

Физическая модель – это о том, когда наступает очередь суровых программистов, архитекторов, которые реально понимают, как эти объекты приземлить – в какую таблицу положить, какие поля создать, какие индексы навесить…

Состояние среды – это некий слепок. Это как показания с машины. Программист иногда хочет сказать машине одно, а она неправильно понимает. Как раз состояние среды показывает нам реальное положение дел, и мы постоянно всё сравниваем; и понимаем, что есть разница между тем, что сказал программист, и реальным состоянием среды.

Кейс для описания метаданных


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

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

Он говорит: «Слушай, у тебя здесь вся история разбивается на отдельные счета как сущности, и у них есть атрибут – средний остаток».

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

Сказано – сделано. А потом пришёл наш парсер, который сходил на промышленный контур и сказал: «Да, вижу – есть необходимые таблицы…» Что ещё обогатило эту таблицу? Здесь (в качестве примера) – партиции и индексы, хотя, строго говоря, и партиции и индексы могли бы находиться на уровне проектирования физмодели, а здесь могло быть что-то ещё (например, объём данных).

Регистрация и хранение на уровне метаданных


АЦ: – Как это хранится всё у нас? Это суперупрощённая форма того примера, который расписал ранее Стас! Как это всё будет лежать у нас?

Фактически это будет одна строка в объекте «Глоссарий», одна – в объекте «Термины», одна – в «Сущностях», одна – в «Атрибутах» и так далее. На рисунке выше каждый прямоугольник – это объект в нашей системе управления, который представляет собой ту или иную хранимую там информацию.

Чтобы вас потихоньку начать вводить в терминологию, я прошу отметить следующее… Что такое объект управления метаданными? Физически это представлено в виде таблицы, но на самом деле там хранится определённая информация по терминам, глоссариям, сущностям, атрибутам и т. д. Этот термин, «объект», мы дальше и будем использовать в своей презентации.

СЦ: – Здесь надо сказать, что каждый кубик – это просто таблица в нашей системе, где мы храним метаданные, и это мы называем тем самым объектом управления.

Требования по введению метаданных


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

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

  • по умолчанию – актуальное состояние;
  • по дате;
  • по номеру ревизии.

Второе требование было интереснее: нам сказали, что могут с нами работать по объектам, но придётся программировать много на Java, а они этого не хотят. Предложили пригнать вперемешку сразу 100 объектов (или 10), а нам это дело обрабатывать (потому что умеем). Что значит вперемешку? Например, пришло 10 колонок. Они имеют ссылку на идентификатор таблицы, а самой таблицы у нас нет – она в хвосте JSON’а пришла. «Вы придумайте и обработайте – надо, чтобы вы это смогли»!

В порядке увеличения интереса – третье: «Мы хотим иметь возможность не просто пользоваться API, который вы нам сделаете, а хотим сами понимать…» И в произвольном порядке говорить: «Дайте нам объединение с этого объекта на тот через третий объект. И пусть у вас система сама поймёт, как это всё делать, спросит у базы и вернёт результат в JSON’е».

Такую историю мы имели на входе.

Приблизительные расчёты


АЦ: – По нашим приблизительным расчётам, чтобы всю эту концепцию претворить в жизнь, нужно каждый объект управления участвовал в семи интерфейсах: простые (симпловые), на пообъектную запись / чтение и удаление…

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

Ещё одно – на построение иерархии, чтобы мы системе могли указать – «Верни нам с объекта по объект»; и она возвращает дерево вложенных объектов.

Сложность реализации


СЦ: – Помимо технических требований, которые пришли нам на вход в момент старта этой истории, мы имели дополнительные трудности.

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

АЦ: – Это и есть та самая турбулентность, которую анонсировали вначале.

СЦ: – Далее…

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

Третье – это большой объём разработки. Настя на своём слайде показала, что, когда мы посмотрели требования, что и как делать, то поняли: 1 объект требует семи API (либо под него, либо участие в семи API). Это означает, что, если у нас патч (6 объектов, модельный, 42 API) выходит за недельку…

Стандартный подход


АЦ: – Да, на самом деле 42 API за неделю – это лишь верхушка айсберга. Мы прекрасно понимаем: чтобы обеспечить работу этих 42 API, нам необходимо:
  • во-первых, создать структуру хранения под объект;
  • во-вторых, обеспечить логику его обработки;
  • в-третьих, написать тот самый API, в котором объект участвует (либо настроен конкретно под него);
  • в-четвёртых, было бы неплохо в идеале обложить всё это контурами тестирования, протестировать и сказать, что всё хорошо;
  • в-пятых (та самая вишенка на торте), задокументировать всю эту историю.

Естественно, первое, что нам пришло в голову (на старте мы вам показывали примерную схему) – мы имели около 35 объектов. С ними нужно было что-то делать, всё это нужно было выводить, а времени было очень мало. И первая идея, которая пришла к нам в голову – это сесть, закатить рукава и начать кодить.

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

Нестандартный подход


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

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

То есть достаточно один раз заморочиться – создать шаблон, а потом всю эту информацию использовать как для существующих, так и для новых объектов. Здесь мы введём ещё одно понятие – #META_META. Объясню зачем, чтобы вас не запутать.

Наша система занимается управлением метаданными, а подход, который мы используем, описывает систему управления метаданными, т. е. две меты. «МетаМета» – мы так назвали у себя, внутри команды. Чтобы и остальных дальше не путать, мы будем использовать именно этот термин.

Механизм обеспечения историзации и ревизии


СЦ: – Ты кратко изложила остальную часть нашего выступления. Расскажем более подробно.

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

Сперва о том, как мы решили вопрос историзации и ревизии. Возможно, это похоже на то, как делают многие. Рассмотрим это на примере метаданных, которые описывают одно поле в таблице проводок (в качестве примера):

У неё есть id – «7», имя – carry_note, есть ссылка id_table 73, а также поле – 255. Мы вводим в первичный и альтернативный ключ некое поле (типа date) с временной точки, с которой эта запись становится валидной – valid_from. И ещё одно поле – по какую дату эта запись валидна (valid_to). В данном случае они заполнены по умолчанию – видно, что эта запись в принципе валидна всегда. И так происходит до тех пор, пока мы не захотим изменить, скажем, длину поля.
Как только мы хотим это сделать, мы закрываем запись valid_to (фиксируем временную метку, в которую событие произошло). Одновременно с этим делаем новую запись («300»). Несложно заметить, что при таком раскладе, если обратиться к базе данных с какой-то временной точки по «битвину» (between) между valid_from и valid_to, то мы получим одну-единственную, но актуальную на тот момент времени запись. И при этом мы одновременно вели некоторый журнал ревизии:

В нём мы фиксировали возрастающие по сиквенсу (sequence) id ревизии, и временную точку, которая соответствует этому id ревизии. Так мы и смогли закрыть первое требование.

АЦ: – В принципе да! Здесь подход один и тот же. Мы понимаем, что у каждого объекта в системе есть эти два обязательных поля, и мы один раз заморочились – скодировали логику обработки этого шаблона, а потом (при формировании динамического кода) просто подставляем имена соответствующих объектов. Так каждый объект в нашей системе становится ревизионным, и это всё может обрабатываться – мы вообще больше не пишем ни единой строки кода.

Пакетное обновление


СЦ: – Второе требование для меня было чуть более интересным. Честно говоря, когда оно пришло на вход, я сначала просто стал в ступор. Но решение пришло!

Я напомню, это тот самый кейс, когда к нам, допустим, пришёл JSON с пакетом на n-ое количество объектов, которые нужно вставить в систему. При этом у нас в начале идут 10 колонок, ссылающихся на несуществующую таблицу, а таблица шла в хвосте JSON. Что делать?

Мы нашли выход в использовании механизма рекурсивных иерархических запросов – это наверняка всем хорошо известная конструкция connect by prior. Сделали это следующим образом: здесь – фрагмент нашего кода на продакшн:

В этом месте (участок кода, обведённый красным овалом) – основная суть, которая даёт идею. И здесь объект линкуется на другой объект, связанный по foreign key, который есть в системе.

Для понимания: если кто-то пишет код на Oracle, там есть таблицы All_columns, All_all_ tables, All_constraint – это и есть словарь, который обрабатывается обрабатывается скриптами (как те, что отражены на слайде выше).

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

Например, поле – как оно могло бы выглядеть? Это код платформы: oracle КП., production. КП, my_scheme.КП, my_table. КП и т.д., где КП – это код поля. Вот и будет такой дескриптор.

АЦ: – Какая здесь проблематика? У нас есть объекты в системе и нам очень важен порядок их вставки. Например, колонки мы не можем вставить перед таблицами, потому что колонка должна ссылаться на определённую таблицу. Как мы делаем стандартно: сначала вставляем таблицы, в ответ получаем массив id, по этим айдишникам раскидываем колонки и делаем вторую операцию вставки.

В реальности, как показывал Стас, длина этой цепочки доходит до 8-9 объектов. Пользователю, используя стандартный подход, нужно выполнять все эти операции поочерёдно (все эти 9 операций) и чётко осознавать их порядок, чтобы не случилось никакой ошибки.

Насколько я верно интерпретирую Стаса, мы можем передать системе все эти объекты в любом порядке и вообще не заморачиваться о том, как нам нужно производить эту вставку – мы просто кинул в систему суповой набор, а она сама всё распределила, в каком порядке вставлять.
Единственное, у меня возникает вопрос: а если мы вставляем объект в первый раз? Мы таблицу до этого вставляли, не знаем её id. Как нам указать (чисто гипотетический пример), что нужно вставить две таблицы, у каждой из которых есть по колонке? Как нам указать, что в этом JSON’е колонка ссылается на таблицу1, а не на таблицу2?

СЦ: – Дескриптор! Дескриптор, который мы указали на том слайде (предыдущем).
А на этом слайде собственно и дано то самое решение:

Дескрипторы используются в системе как некое мнемоническое поле, которое не существует, но заменяет id. В тот момент, когда вначале система поймёт, что нужно вставить таблицу – вставит, получит id; и уже на этапе генерации SQL-запроса вставки и колонки она будет оперировать id. Пользователь может не париться: «Дай дескриптор и выполни!». Система сделает.

Универсальный запрос по группе связанных объектов


Пожалуй, мой любимый кейс. Это самое любимое техническое требование, которое у нас было. К нам пришли и сказали: «Ребята, сделайте, чтобы система могла всё! С объекта на объект, пожалуйста. Догадайтесь, как это всё джойнить между собой. Верните нам, JSON, пожалуйста. Мы не хотим много программировать, используя ваш сервис»…

Вопрос: «Как?!»

Мы на самом деле пошли тем же путём. Ровно та же самая конструкция:

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

Все возможные связи между объектами лежат заранее подготовленными. Если у нас объект участвует в трёх связях, соответственно, три строчки будет подготовлено для того, чтобы алгоритм мог понять. И как только к нам приходит JSON-запрос, мы идём туда, где у нас заранее в «МетеМете» подготовлена эта история, ищем нужный нам путь. Если не находим – это одна история, если находим – формируем запрос в БД. Выполняется – возвращаем JSON (что и просили).

АЦ: – Как результат, мы можем системе передать, с какого по какой объект мы хотим получить. И если можно очертить чёткую связь между двумя объектами, значит, система сама разберётся, на каком уровне вложенности объект, и вернёт вам дерева:

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

СЦ: – Давай подведём некоторый итог. Понятно, что сейчас мы всех фишек не расскажем из-за ограниченности времени. Три кейса, на наш взгляд, мы вынесли и рассказали. У нас получилось, мы смогли всю самую сложную логику, причём ту, которая должна однообразно работать по каждому объекту управления метаданными, впихнуть в код ядра.

Мы не смогли сделать этот код 100% динамическим, а это означает, что с любыми созданными объектами (неважно – уже созданные или которые будут созданы потом; главное, чтобы были созданы по правилам) система работать умеет – ничего не надо дописывать, переписывать. Достаточно просто протестировать. Всю эту историю мы припарковали на три универсальных метода. На мой взгляд, их достаточно для того, чтобы решить практически любую бизнес-задачу:

  • во-первых, этот тот самый универсальный «обновлятор» – метод, который умеет делать update/insert/delete (delete – это закрытие записи) по одному или группе объектов, переданных в произвольном порядке.
  • второе – это метод, который умеет возвращать универсальную информацию только по одному объекту;
  • третье – это тот самый метод, который может возвращать Join-информацию, соединённую по группам объектов.

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

Точка входа в Application


АЦ: – Да, это моя любимая часть, потому что это моя зона ответственности – Application Server. Чтобы понять, в какой ситуации я находилась, снова попытаюсь погрузить вас в проблему.
Стас хорошо поработал и передал мне эти три стандартных метода, которые манипулировали этими объектами. Это чисто схематичное описание – в реальности их намного больше:

Вернёмся к самому началу, чтобы вас погрузить… Как у нас будут представлены метаданные в системе?

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

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

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

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

АЦ: – Сейчас мы не будем об этом спорить. За две недели до конца дедлайна я осталась с тем, что у меня на руках были эти три метода (слева на предыдущем слайде), которые манипулировали универсальной структурой (справа на том же слайде).

Моей первой мыслью было просто завернуть всё на уровне API и пойти с этим к пользователю, сказав: «Вот, смотрите, какая гениальная вещь! Вы можете делать что угодно! Передавать любые объекты, и даже не существующие. Круто, да»?!

А они говорят: «Но вы понимаете, что у вас сервис совсем не специализирован? Я как пользователь не понимаю, какие объекты я могу передать в систему, как я могу ими манипулировать… Для меня это – чёрный ящик, я вообще боюсь, что покорёжу данные; я могу ошибиться – мне страшно. Сделайте так, чтобы я мог чётко следовать инструкциям и видеть, какие объекты есть в системе и какие способы манипуляции я могу использовать».

Спека. Подход


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

Посмотрев структуры «Сваггера», я поняла, что нужно где-то взять структуру объектов, которые есть в системе. От ядра я получила только три стандартных метода и перевёртыш в виде таблицы. Больше ничего. Для меня тогда казалось невыполнимой задачей вытащить всю структуру, которая есть в хранилище, из этих четырёх стандартных полей. Я искренне не понимала, где меня взять всё описания объектов, все допустимые значения, всю логику…

СЦ: – Что значит где? У нас с тобой есть «МетаМета», которая обеспечивает работу ядра в режиме Real-time. Ядро в режиме реального времени исполнения генерирует SQL-запрос, который общается с базой. Там всё есть, не только то, что тебе нужно. Там есть ещё и связи между объектами.

АЦ: – По совету Стаса тогда я пошла в «МетаМету» и удивилась, потому что весь необходимый джентльменский набор для генерации стандартной спеки там присутствовал. Тогда появилась идея, что нужно создать шаблон и расписать всё по семи возможным сценариям – 7 стандартных API для каждого объекта.

Спека. OAS + Handlebars


Итак, здесь нетрудно заметить, из чего состоит спека:

Можно зайти на сайт OAS и Handlebars (внизу слайда) и посмотреть, из чего она должна состоять – там набор Endpoints, набор методов, а в конце идут модели. Код повторяется из раза в раз. Для каждого объекта мы должны писать get, put. delete; для группы объектов мы это должны написать и так далее.

Фишка состояла в том, чтобы всю эту историю написать один раз и больше не париться. На слайде представлен пример реального кода. Синие объекты – это теги в Handlebars, это шаблонизатор; довольно-таки гибкий, всем советую – его можно настраивать под себя, писать кастомные обработчики тегов…

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

Код application. Swagger Codegen + Handlebars


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

Отдали это пользователю. Тот сказал: «Вау! Круто! Теперь мы хотим этим пользоваться»! В чём проблема, опять-таки?

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

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

Для того чтобы всё это претворить в жизнь, нам потребовались «назначительные» преобразования…

Преобразования


У «Сваггера» изначально есть такой инструмент – Swagger Codegen. Если вы хоть раз заходили в спеку, составляли, то там есть кнопка «Сгенерировать серверную часть». Нажимаете, выбираете язык – вам генерируется готовый проект.

Генерируется замечательно: там есть все описания классов, все описания эндпойнтов… – он работающий. Можете запустить у себя локально – он будет работать. Беда одна: он возвращает заглушки – каждый метод не инкрементирован.

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

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

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

СЦ: – Я на секунду тебя остановлю, поскольку уже начинаю теряться. Спрошу тебя в стиле «Правильно ли я понимаю, что»…

Ты хочешь сказать, что мы вычислили всё самое сложное, самый сложный код, который необходимо было бы написать для какого-то нового объекта. И для того, чтобы сэкономить время, не делать этого, мы сумели всё это запихнуть в ядро и сделать эту историю динамической… Но этот API (как пошутили, «упоротый») настолько «может всё», что его страшно отдавать наружу: неумело обращаясь с ним, можно повредить метаданные. Это с одной стороны.

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

Мы вроде бы попали избегаемое ручное кодирование, но ты здесь предлагаешь делать этот код по кнопке. Снова нам удаётся уйти от истории, когда что-то надо писать руками. Это так?

АЦ: – Да, это действительно так. Вообще, моя идея была завязать с программированием раз и навсегда, хотя бы с помощью шаблонизаторов. Один раз написать код, а потом отдыхать. И даже если появится новый объект в системе – по кнопке запускаем обновление, всё подтягивается, у нас новая структура, генерируются новые методы, всё хорошо и прекрасно.

Тюнинг MetaMeta


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

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

Но самое главное, чтобы вся эта магия работала, нам необходимо было внутри договориться: создать свод определённых правил. Их немного – я насчитала три (на слайде их два, поэтому один придётся запомнить):

  • Соглашение о наименовании. Мы определённым образом именуем объекты в системе, чтобы было легче распознавать сценарии их дальнейшего использования.
  • Соглашение о типизации. Это чтобы корректно определить типы, форматы, и чтобы они бились между ядром и application-сервером, мы используем систему check`ов, по которым понимаем, к какому формату относится то или иное свойство.
  • Корректные внешние ключи. Если объекту указать неверную ссылку на другой объект, то вся эта магия будет работать неправильно.

Результат


СЦ: – Это круто, но очень много теории. Ты можешь привести какой-то практический пример?

АЦ: – Да, я его специально подготовила. До того как уехать на конференцию, в пятницу вечером, буквально за 5 минут до конца рабочего дня, Стас мне сказал: «О, смотри! Я выпустил модельный патч – как классно! Было бы неплохо обновить наш сервис». Патч содержал всего лишь два объекта, но я понимаю, что при старом подходе мне пришлось бы заморочиться и написать либо дописать 7 API.

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

Нажимаю на кнопку… Это конечно, скрины, но в реальности всё так и работает:

У нас появился новый метод (между двумя), который уже отдаёт данные, по которым мы в иерархии можем запросить всю структуру, все вложенные объекты:

И всё это работает! Я вообще не написала ни одной строки кода.

Итоги


СЦ: – Во-первых, факт в чём? Нам удалось самую сложную логику, которая отнимала бы больше всего времени у наших программистов, упаковать в 100% динамический код ядра, который умеет работать с объектами – теми, что есть и теми, что будут:

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

АЦ: – Тот же самый подход, основанный на метаданных, мы постарались распространить на другие области, на область тестирования. Мы так же пишем шаблон один раз для какого-то объекта, вставляем туда теги. И когда этот шаблон пробегается по метаданным, он генерирует готовую простыню со всеми тестовыми сценариями, то есть фактически мы все объекты покрываем тестами.

Далее – вишенка на торте. Я знаю, что мало кто любит документировать то, что делает. Мы решили эту боль тоже на основе метаданных. Один раз мы подготовили шаблон с html-разметкой, разметили его тегами. И когда мы пробегаемся по метаданным, во все эти теги подставляются соответствующие объектам их свойства.

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

Как результат, мы имеем четыре основных пойнта, и такой подход называется MDA (Model Driven Architecture). Переводится это почему-то как «архитектура, управляемая моделью», хотя я назвала бы это «методом разработки программного обеспечения».

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

СЦ: – Я честно ждал весь доклад, когда ты ответишь на этот вопрос. Давай перейдём к моим любимым слайдам.

Решение. Процесс. Раньше


АЦ: – «Процесс. Раньше» – это наша гордость, потому что раньше мы много программировали, почти ничего не ели – были очень злыми. Приходилось выполнять все эти 5 шагов для каждого объекта:

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

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

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

СЦ: – От себя хочу искренне сказать, что цифра 6 – не дутая, она даже консервативная. На самом деле КПД ещё выше.

Планы на будущее


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

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

Цифра 6 и тот кейс, который Настя привела – они честные. Это действительно было в пятницу, когда нам нужно было получать документы (самолёт, командировочные и прочее). У смежной команды в понедельник были назначены испытания, и нам нужно было выпустить этот патч, не подставить ребят. Сработало! Это реальный кейс.

Я был бы счастлив, если бы кому-нибудь из вас это могло бы пригодиться. Если будут какие-то вопросы – мы доступны. И после доклада тоже некоторое время здесь. Спрашивайте. Будем рады вам помочь!

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

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

Вопросы


Вопрос из аудитории (далее – А): – Я правильно понимаю, что у вас всё нагромождено из-за того, что вы используете реляционную БД? Мне кажется, если бы вы посмотрели в сторону документоориентированной БД, всё это решение у вас было бы гораздо проще, чем сейчас вижу.

СЦ: – Не совсем так. То, с чего мы начали, когда рассказывали про людей, работающих на уровне глоссария и того паука, который ходит на пром, читает эти истории и проверяет – действительно, та таблица с тем полем, которая отвечает за этот термин глоссария, имеет место на проме. От нашего сервиса говорили: «Ребята, у вас REST API должен быть. Как вы это сделаете – ваши проблемы. Вот список разрешённых технологий – используйте что-то из этого списка (это то, что мы можем в «Сбербанке» использовать)».

Это уровень нашей solution, прикладной архитектуры. Нам, наоборот, было легче сделать это не реляционке. Почему? Приведу пример, один из многих… Например, мне нужно обеспечить, когда я пишу поле, чтобы оно не ссылалось в никуда на таблицу, которая не существует. Я просто делаю foreign key в базе и не парюсь. Ни строчки не пишу – она мне не даст сделать эту запись. И таких примеров много!

Здесь скорее следует говорить о другом. Более сложная история: мы будем выпускать модельный патч с набором данных корректировка / сертификация, и там 6 объектов. И неизбежно, чтобы ты обеспечивал этот джентльменский набор API, нужно месяца три работы (навскидку). У нас на это уйдёт недели полторы. Не применяя эти технологии, просто было невозможно выжить в этих условиях. Мы просто не дали бы такой уровень сервиса!

Это возможно в том случае, если ты так построил производство, что у тебя есть модельный патч (новый объект), кнопка «Сделай всё хорошо» и какой-то софт, который в режиме эмуляции клиента протестирует. Заработало новое, не отвалилось старое – вот этого надо было достичь, а как – это уже выбор команды.

А: – У меня второй вопрос. А какой есть пример использования из жизни? Я понимаю, что теоретически это выглядит так, что можно хоть весь мир описать вашим META_META-объектом… А в жизни как применяете? Тормозить ведь должно, судя по тому, как оно реализовано (друг в друга всё вкладывается)!

СЦ: – Кстати, нет (на удивление)! Ещё одно применение этой истории – это кодогенераторы. Это там, где строятся какие-то витрины, хранилища, и ты ETL, все возможные варианты пытаешься припарковать к заранее описанным девяти шаблонам, девяти шаблонизаторам. С помощью метаданных описываешь эту трансформацию, используя эти шаблоны как заготовки. Дальше эта машина без программирования даёт ETL-код, генерит код на основе метаданных. Считаю, что там тоже такие технологии, подходы будут уместны и правильны.

А: – Я рассчитывал на более конкретный пример.

А: – Скажите, пожалуйста, у вас в требованиях было написано, что вам нужно сложно-структурные запросы делать (Join и тому подобное). На каком языке это реализовано, или как-то логически вы это описываете?

СЦ: – Обращение через REST API, чаще всего это Java, хотя это может быть любой язык. У нас сервис опубликован (dhttps, https спрашивай – тебе JSON вернётся). Те куски кода, который мы показали – это SQL. Для того чтобы понять, в каком порядке это обрабатывать, мы делали некоторую SQL-настройку над словарями СУБД и парковали это в отдельной схеме в виде материализованных представлений. Соответственно, когда выпускается модельный патч, нажимается кнопка «Обновить материализованное представление» (+ поля появляются). А реально наш код – Java и Oracle.

АЦ: – Здесь стоит заметить, что мы решили разделить зоны ответственности. Всю магию мы заведомо перенесли в ядро, а Application просто грамотно интерпретирует эти ответы. То есть сам механизм Join’а происходит в ядре, а Java просто грамотно раскидывает это всё по дереву и выдаёт пользователю конечный результат.

А: – А то, что делает Code Gens – туда вы уже записываете логику сложных запросов? Или это делается на стороне клиента? Надо понять, с какой стороны описывается… Представили, получается, Code Gen, на котором надо в какой-то структуре аккуратно описать: например, я хочу, чтобы у меня API изучал такой-то Join, пройти по списку; потом сказать, есть ли там внутри или нет… – сложные достаточно запросы. На каком этапе это пишется?

СЦ: – Если я правильно понял ваш вопрос, это как раз та история, когда наши клиенты, наши заказчики (это команда внутри ядра, платформы) говорят: «Слушай, не хотим программировать – дайм нам вот это». «Вот это» делалось всё в ядре. Ядро – по сути что? Процентов 80, может, 90 – это генерация динамического кода, того текста, который будет из-под PL/SQL вызвано, но обращено к базе. Там даже по времени дольше генерируется эта строка, потом происходит обращение к базе (например, запрос Join), возвращает, заворачивает это в JSON, выдаёт в перевёрнутом виде. Далее Java всё это трансформирует в контракт, который зависит от структуры.

А: – Показали решение пакетного обновления. А как производится гарантия доставки – пришёл ли целостный пакет, или часть пакета? Они имеют определённый кахерианс? И как сделать так, чтобы ни сервис не упал, ни структуры данных не имели какую-то связанность, чтобы не было каких-то ошибок?

СЦ: – У нас протокол есть – там два режима обновления. В одном из них ты можешь выставить флаг «Примени всё, что сможешь». Есть некий софт, который Excel преобразует в JSON – там может быть 10 тысяч строк. И у тебя, строго говоря, две строки могут быть невалидны (ошибка). И либо ты говоришь: «Примени всё, что сможешь»; либо «Примени только в случае, если вся эта история не будет иметь ни одной ошибки». Там интегральный статус будет rollback, например. Фактически происходит вставка в базу, но commit не вызывается.

В случае если ошибка – он rollback вызывает, он в протоколе; ты в любом случае получаешь протокол. Ты получаешь статус по каждой строке, и у тебя отдельным полем идёт идентификатор – или число (id объекта), или какой-то альтернативный ключ, или и то и другое. Протокол даёт возможность понять, что произошло с моей просьбой.

АЦ: – Пользователь сам указывает, в каком из вариантов ему двигаться. Мы этот параметр передаём на сторону ядра, и ядро уже производит всю магию, выдаёт нам ответ, а мы его интерпретируем.

А: – Почему не использовали какую-либо встроенный компилятор выражений, который помогал бы определить правило? Допустим, у нас есть шаблон, я на каком-то языке (типизированный / не типизированный язык сценария) веду блог; написал: «Хочу список». Передал этот фрагмент, чтобы какой-то обработчик кода всё это прожевал, сложил это в NoSQL-базу, как это предлагали в первом вопросе… Всё-таки непонятно, зачем реляционная база данных и почему и как бороться с избыточностью данных? Присылает вам человек шаблон с миллиардом мусора… Как эти договорённости достигаются, когда человеку надо?

СЦ: – Попробую ответить так, как я понял вопрос. С нами общаются сейчас большей частью программы. Когда настраивается механизм интеграционного взаимодействия, с нами общаются не столько люди, сколько программы. Есть, конечно, кейсы, когда люди присылают а-ля эксельники для первичной проливки: мы из них делаем JSON’ы, прогружаем, но это скорее первичная настройка.

И у нас есть режим, когда ты послал 5000 строк, из них 4900 вернулось со статусом «Я обработала, изменений не нашла, ничего не сделала». Но в протоколе это отражено и ошибки нет. Это с одной стороны избыточность.

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

Почему реляционка? На нас работают кодогенераторы, и очень высока чувствительность к качеству метаданных в системе. И когда мы имеем возможность с помощью реляционки настроить foreign key и обеспечить… Запись просто не ляжет – будет ошибка, если в системе что-то не то, если произошёл сбой. И мы хотим, но не ищем себе дополнительной работы…

Нас измеряют не потому, сколько строк кода мы написали: «Вы решили вопрос сервиса и его стабильности или нет?» Можете вообще не писать – главное, чтобы оно работало. В этом смысле нам было просто быстрее и удобнее сделать так.

Я не беру конкретного вендор, но ведь реляционные базы развиваются уже 20 лет! Это же не просто так. Возьмите, например программу Word или Excel в Windows – вы там не программируете код, который с помощью «Ассемблера» обращается и двигает головки винчестера, чтобы записать файл… Так же и здесь! Мы просто использовали те наработки, которые в RDBMS были, и это было удобно.

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

А: – Система предполагает какое-то использование. Как вы планируете (или уже сделали) поставку данных в вашу систему? Понятно, что на продуктовую идёт какое-то обновление структуры данных. Как это всё приходит к вам? Автоматически, либо агент ваш стоит, либо нагибаете все команды разработчиков, чтобы вам поступали обновления?

АЦ: – У нас есть два режима работы. Один – это когда сами разработчики или команды вынуждены нам пулять через REST-сервисы метаданные в систему. Второй режим работы – этот тот самый «пылесос»: мы сами заходим в среду и забираем оттуда все возможные метаданные. Мы это делаем раз в сутки, и как раз сверяемся с тем, что нам отправили разработчики.

СЦ: – Из тех четырёх уровней, которые мы рассмотрели, три верхних уровня (глоссарий, логические модели, физмодели) – это та история, которая по умолчанию в режиме Metadata Broker заходит к нам, а мы – пассивный участник. Нас вызывают, нам передают что-то, спрашивают; наша задача – припарковать в согласованном виде. Хотя есть кейсы, когда мы ресурсами команды какие-то истории настраиваем, если сильно заинтересованы в том, чтобы эти метаданные у нас появились.

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

А: – Я из центра финансовых технологий. Увидел там знакомое слово – main DACUM. В нашей платформе есть свои метаданные. Вы как дружите – непосредственно с таблицами «Оракла» или с нашими метаданными в этом случае? Потому что в нашем случае дружить с таблицами «Оракла» – это не совсем показательно.

СЦ: – Есть такая таблица main DACUM, которая содержит проводки. Это не секрет: были и есть продукты, которые работают на этой истории. Это одни из источников информации в хранилище. Есть какая-то система, которая является поставщиком данных. Естественно, она в фокусе нашего внимания с точки зрения метаданных, потому что одна из историй, которую мы должны показать и вообще не коснулись здесь (в силу темы доклада) – это Data lineage. Вы должны показать, откуда происходит история данных этого поля. В этом смысле, если имеется таблица main DACUM, мы о ней знаем.


Немного рекламы :)


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас:Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)

Ежегодный отчет Qrator Labs о сетевой безопасности и доступности

Есть у нас в Qrator Labs такая традиция — в начале, а февраль это точно не конец, каждого года публиковать отчет о годе предыдущем.

Как и любая многолетняя сущность, она обрастает множеством сопутствующих историй. К примеру, уже стало «доброй» приметой, когда в начале января на наши корпоративные страницы заходит очередная DDoS-атака, которую мы не успеваем разобрать в отчете. 2020 год стал наполовину исключением — вектор атаки мы успели писать (TCP SYN-ACK-амплификация), но именно к нам, на qrator.net, гость пожаловал только 18 января, зато сразу с гостинцами: 116 Gbps при 26 Mpps.

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

Начнём мы с двух самых интересных нам тем прошлого года: SYN-ACK-амплификации и BGP-«оптимизации».

TCP SYN-ACK-амплификация и другие протоколы


Рост рынка IoT, помимо прочего, означает, что злоумышленники при желании могут эксплуатировать уязвимые устройства, создавая значительную пропускную полосу атаки — как это произошло в середине года, когда протокол WSDD был использован для нанесения видимого ущерба. Протокол Apple ARMS, задействовавшийся для получения коэффициента амплификации порядка 35,5, также был виден в атаках на сеть фильтрации Qrator Labs.

В течение 2019 года общественность узнала и о новых амплификаторах (PCAP), а также воочию увидела уже давно известный вектор атаки с задействованием TCP — SYN-ACK. Основное различие между данным методом и типичной UDP-амплификацией заключается в том, что вектор SYN-ACK не использует увеличенный по сравнению с запросом ответ — вместо этого он лишь пытается несколько раз ответить на TCP-запрос, таким образом, создавая заметный коэффициент амплификации. Так как публичные облака в Интернете отвечают на пакеты с подменой адреса источника, атаки, задействующие вектор амплификации SYN-ACK, стали одной из наиболее серьезных сетевых угроз. Апогей случился, когда крупный облачный хостинговый провайдер Servers.com обратился к Qrator Labs с просьбой о помощи в нейтрализации DDoS-атак, задействующих в том числе и вектор SYN-ACK.

Довольно интересным является и то, что наиболее часто использовавшийся в прошлом метод реакции в виде сброса всего UDP-трафика, виртуально нейтрализующего львиную долю атак с использованием амплификации, совсем не помогает нейтрализовать вектор SYN-ACK. Меньшие интернет-компании испытывают огромные трудности при нейтрализации подобных угроз, так как она требует задействования комплексных мер по борьбе с DDoS-атаками.


И хотя TCP SYN-ACK-амплификация не является новой, до сих пор она оставалась относительно неизвестным вектором атак. Злоумышленник посылает SYN-пакеты по всем публичным TCP-сервисам в интернете, подменяя адрес источника на адрес жертвы, а каждый из таких сервисов в свою очередь отвечает несколько раз в попытке установить соединение — обычно от 3 до 5. Очень долгое время данный вектор атаки считался бессмысленным, и лишь в июле 2019 года мы увидели, что атакующие оказались в состоянии генерировать достаточно атакующей пропускной полосы для того, чтобы потрясти даже очень крупные и распределенные сетевые инфраструктуры. Что особенно необычно, учитывая уже упомянутый факт отсутствия «амплификации ответа» как такового и задействование лишь заложенной в протокол возможности переподключения в случае неудачи. Для тех, кто интересуется другими протоколами с подобными «возможностями», можно указать на протокол QUIC, уже предоставляющий серверу опцию отвечать на запрос клиента увеличенным ответом (хотя черновик протокола и «рекомендует» не посылать ответ более чем в три раза превышающий размер запроса).

Амплификация перестала быть угрозой при коэффициентах около 100х — очевидно, что сегодня вполне достаточно 3-5х. Решение этой проблемы почти невозможно без устранения феномена «спуфленного» трафика как категории — у злоумышленника не должно быть возможности имитировать чей-то сетевой идентификатор и заливать его трафиком от источников легитимного контента. BCP38 (набор лучших и общепринятых практик по настройке сетей и решению проблематичных ситуаций) совсем не работает и создатели новых транспортных протоколов — таких как QUIC — плохо оценивают опасность, исходящую даже из совсем небольших возможностей по амплификации. Они на другой стороне.

Сетям нужен надежный способ сбрасывать или как минимум лимитировать спуфленный трафик — и данный инструмент должен иметь достаточно информации о легитимности источника запроса. Облачные сети, принадлежащие таким компаниям как Amazon, Akamai, Google и Azure, сегодня представляют собой почти идеальную цель для TCP амплификации — у них много мощного железа, способного удовлетворить практически все цели атакующего.

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

Необходимо дальнейшее развитие протокола BGP с целью задействования его в борьбе со спуфингом в стеке протоколов TCP/IP. Таблицы маршрутизации кардинально отличаются от таблиц подсетей, и нам необходимо научить сеть быстро вычленять и отбрасывать нелегитимный пакет — другими словами, обеспечить аутентификацию на уровне сетевой инфраструктуры. Внимание должно обращаться не на «целевой адрес», но на «адрес источника», чтобы сопоставить его с информацией, содержащейся в таблице маршрутизации.


BGP-«оптимизаторы»


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

Инциденты 2019 года, связанные с BGP-оптимизаторами, показали, что та статистика относительно BGP, на которую все полагаются, содержит много проблем. Дело в том, что в полученном от однорангового узла BGP-анонсе можно изменить практически все содержимое до того, как оно будет снова анонсировано — протокол очень гибкий. Это именно то, что использует оптимизатор: большие или меньшие сетевые префиксы, одновременно с неработающими фильтрами и опцией local pref. Если кто-нибудь дезагрегирует префикс на два меньших, он, как правило, выиграет соревнование за право передавать трафик. Оптимизаторы берут корректный маршрут и анонсируют его меньшую часть — достаточно прямолинейно. И это работает, разнося на части большие составляющие Интернета.

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

Множество текстов было написано за 2019 год, в том числе и нашей компанией, о рисках «оптимизации BGP». В случае с Verizon, конечно, создавать новую политику фильтрации на каждого нового потребителя услуги неприятно. И также известно, что у Verizon нет фильтров, так как он принял сотни проблемных маршрутов от собственного клиента AS396531, являющегося «стабом» — автономной системой с единственным подключением. Более того, у телекоммуникационного гиганта также не был настроен лимит подсетей на данное соединение. Не было даже базовой проверки на присутствие других Tier-1 операторов в пути со стороны потребителя (такой тип проверки заводится по умолчанию и не требует поддержки или изменения).


В прессе данный инцидент, включающий Verizon и Cloudflare, обсуждался достаточно бурно. Помимо возможных действий со стороны Verizon, многие отмечали выгоды RPKI и строгую максимальную запись в ROA. Но что же с maxLength? Известно, что при строгой проверке максимальной длины записи все анонсы с указанием на меньшие подсети становятся некорректными при проверке ROA. Также известно, что существует политика сброса некорректных путей. Существует и черновик в рамках IETF, указывающий на то, что maxLength должна быть равна длине сетевого префикса.

Cloudflare следует лучшим практикам. Однако есть небольшая проблема. Verizon не поддерживает политику сброса некорректных маршрутов. Возможно, у него не было вообще никакой проверки по RPKI. В результате все маршруты с меньшими подсетями распространились еще дальше, хотя они и являлись некорректными с точки зрения Route Origin-валидации и стягивали на себя весь трафик. При этом, несмотря на некорректный (Invalid) статус, Cloudflare не могла сама проанонсировать такие же маршруты, так как ее поставщики сбросили бы их как некорректные.

Утечку маршрута можно устранить простой манипуляцией атрибутом AS_PATH в форме: ASx AS396531 ASx (где ASx это номер автономной системы источника) в процессе создания анонса — это поможет избежать утечки благодаря задействованию механизма обнаружения циклов, пока проблема решается другими способами. Хотя каждый раз при подобной манипуляции придется держать такие политики в памяти.

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


Что в итоге? Иногда нас спрашивают, насколько сложно использовать BGP для того, чтобы организовать что-нибудь плохое. Представим, что вы начинающий злодей. Необходимо подключиться к крупному оператору связи, у которого плохо с настройкой фильтров. Потом выберите любую цель и возьмите ее сетевые префиксы, проанонсировав их меньшие части. Также не забудьте сбросить все транзитные пакеты. Поздравляем! Вы только что создали черную дыру в Интернете для всего транзитного трафика данного сервиса через вашего провайдера. Жертва потеряет реальные деньги из-за такого отказа в обслуживании и, вполне возможно, понесет значительные репутационные потери. Не менее часа уходит на нахождение причин подобного инцидента, и от часа требуется на то, чтобы привести все в норму — при условии непреднамеренности такой ситуации и доброй воли к разрешению среди всех участников.

В марте 2019 года был еще один случай, который в свое время мы не связали с BGP-оптимизацией. Однако он также заслуживает внимания.

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

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

Если говорить о других механизмах обеспечения безопасности BGP, то в данном типе перехвата не помогла бы и ASPA — потому что AS_PATH принадлежит корректному пути. BGPSec на текущем этапе неэффективен по причине отсутствия поддержки и остающейся возможности проводить downgrade-атаки.

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


Суммарное количество статических циклов (static loops) в сети.

Что все-таки можно сделать? Очевидный и наиболее радикальный шаг — пересмотреть текущие политики маршрутизации. Это поможет вам разделить адресное пространство на наименьшие возможные части (без пересечений), которые вы хотели бы анонсировать. Подпишите ROA только для этих маршрутов, используя опцию maxLength. Текущая валидация ROV может спасти от такой атаки. Но повторим, некоторые не могут позволить себе использовать только наименьшие подсети.

С помощью Radar.Qrator можно отслеживать подобные события. Для этого нам нужна базовая информация о ваших префиксах. Вы можете установить BGP-сессию с коллектором и представить информацию о своей видимости Интернета. Мы также положительно оцениваем тех, кто готов отправить нам полную таблицу маршрутизации (full-view) — это помогает отслеживать степень распространения инцидентов, но для собственной выгоды и начала использования инструмента достаточно списка маршрутов только для ваших префиксов. Если у вас уже установлена сессия с Radar.Qrator — пожалуйста, проверьте, что вы отправляете маршруты. Для автоматического определения и оповещения об атаках на ваше адресное пространство эта информация необходима.

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

Банки


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

Банки-респонденты выделяют финансовый и репутационный ущерб как наиболее серьезные последствия нарушений информационной безопасности.

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

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

Электронная коммерция


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

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

Как правило, о своей готовности к DDoS-атакам средний и крупный e-commerce-бизнес узнаёт исключительно на практике, проходя «проверку боем». Необходимость предварительной оценки рисков подготовки проекта осознают далеко не все, и еще меньше компаний реально проводят такую оценку. Основными причинами взломов респонденты считают нарушение работоспособности магазина, а также кражу пользовательской базы.

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

DNS-over-HTTPS против DNS-over-TLS


Одной из наиболее горячих тем 2019 года были дебаты относительно того, за какой технологией будущее — DoH или DoT. Изначальное противоречие связано как со значительными различиями в различных легислативах (GDPR Евросоюза против федеральных и законов уровня штатов в США), так и конкуренцией на рынке главных браузеров: Google Chrome и Mozilla Firefox, а также Apple Safari. Мы не готовы утверждать, снизит ли внедрение любой из данных технологий количество амплификаторов в Интернете. Однако, с опцией DoT это представляется более возможным с архитектурной точки зрения из-за создания защищенных соединений между DNS-резолверами. Относительно других прогнозов — подождем решения, которое примет рынок.


Наиболее атакуемые в 2019 году индустрии.

Уязвимости TCP acknowledgment


В июне 2019 года появились первые подробности о наличии серьезных уязвимостей в некоторых реализациях стека протоколов TCP/IP, о которых сообщила компания Netflix. Предположительно, первоначально проблема была обнаружена в операционной системе FreeBSD, после чего наша компания получила подтверждение о наличии этой же и других уязвимостей в Linux.

Наиболее опасна CVE-2019-11477 (SACK Panic), которая может позволить злоумышленнику вызвать kernel panic с помощью последовательности специально сформированных пакетов. Три других уязвимости могут приводить к избыточному потреблению ресурсов, что может повлечь отказ в обслуживании.

Отключение SACK-функционала может привести к увеличению задержек, однако это обезопасит серверы от возможных атак на отказ в обслуживании — временное снижение производительности TCP/IP, по мнению Qrator Labs, является оправданным способом нейтрализации серьезной уязвимости. Патчи, закрывающие данные уязвимости, уже давно доступны и рекомендованы к установке.

Будущее BGP-маршрутизации


На конец 2019 года Radar.Qrator — крупнейшая платформа по сбору и аналитике глобальной маршрутизации BGP с более чем 650 установленных сессий.

Команда Radar.Qrator работает над повышением удобства использования и надежности сервиса, внося улучшения и в модель отношений BGP, являющейся основой платного сервиса мониторинга автономной системы в реальном времени.

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

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

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


Предложенная схема работы механизма ASPA.

Также мы надеемся, что в течение этого года ASPA станет RFC — утвержденным сетевым стандартом. Необходимость наличия более широкого, чем комбинация IRR/RPKI, и более легковесного, чем BGPSec-решения, очевидна всем в индустрии. В 2019 году стало очевидно, как некорректная настройка BGP может вести к утечкам маршрутов с чудовищными последствиями в виде недоступности огромного количества сервисов, вовлекающих крупнейших поставщиков Интернет-услуг. Удивительно, но эти инциденты в очередной раз доказали, что не существует серебряной пули, способной одолеть все возможные сценарии их развития.

Необходимо, чтобы крупнейшие Интернет-провайдеры в мире поддержали изначальное движение. Вовлечение крупных сообществ, способных помочь в нахождении источника утечки маршрута — это следующий шаг. Говоря простым языком, ASPA является новым объектом, соединяющим текущие возможности ROA и RPKI — она реализует простой принцип: «Знай своего поставщика». Владельцу AS нужно знать только свои апстримы для того, чтобы внедрить достаточно надежный способ защиты от инцидентов BGP-маршрутизации.

Как и в случае с ROA, ASPA позволяет фильтровать маршруты при любом соединении: с вышестоящим поставщиком, соседом или, конечно же, потребителем. Соединение ROA и ASPA может решить львиную долю задач по защите сети без необходимости внесения принципиальных изменений в сам протокол, отфильтровывая намеренные атаки и ошибки, связанные с человеческим фактором. Однако, необходимо будет дождаться также и поддержки от производителей ПО и оборудования — хотя есть уверенность, что поддержка в открытом исходном коде не заставит себя ждать.

Одним из главным преимуществ ASPA является то, что это очень простая идея. В 2020 году планируется завершить работу над черновиком протокола, а в случае успеха IETF и соавторы черновика придут к единому мнению относительно закрепления статуса протокола.

Текущее и будущее развитие сети фильтрации Qrator

Логика фильтрации


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

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

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


Распределение DDoS-атак за 2019 год по используемой полосе.

Проблемы с реализациями протокола HTTP/2 (уязвимости на отказ в обслуживании) были в основном решены в течение 2019 года, что позволило нам включить поддержку данного протокола внутри сети фильтрации Qrator.

Сейчас работа активно продолжается с целью обеспечить возможность защиты HTTP/2 каждому клиенту, завершая длительный и глубокий период тестирования. Одновременно с поддержкой HTTP/2, TLS 1.3 была представлена возможность использования eSNI с автоматизированной выдачей сертификатов безопасности Let’s Encrypt.

В настоящий же момент HTTP/2 предоставляется по запросу в качестве дополнительной опции.

Контейнеры и оркестрация


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

Будущее разработки и развития распределенных и отказоустойчивых сетей требует внедрения соответствующего инструментария (CI/CD и автоматическое тестирование — его часть) и умения использовать его для создания и управления стабильной и надежной системой. Так как количество данных только увеличивается, усилия по мониторингу должны расти вслед за ними. Наиболее естественный способ построения мониторинга — это предоставление безопасного и легко различимого способа общения для приложений. Мы считаем, что Kubernetes уже доказал свою универсальность и применимость, а дальнейшая специализация его под нужды работы инфраструктуры, борющейся с DDoS-атаками, это реальность работы с любым решением с открытым исходным кодом.


Изменение средней продолжительности DDoS-атак с 2018 по 2019 год.

Яндекс.Облако и Ingress 2.0


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

Команда Яндекс.Облака прошла с нами длинный путь, объединив две инфраструктуры с помощью физических узлов Qrator Labs, размещенных внутри инфраструктуры партнера, работающих над его трафиком.

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

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

TLS 1.3 и ECDSA-сертификаты


В начале 2019 года Qrator Labs писала о поддержке TLS версии 1.3 с одновременным отключением SSL v.3. По причине наличия услуги нейтрализации DDoS без раскрытия ключей шифрования, были сделаны дополнительные улучшения в данной схеме фильтрации, повышающие скорость и надежность трансляции syslog. Позволим себе напомнить результаты замеров производительности.
Как вы можете видеть, на одном ядре процессора Intel® Xeon® Silver 4114 CPU @ 2.20GHz (выпущенного в третьем квартале 17 года) общая разница между производительностью ECDSA и общепринятым RSA с длиной ключа 2048 бит составляет 3,5 раза.

Давайте посмотрим на результаты выполнения команды openssl -speed для ECDSA и RSA на том же процессоре.


Здесь мы можем найти подтверждение ранее написанному тезису о том, как различаются вычислительно операции подписи и ее проверки для ECC и RSA. На текущий момент, вооружившись TLS 1.3 криптография на основе эллиптических кривых дает значительный прирост производительности сервера при большем уровне защиты, по сравнению с RSA. Это и есть та главная причина, по которой мы в Qrator Labs рекомендуем и всячески поощряем клиентов, готовых использовать в том числе ECDSA-сертификаты. На современных CPU прирост производительности в пользу ECDSA составляет 5х.

Меньшие улучшения


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

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

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


Сравнение двух основных групп классификации DDoS-атак за 2019 год.

IPv6


Qrator Labs активно готовится к тому, чтобы начать использовать протокол IPv6 в рамках услуг фильтрации трафика. Для любой компании, занимающейся кибербезопасностью, такой переход не может быть элементарен. Из-за самой природы DDoS-атак нейтрализация сетевых нападений с использованием IPv6 требует кардинальной смены подхода, так как более невозможно оперировать с любыми формами «списков», имея дело с теоретическим лимитом в 2128 IP-адресов. И речь идет только о TCP, не рассматривая UDP.

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

Антибот


В 2019 году индустрия наблюдала ожесточенную схватку фингерпринтинга (идентификации посетителя) и попыток его ограничения. Желание владельцев и разработчиков интернет-сервисов ограничить или разделить запросы от легитимных пользователей от автоматизированных запросов от ботов вполне понятно. С другой стороны, нет ничего странного и в желании разработчиков браузеров обезопасить пользователей ПО. Qrator Labs годами напоминали рынку о том, что если какая-то информация является публично доступной и не требуется никакой авторизации для ее получения, то вероятность защитить ее от автоматизированного парсинга стремится к нулю. В то же время напоминаем владельцам цифрового бизнеса, что у них есть право выбирать, что делать с приходящими на сервер запросами. Проактивный подход в определенных ситуациях помогает оценить и определить угрозу.

Так как боты генерируют все большую долю трафика, можно ожидать наступления в будущем момента, когда крупные сервисы будут создавать специальные интерфейсы для хороших ботов, отдавая им легитимную информацию. Остальные же будут блокироваться. Даже сейчас, в начале 2020 года, можно утверждать, что не на 100% легитимный пользователь не сможет сразу получить доступ на любой ресурс в Интернете — многие не позволят этого сделать, если, допустим, вы просто поменяете браузерный user-agent на произвольный.

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


Оборудование


Протестировав новые процессоры AMD ответственные сотрудники компании были настолько заинтригованы, что в первом квартале 2020 года Qrator Labs введет в строй новую точку присутствия в Осаке, Япония, полностью построенную на процессорах AMD. PCI Express 4 поколения, доступный с CPU производства AMD, обещает удвоение пропускной полосы между центральным процессором и сетевым интерфейсом. В течение года будет тестироваться и оцениваться применение этой связки в наиболее стрессовых сценариях. Канал между сетевым интерфейсом и процессором постепенно становится узким горлышком с ростом объёма передаваемых в сетях данных. Комбинация дополнительных ядер, большего кэша и новой версии PCI Express обещает принести хороший результат.

Еще одна причина использования AMD CPU заключается в необходимости диверсификации сетевой архитектуры, хотя это и первая для Qrator Labs точка присутствия, построенная целиком на новом процессоре.

Мы очень ждем начала работы нового оборудования, о запуске которого сообщим отдельно в начале 2020 года. Надеемся, что комбинация процессоров AMD и высокопроизводительных сетевых карт с задействованием PCI Express 4 будет отвечать нашим требованиям. Азиатский рынок является одним из самых быстрорастущих, и хотелось бы оценить дальнейшие перспективы нейтрализации DDoS-атак с новым оборудованием именно там.

В то же время, ожидается поступление и нового поколения процессоров Intel — Ice Lake. Дальнейшее их использования в нашей инфраструктуре будет во многом зависеть от результатов их тестирования и сравнения.

Помимо процессоров вся индустрия ожидает выхода сетевых карт Intel 800-й серии. В 2020 году мы постараемся найти им применение внутри инфраструктуры сети фильтрации.

Касаемо свитчей — Qrator Labs продолжает сотрудничество с компанией Mellanox, неоднократно проявившей себя как надежный поставщик и партнер.

Говорить такое нелегко, но в то время, как Broadcom доминирует на рынке сетевого оборудования, надеемся, что объединение с NVidia даст Mellanox шанс на достойную конкуренцию.

Будущие улучшения в работе сети фильтрации


В течение 2020 года наша компания рассчитывает значительно углубить партнерство с поставщиками самых разнообразных сервисов и услуг, таких как Web Application Firewall и Content Delivery Network внутри сети фильтрации. Мы всегда старались интегрировать разнообразных поставщиков внутрь инфраструктуры для предоставления наилучших комбинаций возможных сервисов для потребителей. К концу 2020 планируется объявить о доступности целого ряда новых поставщиков услуг в связке с Qrator.

2019 год также выявил ряд вопросов относительно защиты технологии WebSockets. Ее распространенность и популярность только растет, а сложность по корректной защите не снижается. В течение 2020 года мы рассчитываем провести работы с некоторыми из наших клиентов, использующих технологию WebSockets, для нахождения оптимального пути ее защиты даже при условии пересылки произвольных (неизвестных) данных.

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

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

Let's block ads! (Why?)