Каковы наилучшие способы смягчения базы данных ввода / вывода для больших веб-сайтов? - PullRequest
3 голосов
/ 01 июля 2011

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

Ответы [ 4 ]

4 голосов
/ 01 июля 2011

Вот наиболее распространенные решения для производительности базы данных:

  • Кэширование (Memcache и т. Д.)
  • Добавление памяти в базу данных
  • Дополнительные серверы баз данных (master/ slave или sharding)
  • Использовать другой тип базы данных (NoSQL, Redis и т. д.)
  • Индексы для ускорения чтения.(осторожно, слишком много повлияет на производительность записи)
  • SSD (быстрые SSD очень помогут)
  • RAID
  • Оптимизация / настройка SQL-запросов
2 голосов
/ 15 мая 2013

10 лет назад стандартный ответ - помимо оптимизации вашей конкретной базы данных - был масштабирован с использованием MySQL двумя способами.

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

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

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

После того, как вы осветлили свою базу данных, вы не можете выполнять объединения, и поиск по диапазону становится затруднительным.Это подмножество иногда называют операциями CRUD, и поэтому MySQL является избыточным.Многие китайские социальные сети осознали это и используют Shards Redis (который намного быстрее, чем MySQL), и написали свой собственный слой шарда и логический уровень приложения.

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

Другой подход заключается в использовании распределенной базы данных, которая обычно имеет имена NoSQL или NewSQL и имеет множество подходов.Некоторые, такие как MongoDB, имеют систему разделения для управления этим отображением, но для добавления серверов требуются шаги вручную.Кассандра имеет более гибкую схему кластеризации, называемую распределенной архитектурой.Такие системы, как CouchBase и Aerospike, используют механизм случайного распределения, который устраняет необходимость в слое осколков.Некоторые из этих баз данных могут превышать от 100 000 до 200 000 запросов в секунду на сервер с боковой шкалой для добавления новых серверов - достаточно для очень больших операций.При таком стиле кластеризации вы часто можете получить более высокий уровень избыточности и надежности.

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

2 голосов
/ 01 июля 2011

Это очень сильно зависит от модели использования и типа данных.Есть действительно разные вещи, которые нужно сделать в зависимости от того, будет ли поддерживаться транзакция, заинтересованы ли вы в полной согласованности или «возможной согласованности», насколько велики данные (все они поместятся в огромной памяти?), Насколько сложны данныеи запросы, список может продолжаться и продолжать .... Множество переменных и только после перечисления всех ограничений / требований вы сможете принять правильное решение.Однако есть два основных совета:

  • Использовать твердотельные накопители
  • Использовать распределенную архитектуру с распределенным подходом "ключ / значение" NoSQL (только если вам не нужно использовать сложные отношения и транзакции)
2 голосов
/ 01 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...