Рубрики
Uncategorized

Проникновение в кэш, Параллелизм и сбои, Синхронизированное прерывание, Лучшие практики и Оптимизированные решения

Автор оригинала: David Wong.

Оригинальная аннотация взята из:

Проникновение в кэш, параллелизм и сбои, решения от передовых архитекторов https://community.qingcloud.com/topic/463

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

Проникновение в кэш, Параллелизм и сбои, Прерывания синхронизации, Рекомендации и сценарии оптимизации

Когда мы используем кэширование, будь то Redis или Memcached, мы обычно сталкиваемся с тремя проблемами:

  • Проникновение в кэш

  • Кэш одновременно

  • Аннулирование кэша

  • Прерывание синхронизации и репликации

Проникновение в кэш

Примечание: В чем проблемы с приведенными выше тремя цифрами?

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

На этом этапе, если мы запросим определенные данные в ____________ Если кэш не существует все время, это приведет к тому, что БД будет запрашиваться для каждого запроса. Таким образом, кэш теряет свое значение, и при высоком трафике база данных может зависнуть.

Каков наилучший способ решения этой проблемы?

Если кто-то часто использует несуществующие ключи для атаки на наши приложения, это уязвимость. Один из разумных способов сделать это-представить несуществующий ключ к значению. Например, “ключ”,”&”.

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

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

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

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

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

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

  • Серверная асинхронная синхронизация проверяет наличие кэшей и активно устанавливает их

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

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

Кэш одновременно

Иногда, если одновременный доступ к веб-сайту высок, в случае сбоя кэша может быть несколько процессов, одновременно запрашивающих базу данных, настраивая кэш. Если параллелизм действительно велик, это также может вызвать давление на БД и проблему частых обновлений кэша. Моя идея сейчас состоит в том, чтобы заблокировать запрос кэша, если КЛЮЧ не существует, заблокировать его, а затем проверить базу данных в кэше, а затем разблокировать; если другие процессы обнаружат блокировку, подождите, а затем верните данные после разблокировки или введите запрос БД.

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

Аннулирование кэша

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

Как решить эти проблемы?

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

Второй вопрос, который мы обсуждали, касался одного и того же кэша, а третий – множества кэшей.

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

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

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

Замечательные вопросы и ответы Вопрос: Как решить проблему согласованности БД и кэша?

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

Вопрос: Попросите кэш проникнуть в этот фрагмент! Например, пользователь запрашивает статьи через идентификатор, в соответствии с тем, что было сказано ранее, чтобы задать значение для КЛЮЧА кэша. Если он интерполируется через идентификатор, обнаруживается, что это заданное значение, такое как”&”, то что значит продолжать ждать доступа после этого? Когда идентификатор действительно будет привязан к значению, необходимому пользователю?

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

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

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

Вопрос: В чем заключается концепция многоуровневого кэширования?

Многоуровневое кэширование, как я упоминал в статье, которую я отправил вам ранее сегодня, использует Ehcache и Redis в качестве вторичного кэширования, как я упоминал в своей предыдущей статье http://www.jianshu.com/p/2cd6ad416a5a. Но также возникнут проблемы с согласованностью. Если нам нужна сильная согласованность, между синхронизацией кэша и базы данных будет задержка по времени. Поэтому в процессе конкретного развития мы должны проводить конкретный анализ в соответствии со сценариями. Кэш второго уровня больше предназначен для решения проблемы проникновения в кэш и надежности программ. Когда возникает проблема с централизованным кэшем, наше приложение может продолжать работать. Все в порядке.