Sphinxsearch распределяем индексы по потокам

При использовании sphinxsearch можно столкнуться с 2-мя неприятными моментами. Во-первых объем индекса не может превышать 4 GB и более этого количества проиндексировано быть не может. Это конечно достаточно не малый объем, но тем не менее играет роль, особенно если бд хранит не только ascii текст. К тому же, некоторые запросы могут отнимать массу времени и сильно нагружать цп. Время отведенное на запрос, а соответственно и нагрузку от него можно отрегулировать добавлением в конце запроса параметров  OPTION max_query_time=500 В данном случае время выполнения будет ограничено 500 мс, которых в принципе должно хватать. Однако, когда объем большой за это время у нас может ничего не найтись. Решение двух проблем выше в разбиении индексов и многопоточной обработке. Разобьем сначала индексы нашей огромной бд на части, затем создадим под них распределенный(distributed) индекс. Все лишние параметры в этом конфиге я опущу, дабы не захламлять.

Разбиваем запросы формирующие индексы на основе id на 10 приблизительно равных частей:

И прописываем параметры индексов:

Объединяем их в один распределённый индекс:

Отлично! Проблема с объемом решена, сюда влезет 40 GB проиндексированных данных, что реально до хрена. Проведенные выше манипуляции позволяют нам настроить до 10 распаралелленных потоков, которые будут обрабатывать, каждый свою, часть распределенного индекса. Под каждый поток выделяется 1 ядро, поэтому если на борту меньше 10 ядер, придётся довольствоваться тем что есть и выставить кол-во потоков не более чем количество ядер. В моём случае ядер 16, поэтому смело прописываем:

 

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *