Я не очень много знаю о серверах, но знаю, что есть много способов улучшить производительность работы веб-приложений с точки зрения оборудования.
Например, начиная с одного сервера, вы можете:
Но как вы можете масштабировать сервер базы данных? Можно ли иметь несколько серверов с одной и той же базой данных? Если да, то как это обычно работает?
Я понимаю, как работает балансировщик нагрузки / несколько веб-серверов, но можно ли применить тот же подход к серверам баз данных?
Это очень широкий вопрос.
Общий ответ состоит в том, что это можно сделать несколькими способами; два основных из них:
Репликация здесь база данных копируется с одного компьютера на другой. Используя этот метод, вы теоретически должны иметь как минимум две идентичные базы данных. С помощью реплицированных баз данных вы можете запрашивать ваши данные в любой из них; вам нужно только быть осторожным с записями, чтобы они не конфликтовали между серверами.
Кластеризация использует общее хранилище данных и сервер базы данных, который распознает, что хранилище данных является общим, и обрабатывает его должным образом. Также предлагается кластерная файловая система, такая как GFS.
Вы можете немного сбалансировать нагрузку; но это быстро становится сложным. Я обнаружил, что наиболее полезно знать, какие операции обычно выполняет ваша база данных. Если у вас есть сайт; обычно его читает. Для отслеживания приложений (например) у вас будет много записей.
Если у вас много операций чтения, вы можете создать множество зеркал только для чтения, поставить на передний план балансировщик нагрузки, и все готово. Каждый запрос сбалансирован, поэтому каждый запрос получает максимальное количество ресурсов.
Для систем с большим объемом записи это немного сложнее, потому что, когда вы добавляете новый сервер, они должны знать, что делает другой - вот где вступает в действие блокировка. Если у вас есть серверы A и B; A получает запрос на обновление или вставку, прежде чем он сможет изменить таблицу, он должен сказать: «Эй, Б, убедитесь, что вы не меняете эту таблицу, я собираюсь изменить ее» (блокировка), а затем фиксирует изменение. Все это происходит по сети (обычно), что означает, что это может быть медленным (мс, а не мкс), что может снизить производительность. По мере добавления серверов производительность падает. С A, B и C; Перед фиксацией A должен поговорить с B и C.
Надеюсь, это послужит введением в масштабирование базы данных. В настоящее время я изучаю предложения по балансировке нагрузки Citrix Netscaler DB, которые могут помочь с этими вопросами; Я бы рекомендовал посмотреть хотя бы те документы, которые у них есть по теме :)
Это действительно зависит от технологии базы данных, но обычно это достигается с помощью сегментирования, репликации мастер-мастер или репликации мастер-подчиненный, при этом все операции записи идут к мастеру (-ам), а все чтения - от подчиненного (-ых).
Есть много других способов, но это самые распространенные.