Резервныe ApacheSolr серверa для Drupal'a

21.02.2011
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

Во первых, что такое Apache Solr?

Apache Solr - это расширяемая поисковая платформа с открытым исходным кодом от проекта Apache Lucene. 

Почему Apache Solr? 

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

При разработке одного из проектов мы столкнулись с вопросом «А что будет если наш основной Solr сервер вдруг перестанет отвечать? Вся система поиска на сайте умирает?».

Иногда в таких ситуаций можно переключатся на поиск ядра Друпала (такой функционал есть в базовом составе модуля Друпала Apache Solr Search Integration), но на больших проектах такое не возможно в силу того что это создаст смертельную нагрузку на базу данных - такой вариант отбрасываем сразу. 

Как вариант в случае падения основного SOLR-сервера администратор ASAP поднимает новый (ну или с slave-сервера делает master) и прописывает новый коннект в Друпале.

Но здесь есть 2 проблемы. Во первых администратор не может быть онлайн 24 часа в сутки, а во-вторых если поднимать новый сервер то переиндексация материалов может занят несколько десятков часов...

Наше решение в этой ситуации:

1) В settings.php добавим следующие строки:

$conf['apachesolr_servers'] = array( 
  'main'   => array( 
    'apachesolr_host' => '1.2.3.4', // ip 
    'apachesolr_path' => '/solr', 
    'apachesolr_port' => 8081, 
  ), 
  'reserve' => array( 
    'apachesolr_host' => '2.3.4.5', // ip 
    'apachesolr_path' => '/solr', 
    'apachesolr_port' => 8080, 
  ), 
  // we can add an unlimited number of connections 
);

Здесь «main» и «reserve» это просто имена соединений для программиста, они ни на что не влияют. 

Как вариант если не используется репликация SOLR на несколько серверов, но есть необходимость в создании резервного сервера, то можно дублировать информацию с основного сервера на резервный простым rsync’ом директорий. Для этого достаточно добавить в crontab правило:

*/5 * * * * root cd /opt/solr && rsync -ave ssh solr_backup_server:/opt/solr/example/

2)  Создадим друпал-модуль который на хук крон будет проверять соединение к SOLR-серверу и в случае неудачи будет переключать его на один с резервных серверов.

/** 
 * Implementation of hook_cron(). 
 */ 
function your_module_name _cron() { 
    $servers = variable_get('apachesolr_servers', NULL);
    if (!$servers || !module_exists('apachesolr')) { 
        return; 
    } 
     
    // check ApacheSolr server connection 
    foreach ($servers as $name => $server) { 
        $solr = apachesolr_get_solr($server['apachesolr_host'], $server['apachesolr_port'], $server['apachesolr_path']);
        $ping = @$solr->ping(variable_get('apachesolr_ping_timeout', 4)); 
        if ($ping) { 
            variable_set('apachesolr_host', $server['apachesolr_host']);
            variable_set('apachesolr_path', $server['apachesolr_path']);
            variable_set('apachesolr_port', $server['apachesolr_port']);
            break; 
        } 
        // also for example you can send letter to someone and inform that something is wrong
    } 
} 

В нашем случае модуль Elysia Cron настроен так что бы это проверка осуществлялась каждые 3 минуты.

Что в итоге?

Максимальное время отсутствия поиска на сайте в случаи падении SOLR-сервера – всего несколько минут  без какого либо вмешательства программистов и администраторов.

1 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

На серверах с nginx в качестве фронтенда и Apache в качестве бэкенда часто можно увидеть такую ошибку. Обычно думают, что проблема в nginx и начинают его уверенно...

3

При разработке одного сайта по недвижимости мы по запросу клиента импортировали в таксономию базу данных всех городов мира. И оказалось, что Hierarchical Select не...

4

Очень полезный модулечек, который позволят вставлять FileField поля прямо в текстовый редактор. Например, в процессе написания данного текста была нажата кнопочка Insert, и появилась вот такая...

5

Рано или поздно каждый разработчик сталкивается с ситуацией, когда сайт "падает" и его приходится "поднимать". Причин тому может быть множество.

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime