Как подружить Sphinx с OpenShift для ThinkingSphinx под Rails

от автора

Для стейджинга моих небольших проектов на Rails я использую Openshift. Впринципе для небольших проектов он очень удобен — удобный деплой, все самое необходимое из коробки. Чего еще душе может быть необходимо? Но душа захотела сфинкса, при том очень сильно хзахотела. Так как среди картриджей я сфинкса не обнаружил, то пошел в google за советом.
А в гугле ничего… Ну или почти ничего. Все советовали поднимать DIY, накатывать все вручную, некоторые из моих знакомых советовали пересесть на AWS, но я в упор не хотел признавать, что под OpenShift нельзя поднять сфинкс. А так как приложение уже крутилось под сборкой для рельс то и DIY создавать не хотелось и я, стал думать как же все-таки поднять sphinx в уже готовой среде.
Под катом то, что я придумал.

Инсталируем Sphinx

С rpm в OpenShift то же туго, так что будем ставить все из сорцов. Идем на страницу sphinxsearch.com/downloads/release/, выбираем «Source tarbal» и копируем ссылку в самом низу страницы («sphinxsearch.com/files/sphinx-2.0.6-release.tar.gz»). У меня релиз был 2.0.6, так что описывать буду для него.
Теперь заходим в свое приложение под ssh:

rhc app show -a [APP_NAME] 

смотрим на параметр «Git URL», из него копируем только адрес с UUID и заходим под ним через ssh на сервер.
Теперь переходим в tmp директорию, скачиваем и устанавливаем spinx:

cd $OPENSHIFT_TMP_DIR wget http://sphinxsearch.com/files/sphinx-2.0.6-release.tar.gz tar -zxfv sphinx-2.0.6-release.tar.gz cd sphinx-2.0.6-release ./configure --prefix=$OPENSHIFT_RUNTIME_DIR make install 

Обратите внимание, на префикс при конфигурировании, он необходим, иначе sphinx не поставится.

Настройка ThinkingSphinx

Теперь нам нужно настроить ThinkingSphinx (я предполагаю, что вы уже сконфигурировали Sphinx на локальной машине, если нет, то информации про это полно, а также у вас есть все необходимые файлы от OpenShift в проекте). Итак первым делом нужно понимать, что OpenShift не даст нам забиндить Sphinx на localhost, для всех биндингов на OpenShift используется переменная окружения $OPENSHIFT_INTERNAL_IP. Так же стоит понимать, что не на все порты Openshift даст вам доступ для биндинга. Доступные порты лежат в пределах 15000 — 35530. Поэтому идем в наш config/sphinx.yml и пишем следующее:

production:   address: <%=ENV['OPENSHIFT_INTERNAL_IP']%>   port: 15000 

Я выбрал этот порт, вы можете выбрать свой, главное что бы он лежал в пределах допустимых значений.
Есть еще одно ограничение. OpenShift не хранит log файлы в стандартной рельсовой директории, поэтому нам надо прописать и пути для log файлов:

  searchd_log_file: <%=File.join(ENV['OPENSHIFT_LOG_DIR'],'searchd.log')%>   query_log_file: <%=File.join(ENV['OPENSHIFT_LOG_DIR'],'searchd.query.log')%>   pid_file: <%=File.join(ENV['OPENSHIFT_LOG_DIR'],'searchd.production.pid')%> 

Так как наш searchd демон лежит не в стандартной папке, то нам требуется прописать и его в конфиге:

  bin_path: <%=File.join(ENV['OPENSHIFT_RUNTIME_DIR'],'bin')%>   searchd_binary_name: 'searchd'   indexer_binary_name: 'indexer' 

В итоге у меня получился вот такой конфиг:

production:   searchd_log_file: <%=File.join(ENV['OPENSHIFT_LOG_DIR'],'searchd.log')%>   query_log_file: <%=File.join(ENV['OPENSHIFT_LOG_DIR'],'searchd.query.log')%>   pid_file: <%=File.join(ENV['OPENSHIFT_LOG_DIR'],'searchd.production.pid')%>   address: <%=ENV['OPENSHIFT_INTERNAL_IP']%>   port: 15000   bin_path: <%=File.join(ENV['OPENSHIFT_RUNTIME_DIR'],'bin')%>   searchd_binary_name: 'searchd'   indexer_binary_name: 'indexer' 

Конфигурируем деплой

Теперь нам нужно прописать правила рестарта сфинкса, идем в .openshift/action_hooks/deploy и пишем там следующее:

bundle exec rake ts:config RAILS_ENV="production" bundle exec rake ts:rebuild RAILS_ENV="production" 

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

Однако, наш демон теперь пересобирает индексы только один раз, во время деплоя. Что бы исправить это нам нужно написать таск для cron’а. Я решил что он будет пересобираться каждую минуту, так что идем в .openshift/cron/minutely создаем там файлик sphinx_rebuild следующего содержания:

!#/bin/bash cd $OPENSHIFT_REPO_DIR bundle exec rake ts:rebuild RAILS_ENV="production" 

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

Нам осталось только задеплоиться и наслаждаться работой сфинкса на стейдже. К слову все тоже самое можно проделать и на DIY и не обязательно для Rails.

ссылка на оригинал статьи http://habrahabr.ru/post/157857/


Комментарии

Добавить комментарий

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