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

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