Запуск кількох Sphinx search на одному сервері

Запуск кількох Sphinx search на одному сервері

У нас часто виникає необхідність налаштувати пошук через Sphinx для кількох проектів на одному сервері. Спочатку ми просто давали різні імена джерелам і індексам. Мінуси такого підходу очевидні: ми не могли використовувати різні версії sphinx’а, оновлювати подібний конфіг було досить незручно. Пізніше ми просто збирали кілька версій з різними префіксами і запускали демони з різними конфігами. Тут, здається, все помітно краще, але з'являється багато рутинної роботи зі збором пакетів, у конфігах потрібно прописувати різні шляхи до логів, індексів і pid-файлів. І виникла ідея запускати сам Sphinx всередині docker контейнерів, а управляти цим всім централізовано за допомогою puppet’а.

Коротко розглянемо установку puppet

Запуск кількох Sphinx search на одному сервері

Установка puppet master:

puppetmaster # wget https://apt.puppetlabs.com/puppetlabs-release-wheezy.deb -O /tmp/puppet.deb && dpkg -i /tmp/puppet.deb && rm /tmp/puppet.deb
puppetmaster # apt-get update && apt-get install puppetmaster

Установка майстра під високі навантаження (для великої кількості нод) описана в офіційній документації.

Установка puppet на ноду:

puppetnode # wget https://apt.puppetlabs.com/puppetlabs-release-wheezy.deb -O /tmp/puppet.deb && dpkg -i /tmp/puppet.deb && rm /tmp/puppet.deb
puppetnode # apt-get update && apt-get install puppet

Тепер поправимо конфіг /etc/puppet/puppet.conf:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
server=puppetmaster
runinterval=120

В server потрібно прописати хост вашого puppet master.

Тепер потрібно запустити:

puppetnode # puppet agent -t --waitforcert 30
 
Info: Creating a new SSL key for puppetnode
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for puppetnode
Info: Certificate Request fingerprint (SHA256): 67:F6:47:58:05:01:31:51:A4:61:AA:5D:2D:89:00:1F:CF:58:14:AB:27:22:5F:79:1A:64:4F:6B:D4:AD:E0:5E
Info: Caching certificate for ca

Ідемо на майстер і порівнюємо fingerprint:

puppetmaster # puppet cert --list"puppetnode"(SHA256)67:F6:47:58:05:01:31:51:A4:61:AA:5D:2D:89:00:1F:CF:58:14:AB:27:22:5F:79:1A:64:4F:6B:D4:AD:E0:5E

Тепер підписуємо сертифікат клієнта:

puppetmaster # puppet cert --sign puppetnode
Notice: Signed certificate request for puppetnode
Notice: Removing file Puppet::SSL::CertificateRequest puppetnode at '/var/lib/puppet/ssl/ca/requests/puppetnode.pem'

Додамо в /etc/puppet/manifests/site.pp конфігурацію ноди:

node 'puppetnode'{file{"/tmp/just-test.txt":
    ensure => "present",
    mode   => "700"}}

Запустимо puppet на ноді:

puppetnode # puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetnode
Info: Applying configuration version '1421320391'
Notice: /Stage[main]/Main/Node[puppetnode]/File[/tmp/just-test.txt]/ensure: created
Notice: Finished catalog run in0.06 seconds

Тепер на вузлі має з'явитися файл /tmp/just-test.txt:

puppetnode # ls -l /tmp/just-test.txt-rwx------1 root root 0 Jan 1511:13/tmp/just-test.txt

На цьому з конфігурацією puppet'а в нас все готово.

Встановлення docker на Debian Wheezy

Запуск кількох Sphinx search на одному сервері

Щоб запустити docker на Wheezy, потрібно встановити ядро з backports. Давайте напишемо для цього модуль на puppet. Для початку нам потрібно додати репозиторій з backports. Встановимо модуль, який дозволяє додавати репозиторії в apt-системах:

puppetmaster # puppet module install puppetlabs-apt

Також нам знадобиться модуль stdlib:

puppetmaster # puppet-module install puppetlabs/stdlib

Створимо ієрархію директорій для нашого модуля:

puppetmaster # mkdir -p /etc/puppet/modules/install-docker-wheezy/{files,manifests,templates}

Або ви можете використати команду puppet module generate ім'я для автоматичної генерації ієрархії.

Створимо клас для встановлення в /etc/puppet/modules/install-docker-wheezy/manifests/init.pp:

class install-docker-wheezy  ($docker_version="1.3.0"){
 
  apt::source {"deb-backports":
    location        => "https://http.debian.net/debian",
    release         => "wheezy-backports",
    repos           => "main",
  }
 
  package {'linux-image-3.16.0-0.bpo.4-amd64':
    ensure  => installed,
    require => Apt::Source["deb-backports"]}
 
  exec{"download-docker":
    command => "/usr/bin/wget https://get.docker.com/builds/Linux/x86_64/docker-${docker_version} -O /usr/local/bin/docker",
    unless  => "/usr/bin/test -f /usr/local/bin/docker",
  }
 
  exec{"make-docker-exec":
    command => "/bin/chmod a+x /usr/local/bin/docker",
    unless  => "/usr/bin/test -x /usr/local/bin/docker",
    require => Exec["download-docker"]}
 
  file{"/etc/rc.local":
    ensure => present
  }->
  file_line {"docker-start":
    path  => '/etc/rc.local',
    line  => '/usr/local/bin/docker -d & exit 0',
    match => "^.*exit 0$",
  }
 
  file{"/usr/bin/docker.io":
    ensure  => 'link',
    target  => '/usr/local/bin/docker',
    require => Exec["download-docker"]}
 
  file{"/cgroup":
    ensure => "directory"}
 
  mount{"/cgroup":
    device  => "cgroup",
    fstype  => "cgroup",
    ensure  => "mounted",
    options => "defaults",
    atboot  => "true",
    require => File["/cgroup"]}}

І підключимо його в конфігурацію вузла /etc/puppet/manifests/site.pp:

node 'puppetnode'{file{'/tmp/just-test.txt':
    ensure => 'present',
    mode   => '0700'}
 
  include install-docker-wheezy
}

Після цього необхідно прогнати конфігурацію на вузлі:

puppetnode # puppet agent -t
Info: Отримання pluginfacts
Info: Отримання плагіна
Info: Завантаження фактів
Info: Кешування каталогу для puppetnode
Info: Застосування версії конфігурації '1421403992'
Notice: /Stage[main]/Install-docker-wheezy/File_line[docker-start]/ensure: створено
Notice: /Stage[main]/Install-docker-wheezy/Apt::Source[deb-backports]/File[deb-backports.list]/ensure: створено
Info: /Stage[main]/Install-docker-wheezy/Apt::Source[deb-backports]/File[deb-backports.list]: Заплановано оновлення Exec[apt_update]
Notice: /Stage[main]/Apt::Update/Exec[apt_update]: Запущено 'оновлення' з 1 події
Notice: /Stage[main]/Install-docker-wheezy/File[/cgroup]/ensure: створено
Notice: /Stage[main]/Install-docker-wheezy/Mount[/cgroup]/ensure: визначено 'ensure' як 'змонтовано'
Info: Обчислення контрольної суми для файлу /etc/fstab
Info: /Stage[main]/Install-docker-wheezy/Mount[/cgroup]: Заплановано оновлення Mount[/cgroup]
Info: Mount[/cgroup](provider=parsed): Повторне монтування
Notice: /Stage[main]/Install-docker-wheezy/Mount[/cgroup]: Запущено 'оновлення' з 1 події
Info: /Stage[main]/Install-docker-wheezy/Mount[/cgroup]: Заплановано оновлення Mount[/cgroup]
Notice: /Stage[main]/Install-docker-wheezy/Exec[download-docker]/returns: виконано успішно
Notice: /Stage[main]/Install-docker-wheezy/Exec[make-docker-exec]/returns: виконано успішно
Notice: /Stage[main]/Install-docker-wheezy/Package[linux-image-3.16.0-0.bpo.4-amd64]/ensure: ensure змінив 'purged' на 'present'
Notice: Завершено виконання каталогу за 234.61 секунд

Тепер нам потрібно перезавантажити сервер, щоб завантажилось нове ядро. Після цього docker можна використовувати.

Розгортаємо Sphinx search у контейнерах docker

Цей модуль ми виклали на Puppet Forge, для його встановлення достатньо виконати:

puppetmaster # puppet module install stfalcon-sphinxsearchdocker

Підключити модуль можна, додавши його в конфігурацію ноди /etc/puppet/manifests/site.pp):

node 'puppetnode'{file{'/tmp/just-test.txt':
    ensure => 'present',
    mode   => '0700'}
 
  include install-docker-wheezy
  include sphinxsearchdocker
}

Також ви можете задати свій image, який викладений на hub.docker.com:

node 'puppetnode'{file{'/tmp/just-test.txt':
    ensure => 'present',
    mode   => '0700'}
 
  include install-docker-wheezy
 
  class {'sphinxsearchdocker':
    docker_image_sphinx => 'someuser/sphinx'}}

Тепер для запуску sphinx'а потрібно тільки завантажити конфіг і оголосити ресурс.

puppetmaster # mkdir -p /etc/puppet/modules/some-server-config/{files,manifests,templates}
 
/etc/puppet/modules/some-server-config/manifests/init.pp:
class some-server-conf {file{'/etc/docker-sphinx/coolsite-sphinx.conf':
    ensure => 'file',
    source  => "puppet:///modules/some-server-conf/coolsite.conf"}
 
  sphinxsearchdocker::sphinxsearch {'coolsite':
    sphinx_container_name => 'coolsite',
    sphinx_container_port => '3312',
    require               => File['/etc/docker-sphinx/coolsite-sphinx.conf']}}

І підключити модуль до ноди /etc/puppet/manifests/site.pp.

Після застосування конфігурації на сервері ми отримаємо запущений контейнер docker з sphinx'ом:

puppetnode # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a85d848b1c6e jekakm/sphinx:latest "/usr/local/bin/run. 11 minutes ago Up 11 minutes 127.0.0.1:3312->3312/tcp sphinx-coolsite

Виконати ротацію індексів можна командою:

puppetnode # docker exec sphinx-coolsite indexer --config /etc/sphinxsearch/sphinx.conf --rotate --all

Тепер має сенс додати цю команду в крон, це також можна зробити через puppet. Давайте додамо в клас some-server-conf ще один ресурс:

cron {'rotate-sphinx-coolsite':
  command => '/usr/local/bin/docker exec sphinx-coolsite indexer --config /etc/sphinxsearch/sphinx.conf --rotate --all',
  user    => 'root',
  hour    => '*',
  minute  => '05'}

Після оновлення конфігурації на ноді з'явиться нове cron-завдання.

На цьому все, тепер у нас є інструмент, який дозволяє досить швидко розгорнути sphinx в кількох екземплярах на довільній кількості серверів.