Распределенная база данных. Вопрос.

b0bah1

Новичок
В общем на одном из новых проектов решили сделать БД на разных серверах, так же клиенты которые будут обращаться к ним тоже на разных серверах.
Дабы избежать нагрузок и возможность расширение с возросшими нагрузками.
Каждый юзер привязан к своему серверу и все данные о нем хранятся только на этом сервере.
Есть управляющий сервер который хранит данные обо всех серверах и какой юзер на каком сервере находится, при первом запросе мы получаем данные и больше
не проверяем это на управляющем сервере а идет обращение только к серверу где хранится юзер.
Теперь вопросы:
1. Есть грубо говоря поиск данных у пользователей, например выборка предметов по фильтрам. Нам нужно получить данные например с 5 серверов с этой выборкой.
Нужно по идее сделать 5 параллельных запросов, а потом их сложить и выдать пользователю. Как это можно реализовать именно параллельные запросы на PHP?
2. Вопрос про кеширование. Есть SELECTы по LIKE названию предмета, его цене и т.д. фильтров может быть около 10, и кол-во предметов на каждом сервере может быть несколько миллионов. На текущем проекте я использую мемкешь, но там для селектов используется всего несколько десятков тысяч предметов, а тут будут миллионы. Нагрузка будет очень высокой. Какие есть идеи реализации кеша при запросах? Когда 1 пользователь будет все отлично работать, а вот 100-200 запросов одновременных на выборки будет убивать базы.
Архитектура проекта выглядит примерно вот так:

 

fixxxer

К.О.
Партнер клуба
Вопрос про кеширование. Есть SELECTы по LIKE названию предмета, его цене и т.д. фильтров может быть около 10, и кол-во предметов на каждом сервере может быть несколько миллионов.
Если разные пользователи постоянно ищут разное, то никакой кэш не поможет. Делай такой поиск более подходящими средствами, чем mysql. Например, elasticsearch.
 

b0bah1

Новичок
А в самом php mysql нету возможности выполнять параллельные запросы? Когда например 10 запросов одновременно запускаются к 10 разным серверам?
 

fixxxer

К.О.
Партнер клуба
ну то есть чтобы like-ами убить не один сервер, а все сразу? :) Ты хочешь map-reduce? Из коробки такого нет, конечно
 

b0bah1

Новичок
Даже нет такого что бы типа отправил запрос но не читаешь ответ? а потом спустя время читаешь?
 

antson

Новичок
Партнер клуба

fixxxer

К.О.
Партнер клуба
@b0bah1, с мысклем тебе придется делать это все вручную, да и все равно получишь fullscan-ы.

Я бы взял для такого поиска более специализированное решение, тот же elasticsearch. Он и по атрибутам эффективно искать умеет, и фуллтекст, и масштабируется.
 

WMix

герр M:)ller
Партнер клуба
нативно можно решить разными способами
на уровне базы federated, параллельность через thread, можно создать мини базу для задачи и обновлять ее, практически что предложено выше
 

fixxxer

К.О.
Партнер клуба
Можно много что, но инвертированных индексов вместо фуллскана от этого не появится ;)

Ну, хотя, есть веселый костыль с использованием mysql fulltext-а для поиска по атрибутам - хранить атрибуты "словами" и отключить морфологию. :)
 

b0bah1

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

fixxxer

К.О.
Партнер клуба
Ну, в сфинксе по атрибутам фактически фулскан, хоть и очень быстрый (с ним, кстати, такой костыль тоже сработает, если прям очень надо ускорить). Elastic умеет инвертированные индексы использовать.
 

antson

Новичок
Партнер клуба
@fixxxer, на сколько я знаю сфинкс построен на инвертированный индекс.
 

antson

Новичок
Партнер клуба
@fixxxer, отключаем морфологию . атрибуты собираем как теги в одно текстовое поле.
для признаков типа произвольное значение без словаря (н-р цены) вводим диапазоны наиболее часто требуемых при поиске и тоже сажаем как тег.

Тег
предлогИДтерминатор

pr1234n - процессор
ram1234n - объем озу

здесь 1234 - это ид записи в таблице
а терминатор чтобы точно не попутать ид 123 и 1234
 
Последнее редактирование:

Yoskaldyr

"Спамер"
Партнер клуба
@antson, лучше разделитель еще добавить предлогом и ид

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

antson

Новичок
Партнер клуба
@b0bah1, смотрю я на эту схему и у меня вопрос 100 тысяч в месяц на хостинг уже есть ?
а какая посещаемость закладывается ? сколько в пике посетителей в секунду ?
 

fixxxer

К.О.
Партнер клуба
@antson, я ровно про это и говорил как про "веселый костыль". Это и в mysql FT сработает.

@Breeze, аха, массив таких и reduce в цикле с поллингом... я бы не назвал это "из коробки"
 

antson

Новичок
Партнер клуба
@fixxxer, просто поднять нужное количество инстансев сфинкса имхо проще чем городить репликацию субд
 
Сверху