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