Параллельное выполнение запросов на нескольких серверах баз данных (под управлением Microsoft SQL Server) - PullRequest
4 голосов
/ 16 февраля 2009

Можно ли настроить несколько серверов баз данных (на всех хостах одной базы данных) для одновременного выполнения одного запроса?

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

UPDATE

Что я имею в виду, примерно так:

  • Существует два сервера: Сервер1 и Сервер2
  • Обе базы данных хоста сервера Foo и оба экземпляра Foo идентичны
  • Я подключаюсь к Server1 и отправляю сложный (много объединений, много вычислений) запрос
  • Сервер1 решает, что некоторые вычисления должны быть выполнены на Сервер2 , и некоторые данные также должны быть прочитаны с этого сервера - соответствующие части запроса отправляются на Сервер2
  • Оба сервера считывают данные и выполняют необходимые вычисления
  • Наконец, результаты из Server1 и Server2 объединяются и возвращаются клиенту

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

ОБНОВЛЕНИЕ 2

Спасибо за советы, Джон и Вупута.

Я изучаю варианты увеличения и доступности и емкости базы данных MOSS. Так что я ищу какое-то готовое решение для балансировки нагрузки SQL Server, которое будет прозрачным для приложения , потому что я не могу изменить приложение в любом путь. Я полагаю, что SQL Server не имеет такой функции (а Oracle, насколько я понимаю, делает - это RAC, упомянутый wuputah).

ОБНОВЛЕНИЕ 3

Цитата из советов по кластеризации SQL Server статья:

Давайте начнем с разоблачения общего заблуждение. Вы используете MSCS кластеризацию для высокой доступности, не для нагрузки балансировка. Кроме того, SQL Server не есть встроенный, автоматический возможность балансировки нагрузки. Ты должен баланс нагрузки через ваш Физический дизайн приложения.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2009

То, о чем вы на самом деле говорите, это кластерное решение. Похоже, SQL Server и Oracle имеют решения для этого, но я ничего о них не знаю. Я могу предположить, что их было бы очень дорого покупать и реализовывать.

Возможные альтернативные предложения будут следующими:

  • Используйте репликацию master-slave и выполняйте сложные запросы чтения от slave. Все записи должны отправляться ведущему, а затем отправляться на ведомое устройство, чтобы все оставалось синхронизированным. Это помогает вещам идти быстрее, потому что ведомое устройство должно беспокоиться только о записях, поступающих от мастера, которые уже предопределены от имени ведомого (без блокировок и т. Д.). Если вы хотите использовать несколько серверов, это первое место, с которого я бы начал.
  • Использовать репликацию мастер-мастер. Это означает, что все записи с обоих серверов идут друг к другу, поэтому они остаются синхронизированными (по крайней мере, теоретически). Это имеет некоторые преимущества как ведущий-ведомый, но вам не нужно беспокоиться о записи на один сервер вместо другого. Более распространенное использование репликации мастер-мастер - для поддержки отработки отказа; Мастер-раб действительно лучше подходит для производительности.
  • Используйте функцию, о которой говорил Джон Сэнсом. Я не знаю много об этом, но кажется, что его основой является разбиение вашей базы данных на таблицы на разных серверах, что будет иметь как преимущества, так и недостатки. Большая проблема заключается в том, что, поскольку две системы не могут совместно использовать память, им придется совместно использовать большое количество данных по сети для вычисления сложных объединений.

Надеюсь, это поможет!

<ч />

RE Обновление 1:

Если вы не можете изменить приложение, есть надежда, но это может быть немного сложнее. Если вам нужно было настроить репликацию «ведущий-ведомый», вы можете настроить прокси-сервер для отправки запросов на чтение ведомым (и) и записи запросов к ведущим (и). Я видел это сделано с MySQL, но не SQLServer. Это немного проблематично, если вы не хотите сами писать прокси.

Это было , которое обсуждалось на SO ранее , так что вы можете найти больше информации там.

<ч />

RE Обновление 2:

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

2 голосов
/ 16 февраля 2009

Да, я верю, что это возможно, ну вроде, позвольте мне объяснить.

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

http://msdn.microsoft.com/en-us/library/ms191440.aspx

Например, сервер A может содержать мою таблицу клиентов, а сервер B - мою таблицу заказов. Распределенные запросы можно использовать для запуска запроса, который ссылается как на сервер A, так и на сервер B, причем каждый сервер управляет обработкой своих локальных данных (что может включать использование параллелизма).

Теперь теоретически вы можете хранить одни и те же данные на каждом сервере и разрабатывать свои запросы специально, чтобы на определенные серверы ссылались только на определенные таблицы, тем самым распределяя нагрузку запроса. Однако это не совсем параллельная обработка с точки зрения ЦП.

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

http://databases.about.com/cs/sqlserver/a/aa041303a.htm

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

1 голос
/ 16 февраля 2009

Интересный вопрос, но я изо всех сил пытаюсь понять, что это полезно для многопользовательской системы.

Если я единственный пользователь, у которого половина запросов выполняется на Сервере1, а другая половина на Сервере2 звучит круто:)

Если есть два одновременно работающих пользователя (скажем, с запросами одинаковой сложности), я изо всех сил пытаюсь понять, что это помогает: (

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

Которые в основном являются серверами федеративных баз данных. Вместо того, чтобы все мои Клиенты были на одном сервере, а все мои Заказы - на другом, я мог бы, скажем, иметь своих клиентов из США и их заказы на одном, а моих европейских клиентов / заказов на другом, и только если мой запрос охватывает оба любая необходимость в шаге слияния.

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