Часть VIII. Техника 71 / 85
Часть VIII. Техника

71. Компьютер, о котором ты не знал

Порядок: Распределённая система

компьютеры без общих часов → согласие и частичный отказ

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

Без двенадцати полночь 19 октября 2025 года по тихоокеанскому времени база данных DynamoDB в дата-центрах Amazon в Северной Вирджинии перестала находиться. Она была цела, включена и хранила всё, что хранила, но в справочной, той службе, что превращает имя в числовой адрес машины, запись о ней оказалась пустой. Дом стоял на месте, а табличку с адресом сняли со всех карт.

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

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

Лесли Лампорт, математик, получивший за работы о таких системах премию Тьюринга, главную награду в информатике, описал это ещё 28 мая 1987 года в письме коллегам. Распределённая, писал он, это система, в которой тебя может вывести из строя отказ компьютера, о существовании которого ты даже не подозревал. Октябрьская ночь исполнила это определение в масштабе планеты. Под него попадает и сам хозяин облака. Когда в 2017 году в том же регионе упало хранилище S3, страница, где Amazon сообщает о сбоях, не могла зажечь на себе красный значок: картинки для неё лежали в упавшем хранилище. О поломке компания сообщала в Твиттере.

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

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

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

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

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

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

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

Здесь, в отличие от многих порядков этой книги, опыт можно поставить самому. Netflix выпустила в свою работающую систему программу Chaos Monkey, «обезьяну хаоса», которая наугад выключает серверы, чтобы заранее узнать, выдержит ли целое. Кайл Кингсбери в проекте Jepsen рвёт связь между копиями баз данных и не раз ловил популярные базы на том, что они теряют уже подтверждённые записи. Разработчик с ноутбуком может поднять три копии базы, выдернуть одну и посмотреть, что станет с целым.

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