Blizzard рассказали, почему в Diablo II: Resurrected все еще продолжаются технические проблемы.
После запуска Diablo II: Resurrected мы столкнулись с многочисленными проблемами на сервере, и мы хотели бы предоставить некоторую прозрачность в отношении причин этих проблем и шагов, которые мы уже предприняли для их решения. Мы также хотим дать вам некоторое представление о том, как мы будем двигаться дальше.
tl;dr: Перебои в работе нашего сервера не были вызваны какой-то одной проблемой; мы решаем каждую проблему по мере ее возникновения, используя как смягчающие решения, так и долгосрочные архитектурные изменения. Небольшое количество игроков столкнулось с потерей прогресса персонажа - в дальнейшем любая потеря из-за падения сервера должна быть ограничена несколькими минутами. Для нас это не является полным решением проблемы, и мы продолжаем работать над этим вопросом. Наша команда, с помощью других сотрудников Blizzard, работает над тем, чтобы довести впечатления от игры до такого уровня, который будет приятен всем.
Мы немного углубимся в технические подробности, но мы надеемся, что в целом это поможет вам понять, почему происходили эти сбои и что мы делали для устранения каждого случая, а также как мы расследуем общую причину. Давайте начнем с самого начала.
Проблема (проблемы) с серверами:
Прежде чем говорить о проблемах, мы кратко расскажем вам о том, как работают наши серверные базы данных. Во-первых, есть наша глобальная база данных, которая существует как "единственный источник правды" для всей информации о вашем персонаже и его прогрессе. Как вы можете себе представить, это большая задача для одной базы данных, и сама по себе она не справится. Поэтому для снижения нагрузки и задержек на нашу глобальную базу данных, каждый регион - Северная Африка, ЕС и Азия - имеет отдельные базы данных, которые также хранят информацию о вашем персонаже и его прогрессе, и база данных вашего региона будет периодически записывать данные в глобальную базу данных. Большинство ваших внутриигровых действий выполняются с этой региональной базой данных, потому что она быстрее, и ваш персонаж "заперт" в ней для поддержания целостности индивидуальных записей персонажа. Глобальная база данных также является резервной на случай сбоя основной.
Учитывая это, чтобы объяснить, что происходит, мы сосредоточимся на простоях с субботы 9 октября по настоящее время.
В субботу утром по тихоокеанскому времени у нас произошел глобальный сбой из-за внезапного и значительного увеличения трафика. Это был новый порог, с которым наши серверы еще не сталкивались, даже во время запуска. Это усугубилось обновлением, которое мы выпустили накануне, чтобы повысить производительность при создании игр - эти два фактора в совокупности перегрузили нашу глобальную базу данных, что привело к тайм-ауту. Мы решили откатить ранее выпущенное в пятницу обновление, надеясь, что это снизит нагрузку на серверы до воскресенья, а также даст нам возможность глубже изучить первопричину.
Однако в воскресенье стало ясно, что того, что мы сделали в субботу, было недостаточно - мы увидели еще больший рост трафика, что привело к очередному сбою. Наши игровые серверы наблюдали отключение от базы данных и немедленно пытались подключиться снова, причем неоднократно, что означало, что у базы данных не было времени, чтобы наверстать упущенное, поскольку она была слишком занята обработкой непрерывного потока попыток подключения со стороны игровых серверов. В это время мы также увидели, что можем внести улучшения в конфигурацию журнала событий базы данных, который необходим для восстановления здорового состояния в случае сбоя базы данных, поэтому мы выполнили эти работы и провели дальнейший анализ первопричины.
Обоюдоострым мечом воскресного сбоя стало то, что из-за того, с чем мы столкнулись в субботу, мы создали, по сути, учебник по быстрому восстановлению после сбоя. Это было хорошо.
Но поскольку мы так быстро вернулись в сеть в пик активности игроков, когда сотни тысяч игр проходили в течение десятков минут, мы снова упали. Что было плохо.
Поэтому нам нужно было внедрить множество исправлений, включая улучшения конфигурации и кода, которые мы внедрили в резервную глобальную базу данных. Это привело нас к понедельнику, 11 октября, когда мы произвели переключение между глобальными базами данных. Это привело к очередному сбою, когда наша резервная база данных ошибочно продолжала выполнять процесс резервного копирования, что означало, что она тратила большую часть своего времени на попытки копирования из другой базы данных, в то время как должна была обслуживать запросы от серверов. В течение этого времени мы обнаружили другие проблемы и внесли дальнейшие улучшения - мы нашли устаревший, но вредный запрос, который мы смогли полностью исключить из базы данных, мы оптимизировали проверку соответствия требованиям для игроков, когда они присоединяются к игре, что еще больше уменьшило нагрузку, и в данный момент мы тестируем дальнейшие улучшения производительности. Мы также считаем, что устранили шторм, связанный с переподключением к базе данных, который мы наблюдали, поскольку во вторник этого не происходило.
Затем, во вторник, мы достигли очередного максимума одновременного количества игроков, когда только в одном регионе было несколько сотен тысяч игроков. В результате мы столкнулись с еще одним случаем снижения производительности базы данных, над причиной которого в настоящее время работают наши инженеры по базам данных. Мы также обратились к другим инженерам Blizzard для работы над более мелкими исправлениями, пока наша команда сосредоточилась на основных проблемах сервера, а также обратились за помощью к нашим сторонним партнерам.
Почему это происходит:
Оставаясь верными оригинальной игре, мы сохранили много устаревшего кода. Однако одна из унаследованных служб, в частности, с трудом справляется с современным поведением игроков.
Этот сервис, с некоторыми обновлениями по сравнению с оригиналом, обрабатывает критически важные части игровой функциональности, а именно: создание/присоединение к игре, обновление/чтение/фильтрация списков игр, проверка работоспособности игрового сервера и чтение персонажей из базы данных, чтобы убедиться, что ваш персонаж может участвовать во всем, что вы выбрали. Важно отметить, что эта служба является синглтоном, что означает, что мы можем запустить только один ее экземпляр, чтобы все игроки всегда видели самый актуальный и правильный список игр. Мы оптимизировали этот сервис во многих отношениях, чтобы он соответствовал более современным технологиям, но, как мы уже говорили, многие наши проблемы связаны с созданием игр.
Мы упомянули "современное поведение игроков", потому что это интересный момент, о котором стоит задуматься. В 2001 году в интернете не было такого количества материалов о том, как "правильно" играть в Diablo II (бегство к Баалу для получения XP, Pindleskin/Ancient Sewers/etc для поиска магии и т.д.). Однако сегодня новый игрок может найти любое количество замечательных создателей контента, которые научат его играть в игру разными способами, многие из которых включают в себя большую нагрузку на базу данных в виде создания, загрузки и уничтожения игр в быстрой последовательности. Хотя мы и предвидели это - игроки, создающие новых персонажей на новых серверах, упорно работающие над получением своих магических предметов, - мы сильно недооценили масштабы, которые мы получили в результате бета-тестирования.
Кроме того, в целом, мы слишком часто сохраняли данные в глобальную базу данных: Нет необходимости делать это так часто, как мы делали. Мы должны сохранять вас в региональной базе данных, а в глобальной базе данных сохранять только тогда, когда нам нужно вас разблокировать - это одна из мер, которые мы ввели. Сейчас мы пишем код, чтобы полностью изменить то, как мы это делаем, так что мы почти никогда не будем сохранять данные в глобальную базу данных, что значительно снизит нагрузку на этот сервер, но это переделка архитектуры, которая займет некоторое время для создания, тестирования и последующей реализации.
Замечание о потере прогресса:
Потеря прогресса, с которой столкнулись некоторые игроки, связана с тем, как мы делаем блокировку персонажа в региональных и глобальных базах данных - мы блокируем вашего персонажа в глобальной базе данных, когда вы назначены на регион (например, когда вы играете в регионе США, ваш персонаж привязан к региону США, и большинство действий решаются в базе данных региона США).
Проблема заключалась в том, что во время перерыва в работе сервера, когда база данных падала, некоторые персонажи застревали в региональной базе данных, и у нас не было возможности переместить их в глобальную базу данных. На тот момент мы полагали, что у нас есть два варианта: либо мы разблокируем всех с несохраненными изменениями в глобальной базе данных, потеряв тем самым часть прогресса из-за перезаписи, которая произойдет в глобальной базе данных, либо мы полностью остановим игру на неопределенное время и запустим скрипт для записи региональных данных в глобальную базу данных.
В то время мы приняли первое решение: мы посчитали, что важнее поддерживать игру в рабочем состоянии, чтобы люди могли играть, а не останавливать игру на длительный период времени для восстановления данных. Мы приносим глубокие извинения всем игрокам, которые потеряли важный прогресс или ценные предметы. Как игроки, мы знаем, что такое откат, и глубоко это чувствуем.
В дальнейшем мы считаем, что у нас есть способ восстановления персонажей, который не приведет к значительной потере данных - в случае падения сервера потери не должны превышать нескольких минут.
Это уже лучше, но все еще недостаточно хорошо в наших глазах.
Что мы делаем для этого:
Ограничение скорости: Мы ограничиваем количество операций с базой данных, связанных с созданием игр и присоединением к ним, и мы знаем, что многие из вас чувствуют это. Например, для тех, кто занимается бегом в Pindleskin, вы будете входить и выходить из игры и создавать новую в течение 20 секунд. В этом случае вы будете ограничены в скорости в определенный момент. Когда это происходит, в сообщении об ошибке будет сказано, что возникла проблема связи с игровыми серверами: это не является показателем того, что игровые серверы не работают в данном конкретном случае, это просто означает, что вы были ограничены в скорости, чтобы временно снизить нагрузку на базу данных в интересах поддержания игры. Мы можем заверить вас, что на данный момент это просто смягчение - мы не рассматриваем это как долгосрочное исправление.
Создание очереди на вход: Прошедшие выходные были серией проблем, а не одной и той же проблемой снова и снова. В связи с оживлением базы игроков, добавлением нескольких платформ и другими проблемами, связанными с масштабированием, мы можем продолжать сталкиваться с небольшими проблемами. Чтобы быстро их диагностировать и решить, нам нужно убедиться, что "стадность" - большое количество игроков, входящих в игру одновременно, - прекратилась. Для решения этой проблемы у нас есть люди, которые работают над очередью входа, подобно тому, с чем вы, возможно, сталкивались в World of Warcraft. Это позволит поддерживать онлайн на безопасном уровне, который мы имеем на данный момент, чтобы мы могли отслеживать, где система испытывает нагрузку, и устранять ее до того, как она полностью выведет игру из строя. Каждый раз, когда мы будем устранять напряжение, мы сможем увеличивать лимит онлайна. Эта очередь входа уже частично реализована на бэкенде (сейчас это выглядит как неудачная аутентификация в клиенте) и должна быть полностью развернута в ближайшие дни на ПК, а затем и на консоли.
Разбиение критических частей функциональности на более мелкие сервисы: Эта работа как частично ведется для вещей, которые мы можем решить менее чем за день (некоторые уже завершены на этой неделе), так и запланирована для более крупных проектов, таких как новые микросервисы (например, сервис GameList, который отвечает только за предоставление игрокам списка игр). Как только критическая функциональность будет разрушена, мы сможем рассмотреть возможность масштабирования наших сервисов управления играми, что позволит снизить нагрузку.
У нас есть люди, которые работают невероятно усердно, чтобы управлять инцидентами в режиме реального времени, диагностировать проблемы и внедрять исправления - не только в команде D2R, но и во всей Blizzard. Эта игра так много значит для всех нас. Многие из нас в команде являются игроками D2 на протяжении всей жизни - мы играли во время ее первого запуска в 2000 году, некоторые являются частью сообщества моддеров и так далее. Мы можем заверить вас, что будем продолжать работать до тех пор, пока впечатления от игры не станут приятными не только для нас как разработчиков, но и как игроков и членов сообщества.
В общем контентмейкеры зло - вот насмотрятся всяких гайдов про абузы, а потом сервера крашат! Игра вообще 2001 года для Windows XP максимум, а вы тут со своими 10ками. А игроки вообще стадо! Этож надо додуматься - в одну секунду ломиться сотнями тысяч юзеров на один бедный несчастный сервер! Ну ничего, в очередях постоите - подумаете над своим поведением!
После запуска Diablo II: Resurrected мы столкнулись с многочисленными проблемами на сервере, и мы хотели бы предоставить некоторую прозрачность в отношении причин этих проблем и шагов, которые мы уже предприняли для их решения. Мы также хотим дать вам некоторое представление о том, как мы будем двигаться дальше.
tl;dr: Перебои в работе нашего сервера не были вызваны какой-то одной проблемой; мы решаем каждую проблему по мере ее возникновения, используя как смягчающие решения, так и долгосрочные архитектурные изменения. Небольшое количество игроков столкнулось с потерей прогресса персонажа - в дальнейшем любая потеря из-за падения сервера должна быть ограничена несколькими минутами. Для нас это не является полным решением проблемы, и мы продолжаем работать над этим вопросом. Наша команда, с помощью других сотрудников Blizzard, работает над тем, чтобы довести впечатления от игры до такого уровня, который будет приятен всем.
Мы немного углубимся в технические подробности, но мы надеемся, что в целом это поможет вам понять, почему происходили эти сбои и что мы делали для устранения каждого случая, а также как мы расследуем общую причину. Давайте начнем с самого начала.
Проблема (проблемы) с серверами:
Прежде чем говорить о проблемах, мы кратко расскажем вам о том, как работают наши серверные базы данных. Во-первых, есть наша глобальная база данных, которая существует как "единственный источник правды" для всей информации о вашем персонаже и его прогрессе. Как вы можете себе представить, это большая задача для одной базы данных, и сама по себе она не справится. Поэтому для снижения нагрузки и задержек на нашу глобальную базу данных, каждый регион - Северная Африка, ЕС и Азия - имеет отдельные базы данных, которые также хранят информацию о вашем персонаже и его прогрессе, и база данных вашего региона будет периодически записывать данные в глобальную базу данных. Большинство ваших внутриигровых действий выполняются с этой региональной базой данных, потому что она быстрее, и ваш персонаж "заперт" в ней для поддержания целостности индивидуальных записей персонажа. Глобальная база данных также является резервной на случай сбоя основной.
Учитывая это, чтобы объяснить, что происходит, мы сосредоточимся на простоях с субботы 9 октября по настоящее время.
В субботу утром по тихоокеанскому времени у нас произошел глобальный сбой из-за внезапного и значительного увеличения трафика. Это был новый порог, с которым наши серверы еще не сталкивались, даже во время запуска. Это усугубилось обновлением, которое мы выпустили накануне, чтобы повысить производительность при создании игр - эти два фактора в совокупности перегрузили нашу глобальную базу данных, что привело к тайм-ауту. Мы решили откатить ранее выпущенное в пятницу обновление, надеясь, что это снизит нагрузку на серверы до воскресенья, а также даст нам возможность глубже изучить первопричину.
Однако в воскресенье стало ясно, что того, что мы сделали в субботу, было недостаточно - мы увидели еще больший рост трафика, что привело к очередному сбою. Наши игровые серверы наблюдали отключение от базы данных и немедленно пытались подключиться снова, причем неоднократно, что означало, что у базы данных не было времени, чтобы наверстать упущенное, поскольку она была слишком занята обработкой непрерывного потока попыток подключения со стороны игровых серверов. В это время мы также увидели, что можем внести улучшения в конфигурацию журнала событий базы данных, который необходим для восстановления здорового состояния в случае сбоя базы данных, поэтому мы выполнили эти работы и провели дальнейший анализ первопричины.
Обоюдоострым мечом воскресного сбоя стало то, что из-за того, с чем мы столкнулись в субботу, мы создали, по сути, учебник по быстрому восстановлению после сбоя. Это было хорошо.
Но поскольку мы так быстро вернулись в сеть в пик активности игроков, когда сотни тысяч игр проходили в течение десятков минут, мы снова упали. Что было плохо.
Поэтому нам нужно было внедрить множество исправлений, включая улучшения конфигурации и кода, которые мы внедрили в резервную глобальную базу данных. Это привело нас к понедельнику, 11 октября, когда мы произвели переключение между глобальными базами данных. Это привело к очередному сбою, когда наша резервная база данных ошибочно продолжала выполнять процесс резервного копирования, что означало, что она тратила большую часть своего времени на попытки копирования из другой базы данных, в то время как должна была обслуживать запросы от серверов. В течение этого времени мы обнаружили другие проблемы и внесли дальнейшие улучшения - мы нашли устаревший, но вредный запрос, который мы смогли полностью исключить из базы данных, мы оптимизировали проверку соответствия требованиям для игроков, когда они присоединяются к игре, что еще больше уменьшило нагрузку, и в данный момент мы тестируем дальнейшие улучшения производительности. Мы также считаем, что устранили шторм, связанный с переподключением к базе данных, который мы наблюдали, поскольку во вторник этого не происходило.
Затем, во вторник, мы достигли очередного максимума одновременного количества игроков, когда только в одном регионе было несколько сотен тысяч игроков. В результате мы столкнулись с еще одним случаем снижения производительности базы данных, над причиной которого в настоящее время работают наши инженеры по базам данных. Мы также обратились к другим инженерам Blizzard для работы над более мелкими исправлениями, пока наша команда сосредоточилась на основных проблемах сервера, а также обратились за помощью к нашим сторонним партнерам.
Почему это происходит:
Оставаясь верными оригинальной игре, мы сохранили много устаревшего кода. Однако одна из унаследованных служб, в частности, с трудом справляется с современным поведением игроков.
Этот сервис, с некоторыми обновлениями по сравнению с оригиналом, обрабатывает критически важные части игровой функциональности, а именно: создание/присоединение к игре, обновление/чтение/фильтрация списков игр, проверка работоспособности игрового сервера и чтение персонажей из базы данных, чтобы убедиться, что ваш персонаж может участвовать во всем, что вы выбрали. Важно отметить, что эта служба является синглтоном, что означает, что мы можем запустить только один ее экземпляр, чтобы все игроки всегда видели самый актуальный и правильный список игр. Мы оптимизировали этот сервис во многих отношениях, чтобы он соответствовал более современным технологиям, но, как мы уже говорили, многие наши проблемы связаны с созданием игр.
Мы упомянули "современное поведение игроков", потому что это интересный момент, о котором стоит задуматься. В 2001 году в интернете не было такого количества материалов о том, как "правильно" играть в Diablo II (бегство к Баалу для получения XP, Pindleskin/Ancient Sewers/etc для поиска магии и т.д.). Однако сегодня новый игрок может найти любое количество замечательных создателей контента, которые научат его играть в игру разными способами, многие из которых включают в себя большую нагрузку на базу данных в виде создания, загрузки и уничтожения игр в быстрой последовательности. Хотя мы и предвидели это - игроки, создающие новых персонажей на новых серверах, упорно работающие над получением своих магических предметов, - мы сильно недооценили масштабы, которые мы получили в результате бета-тестирования.
Кроме того, в целом, мы слишком часто сохраняли данные в глобальную базу данных: Нет необходимости делать это так часто, как мы делали. Мы должны сохранять вас в региональной базе данных, а в глобальной базе данных сохранять только тогда, когда нам нужно вас разблокировать - это одна из мер, которые мы ввели. Сейчас мы пишем код, чтобы полностью изменить то, как мы это делаем, так что мы почти никогда не будем сохранять данные в глобальную базу данных, что значительно снизит нагрузку на этот сервер, но это переделка архитектуры, которая займет некоторое время для создания, тестирования и последующей реализации.
Замечание о потере прогресса:
Потеря прогресса, с которой столкнулись некоторые игроки, связана с тем, как мы делаем блокировку персонажа в региональных и глобальных базах данных - мы блокируем вашего персонажа в глобальной базе данных, когда вы назначены на регион (например, когда вы играете в регионе США, ваш персонаж привязан к региону США, и большинство действий решаются в базе данных региона США).
Проблема заключалась в том, что во время перерыва в работе сервера, когда база данных падала, некоторые персонажи застревали в региональной базе данных, и у нас не было возможности переместить их в глобальную базу данных. На тот момент мы полагали, что у нас есть два варианта: либо мы разблокируем всех с несохраненными изменениями в глобальной базе данных, потеряв тем самым часть прогресса из-за перезаписи, которая произойдет в глобальной базе данных, либо мы полностью остановим игру на неопределенное время и запустим скрипт для записи региональных данных в глобальную базу данных.
В то время мы приняли первое решение: мы посчитали, что важнее поддерживать игру в рабочем состоянии, чтобы люди могли играть, а не останавливать игру на длительный период времени для восстановления данных. Мы приносим глубокие извинения всем игрокам, которые потеряли важный прогресс или ценные предметы. Как игроки, мы знаем, что такое откат, и глубоко это чувствуем.
В дальнейшем мы считаем, что у нас есть способ восстановления персонажей, который не приведет к значительной потере данных - в случае падения сервера потери не должны превышать нескольких минут.
Это уже лучше, но все еще недостаточно хорошо в наших глазах.
Что мы делаем для этого:
Ограничение скорости: Мы ограничиваем количество операций с базой данных, связанных с созданием игр и присоединением к ним, и мы знаем, что многие из вас чувствуют это. Например, для тех, кто занимается бегом в Pindleskin, вы будете входить и выходить из игры и создавать новую в течение 20 секунд. В этом случае вы будете ограничены в скорости в определенный момент. Когда это происходит, в сообщении об ошибке будет сказано, что возникла проблема связи с игровыми серверами: это не является показателем того, что игровые серверы не работают в данном конкретном случае, это просто означает, что вы были ограничены в скорости, чтобы временно снизить нагрузку на базу данных в интересах поддержания игры. Мы можем заверить вас, что на данный момент это просто смягчение - мы не рассматриваем это как долгосрочное исправление.
Создание очереди на вход: Прошедшие выходные были серией проблем, а не одной и той же проблемой снова и снова. В связи с оживлением базы игроков, добавлением нескольких платформ и другими проблемами, связанными с масштабированием, мы можем продолжать сталкиваться с небольшими проблемами. Чтобы быстро их диагностировать и решить, нам нужно убедиться, что "стадность" - большое количество игроков, входящих в игру одновременно, - прекратилась. Для решения этой проблемы у нас есть люди, которые работают над очередью входа, подобно тому, с чем вы, возможно, сталкивались в World of Warcraft. Это позволит поддерживать онлайн на безопасном уровне, который мы имеем на данный момент, чтобы мы могли отслеживать, где система испытывает нагрузку, и устранять ее до того, как она полностью выведет игру из строя. Каждый раз, когда мы будем устранять напряжение, мы сможем увеличивать лимит онлайна. Эта очередь входа уже частично реализована на бэкенде (сейчас это выглядит как неудачная аутентификация в клиенте) и должна быть полностью развернута в ближайшие дни на ПК, а затем и на консоли.
Разбиение критических частей функциональности на более мелкие сервисы: Эта работа как частично ведется для вещей, которые мы можем решить менее чем за день (некоторые уже завершены на этой неделе), так и запланирована для более крупных проектов, таких как новые микросервисы (например, сервис GameList, который отвечает только за предоставление игрокам списка игр). Как только критическая функциональность будет разрушена, мы сможем рассмотреть возможность масштабирования наших сервисов управления играми, что позволит снизить нагрузку.
У нас есть люди, которые работают невероятно усердно, чтобы управлять инцидентами в режиме реального времени, диагностировать проблемы и внедрять исправления - не только в команде D2R, но и во всей Blizzard. Эта игра так много значит для всех нас. Многие из нас в команде являются игроками D2 на протяжении всей жизни - мы играли во время ее первого запуска в 2000 году, некоторые являются частью сообщества моддеров и так далее. Мы можем заверить вас, что будем продолжать работать до тех пор, пока впечатления от игры не станут приятными не только для нас как разработчиков, но и как игроков и членов сообщества.
Сложно было найти =)
В общем контентмейкеры зло - вот насмотрятся всяких гайдов про абузы, а потом сервера крашат! Игра вообще 2001 года для Windows XP максимум, а вы тут со своими 10ками. А игроки вообще стадо! Этож надо додуматься - в одну секунду ломиться сотнями тысяч юзеров на один бедный несчастный сервер! Ну ничего, в очередях постоите - подумаете над своим поведением!