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

в 14:45, , рубрики: openshift, ruby on rails, ruby on rails 3, sphinx, Серверное администрирование, метки: , ,

Для стейджинга моих небольших проектов на 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.

Автор: fr33z3

Источник

Поделиться

* - обязательные к заполнению поля