[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Распределенные базы данных MySQL и PHP.
Magnetic
Уважаемые госпада профиссеоналы, помогите решить в каком направлении работать дальше в развитии проекта.
Есть CMS и называется она DLE.
Есть база данных MySQL 5.
Работает это все на WindowsServer/Apach/PHP5.

Задача состоит в том, что бы организовать 5 сайтов (на отдельных хостах).
У каждого сайта есть своя собственная база данных на том хосте где крутится сайт.
Но пользователи всех 5-и сайтов одинаковы, т. е. если пользователь зарегистрировался на сайте №1 и открыл сессию, то перейдя на сайт №2 он сможет продолжить работать с этой же сессией, либо залогинится по тому логину/паролю который указал при регистрации на сайте №1.
И так для всех пяти.

Была такая идея:
1. В php скриптах CMS должно быть столько запросов сколько есть сайтов(в нашем примере 5), результаты запроса объединяются в общую таблицу и передаются дальше на обработку.
Но как следить за уникальностью идентификаторов записей в разных базах? И сильно ли большая нагрузка будет на хост из-за слияния результатов нескольких запросов в один?

P.S. Просьба сильно меня не ругать за плохую базу данных для этой цели и за неудачный выбор CMS. Изменить CMS и базу данных на другую не получится, они слишком сильно доработаны.



Спустя 8 минут, 27 секунд (19.04.2011 - 16:00) Magnetic написал(а):
Может быть возможно одним запросом выбирать данные из разных баз данных(на разных хостах)?

Спустя 1 час, 1 минута, 46 секунд (19.04.2011 - 17:02) sergeiss написал(а):
Как вариант - сделать всё на одном физическом хосте, чтобы пользоваться одной-единственной БД. Если это не возможно - то почему?

Спустя 1 час, 11 минут, 13 секунд (19.04.2011 - 18:13) Dr.Mars написал(а):
Автор темы походу не знает, что такое распределенная бд

Спустя 4 часа, 36 минут, 5 секунд (19.04.2011 - 22:50) kirik написал(а):
Цитата (Magnetic @ 19.04.2011 - 09:00)
Может быть возможно одним запросом выбирать данные из разных баз данных

Одним запросом - нет. Можно создавать 2 подключения: одно, которое работает с локальной БД; и второе, которое работает с удалённой БД. Затем переписать запросы таким образом, чтобы забирать данные юзера (логин/регистрация/сессия) из удалённой БД.
Совсем не красиво, но как вариант smile.gif

Спустя 9 часов, 54 минуты, 23 секунды (20.04.2011 - 08:44) Magnetic написал(а):
Цитата
Автор темы походу не знает, что такое распределенная бд
- Это справедливое утверждение. Тем не менее, нужно с чего-то начинать, в целом я представляю ту схему, которую хочу организовать, возможно я сделал ошибки в терменалогии.
Цитата
Как вариант - сделать всё на одном физическом хосте, чтобы пользоваться одной-единственной БД. Если это не возможно - то почему?
- В этом вопросе меня волнует вопрос производительности, предположим что хост будет (проц: 4*3Гг; оперативки: 4Гб), сколько пользователей смогут однавременно просматриваь страницы? Учитывая что на сайте будет более 50'000 новостей для каждого сайта, т. е. если зделать не 5 сайтов, а один, получается 250'000!
Цитата
Одним запросом - нет. Можно создавать 2 подключения: одно, которое работает с локальной БД; и второе, которое работает с удалённой БД. Затем переписать запросы таким образом, чтобы забирать данные юзера (логин/регистрация/сессия) из удалённой БД.
- Можно немножко поподробнее? Если я правильно понимаю, то это будет выглядеть примерно так:
1. $result1 = (получаем выборку из базы №1)
2. $result 2= (получаем выборку из базы №2)
3. $result_all = $result1 + $resul2; // Это я образно написал
4. Стандартная обработка $result_all

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

Спустя 25 минут, 21 секунда (20.04.2011 - 09:09) kirik написал(а):
Цитата (Magnetic @ 20.04.2011 - 01:44)
3. $result_all = $result1 + $resul2; // Это я образно написал

Неа..
Цитата (Magnetic @ 20.04.2011 - 01:44)
Т.е. мы берем исходный код, что бы не менять его, просто делаем дублирование запросов только к другим БД и обеденяем результаты в один общий большой результат

И неа smile.gif
Нужно сделать так, чтобы общая таблица(ы) находились на одном сервере и к нему делать запросы с остальных сайтов. В остальных БД этой таблицы вообще может не быть.

Цитата (Magnetic @ 20.04.2011 - 01:44)
И как следить за уникальностью ID?

Чисто теоретически примерно так:
есть 5 серверов. На каждом из серверов новости будут идти с автоинкриментом с шагом 5 (1,6,11). На втором 2,7,12; на третьем 3,8,13; на четвертом 4,9,14 и на пятом 5,10,15. Но это не совсем удобно.

Цитата (Magnetic @ 20.04.2011 - 01:44)
В этом вопросе меня волнует вопрос производительности, предположим что хост будет (проц: 4*3Гг; оперативки: 4Гб), сколько пользователей смогут однавременно просматриваь страницы? Учитывая что на сайте будет более 50'000 новостей для каждого сайта, т. е. если зделать не 5 сайтов, а один, получается 250'000!

Почему вы перемножили количество новостей на количество сайтов?) Получаются не запросы, а количество новостей. Нагрузка зависит от количества общей суммы юзеров "онлайн", от качества БД и запросов. Если с последним всё более-менее впорядке, то могу предположить что около 20-30к юзеров в месяц будет держать стабильно с таким железом.

Спустя 29 минут, 28 секунд (20.04.2011 - 09:39) Magnetic написал(а):
Если я правильно понял, схема будет выглядеть примерно так:
Таблицы сайта разделятся на две группы:
1. Общие таблицы для всех сайтов (инкримент 1)
2. Собственные таблицы для каждого сайта (инкримент 5)

В коде, запросы относящиеся к пользовательской информации будут для хоста на котором вертятся общие таблицы.
А запросы, относящиеся к новостям и вообще контенту в целом, выбираются из локальной базы сайта.

В случае, если необходимо составить список новостей со всех сайтов, различатся они будут шагом инкримента (в нашем случае 5), и соответственно колизии не появятся.

Если зарание не известно количество сайтов? Пусть известно, что уже есть 5 сайтов, планируется в течении 3 лет добавить еще N сайтов, следовательно мы можем предусматреть это и сделать инкримент с шагом 10 (запас для 5 сайтов), это как то отразится на скорости работы БД?

Спустя 39 минут, 44 секунды (20.04.2011 - 10:18) kirik написал(а):
Цитата (Magnetic @ 20.04.2011 - 02:39)
сделать инкримент с шагом 10 (запас для 5 сайтов), это как то отразится на скорости работы БД?

Нет, не скажется. Единственное что нужно предусмотреть это поле id должно быть int(unsigned).
Единственное что в данном случае не выйдет - запросы с JOIN'ом, которые затрагивают общую и локальную таблицы.
Вообще звучит вполне костыльно smile.gif
Если что сдвиг и шаг управляются переменными auto_increment_offset и auto_increment_increment в MySQL.

Спустя 6 часов, 29 минут, 48 секунд (20.04.2011 - 16:48) Magnetic написал(а):
Спасибо что разжували.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.