Sphinxsearch в docker-контейнере

Mar 12, 2018 08:50 · 459 words · 3 minute read docker sphinxsearch

В данной статье рассмотрим процесс сборки docker-образа включающего в себя систему полнотекстового поиска Sphinxsearch с возможностью переиндексации - давайте разберемся!

Несмотря на то, что в данный момент уже есть Sphinxsearch версии 3.0.1, в данном примере мы будем использовать стабильную и “обкатанную” версию поискового движка - 2.2.11.

За основу для нашего docker-образа возьмем ubuntu:16.04, и наш Dockerfile будет выглядеть следующим образом:

FROM ubuntu:16.04

ARG APP_ENV=dev
RUN apt-get update \
    && apt-get -y install \
        software-properties-common

RUN add-apt-repository ppa:builds/sphinxsearch-rel22 \
    && apt-get update \
    && apt-get -y install \
        mysql-client \
        unixodbc \
        libpq5 \
        sphinxsearch \
    && apt-get remove -y software-properties-common \
    && apt-get autoremove -y \
    && apt-get autoclean \
    && rm -r /var/lib/apt/lists/*

RUN ln -sf /dev/stdout /var/log/sphinxsearch/searchd.log \
    && ln -sf /dev/stderr /var/log/sphinxsearch/query.log

COPY start.sh /start.sh
COPY sphinx.conf.${APP_ENV} /etc/sphinxsearch/sphinx.conf

VOLUME ["/etc/sphinxsearch"]
VOLUME ["/var/lib/sphinxsearch/data"]

EXPOSE 9312 9306

CMD ["/start.sh"]

В зависимости от переданного при сборке docker-образа значения аргумента APP_ENV (по умолчанию это dev), в образ будет скопирован соответствующий конфигурационный файл sphinx.conf.${APP_ENV}.

При старте docker-контейнера будет выполнен bash-скрипт start.sh, который выполняет переиндексацию и запуск поискового движка. Содержимое скрипта довольно простое:

#!/usr/bin/env bash

indexer --config /etc/sphinxsearch/sphinx.conf  --rotate --all
searchd --config /etc/sphinxsearch/sphinx.conf --nodetach

Пример конфигурационного файла sphinx.conf:

source parent_source
{
    type			= mysql

    sql_host			= db1.lc
    sql_user			= testuser
    sql_pass			= password
    sql_db		    	= test
    sql_port			= 3306

    mysql_connect_flags		= 32 # enable compression
    sql_query_pre		= SET NAMES utf8
    sql_query_pre       	= SET CHARACTER SET utf8
}

source src_blog_posts:parent_source
{
    sql_query = \
        SELECT blog_post_id as id, title, content, tags \
        FROM blog_posts \
        WHERE visible = 1 \
        AND dt_published <= NOW()

    sql_ranged_throttle = 0
    sql_field_string = title
    sql_field_string = content
    sql_field_string = tags
}

index blog_posts
{
    source = src_blog_posts
    path = /var/lib/sphinxsearch/data/blog_posts
    docinfo = extern
    mlock = 0
    morphology = stem_enru
    index_exact_words = 1
    charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
    min_word_len = 1
    min_infix_len = 1
    html_strip = 1
}

indexer
{
    mem_limit = 256M
}

searchd
{
    listen			= 9312
    listen			= 9306:mysql41
    log 			= /var/log/sphinxsearch/searchd.log
    query_log			= /var/log/sphinxsearch/query.log
    read_timeout		= 5
    client_timeout		= 300
    max_children		= 30
    pid_file			= /var/run/sphinxsearch/searchd.pid
    seamless_rotate		= 1
    preopen_indexes		= 1
    unlink_old			= 1
    workers			= threads
    binlog_path			= /var/lib/sphinxsearch/data
    collation_server		= utf8_general_ci
    watchdog			= 1
}

Собираем docker-образ находясь в каталоге с Dockerfile с помощью следующей команды:

docker build -t sphinx:latest .

Запустить docker-контейнер из созданного нами образа можно так:

docker run -d \
	--name sphinxsearch \
	-v $(pwd)/sphinx.conf:/etc/sphinxsearch/sphinx.conf \
	-v $(pwd)/sphinxdata:/var/lib/sphinxsearch/data \
sphinx:latest

Или с помощью docker-compose.yml (для удобства редактирования конфиг sphinx монтируем с хост-машины в docker-контейнер):

...
### Sphinxsearch Container ##################################
  sphinxsearch:
    container_name: sphinxsearch
    image: sphinx:latest
    volumes:
      - ./sphinx/sphinx.conf:/etc/sphinxsearch/sphinx.conf
      - sphinx:/var/lib/sphinxsearch/data
...
### Volumes Setup ###########################################
volumes:
  sphinx:
    driver: "local"

При необходимости можно запустить переиндексацию с помощью команды:

docker exec -it sphinxsearch indexer --config /etc/sphinxsearch/sphinx.conf  --rotate --all
tweet Share