Как работают несколько серверов с точки зрения баз данных?

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

Например, начиная с одного сервера, вы можете:

  • Переместите базу данных на другой сервер.
  • Переместить статические файлы на CDN
  • Используйте несколько веб-серверов за балансировщиком нагрузки.

Но как вы можете масштабировать сервер базы данных? Можете ли вы иметь несколько серверов, работающих под одной и той же базой данных? Если да, то как это нормально работает?

Я понял, как работает балансировщик нагрузки / несколько веб-серверов, но можно ли применить тот же подход к серверам баз данных?

3 ответа

Решение

Это очень широкий вопрос.

Общий ответ заключается в том, что существует ряд способов сделать это; Вот два основных из них:

  • копирование
  • Кластеризация

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

Кластеризация использует общее хранилище данных и сервер базы данных, который распознает хранилище данных как общее и обрабатывает его должным образом. Также предлагается кластерная файловая система, такая как GFS.

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

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

Для систем с тяжелой записью это немного сложнее, потому что, когда вы добавляете новый сервер, они должны знать, что делает другой - это то место, где вступает блокировка. Если у вас есть серверы A и B; A получает запрос на обновление или вставку, прежде чем он сможет изменить таблицу, он должен сказать "эй B, убедитесь, что вы не меняете эту таблицу, я собираюсь ее изменить" (блокировка), а затем фиксирует это изменение. Все это происходит по сети (обычно), что означает, что он может быть медленным (не используется), что может снизить производительность. По мере добавления серверов производительность снижается. С А, В и С; A должен поговорить как с B, так и с C до совершения.

Надеюсь, это послужит введением в масштабирование БД. В настоящее время я изучаю предложения по балансировке нагрузки Citrix Netscalers DB, которые могут помочь с этими вопросами; Я бы порекомендовал посмотреть хотя бы документы, которые они имеют по теме:)

Это действительно зависит от технологии базы данных, но, как правило, это достигается с помощью шардинга, репликации master-master или репликации master-slave, при этом все записи идут на master(s), а все чтения - от slave(s).

Есть много других способов, но это самые распространенные.

Другие вопросы по тегам