Кейси разбирает сбой AWS | The Standup

TThe PrimeTime
Computing/SoftwareManagementInternet Technology

Transcript

00:00:00Этот выпуск подкаста будет особенным,
00:00:02потому что вступление сделает Кейси.
00:00:05Кейси, о чём мы сегодня будем говорить?
00:00:09Всем привет и добро пожаловать на подкаст.
00:00:14Номер 45,
00:00:156-й лучший технический подкаст на Spotify согласно последним...
00:00:21чему-то там.
00:00:23Правда..
00:00:29В общем, извините.
00:00:30Сегодня в выпуске я хотел затронуть одну тему.
00:00:33Я собираюсь рассказать о сбое AWS,
00:00:35который произошёл в октябре,
00:00:37но делаю это потому,
00:00:39что хочу поговорить о более важной вещи — о разнице между тем,
00:00:43чтобы действительно что-то понимать,
00:00:45и тем,
00:00:46чтобы говорить,
00:00:47что ты это понимаешь..
00:00:49Знаете,
00:00:49это часто происходит,
00:00:51особенно с теми,
00:00:52кто только начинает карьеру в программировании — если ты джуниор-разработчик или что-то в этом роде,
00:00:59ты только пришёл.
00:01:00И я точно знаю,
00:01:01что со мной так было: ты хочешь выглядеть так,
00:01:04будто всё знаешь,
00:01:05верно?
00:01:06Не хочешь казаться человеком,
00:01:08который не понимает,
00:01:09что происходит.
00:01:10Так что возникает сильное внешнее давление — реальное или нет,
00:01:14но ты чувствуешь,
00:01:16что должен как бы сказать,
00:01:17что понял что-то,
00:01:19или притвориться,
00:01:20что понимаешь,
00:01:21даже если всё немного туманно или ты не совсем разобрался..
00:01:26И даже если это не твоя вина — даже если тебе что-то плохо объяснили или не включили важную информацию — ты всё равно мотивирован вести себя так,
00:01:37будто знал,
00:01:38о чём речь,
00:01:39правильно?
00:01:40Потому что это заставляет тебя казаться умнее или,
00:01:43по крайней мере,
00:01:44не выглядеть джуниором,
00:01:46да?
00:01:47И вот одна из вещей,
00:01:48которую я для себя открыл с возрастом и с опытом программирования: теперь я чуть ли не переспрашиваю,
00:01:56когда мне что-то объясняют.
00:01:58Я прямо такой: мне вообще всё равно,
00:02:00что буду выглядеть глупо..
00:02:03Я говорю: подожди, вернись назад.
00:02:05Я не понял эту часть.
00:02:06Что ты имеешь в виду?
00:02:07Или что означает этот термин?
00:02:09Потому что теперь мне просто на это наплевать..
00:02:12Я больше не беспокоюсь об этом.
00:02:14И я хочу действительно знать,
00:02:15потому что у меня столько опыта программирования,
00:02:17когда я думал,
00:02:18что что-то знаю,
00:02:19или притворялся,
00:02:20что знаю,
00:02:20а потом это мне аукалось..
00:02:22Я хочу действительно знать.
00:02:23Хочу быть уверенным,
00:02:25что когда у меня есть объяснение бага или я думаю,
00:02:28что знаю причину падения производительности,
00:02:30у меня в голове всегда сидит мысль: если я не докопался до самой сути,
00:02:35это может быть что-то другое.
00:02:37Может быть, настоящая причина всё ещё где-то скрыта.
00:02:40А я просто не знаю, потому что не изучил всё до конца.
00:02:43Я просто двигаюсь дальше,
00:02:45потому что так удобнее или что-то в этом роде..
00:02:48Причина,
00:02:49по которой я хотел поговорить о сбое DynamoDB,
00:02:51заключается в том,
00:02:52что в последнее время произошла целая серия громких отключений.
00:02:56Например,
00:02:57был крупный сбой,
00:02:58который обрушил Google,
00:02:59и оказалось,
00:03:00что это была ситуация,
00:03:01когда они не обработали пустое поле,
00:03:03понимаете?
00:03:04То есть в их коде,
00:03:05в том,
00:03:05как они программировали,
00:03:07они типа: «Окей,
00:03:08у нас есть эта штука.
00:03:09Мы загружаем какой-то JSON,
00:03:10и если в JSON ничего нет,
00:03:12мы просто разыменовываем нулевой указатель или что-то в этом роде»,
00:03:16да?
00:03:16Буквально вот так.
00:03:17А потом был случай с CrowdStrike,
00:03:19когда они обрушили весь мир синими экранами смерти.
00:03:22И они дали очень хорошее,
00:03:24действительно качественное объяснение.
00:03:26Они сказали: «Мы используем определённый способ определения размера массива,
00:03:30и у нас оказалось слишком много правил.
00:03:33Поэтому массив переполнился», понимаете?
00:03:35И вот эти случаи были довольно понятными,
00:03:37когда они публиковали то,
00:03:39что называют RCA,
00:03:40или анализом первопричин,
00:03:41верно?
00:03:42Когда они говорили: «Вот почему у нас произошёл сбой».
00:03:45Когда я их читал,
00:03:46у меня не оставалось множества вопросов без ответа.
00:03:49Может,
00:03:50я не знал буквально строку кода,
00:03:52потому что они,
00:03:52возможно,
00:03:53не опубликовали конкретный фрагмент кода,
00:03:55но они дали мне достаточно информации,
00:03:58чтобы я понял: окей,
00:03:59я понимаю,
00:03:59как кто-то написал этот код,
00:04:01и я понимаю глупость,
00:04:02которую они совершили,
00:04:03да?
00:04:04Типа: окей, не делайте так.
00:04:06Понятно.
00:04:06И я полностью в порядке с этим..
00:04:10А со случаем DynamoDB,
00:04:12потому что это всплыло в нашем подкасте,
00:04:15да?
00:04:15Мы говорили об этом,
00:04:17когда тот парень в Guitar Center,
00:04:20помнишь?
00:04:21Сказал: «Я подслушал разговор в пабе», да??
00:04:24Да.
00:04:25Невероятно.
00:04:25Вот мы наблюдаем неуловимого программиста — простое существо,
00:04:29которое проводит большую часть времени в одиночестве,
00:04:32часто в темноте.
00:04:33Но что это?
00:04:33Кто-то неправ в интернете!
00:04:35Наш кодер мгновенно приходит в действие,
00:04:37достигая максимальной скорости в 120 слов в минуту,
00:04:40прежде чем — вспышка!
00:04:41— светлая тема сайта..
00:04:42Естественный враг этих любителей кода оглушает нашего друга.
00:04:45Погоня прервана.
00:04:46Придётся поймать их в следующий раз.
00:04:48Когда они не за компьютерами,
00:04:49они могут часами рисовать грубые символы — то,
00:04:52что они называют досками для маркеров.
00:04:54Исследователи обнаружили тысячи диалектов,
00:04:56причём часто в одном офисе используется более дюжины.
00:04:59Однако ни один лингвист пока не расшифровал,
00:05:01в чём их предназначение..
00:05:03Тщеславные создания — их тела эволюционировали на протяжении тысячелетий,
00:05:08чтобы уметь сидеть в необычных позах,
00:05:10глядя на себя онлайн.
00:05:12Это часто продолжается часами под предлогом,
00:05:15что они ждут код-ревью,
00:05:16но если спросить,
00:05:17почему они так неактивны...
00:05:19И наконец,
00:05:20после долгого дня,
00:05:21в который сделано очень мало,
00:05:23наши клавиатурные воины готовятся ко сну.
00:05:26Быстрое чтение — и свет гаснет..
00:05:29Спокойной ночи, маленький кодер.
00:05:30Так как же я так хорошо сплю по ночам?
00:05:32Ну, мне помогает Sentry давить этих багов.
00:05:36И я говорю не о каких-то крошечных жучках из Южной Дакоты,
00:05:40которые дохнут зимой.
00:05:41Я говорю о больших, злобных джунглевых багах.
00:05:45И я их, кстати, не боюсь, просто...
00:05:47но я могу раздавить эти баги с помощью Seer от Sentry.
00:05:51Так что у меня появилась дополнительная мотивация пойти и посмотреть,
00:05:56сколько информации они опубликовали.
00:05:59И я читал — я уже читал после этого их краткое изложение,
00:06:03где они опубликовали RCA,
00:06:04и он был очень расплывчатым.
00:06:06Типа, RCA по сути ничего толком не объяснял.
00:06:10Потом я заметил,
00:06:11что они выложили полную презентацию — на re:Invent в декабре,
00:06:15они...
00:06:16или я не знаю,
00:06:17был ли re:Invent в декабре,
00:06:19но видео вышло в декабре,
00:06:21презентация с re:Invent,
00:06:22где они разбирали этот сбой..
00:06:26Так что я посмотрел всё это целиком.
00:06:28И после того,
00:06:29как прочитал весь RCA и посмотрел всю презентацию,
00:06:33я всё равно остался в недоумении.
00:06:35Я не вижу здесь реального объяснения бага, понимаете?
00:06:39Типа,
00:06:40я пытаюсь понять,
00:06:41в чём был настоящий баг,
00:06:42но это так и не было объяснено..
00:06:45И вот что я хотел сделать — просто поговорить об этом,
00:06:48разобрать,
00:06:48почему,
00:06:49на мой взгляд,
00:06:49они не объяснили,
00:06:50в чём была ошибка,
00:06:51и использовать это как пример того,
00:06:53что люди не должны просто говорить: «О,
00:06:55окей,
00:06:55я понял,
00:06:56в чём была ошибка».
00:06:57Потому что люди отвечали мне и говорили: «О,
00:06:59вот,
00:06:59позволь мне объяснить тебе,
00:07:01в чём была ошибка».
00:07:02А потом они просто объясняли то же самое.
00:07:04Я такой: это не та ошибка, понимаете?
00:07:05Так что все делают вид,
00:07:06что понимают,
00:07:07потому что прочитали что-то вроде: нет,
00:07:09если ты не можешь сказать мне,
00:07:10в чём была настоящая ошибка,
00:07:12тогда мы ещё не закончили,
00:07:13верно??
00:07:14Нам нужно более полное объяснение.
00:07:16Так что всё, что я говорю, звучит разумно?
00:07:18Да.
00:07:19Прежде всего,
00:07:20я просто хочу сказать,
00:07:21что я точно понял,
00:07:22что ты имел в виду,
00:07:23Кейси..
00:07:23Прямо с самого начала, да.
00:07:25Буквально сразу.
00:07:27Ты такой: окей, я знаю, я точно понял, что ты говоришь.
00:07:31Никаких вопросов с моей стороны.
00:07:34Никаких препятствий.
00:07:36Спасибо всем.
00:07:37У меня всё отлично..
00:07:39Увидимся завтра, ребята.
00:07:40Знаете, никаких проблем.
00:07:42Я просто хочу сказать,
00:07:43что мне очень нравится слушать,
00:07:45как Кейси говорит в подкасте,
00:07:46когда я слушаю на Spotify,
00:07:48но и прямо сейчас тоже — я мог бы слушать,
00:07:51как ты говоришь,
00:07:52целый час.
00:07:52Отличная реклама Spotify, кстати.
00:07:54Я как раз собирался сказать,
00:07:56я собирался сказать,
00:07:57что особенно когда слушаешь на Spotify,
00:07:59качество невероятное.
00:08:01Ты ещё получаешь бонусные дополнения, верно?
00:08:03Всю болтовню до и после самого эпизода.
00:08:06Мы начали выкладывать более длинные версии на Spotify,
00:08:09где больше этих дополнительных моментов.
00:08:11Да.
00:08:12Меньше времени уделяется строго теме,
00:08:14но чуть больше треп на Spotify,
00:08:16потому что живая аудитория получает весь трёп..
00:08:19Они приходят сюда.
00:08:20Они слышат про Трэша и его зависимость от покемонов,
00:08:23о которой ты,
00:08:23вероятно,
00:08:24даже не знаешь,
00:08:25потому что слушал это на YouTube,
00:08:26верно?
00:08:27Ты не получаешь возможности услышать все эти весёлые штуки.
00:08:30Это довольно сложная продажа для первых 10 минут видео на YouTube.
00:08:33Очень сложная продажа для YouTube-видео.
00:08:35Типа: я собираюсь смотреть,
00:08:36как четыре парня обсуждают что-то,
00:08:38чего я даже не понимаю.
00:08:39И это называется DynamoDB.
00:08:40Ага..
00:08:41Раз мы начинаем подкаст, может, нам стоит представить Адама.
00:08:43О да.
00:08:44Это очень хорошая мысль..
00:08:45Мы вообще этого не сделали.
00:08:46Привет.
00:08:47Расскажи нам немного о том, почему ты сегодня в подкасте..
00:08:50Потому что я в доме у Ти-Джея — это причина номер один,
00:08:55почему Ти-Джей требует,
00:08:57чтобы все люди,
00:08:58которые посещают его дом,
00:09:00участвовали в подкасте.
00:09:02Пару раз было неловко.
00:09:04Да.
00:09:04Ага.
00:09:05Кто ты на самом деле??
00:09:07Кроме того, что AWS Hero.
00:09:09Я даже не это.
00:09:10Я не был AWS Hero.
00:09:12Ладно..
00:09:13Выгнали из группы супергероев.
00:09:15Как это вообще работает?
00:09:16Просто тебя не продлевают..
00:09:18Я был героем на один срок,
00:09:20и они решили: «О,
00:09:21ты…» это что,
00:09:21платная штука?
00:09:22Платишь, чтобы быть героем??
00:09:24Нет, нет, просто мне стало всё равно.
00:09:26Вообще не говорил об этом.
00:09:28Так что они подумали: может, он больше не герой.
00:09:31Теперь он злодей.
00:09:32Кейси выглядит так,
00:09:33будто он часть какого-то детектива с убийством.
00:09:36Он там стоит.
00:09:36О, чувак.
00:09:37Сейчас у нас будет, эээ, как там, Ник Хилл.
00:09:39Тот человек, который всё рисует на доске.
00:09:42А потом это всплывает.
00:09:43Кейси Мураторио.
00:09:44Вот кого ты имеешь в виду.
00:09:46Мураторио.
00:09:46Это Мураторио или Мураторио?
00:09:48О боже.
00:09:49Ты собираешься показывать визуалы, да?
00:09:51Так что я знаю, это лучший подкаст..
00:09:54Буквально, это лучший, в котором можно участвовать.
00:09:57Эээ, произносится Мураториё в моей семье.
00:10:00Почти как будто там была Y,
00:10:02вроде Мураториё,
00:10:03но это правильно.
00:10:04На самом деле это не очень-то имеет смысл,
00:10:06потому что это итальянская,
00:10:08это итальянская фамилия.
00:10:09А в итальянском это было бы Мураторио или Мураторио..
00:10:13Не складывается.
00:10:14Так что почему получилось Мураториё — понятия не имею.
00:10:19Это какая-то итало-американская иммигрантская история,
00:10:23видимо.
00:10:23Не знаю.
00:10:24Окей.
00:10:25Так вот, по сути, вот что они сказали..
00:10:28У них есть так называемые конечные точки API,
00:10:31но они называют их правильно.
00:10:33И это доменные адреса.
00:10:35Например,
00:10:36если вы посмотрите в DNS,
00:10:37это имя,
00:10:38которое вы будете искать,
00:10:40чтобы знать,
00:10:41куда отправлять свои запросы к DynamoDB.
00:10:44И эти вещи, я полагаю, выглядят примерно так..
00:10:47И Адам,
00:10:48вероятно,
00:10:49может подтвердить это,
00:10:50потому что он является или был героем.
00:10:53Они выглядят как...
00:10:55О, он отстаёт.
00:10:55Да.
00:10:56Мы на несколько секунд отстаём.
00:10:58Потому что наше видео исчезло на River.
00:11:00О, вот оно.
00:11:01Так вот,
00:11:01они выглядят как dynamodb.use-east-1.api.aws или что-то в этом роде.
00:11:05И я полагаю,
00:11:06это зависит от того,
00:11:07используете ли вы IPv6 или IPv4.
00:11:09У них разные имена в зависимости от обстоятельств или от того,
00:11:13используете ли вы что-то специфическое,
00:11:15типа они говорили,
00:11:17что правительственные организации используют другой адрес или что-то такое.
00:11:21Так что эти имена — это,
00:11:23по сути,
00:11:23имена,
00:11:24которые вы жёстко прописываете в своём приложении,
00:11:27где указываете: когда мне нужно что-то сделать с DynamoDB,
00:11:30я собираюсь запросить это.
00:11:32Это понятно.
00:11:32И правильно ли это звучит, Адам.
00:11:34Потому что я не использую AWS.
00:11:36Да.
00:11:37Да.
00:11:37Да?
00:11:38Всё верно.?
00:11:38Так что,
00:11:39знаете,
00:11:39вы запрашиваете что-то вроде этого,
00:11:41и вы отправляете это идеально.
00:11:42Я имею в виду, я понимаю, что он говорит.
00:11:45Да.
00:11:45Так что это потом перенаправит вас куда-то,
00:11:48потому что,
00:11:48очевидно,
00:11:49нет какой-то одной машины,
00:11:51которая будет обрабатывать весь трафик DynamoDB во всей вселенной.
00:11:55Даже если вы разделите его по регионам,
00:11:57что видно здесь,
00:11:58вы вроде как должны выбрать регион.
00:12:00Я полагаю, вы не отправляете его на какой-то главный адрес.
00:12:04Вы отправляете его на региональный адрес,
00:12:06или,
00:12:07может быть,
00:12:08есть главный адрес,
00:12:09который вы можете использовать,
00:12:11и он всё разберёт.
00:12:12Не знаю..
00:12:13Но в любом случае,
00:12:14в какой-то момент вы обращаетесь к этому,
00:12:17и это должно указывать,
00:12:18по сути,
00:12:19на схему балансировки нагрузки.
00:12:21Так что эта штука должна указывать,
00:12:23по сути,
00:12:24на то,
00:12:24что они назвали DNS-деревом..
00:12:27Хотя они никогда толком не объяснили древовидную природу этого.
00:12:30Это звучало скорее как взвешенный массив,
00:12:32если хотите,
00:12:33где вы просто говорите: вот куча машин,
00:12:35и вы будете выбирать эти машины на основе весов,
00:12:38которые мы устанавливаем,
00:12:39чтобы мы могли балансировать нагрузку,
00:12:41понимаете?
00:12:41Так что если машина отстаёт,
00:12:43возможно,
00:12:43мы устанавливаем её вес пониже.
00:12:45А если машина кажется довольно свободной,
00:12:47мы устанавливаем её вес повыше.
00:12:49И вот они назвали это деревом.
00:12:50Так что я предполагаю, что это дерево.
00:12:52Они никогда не объяснили,
00:12:54в чём заключается древовидная часть,
00:12:56но это имя должно указывать.
00:12:57Могу я прервать на одну секунду??
00:13:00Кстати,
00:13:00кто-то действительно получил повышение до L6 благодаря этому дереву.
00:13:04Так что я думаю,
00:13:04в следующий раз вам стоит выяснить,
00:13:06что это за дерево.
00:13:07Потому что это много значило для кого-то.
00:13:09Хорошо.
00:13:10Произошёл какой-то пакет и инженеры случились.
00:13:12Я согласен.
00:13:12Дерево, вероятно, важно.
00:13:14Просто оно не важно для бага.
00:13:15И даже при этом,
00:13:16так что я скажу,
00:13:17что им не было необходимости объяснять дерево..
00:13:19Так что я не против того,
00:13:21что они пропустили объяснение того,
00:13:23что делает дерево.
00:13:24Но у меня тоже быстрый вопрос..
00:13:25Да.
00:13:26Оно называется деревом потому,
00:13:27что это анализ первопричины,
00:13:28или нет??
00:13:29Больше никаких шуток.
00:13:31Мы слишком отклонились от темы.
00:13:33Извините.
00:13:34Извините.
00:13:34Так вот, это должно указывать на то..
00:13:37И эта,
00:13:38эта своего рода схема балансировки нагрузки,
00:13:40основанная на DNS-записях,
00:13:41и то,
00:13:42как они описали это в своей презентации,
00:13:44заключается в том,
00:13:45что они использовали бы что-то вроде,
00:13:47скажем,
00:13:48plan one 45 dot dynamo DB,
00:13:49типа DDB dot AWS,
00:13:50верно?
00:13:50Это корень того дерева,
00:13:52я полагаю,
00:13:52не корневая причина,
00:13:53а именно это дерево,
00:13:54оно содержало бы,
00:13:55это запись верхнего уровня из множества записей,
00:13:58которые позволяют ему выполнять балансировку нагрузки.
00:14:01И я предполагаю,
00:14:02что Route 53 в некотором роде обладает этой возможностью балансировки нагрузки.
00:14:06Я читаю между строк презентации.
00:14:08Они не сказали этого прямо,
00:14:09но я предполагаю,
00:14:10что Route 53,
00:14:11через который всё это делается,
00:14:13знаете,
00:14:13который является их собственной DNS-системой,
00:14:15позволяет этой балансировке нагрузки происходить — вы просто настраиваете здесь всё,
00:14:20что говорит,
00:14:21как балансировка нагрузки должна работать прямо сейчас.
00:14:24А затем он выберет правильную машину на основе какой-то рандомизации по весам или чего-то такого.
00:14:29Так вот,
00:14:30они сказали,
00:14:30что это имя,
00:14:31которое действительно существует.
00:14:33И, по-видимому, есть дерево или что-то в этом роде.
00:14:36Это имя — то,
00:14:36которое они просто использовали для презентации.
00:14:39Они никогда не использовали на самом деле человекочитаемое имя для этого плана,
00:14:43типа one 45,
00:14:44которое я здесь написал или что-то такое.
00:14:46На самом деле это был хеш чего-то.
00:14:48Так что это было бы на самом деле что-то вроде,
00:14:51знаете,
00:14:51zero a F E one,
00:14:52two,
00:14:52знаете,
00:14:53nine a или что-то в этом роде,
00:14:54верно.
00:14:55Именно это там и было бы.
00:14:56Так что если бы вы пошли и посмотрели,
00:14:58вы бы не увидели человекочитаемого имени,
00:15:01или,
00:15:01по крайней мере,
00:15:02в то время вы бы не увидели,
00:15:04я полагаю,
00:15:04вы бы не увидели типа plan one 45.
00:15:06Вы бы просто увидели это.
00:15:07И поэтому идея была такой: окей,
00:15:09пользователь приходит использовать это.
00:15:11Они запрашивают это имя, Route 53 направит их типа сюда.
00:15:14И эта штука — какое-то дерево балансировки нагрузки,
00:15:17которое Route 53 может использовать,
00:15:19что позволит вам попасть туда,
00:15:21куда нужно.
00:15:21Верно.
00:15:22В конечном итоге они дадут вам реальную машину,
00:15:24на которую можно отправлять трафик.
00:15:26Опять же, они ничего из этого не описывали.
00:15:28Так что я понятия не имею, как это всё работает.
00:15:31Я никогда не трогал и не использовал Route 53.
00:15:34Так что понятия не имею,
00:15:35но просто предположим,
00:15:36что это происходит,
00:15:37потому что для этого бага это не важно..
00:15:41У нас есть AWS-герой.
00:15:42Так что если вы,
00:15:43если вы в замешательстве,
00:15:44вы всегда можете спросить Адама,
00:15:46и у него могут быть дополнительные соображения.
00:15:48Я имею в виду, да, давай..
00:15:50Ну,
00:15:51у Route 53 есть множество разных способов распределения трафика.
00:15:54Так что да, взвешенный — один из них.
00:15:55И похоже на то, что они описали..
00:15:57Так что каким-то образом они настроили эти записи с этим.
00:15:59И они просто не сказали как,
00:16:01но что-то,
00:16:01что-то в древовидном формате это делало.
00:16:03Я предполагаю,
00:16:03что там что-то вроде взвешенного,
00:16:05типа у дерева есть взвешенные,
00:16:06там есть пара весов наверху,
00:16:07которые разветвляются на большее количество весов или что-то в этом роде,
00:16:10потому что с ними так легче работать,
00:16:12потому что их много или что-то такое..
00:16:14Кто знает?
00:16:14В любом случае, понятия не имею.
00:16:16Дело в том,
00:16:16что это то,
00:16:17что должно происходить в нормальном режиме..
00:16:20Так вот,
00:16:20причина,
00:16:21по которой это называется plan 145 здесь,
00:16:23хотя на самом деле это был бы какой-то хеш-код,
00:16:26но они ссылаются на него как на plan 145,
00:16:28в том,
00:16:28что балансировка нагрузки,
00:16:30как вы можете себе представить,
00:16:32должна быть своего рода непрерывной,
00:16:34потому что машины DynamoDB постоянно что-то делают.
00:16:37Они становятся всё более перегруженными.
00:16:39Машины выходят из строя или падают,
00:16:41или кто знает что,
00:16:42верно??
00:16:43Может происходить отключение.
00:16:45Можно добавить новую мощность.
00:16:47И всё это нужно постоянно обновлять, буквально всё время.
00:16:50Так что эта главная конечная точка API,
00:16:53к которой вы подключаетесь,
00:16:55постоянно требует корректировки того дерева,
00:16:58на которое она указывает.
00:17:00И делают они это так: они создают другое дерево,
00:17:03дерево,
00:17:03на которое они собираются перейти,
00:17:06понимаете?
00:17:06Они создают что-то вроде,
00:17:08ну знаете,
00:17:09план 146 или что-то в этом роде.
00:17:11И они строят всё дерево здесь.
00:17:13А потом,
00:17:13когда всё готово,
00:17:15типа когда это дерево завершено,
00:17:17они берут вот эту,
00:17:18ну знаете,
00:17:19вот эту запись здесь,
00:17:20и вместо того,
00:17:21чтобы она указывала на ту,
00:17:23они указывают её на эту,
00:17:24верно?
00:17:25То есть вы создаёте новую,
00:17:27и они переходят на неё,
00:17:28просто изменив это имя.
00:17:30Так вот,
00:17:30по какой-то причине,
00:17:32и эта причина особо не объясняется..
00:17:36То,
00:17:36как они настроили этот процесс,
00:17:38они разделили его на две части.
00:17:40Есть что-то,
00:17:41что называется планировщик,
00:17:42который в основном определяет,
00:17:44как должно выглядеть новое дерево.
00:17:46Так что можете представить,
00:17:48есть какая-то машина под названием планировщик.
00:17:51И я не знаю,
00:17:51это реальная машина или это просто процесс,
00:17:54запущенный на какой-то машине,
00:17:56которая выполняет и другие задачи,
00:17:58кто знает.
00:17:58Но есть что-то, что называется планировщик.
00:18:01И насколько я мог понять,
00:18:02он один,
00:18:03то есть существует просто планировщик,
00:18:05который сидит себе и определяет,
00:18:07как должен выглядеть новый план,
00:18:09на который мы собираемся переключиться..
00:18:13И он делает это постоянно.
00:18:15Так что он генерирует план 145,
00:18:17потом он генерирует план 146,
00:18:19потом генерирует 147,
00:18:21148,
00:18:219,
00:18:2210,
00:18:22ну знаете,
00:18:23бла,
00:18:24бла,
00:18:24бла,
00:18:25бла,
00:18:25бла,
00:18:26да?
00:18:26И он просто продолжает выдавать планы до бесконечности,
00:18:30потому что это его работа.
00:18:32Но вот что интересно, он их никогда фактически не создаёт.
00:18:37Его задача не в том,
00:18:38чтобы когда-либо создавать их в Route 53.
00:18:41Его задача просто определить,
00:18:43какими бы они были,
00:18:45если бы кто-то внёс их в Route 53.
00:18:47А дальше у них есть три исполнителя..
00:18:50Эти исполнители получают план от планировщика и вносят его в Route 53.
00:19:06Понятно?
00:19:07Итак,
00:19:07один планировщик,
00:19:08насколько я понимаю произношение,
00:19:10три исполнителя.
00:19:11Не было никакого объяснения, почему это устроено именно так.
00:19:15Они сказали,
00:19:16что причина,
00:19:17по которой существует три исполнителя,
00:19:19в том,
00:19:19что это должно быть отказоустойчиво,
00:19:22типа если один из них выйдет из строя или что-то в этом роде.
00:19:25Но они так и не объяснили,
00:19:27почему тогда не нужны три планировщика,
00:19:29потому что если планировщик упадёт,
00:19:32то исполнителям нечего будет исполнять.
00:19:34Так что это не особо имело смысл.
00:19:36Так что в материале не было объяснения,
00:19:38почему эта структура выглядит именно так.
00:19:41Это не особо важно для бага,
00:19:43что она выглядит именно так,
00:19:44хотя в каком-то смысле важно,
00:19:46как мы увидим позже.
00:19:47Так что меня немного смутило,
00:19:49что они это не обосновали,
00:19:51но ладно.
00:19:51Так что надеюсь, это понятно.
00:19:53У нас есть планировщик.
00:19:54У нас есть три исполнителя.
00:19:56Исполнители все пытаются исполнить этот план.
00:19:59Так вот,
00:19:59что здесь происходит,
00:20:01опять же,
00:20:01по причинам,
00:20:02о которых в презентации сказали только одно: это упрощает понимание.
00:20:06Это единственная информация об этом.
00:20:08Они сказали, что это упрощает понимание.
00:20:11Поскольку это упрощает понимание,
00:20:13эти исполнители используют сериализацию.
00:20:15То есть вместо того,
00:20:17чтобы они просто пытались создать записи,
00:20:19и если записи уже там есть,
00:20:21просто не создавать их или что-то в этом роде,
00:20:24другими словами,
00:20:25у меня три человека работают..
00:20:29Мы все хотим создать,
00:20:31ну знаете,
00:20:31допустим вот эту запись верхнего уровня,
00:20:34plan146.ddb.aws,
00:20:36да?
00:20:36Мы все пытаемся это сделать.
00:20:38Один из нас делает это первым.
00:20:40Следующий человек пытается это сделать,
00:20:42а оно уже там или что-то в этом роде,
00:20:44верно?
00:20:45Мы все пытаемся создать одну и ту же запись.
00:20:47Так что в теории мы могли бы просто посадить трёх человек,
00:20:51которые бы случайным образом долбили по той части плана,
00:20:54по которой они пытаются долбить,
00:20:56и в теории всё должно как бы работать,
00:20:58верно?
00:20:58И у меня сложилось впечатление,
00:21:00хотя он прямо этого не сказал,
00:21:02у меня сложилось впечатление от докладчика,
00:21:05что он бы согласился с тем,
00:21:06что я только что сказал,
00:21:08то есть они могли бы просто запустить их произвольно,
00:21:11и это сработало бы или должно было бы быть нормально.
00:21:14Но он сказал,
00:21:15что они используют сериализацию,
00:21:16чтобы об этом было проще рассуждать.
00:21:19Это означает,
00:21:19что вместо того,
00:21:20чтобы эти исполнители просто так по нему молотили,
00:21:23они вместо этого пытаются получить блокировку для той конечной точки,
00:21:27которую они пытаются обновить.
00:21:29Другими словами,
00:21:30если этот человек пытается обновить одну из этих штук,
00:21:33и у меня сложилось впечатление,
00:21:35что блокировка происходит,
00:21:37если ты пытаешься обновить вот это,
00:21:39но это могло быть,
00:21:40если ты пытаешься обновить вот это,
00:21:42или это могло быть на обоих.
00:21:44Они на самом деле никогда не говорили на все 100%,
00:21:47если я правильно помню,
00:21:48где именно происходила блокировка.
00:21:50Но блокировка происходит так: они говорят: окей,
00:21:53я создам блокировку,
00:21:54которая является DNS-записью.
00:21:56И используя тот факт,
00:21:57что Route 53 имеет концепцию атомарности,
00:21:59то есть,
00:22:00знаете,
00:22:00я могу сделать две вещи,
00:22:02и если обе не выполнятся успешно,
00:22:04то ни одна из них не выполнится..
00:22:08По сути они сделали систему блокировок,
00:22:11которая блокирует через Route 53.
00:22:13То есть DNS-записи Route 53 фактически являются записью блокировки,
00:22:17если это имеет смысл.
00:22:19Можно быстрый вопрос?
00:22:20Да.
00:22:20Ты сказал, что это делается через сериализацию?
00:22:23Я не совсем понимаю, что это значит.
00:22:26Потому что я думал,
00:22:27сериализация — это просто преобразование из одной памяти в другое представление в памяти чего-то.
00:22:33Извини, другая сериализация.
00:22:35Да, это тоже сериализация.
00:22:36В данном случае мы имеем в виду буквально временную сериализацию,
00:22:40то есть они хотели,
00:22:42чтобы у этих исполнителей был какой-то способ организовать своё поведение в определённом порядке,
00:22:48а не просто произвольно.
00:22:49И способом, которым они это сделали, была блокировка.
00:22:53Так что произойдёт вот что: вместо того,
00:22:55чтобы этот человек просто делал то,
00:22:57что он собирается делать,
00:22:59типа,
00:22:59окей,
00:23:00я закончил это,
00:23:01я сейчас укажу этого парня на план 146.
00:23:03Вместо этого он пытается получить блокировку на,
00:23:06типа,
00:23:07это,
00:23:07верно?
00:23:08И если он не получает блокировку, он не делает изменение.
00:23:11Так что только один из этих исполнителей может находиться в процессе обновления этого в любой момент времени.
00:23:18Это имеет смысл?
00:23:19Угу.
00:23:20Опять же,
00:23:20что именно они пытались этим достичь,
00:23:23никогда не объяснялось.
00:23:24Они просто сказали,
00:23:25что так проще рассуждать,
00:23:27и на этом оставили.
00:23:28Так что я не знаю, почему они считали это улучшением.
00:23:31И забавно, что именно это в итоге обнаруживает баг.
00:23:35Так что это не было улучшением.
00:23:37Если что, это, вероятно, было плохо.
00:23:39Но Кейси,
00:23:39ты говоришь,
00:23:40у них нет,
00:23:41типа,
00:23:41у них нет веской причины,
00:23:43они говорят,
00:23:44мы заставим исполнителей работать почти как по одному?
00:23:47Зачем у них вообще три исполнителя?
00:23:49Я не понимаю.
00:23:50Типа, почему у них не один?
00:23:52Они просто этого не говорят.
00:23:54Мы не знаем почему.
00:23:55И они не совсем объяснили,
00:23:56типа,
00:23:57я не очень услышал объяснения того,
00:23:59как у тебя три конкурентных исполнителя.
00:24:02Ты ожидаешь,
00:24:02что они могут упасть,
00:24:04вот почему у тебя их три..
00:24:07Верно.
00:24:08Но они берут блокировку.
00:24:09Так что происходит,
00:24:10если этот парень берёт блокировку,
00:24:12а потом падает??
00:24:13Типа, я тоже не услышал объяснения этому.
00:24:16Так что всё это меня очень запутало.
00:24:18Ну типа,
00:24:19я,
00:24:19я,
00:24:20я не жалуюсь на это в контексте того,
00:24:22о чём мы тут говорим,
00:24:23потому что для сути дела это неважно.
00:24:26Но как презентация — у меня возникло столько вопросов.
00:24:29Я такой: я вообще не понимаю,
00:24:31зачем вы всё это делали,
00:24:32если честно.
00:24:33Да.
00:24:33И возможно,
00:24:34это,
00:24:35опять же,
00:24:35отчасти может быть потому,
00:24:37что я не пользуюсь сервисами AWS.
00:24:39Может,
00:24:39некоторые из этих вещей были бы очевидны,
00:24:42если бы вы регулярно использовали Route 53 или что-то такое,
00:24:45вы бы сказали: а,
00:24:46это потому что блокировки можно установить с таймаутом,
00:24:50или там,
00:24:50не знаю.
00:24:51Да.
00:24:51Но в общем, да, так что они это делают.
00:24:54И что в итоге происходит — то,
00:24:56что вскрывает баг,
00:24:57это то,
00:24:57что в итоге происходит следующее: эти исполнители,
00:25:00когда они не получают блокировку,
00:25:02они просто делают откат,
00:25:04да?
00:25:04Они в основном просто такие: окей,
00:25:06дай-ка я подожду и попробую снова.
00:25:08То есть исполнитель,
00:25:10этот исполнитель пытается получить блокировку,
00:25:12но кто-то другой уже владеет блокировкой.
00:25:15Поэтому он просто немного ждёт.
00:25:17Он снова пытается получить блокировку.
00:25:19Вот что будет происходить.
00:25:21Да.
00:25:21И они сказали,
00:25:22что произошло то,
00:25:23что они столкнулись с патологическим случаем,
00:25:26цитирую,
00:25:26где один из исполнителей,
00:25:28ну знаете,
00:25:29исполнил какой-то план.
00:25:30И этот план, скажем, был довольно старым.
00:25:32Кажется, они использовали 110 в качестве примера.
00:25:35Так что он исполнил план 110.
00:25:37И он хочет направить,
00:25:39ну знаете,
00:25:39типа: мне нужно настроить API так,
00:25:41чтобы он указывал на мой 110,
00:25:43пытается получить блокировку для обновления dynamodb.use.one или что там ещё,
00:25:48и терпит неудачу,
00:25:49потому что кто-то другой исполняет план 111 или что-то вроде того.
00:25:53Да.
00:25:53Или план 109 мог быть предыдущим планом.
00:25:56Так что другие исполнители это делают.
00:25:58Он не может это сделать.
00:26:00Он откатывается.
00:26:01Да..
00:26:02И помните, этот исполнитель здесь — мы на 110.
00:26:05Он пытается, он реально хочет его исполнить..
00:26:07Он пытается снова.
00:26:08Кто-то другой владеет блокировкой.
00:26:10Теперь он пытается снова — всё ещё заблокировано.
00:26:12Этот парень сидит на 110, отчаянно пытаясь исполнить.
00:26:15Не может.
00:26:16По-видимому,
00:26:16это просто происходило так много раз,
00:26:18что другие исполнители,
00:26:19а планировщик при этом всё это время штампует новые планы.
00:26:22Да..
00:26:23Другие исполнители,
00:26:24они доходят до типа 145 или что-то такое,
00:26:27и 146 — они исполняют планы,
00:26:29которые далеко впереди 110.
00:26:30Да.
00:26:31А этот парень всё ещё застрял,
00:26:33потому что ему просто не везёт и он никак не получает блокировку.
00:26:37Да.
00:26:38Наконец,
00:26:38в какой-то момент,
00:26:39после того как план 145 уже был исполнен и на него указал какой-то другой исполнитель,
00:26:45и всё такое,
00:26:46план 110 — этот исполнитель всё ещё пытается это сделать и наконец получает блокировку.
00:26:51Ну типа да.
00:26:52И тогда он говорит: окей, мы теперь указываем на 110.
00:26:56Да.
00:26:56Точно..
00:26:58Так что теперь он на супер старом устаревшем плане,
00:27:00но на самом деле это не должно быть проблемой.
00:27:02Да..
00:27:03Потому что в конце концов в следующий раз,
00:27:04когда какой-нибудь исполнитель что-то сделает,
00:27:06это будет гораздо более поздний план.
00:27:07Они просто исполнят план,
00:27:08ну знаете,
00:27:09146 или семь,
00:27:09или восемь,
00:27:10или что там.
00:27:10И мы переключим его обратно на это,
00:27:12и мы вернёмся к свежему плану.
00:27:13Так что у всех просто будет плохая балансировка нагрузки минут на несколько,
00:27:17но потом всё будет нормально.
00:27:18Да.
00:27:19У них действительно была плохая балансировка нагрузки как минимум несколько минут..
00:27:22Да.
00:27:23Верно.
00:27:23Ну, всё гораздо хуже, чем это.
00:27:26Вот что должно было произойти.
00:27:29Да..
00:27:30То есть вот так они и ожидали, что это будет работать.
00:27:34Понятно.
00:27:34Проблема в том,
00:27:35что они также не хотели,
00:27:37чтобы Route 53 забился всеми этими записями.
00:27:40Потому что если бы они их просто оставляли,
00:27:42в итоге через,
00:27:43ну знаете,
00:27:44три месяца у вас там 8 миллиардов записей,
00:27:47которые вы запихнули в Route 53 за каждые,
00:27:50ну знаете,
00:27:50пару минут вы туда помещаете это большое дерево весов и всё такое.
00:27:55Они такие: окей,
00:27:56в какой-то момент нам просто надо почистить эти планы..
00:28:00Итак,
00:28:00исполнители также ищут планы,
00:28:02которые старше определённого времени.
00:28:05И если они старше определённого времени, они их удаляют.
00:28:09Получилось так: они указывали на план 110.
00:28:12Этот исполнитель наконец получает блокировку.
00:28:15Он указывает на 110.
00:28:16Другой исполнитель такой: о, вау, 110, чувак, это же старьё.
00:28:20Нам надо от этого избавиться, и удаляет его.
00:28:23Так что теперь DynamoDB us-east-1.api.aws указывает на запись,
00:28:27которую невозможно разрешить.
00:28:29Понимаете.
00:28:30Это просто что-то,
00:28:31на самом деле,
00:28:32опять же,
00:28:33это выглядело бы не как план 110.
00:28:35Это выглядело бы как OAFE129A,
00:28:37какой-то хеш,
00:28:38точка,
00:28:39верно,
00:28:39DDB.aws?
00:28:40Но он указывает на это имя.
00:28:41А если вы запросите это имя, вы ничего не получите..
00:28:46То есть в этот момент происходило следующее: все,
00:28:49кто пытался получить адрес для отправки данных,
00:28:51получали обратно неразрешимое имя,
00:28:53в общем-то.
00:28:54Верно?
00:28:54И я не особо знаю,
00:28:55что происходит в Route 53,
00:28:56когда это случается,
00:28:58но по сути вы получали обратно что-то,
00:29:00что либо невозможно использовать,
00:29:01либо просто какую-то абракадабру вместо IP-адреса,
00:29:04кто знает.
00:29:05Но в любом случае,
00:29:06если вы попытались бы это реально использовать,
00:29:08вы бы не получили ответа.
00:29:09Так-то..
00:29:10Интересно.
00:29:11Это потому,
00:29:12что AWS недостаточно использует Rust,
00:29:14ведь это очевидно баг use-after-free?
00:29:16И я думаю, Rust решил бы это, верно?
00:29:18Если бы вы переписали Route 53 полностью на Rust,
00:29:21очевидно,
00:29:22всех этих проблем бы не было.
00:29:23Нет,
00:29:24если конкретнее,
00:29:25я думаю,
00:29:25в презентации они действительно говорили,
00:29:28не про Rust,
00:29:29а они говорили,
00:29:30что именно произойдёт,
00:29:31то есть,
00:29:31я думаю,
00:29:32когда вы запрашивали эту штуку или либо эту штуку,
00:29:35либо эту штуку,
00:29:36я не знаю,
00:29:36на что именно они ссылались,
00:29:38потому что не совсем помню,
00:29:40вы бы просто получили обратно что-то типа «записей не найдено».
00:29:43Вот такой конечный результат того,
00:29:46что произошло бы,
00:29:47будь то от запроса этого или запроса того,
00:29:49я не уверен,
00:29:50но просто получаете обратно «записей не найдено».
00:29:53Это то, что вы бы получили, пытаясь вызвать этот API.
00:29:56То есть какую бы библиотеку вы ни использовали для работы с DynamoDB,
00:30:00она просто скажет: эй,
00:30:01записей не найдено,
00:30:03братан.
00:30:03Извини.
00:30:04Верно?
00:30:04Так вот,
00:30:05если вы спросите кого угодно в интернете,
00:30:07да,
00:30:08они все такие: да,
00:30:09они объяснили баг.
00:30:10Вот баг.
00:30:10Баг в том, что было это состояние гонки, верно?
00:30:13Все,
00:30:14потому что все,
00:30:14как только вы говорите «состояние гонки»,
00:30:17у всех мозг отключается.
00:30:18Они типа: о, окей, ну, это было состояние гонки.
00:30:21Готово.
00:30:22Тут нечего смотреть, да?
00:30:23Так что они такие: это состояние гонки.
00:30:26Они объяснили.
00:30:27А нет, они не объяснили.
00:30:28Потому что если подумать,
00:30:30что произойдёт здесь,
00:30:31сразу после этого,
00:30:32все получают это,
00:30:33появляется новый исполнитель.
00:30:35Новый исполнитель просто выполнит новое действие, верно?
00:30:38И баг, верно, заключается в том: почему этого не произошло?
00:30:42Вот настоящий анализ первопричины,
00:30:44который я хотел увидеть — почему следующий исполнитель не пришёл и не исправил это?
00:30:49Могу я кое-что добавить?
00:30:50Разве это тоже не баг?
00:30:52Типа,
00:30:52зачем писать запись настолько старую,
00:30:54что её нужно сразу удалить?
00:30:56Ну, это не...
00:30:57это потому, что это...
00:30:58этот парень записал её довольно давно.
00:31:00И это был...
00:31:01вес.
00:31:02Ну,
00:31:02я имею в виду,
00:31:03если вы спрашиваете,
00:31:04почему они не написали исполнителя с лучшим кодом.
00:31:07Да, это довольно круто..
00:31:11Ладно, справедливо.
00:31:12Кажется,
00:31:13если ты обновляешь на что-то,
00:31:14что должно быть удалено немедленно,
00:31:16разве это не...
00:31:17типа это похоже на проблему прямо здесь.
00:31:19Ты сделал что-то не так задолго до этого.
00:31:21Да,
00:31:22даже если это на самом деле не исправляет теоретическую структуру этой штуки,
00:31:26простая проверка у этого парня,
00:31:28когда он закончил откат блокировки,
00:31:30он,
00:31:30возможно,
00:31:31должен проверить,
00:31:31не собирается ли он установить это на что-то,
00:31:34что он бы удалил,
00:31:35если бы запускал свой код удаления — это,
00:31:37вероятно,
00:31:38хорошая мера безопасности.
00:31:39Но да, так что на 100% с ним согласен.
00:31:41Окей,
00:31:42но исполнитель очень,
00:31:43очень усердно работал,
00:31:44чтобы получить эту запись.
00:31:45Ждал долгое время.
00:31:46О, он получит свои карточки Покемонов..
00:31:49Кто-нибудь когда-либо ждал.
00:31:51Так что просто дайте ему записать запись.
00:31:53Окей.
00:31:54Итак, я хочу услышать об этом..
00:31:56К сожалению,
00:31:57если посмотреть на презентацию и на RCA,
00:32:01там этого просто нет.
00:32:03В презентации хотя бы есть один крошечный 12-секундный фрагмент,
00:32:10где указано,
00:32:11где примерно находится баг.
00:32:14Позвольте объяснить, в чём там дело.
00:32:18Видимо,
00:32:19происходит вот что: когда вы делаете DynamoDB us-east-one и направляете его на свой план,
00:32:28вы одновременно выполняете ещё одну операцию.
00:32:33Эта операция — установка отката..
00:32:40Кажется, это DD.
00:32:42Или DDB.rollback.AWS.
00:32:44Не помню точно, как оно называется..
00:32:49Там есть запись отката.
00:32:51Она устанавливается на то, каким был старый план.
00:32:55Допустим,
00:32:56мы находились здесь и указывали на 145,
00:32:59а теперь собираемся указать на 110.
00:33:02Старый enactor,
00:33:04типа,
00:33:04«я переключаюсь на 110»,
00:33:06он пытается взять текущее имя и переместить это имя — которое было планом 145 — так,
00:33:13чтобы адрес отката указывал на старый план..
00:33:18Верно.
00:33:18И это просто для отладки.
00:33:20Или, знаете, в основном для удобства операторов..
00:33:24Если им нужно откатиться к предыдущему плану или что-то в этом роде,
00:33:29или просто хочется узнать,
00:33:30какой был предыдущий план,
00:33:32можно посмотреть здесь,
00:33:33так?
00:33:34Это первая часть того, что они говорили о сбое.
00:33:37Хочу отметить один момент — мне это тоже показалось странным.
00:33:40Я подумал: окей,
00:33:41вы говорите мне,
00:33:42что эти штуки обновляются каждую минуту или около того.
00:33:46Какой смысл в таком откате?
00:33:48К тому времени,
00:33:48как вы даже войдёте в систему,
00:33:50он уже обновится с того,
00:33:52к которому вы хотели откатиться,
00:33:54на что-то новое.
00:33:55А это как раз тот план,
00:33:56который вам не нужен,
00:33:58потому что всё упало,
00:33:59понимаете?
00:33:59Вам это не нужно, вам нужен просто список этих имён.
00:34:03Чтобы можно было сказать: каким он был в 12:30?
00:34:06Вот тот.
00:34:06Для меня это вообще не имело смысла.
00:34:08Я буквально понятия не имею, зачем это вообще нужно.
00:34:11Похоже,
00:34:12что это не делает того,
00:34:13что действительно нужно,
00:34:15а именно — возможности отметить момент времени и сказать: нам нужно вернуться к часу дня,
00:34:20потому что после этого всё полетело к чертям..
00:34:26В общем, для меня это было непонятно.
00:34:29Но опять же,
00:34:29это не совсем про баг,
00:34:31так что я не стал спрашивать почему.
00:34:33Просто говорю: окей, вот что оно должно делать.
00:34:36И можно откатиться только на одну версию назад,
00:34:38как я понимаю.
00:34:39Да, хотя другие деревья существуют.
00:34:41Так что легко можно было бы, просто зная имя.
00:34:44Всё это лишь присваивает человекочитаемое имя чему-то,
00:34:47что вас почти наверняка не волнует.
00:34:49Но у них на самом деле не так уж много возможностей для хранения..
00:34:54Кейси,
00:34:54я не думаю,
00:34:55что у них там реально можно хранить много данных,
00:34:58понимаешь?
00:34:59Адам, это же куча строк.
00:35:00На их месте я бы просто сделал это временной меткой.
00:35:04Если это то, что нужно.
00:35:05Я бы просто указывал: когда планировщик или когда этот человек направил это на эту штуку?
00:35:11Когда вы получили блокировку,
00:35:13вы меняете это имя на временную метку и обновляете это атомарно.
00:35:17Тогда вы просто знаете: если хочу откатиться к часу дня,
00:35:21просто ищу ту,
00:35:22у которой временная метка — ну знаете,
00:35:24самая ранняя метка,
00:35:26не позже этого времени..
00:35:28И это то, что работало в тот момент.
00:35:30Вот что бы я сделал.
00:35:31Но я не знаю.
00:35:32Понятия не имею, почему они сделали так, как сделали.
00:35:35Возможно, это имеет полный смысл.
00:35:36Опять же, я не знаю их систему.
00:35:38Все эти вещи могут иметь абсолютный смысл..
00:35:41Так что я не критикую, я просто говорю, что не понимаю.
00:35:43Не факт, что это плохие идеи..
00:35:45Возможно, это хорошие идеи, если понимать остальную систему.
00:35:49В общем,
00:35:49всё,
00:35:50что они говорят — и это всё,
00:35:51что мы получаем — это что данная операция,
00:35:54то есть установка отката на старый план,
00:35:56на который раньше указывали — и в данном случае он фактически мог быть новее в некоторых случаях,
00:36:02так?
00:36:03То есть это не обязательно предыдущий план по времени,
00:36:06он может быть старше,
00:36:08а может быть новее.
00:36:09Вот выполнение этой операции..
00:36:11Если этот план больше не существует,
00:36:13то есть был удалён вот так,
00:36:15то enactor останавливается навсегда.
00:36:18Так что каждый раз,
00:36:19как только вы попадаете в состояние,
00:36:22где dynamodb.usc — это тот самый,
00:36:24верно.
00:36:25Мы выполняем всю последовательность шагов, которую описали?
00:36:29Этот план удаляется..
00:36:31Теперь это указывает на недействительное,
00:36:33неразрешимое имя,
00:36:34мы не можем разрешить plan-dash-110,
00:36:36который на самом деле какой-то hex-код.
00:36:38Но что бы это ни было, мы больше не можем это разрешить..
00:36:41Как только это состояние становится истинным,
00:36:44то в следующий раз,
00:36:46когда enactor придёт и попытается направить его на новый план,
00:36:50каким бы ни был этот новый план,
00:36:53он не сможет — когда он дойдёт до этого момента и попытается установить откат,
00:36:59это навсегда его обрушит.
00:37:01Поэтому все три enactor'а теперь остановятся,
00:37:04потому что в конечном итоге все три попытаются применить новый план.
00:37:09Они попытаются сначала установить откат на то,
00:37:13чем был старый план,
00:37:14обнаружат,
00:37:15что там нет никакого плана.
00:37:17И это, очевидно, просто жёсткий сбой.
00:37:20О, это безумие.
00:37:21Я думал, три enactor'а должны были обеспечить избыточность.
00:37:26Опять же,
00:37:26вот почему я раздражаюсь,
00:37:28когда люди в интернете отвечают типа: это было состояние гонки.
00:37:33Это не было состояние гонки.
00:37:35Состояние гонки не обязательно для этого.
00:37:38Состояние гонки — это просто причина,
00:37:41по которой это имя стало неразрешимым.
00:37:44Но если бы у вас не было кода,
00:37:46который сделал это плохо,
00:37:48всё бы просто работало..
00:37:52Вы бы никогда не узнали.
00:37:53У вас был бы минутный сбой DynamoDB или что-то в этом роде,
00:37:57но я предполагаю,
00:37:59что минутные сбои DynamoDB случаются время от времени.
00:38:02Это не мировая новость..
00:38:04Мировая новость — это когда система падает навсегда,
00:38:07что и произошло здесь.
00:38:08И пока реальный человек не придёт,
00:38:10не разберётся,
00:38:11не сбросит это,
00:38:12не запустит эти enactor'ы снова,
00:38:14она просто мертва.
00:38:15Просто вышла из строя навсегда.
00:38:16Так что потенциально часы.
00:38:18И в этом случае это было достаточно долго,
00:38:20чтобы затем начались каскадные сбои.
00:38:22У вас никогда бы этого не было.
00:38:24Это просто кратковременный сбой.
00:38:25Если некоторые люди кратковременно получили неразрешимое имя или отсутствие записей,
00:38:30они просто попытались бы снова.
00:38:32Обычно с DNS это как с телефоном — вы проехали через туннель.
00:38:35Вот и всё, что было бы..
00:38:37Поэтому я хочу знать, как выглядел код здесь?
00:38:40Как вы написали что-то такое,
00:38:42что если это не было действительным именем,
00:38:44а оно не было бы даже при запуске,
00:38:46то есть если вы запускали эту систему,
00:38:49а оператор не настроил её заранее,
00:38:51она бы ни на что не указывала.
00:38:53Это случай по умолчанию,
00:38:54с которого,
00:38:55как вы думаете,
00:38:56начнётся работа.
00:38:57Так что если вы собираетесь делать это,
00:38:59вы бы подумали,
00:39:00что просто обработаете этот случай,
00:39:02потому что адрес отката может просто ни на что не указывать.
00:39:06Просто возьмите то, что есть.
00:39:08Если это ничего, установите адрес отката на ничего..
00:39:12Готово.
00:39:12Так что есть что-то действительно странное в том,
00:39:15как они написали этот код.
00:39:17И именно это должно было быть в RCA.
00:39:19Для меня это весь баг.
00:39:21Это просто декорация для того,
00:39:23как мы в итоге получили эту штуку,
00:39:25указывающую в никуда.
00:39:26Тот же баг произошёл бы,
00:39:28если бы кто-то случайно удалил эту запись.
00:39:30Типа какой-то оператор просто: ой,
00:39:32чёрт,
00:39:33я установил это в ничего..
00:39:35Этот же баг произошёл бы согласно презентации.
00:39:38Так что первопричина — не состояние гонки.
00:39:40Состояние гонки — это отступление.
00:39:43Понятно?
00:39:43Быстрый вопрос.
00:39:44Так что я реально обдумываю это.
00:39:46И это означает,
00:39:47что то,
00:39:47что устанавливает откат,
00:39:49вероятно,
00:39:49предполагает какую-то структуру с кучей памяти или чего-то,
00:39:53что было передано,
00:39:54делает какой-то доступ.
00:39:56Взрывается.
00:39:56Или ты думаешь,
00:39:57это тот же стиль бага,
00:39:58который был в той одной строке,
00:40:00обрушившей Cloudflare,
00:40:02а именно они просто предполагают,
00:40:04что это там,
00:40:04и разворачивают это..
00:40:07Это в Rust. Это memory-safe Rust. Разворачивает, взрывается.
00:40:13Я правда не знаю.
00:40:14Моя догадка,
00:40:14ну вот в голове я подумал: что такого я вижу,
00:40:17как люди делают постоянно,
00:40:19и я всегда думаю — зачем вы вообще так делаете?
00:40:22Но это просто потому, что их так научили программировать.
00:40:26И я думал: если бы ты писал на одном из этих языков,
00:40:29которые любят бросать исключения при ошибках,
00:40:32это был бы отличный пример.
00:40:34Допустим,
00:40:34у тебя ситуация: ты пошёл получить DNS-запись,
00:40:37на которую указывает эта штука..
00:40:40И обычно в нормальной среде программирования никто там не бросает исключение.
00:40:45Если ничего не получили — просто возвращают ничего.
00:40:47И когда человек идёт установить ddb.robot.js,
00:40:50он просто ставит его в ничего,
00:40:52что и есть правильное поведение.
00:40:53Буквально значение «ничего» корректно течёт через весь этот поток.
00:40:57Так что если бы ты писал это с расчётом на то,
00:40:59что это базовый сервис,
00:41:01и пытался написать что-то отказоустойчивое,
00:41:03ты бы никогда не стал что-то вроде бросания исключений делать.
00:41:07Поэтому в моей голове я думаю: бьюсь об заклад,
00:41:09что происходит вот что — когда ты запрашиваешь эту запись,
00:41:12они просто используют какой-то вызов библиотеки или что-то такое,
00:41:16что бросает исключение,
00:41:17когда записи не существует.
00:41:19И оно просто выбросило исключение, и актор завершился.
00:41:22Вот моя догадка.
00:41:23И я могу очень сильно ошибаться,
00:41:24потому что это просто дикая догадка.
00:41:26Но вот поэтому я хочу увидеть RCA.
00:41:28Что это было.
00:41:29Это может быть именно то, о чём говорил Трэш.
00:41:32То есть, это может быть то, о чём говорил Прайм?
00:41:34Может быть то, что я только что сказал.
00:41:36Может быть что угодно.
00:41:37И я хочу знать,
00:41:38потому что вот в этом и есть настоящее обучение.
00:41:41Избежать этого состояния гонки — совершенно неважно.
00:41:44Это состояние гонки могло там жить.
00:41:46И хотя важно было в конечном итоге его исправить,
00:41:48чтобы избежать этих раз-в-год странных сбоев на пять секунд или около того,
00:41:52это на самом деле не то,
00:41:54чему мы больше всего хотим научиться.
00:41:56Больше всего мы хотим научиться не писать вот эту штуку.
00:41:59А мы даже не знаем, что это вообще была за штука.
00:42:02Так как же нам её не писать.
00:42:03Вот почему я считаю, что это был плохой RCA.
00:42:05Понятно?
00:42:06Да.
00:42:06Да?
00:42:07Хорошо.
00:42:07На чём написана большая часть AWS, Адам?.
00:42:11Это была Java.
00:42:12Я как раз хотел сказать — кто-то из чата сказал Scala.
00:42:16Сказали,
00:42:17что работали в AWS семь лет,
00:42:19и сказали,
00:42:20что большая часть написана на Scala.
00:42:23Ну, это технически Java с дополнительными шагами.
00:42:27И это будет бесконечно их бесить.
00:42:29Так что для меня на этом всё..
00:42:34Это была та штука,
00:42:35где я подумал: мне кажется,
00:42:36я не увидел объяснения.
00:42:37И мне на самом деле кажется,
00:42:38что это важно услышать,
00:42:39потому что в основе всего этого лежала плохая практика программирования.
00:42:43И я хочу знать,
00:42:43какая именно,
00:42:44особенно потому что это помогает таким людям,
00:42:46как я — знаете,
00:42:47я сейчас не особо занимаюсь обучением архитектуре,
00:42:49но в какой-то момент я,
00:42:50вероятно,
00:42:51хотел бы этим заняться,
00:42:52потому что я думаю,
00:42:53что там куча плохой архитектуры.
00:42:54И поэтому я стараюсь обращать внимание на такие вещи.
00:42:57Типа, какие архитектурные ошибки люди совершают?
00:42:59И бьюсь об заклад, это была одна из них.
00:43:01Верно?
00:43:02И вот поэтому я хотел бы знать.
00:43:03Хотел бы знать..
00:43:04Да.
00:43:05Я думаю,
00:43:05что я бы ожидал хотя бы один простой воспроизводимый пример того,
00:43:09почему всё взорвалось — небольшой фрагмент кода.
00:43:12И это то,
00:43:13что ты поднял раньше — как мы подходим к таким вещам.
00:43:16Если я проверяю чей-то код и вижу что-то странное,
00:43:19я всегда стараюсь создать свою маленькую песочницу и проверить свою теорию.
00:43:24А потом показать им код с объяснением: вот почему это,
00:43:27вероятно,
00:43:28неправильно.
00:43:29Вот небольшой простой воспроизводимый шаг.
00:43:31Так что я бы ожидал чего-то подобного.
00:43:34И это также помогает мне по-настоящему понять.
00:43:37Потому что многие люди,
00:43:38как ты сказал,
00:43:39видят что-то странное,
00:43:40но не знают,
00:43:41почему оно странное,
00:43:42но я не могу на этом остановиться.
00:43:44Мне нужно это реально воспроизвести и понять.
00:43:47Вот чего я бы ожидал.
00:43:48И знаешь,
00:43:49как я уже говорил,
00:43:50отчёты по CrowdStrike и сбоям Google были лучше — они просто сказали,
00:43:54что это был нулевой указатель,
00:43:56разыменование здесь,
00:43:58или выход за границы массива,
00:43:59потому что мы думали,
00:44:01что будет только 20,
00:44:02а в конфиг-файл поместили 21.
00:44:04И типа,
00:44:04окей,
00:44:05я точно знаю,
00:44:05какой код вызывает такую проблему.
00:44:08Верно?
00:44:08И более того,
00:44:09в продолжение более раннего комментария,
00:44:11буквально,
00:44:12насколько я знаю,
00:44:13все,
00:44:14кто программируют на Rust,
00:44:15делают это только для того,
00:44:17чтобы иногда,
00:44:18увидев что-то подобное,
00:44:19сказать: ну,
00:44:20если бы это написали на Rust,
00:44:22такого бы не случилось.
00:44:23Им даже не дали достаточно информации,
00:44:25чтобы сделать такой комментарий..
00:44:29Они,
00:44:30вероятно,
00:44:30всё равно это сказали,
00:44:32если честно,
00:44:33но им не дали информации.
00:44:34Так что нужно соблюдать одно правило в RCA: нужно дать растацианцам достаточно информации,
00:44:40чтобы они,
00:44:41если захотят,
00:44:41могли корректно заявить,
00:44:43что на Rust это было бы предотвращено..
00:44:46А в этом случае у нас этого нет.
00:44:48Мы не знаем, было бы это предотвращено на Rust..
00:44:51Мы понятия не имеем.
00:44:52Вероятно, нет, но мы не знаем.
00:44:54Ну,
00:44:55Кейси,
00:44:55у нас довольно хорошие шансы,
00:44:57потому что это вообще,
00:44:59вероятно,
00:44:59никогда бы не отгрузили.
00:45:01Так что это бы предотвратило..
00:45:03Верно.
00:45:03У нас было бы ноль актёров,
00:45:05потому что мы бы проектировали набор актёров.
00:45:09Да..
00:45:09CloudFlare справляется с этим действительно хорошо.
00:45:12Они вникают и показывают много строк кода,
00:45:15говоря: вот что именно происходит.
00:45:17Вот,
00:45:17знаешь,
00:45:18хотя проблема здесь,
00:45:19это строка,
00:45:20которая взорвалась из-за всех этих предыдущих условий.
00:45:23Это я издевался над Rust с unwrap,
00:45:25который на самом деле не был истинной проблемой.
00:45:28Но знаешь, просто все эти вещи происходят.
00:45:30Так что они делают действительно хорошую работу.
00:45:33Я удивлён, насколько плохо AWS справился с этим.
00:45:36Ну,
00:45:36и ещё одна вещь — это одна из тех ситуаций,
00:45:39когда теперь это заставляет меня излишне подозрительно к вам относиться,
00:45:43понимаете??
00:45:44Когда я читаю это, я думаю: вы что-то скрываете?
00:45:46Вы на самом деле не разобрались, в чём был баг?
00:45:48Вы столько рассказывали об этом состоянии гонки,
00:45:50но даже из вашей собственной презентации я понимаю,
00:45:53что состояние гонки на самом деле не было важным.
00:45:55Это было просто то,
00:45:56что привело к тому,
00:45:57что запись была установлена в ничто,
00:45:58но какая разница,
00:45:59верно?
00:46:00То есть это что-то такое,
00:46:01что хорошо бы добавить в RCA в качестве объяснения,
00:46:03почему этот баг проявился именно сейчас,
00:46:05а не в какое-то другое время,
00:46:06но это не сам баг.
00:46:07Поэтому мне странно.
00:46:08Когда я вижу RCA,
00:46:09в котором не говорится о самом баге,
00:46:10я начинаю подозревать.
00:46:11Верно?
00:46:12И совершенно напрасно,
00:46:13потому что если вы действительно его нашли,
00:46:15то просто скажите мне об этом,
00:46:16и тогда я буду знать,
00:46:17что вы его нашли.
00:46:18Так что,
00:46:18я думаю,
00:46:19это также вселяет уверенность в людей,
00:46:20которые смотрят со стороны и хотят знать,
00:46:22можно ли доверять этому DynamoDB.
00:46:24Если выглядит так,
00:46:24будто вы действительно нашли баг,
00:46:26у меня появляется чуть больше доверия к вам.
00:46:28Если же выглядит так,
00:46:29будто вы понятия не имеете,
00:46:30в чём был баг,
00:46:31или не понимаете,
00:46:31в чём был баг,
00:46:32то я больше беспокоюсь.
00:46:33И поэтому я считаю,
00:46:34что это ещё одна причина делать это в вашем RCA..
00:46:37Это вселяет уверенность в ваших клиентов.
00:46:40Может, поэтому они и уволили Адама из AWS Hero..
00:46:43Может, всё взаимосвязано.
00:46:44Вполне возможно.
00:46:45Они не хотели, чтобы он раскрывал эти грязные секреты..
00:46:48Да.
00:46:48Он слишком много знал.
00:46:50Он слишком много знал.
00:46:51Можешь дать краткий,
00:46:52минуты на три,
00:46:53пересказ истории с гитарным магазином?
00:46:55Что там раскрывалось?
00:46:57Потому что я пытаюсь вспомнить,
00:46:58о чём там речь,
00:46:59ведь там был какой-то единственный парень — точка отказа,
00:47:03который отсутствовал и во время этого сбоя.
00:47:05Так что я не знаю, как согласовать эти две вещи.
00:47:08И конечно, мы понятия не имеем.
00:47:10Мы понятия не имеем,
00:47:11говорят ли нам правду в любом из случаев,
00:47:14верно?
00:47:14Потому что это был настолько плохой RCA,
00:47:17что я не знаю,
00:47:18правильный он или нет,
00:47:19но да,
00:47:19пароль был wishbone 12,
00:47:21кажется..
00:47:22Вот именно.
00:47:23Всегда пытаются меня убить.
00:47:24По крайней мере, так я это помню..
00:47:26Так вот,
00:47:27та история была о том,
00:47:28что была штука,
00:47:29которая была разработана для копирования конфигураций.
00:47:33И эта штука вышла из-под контроля,
00:47:35и её нельзя было остановить.
00:47:37Она просто копировала конфигурации совершенно неправильно,
00:47:41и её нужно было,
00:47:42типа,
00:47:42починить или восстановить,
00:47:44или что-то в этом роде.
00:47:46И у нас нет дополнительной информации,
00:47:48потому что это был подслушанный разговор.
00:47:51Верно?
00:47:51И согласуется ли это с тем?
00:47:53Ну,
00:47:54немного,
00:47:54потому что эти исполнители действительно звучат как то,
00:47:58что могло бы выполнять копирование конфигураций,
00:48:01но с другой стороны,
00:48:02это не совсем конфигурация для машин.
00:48:05DNS-запись — это DNS-запись.
00:48:07Это не совсем конфигурация.
00:48:09Поэтому я бы сказал,
00:48:10что две эти истории не очень-то совпадают..
00:48:14А это ещё одна причина,
00:48:15почему я надеялся,
00:48:16что этот RCA будет чуть более правдоподобным,
00:48:19потому что я хотел точно знать,
00:48:21что та история была ложной.
00:48:23И я всё ещё не знаю наверняка,
00:48:24учитывая,
00:48:25насколько плох этот RCA.
00:48:26А что,
00:48:27если инструмент,
00:48:28который тот парень написал для копирования конфигов,
00:48:31— это буквально и есть исполнитель?
00:48:33Типа,
00:48:33они просто запродакшенили его,
00:48:35и он,
00:48:36и они не меняли его семь лет.
00:48:37Вот так я связываю точки.
00:48:39Он там типа: ребят,
00:48:40я написал это как способ тестировать что-то в своём локальном окружении.
00:48:44А вы просто решили сделать три исполнителя и поставить их рядом друг с другом в проде.
00:48:49Я не понимаю, как это произошло.
00:48:51Не понимаю..
00:48:53У меня есть альтернативные вопросы.
00:48:54Да.
00:48:55Или, может быть, дело в откате?
00:48:57Потому что именно он выполнял копирование типа: «Эй,
00:48:59вот предыдущая версия».
00:49:00Верно.
00:49:01И вот он копирует предыдущую версию.
00:49:03Потом возникает эта проблема с null.
00:49:05И скрипт просто никогда не сталкивался с этим или вообще выходит из-под контроля и начинает писать снова и снова,
00:49:11и снова,
00:49:11и снова,
00:49:12так что ты ничего не можешь сделать.
00:49:13Понятия не имею.
00:49:14Всё,
00:49:15что я знаю — судя по их объяснениям,
00:49:17основываясь только на том,
00:49:18что они предоставили,
00:49:19я всё равно не думаю,
00:49:20что состояние гонки вообще имеет значение,
00:49:22потому что,
00:49:23опять же,
00:49:23буквально случайное обновление конечной точки Route 53 могло бы немедленно вывести из строя всех трёх акторов.
00:49:29Потому что,
00:49:30по их словам,
00:49:30всё,
00:49:31что требуется для их остановки — это если конечная точка указывает на неразрешимое имя,
00:49:35вот и всё.
00:49:36И если это действительно так,
00:49:37то буквально опечатка оператора могла бы всё это обрушить,
00:49:40никакого состояния гонки не требуется.
00:49:42Верно.
00:49:43И поэтому,
00:49:43опять же,
00:49:44отчёт о первопричине просто плохо справляется с задачей убедить меня,
00:49:47что вы разобрались,
00:49:48в чём была настоящая ошибка,
00:49:50потому что я могу придумать столько способов,
00:49:52как можно было вызвать точно то же самое,
00:49:54которые не включают это состояние гонки,
00:49:56о котором вы рассказывали мне на протяжении всего отчёта,
00:49:59утверждая,
00:50:00что это и есть баг,
00:50:01но я так не думаю.
00:50:02Так что спасибо тебе, Кейси, за эту потрясающую презентацию.
00:50:05Я искренне испытываю зависть Гринвуда,
00:50:07ярость ревности к тому инструменту для письма,
00:50:09который у тебя есть.
00:50:10Мне нужно разобраться, как настроить то, что у тебя.
00:50:13Эта штука фантастическая..
00:50:15Спасибо всем за просмотр.
00:50:16Для тех,
00:50:16кто смотрел в прямом эфире,
00:50:18надеюсь,
00:50:18вам понравились предварительные разговоры и,
00:50:20вероятно,
00:50:21немного постразговоров.
00:50:22Если хотите услышать расширенную версию и все эти весёлые взаимодействия,
00:50:25которые не являются частью основной истории,
00:50:27заходите на Spotify за полным подкастом,
00:50:29где мы просто болтаем о том,
00:50:31не знаю,
00:50:31какой мусор едим,
00:50:32и о закусках,
00:50:33и всё такое — название «Ещё больше болтовни»,
00:50:35ещё больше болтовни,
00:50:36и ещё Кейси,
00:50:36Ти Джей и Трэш..
00:50:42Ошибки на моём экране, кофе в терминале и жизнь как мечта.

Key Takeaway

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

Highlights

Проблема разрыва между поверхностным знанием и глубоким техническим пониманием систем

Критика официального отчета AWS (RCA) о сбое DynamoDB как недостаточно детального и расплывчатого

Технический разбор архитектуры обновления DNS-записей в AWS с использованием Route 53

Анализ роли 'состояния гонки' (race condition), которое послужило лишь триггером, а не первопричиной сбоя

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

Сравнение качества технических отчетов о сбоях между AWS, Google, Cloudflare и CrowdStrike

Важность прозрачности IT-гигантов перед клиентами для поддержания доверия к облачным сервисам

Timeline

Вступление: Психология понимания в программировании

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

Сравнение RCA: AWS против Google и CrowdStrike

Спикер сравнивает недавние крупные технологические сбои и качество их официальных анализов первопричин (RCA). Он хвалит Google и CrowdStrike за конкретику, упоминая такие ошибки, как разыменование нулевого указателя при обработке JSON и переполнение массива из-за избытка правил. В отличие от них, первоначальный отчет AWS о сбое DynamoDB показался Кейси крайне туманным и не дающим реальных ответов. Даже после просмотра специализированной презентации на конференции re:Invent у него осталось множество вопросов без ответов. Этот сегмент подчеркивает важность детальной технической коммуникации в индустрии программного обеспечения.

Архитектура балансировки нагрузки в DynamoDB

В этой части Кейси переходит к визуальному разбору технической стороны вопроса, используя интерактивную доску. Он объясняет, как DynamoDB использует доменные имена и API-эндпоинты (например, в регионе use-east-1) для маршрутизации трафика через DNS-систему Route 53. Упоминается концепция 'DNS-дерева' весов, которая позволяет распределять нагрузку между множеством машин в зависимости от их текущего состояния и производительности. К обсуждению подключается Адам, бывший 'AWS Hero', который подтверждает использование взвешенных записей в Route 53. Секция критически важна для понимания того, как штатные изменения в инфраструктуре превращаются в потенциальные точки отказа.

Механизм планировщика и исполнителей (Enactors)

Разбор углубляется в процесс обновления конфигурации, который разделен на две роли: один планировщик и три исполнителя (enactors). Планировщик постоянно генерирует новые планы балансировки нагрузки (например, plan 145, plan 146), представленные в виде хеш-кодов. Исполнители должны брать эти планы и вносить соответствующие изменения в Route 53, используя систему блокировок для обеспечения атомарности. Кейси критикует эту архитектуру за избыточную сложность и отсутствие логического обоснования того, почему планировщик один, а исполнителей три. Использование DNS-записей в качестве механизма блокировки называется странным решением, которое в итоге и поспособствовало обнаружению критического бага.

Состояние гонки и каскадное удаление записей

Здесь описывается цепочка событий, приведшая к сбою: один из исполнителей застрял на старом плане (например, 110) из-за неудачных попыток получить блокировку. Пока он ожидал доступа, другие исполнители продвинулись далеко вперед и запустили процедуру очистки устаревших планов из Route 53. В тот момент, когда 'отставший' исполнитель наконец получил блокировку и обновил основную запись на план 110, этот план был мгновенно удален другим процессом как устаревший. В результате глобальный адрес DynamoDB стал указывать на неразрешимое имя, что привело к полной недоступности сервиса для клиентов. Кейси объясняет, что именно эта ситуация стала триггером, но отказывается считать ее истинной первопричиной.

Настоящий баг: Механизм отката и фатальная ошибка

Кейси раскрывает деталь, которую AWS почти проигнорировали в своем отчете: баг в коде механизма отката (rollback). При каждом обновлении исполнитель пытался установить запись отката на предыдущее значение, но если это значение уже было удалено и не разрешалось, код падал с фатальной ошибкой. Вместо того чтобы просто проигнорировать отсутствие старой записи, исполнители 'умирали' навсегда, что привело к остановке всех трех процессов обновления. Спикер предполагает, что проблема могла быть в использовании языков вроде Java или Scala, где необработанное исключение при запросе DNS приводило к завершению потока. Без ручного вмешательства операторов система не могла восстановиться самостоятельно, что превратило кратковременный инцидент в многочасовую катастрофу.

Заключение: Уроки архитектуры и прозрачность

В финальной части участники обсуждают уроки, которые следует извлечь из данного инцидента, и критикуют AWS за попытку 'спрятать' плохие практики программирования за термином 'состояние гонки'. Кейси настаивает на том, что качественный отчет должен включать фрагменты кода, чтобы сообщество могло учиться на реальных ошибках, как это делает Cloudflare. Обсуждается роль языка Rust в предотвращении подобных проблем, хотя отмечается, что архитектурные ошибки возможны везде. Участники приходят к выводу, что прозрачность в таких вопросах не только помогает обучению, но и укрепляет доверие клиентов к облачным провайдерам. Подкаст завершается шутками про 'актёров' и рекомендациями слушать расширенные версии выпусков на Spotify.

Community Posts

View all posts