Настройка Redis на Webfaction

Какие шаги необходимо выполнить для настройки базы данных Redis на Webfaction общий хостинг-аккаунт?


person Akseli Palén    schedule 04.09.2013    source источник


Ответы (3)


Введение

Из-за особых ограничений среды серверов Webfaction инструкции по установке не так просты, как могли бы быть. Тем не менее, в конце концов у вас будет полностью работающий сервер Redis, который будет работать даже после перезагрузки. Я лично установил Redis по следующей процедуре около полугода назад, и с тех пор он работает безупречно. Небольшое предупреждение, полгода - это не так уж и много, тем более, что сервер не подвергался интенсивной эксплуатации.

Инструкции состоят из пяти частей: «Установка», «Тестирование», «Запуск сервера», «Управление сервером» и «Поддержание работоспособности сервера».

Установка

Войдите в свою оболочку Webfaction

ssh [email protected]

Загрузите последнюю версию Redis с сайта загрузки Redis.

> mkdir -p ~/src/
> cd ~/src/
> wget http://download.redis.io/releases/redis-2.6.16.tar.gz
> tar -xzf redis-2.6.16.tar.gz
> cd redis-2.6.16/

Перед установкой посмотрите, какой у вас сервер Linux 32 или 64 бит. Сценарий установки плохо работает с 32-разрядными средами, по крайней мере, на компьютерах Webfaction с CentOS 5. Команда для битов — uname -m. Если Linux 32-битный, то результат будет i686, если 64-битный, то x86_64. Подробности см. в этом ответе.

> uname -m
i686

Если ваш сервер 64-битный (x86_64), то просто make.

> make

Но если ваш сервер 32-битный (i686), вам придется сделать немного больше. Есть команда make 32bit но она выдает ошибку. Отредактируйте строку в сценарии установки, чтобы make 32bit заработало.

> nano ~/src/redis-2.6.16/src/Makefile

Измените строку 214 с этой

$(MAKE) CFLAGS="-m32" LDFLAGS="-m32"

к этому

$(MAKE) CFLAGS="-m32 -march=i686" LDFLAGS="-m32 -march=i686"

и сохранить. Затем запустите make с 32-битным флагом.

> cd ~/src/redis-2.6.16/  ## Note the dir, no trailing src/
> make 32bit

Исполняемые файлы были созданы в каталоге ~/src/redis-2.6.16/src/. Исполняемые файлы включают redis-cli, redis-server, redis-benchmark и redis-sentinel.

Тестирование (необязательно)

Как следует из результатов установки, было бы неплохо убедиться, что все работает должным образом, запустив тесты.

Hint: To run 'make test' is a good idea ;)

К сожалению, для тестирования требуется, чтобы был установлен tlc8.6.0, который не установлен по умолчанию, по крайней мере, на машине web223. Поэтому вы должны сначала установить его из исходного кода. См. примечания по установке Tcl/Tk и составление заметок.

> cd ~/src/
> wget http://prdownloads.sourceforge.net/tcl/tcl8.6.0-src.tar.gz
> tar -xzf tcl8.6.0-src.tar.gz
> cd tcl8.6.0-src/unix/
> ./configure --prefix=$HOME
> make
> make test # Optional, see notes below
> make install

Тестирование Tcl с make test потребует времени и также не удастся из-за ограничений среды WebFaction. Я предлагаю вам пропустить это.

Теперь, когда у нас установлен Tlc, мы можем запустить тесты Redis. Тесты займут много времени, а также временно используют довольно большой объем памяти.

> cd ~/src/redis-2.6.16/
> make test

После испытаний вы готовы продолжить.

Запуск сервера

Сначала создайте пользовательское приложение с помощью панели управления Webfaction (пользовательское приложение (прослушивание порта)). Назовите его, например, fooredis. Обратите внимание, что вам не нужно создавать домен или веб-сайт для приложения, если Redis используется только локально, то есть с того же хоста.

Во-вторых, запишите номер порта сокета, указанный для приложения. Пусть это будет 23015.

Скопируйте ранее скомпилированные исполняемые файлы в каталог приложения. Вы можете скопировать все или только те, которые вам нужны.

> cd ~/webapps/fooredis/
> cp ~/src/redis-2.6.16/src/redis-server .
> cp ~/src/redis-2.6.16/src/redis-cli .

Скопируйте также пример файла конфигурации. Вы скоро измените это.

> cp ~/src/redis-2.6.16/redis.conf .

Теперь Redis уже запускается. Хотя есть пара проблем. Во-первых, возможно, порт Redis по умолчанию 6379 уже используется. Во-вторых, даже если бы порт был свободен, да, вы могли бы запустить сервер, но он перестает работать в тот же момент, когда вы выходите из оболочки. Для первого необходимо отредактировать redis.conf, а для второго вам нужен демон, который также решается путем редактирования redis.conf.

Redis может работать в режиме демона. Для этого вам нужно настроить место, где демон хранит свои идентификаторы процессов, PID. Обычно pid-файлы хранятся в /var/run/, но из-за ограничений среды вы должны выбрать место для них в своем домашнем каталоге. Поскольку причина, объясненная позже в части «Управление сервером», хорошим выбором является размещение pid-файла в том же каталоге, что и исполняемые файлы. Вам не нужно создавать файл самостоятельно, Redis создает его автоматически.

Теперь откройте redis.conf для редактирования.

> cd ~/webapps/fooredis/
> nano redis.conf

Измените конфигурации следующим образом.

  • daemonize no -> daemonize yes
  • pidfile /var/run/redis.pid -> pidfile /home/foouser/webapps/fooredis/redis.pid
  • port 6379 -> port 23015

Теперь, наконец, запустите сервер Redis. Укажите файл conf, чтобы Redis прослушивал правильный порт и работал как демон.

> cd ~/webapps/fooredis/
> ./redis-server redis.conf
> 

Смотрите, как он работает.

> cd ~/webapps/fooredis/
> ./redis-cli -p 23015
redis 127.0.0.1:23015> SET myfeeling Phew.
OK
redis 127.0.0.1:23015> GET myfeeling
"Phew."
redis 127.0.0.1:23015> (ctrl-d)
>

Остановите сервер, если хотите.

> ps -u $USER -o pid,command | grep redis
  718 grep redis
10735 ./redis-server redis.conf
> kill 10735

or

> cat redis.pid | xargs kill

Управление сервером

Для удобства использования и в качестве подготовительной работы к следующей части сделайте скрипт, помогающий открывать клиент и запускать, перезапускать и останавливать сервер. Простое решение — написать make-файл. При написании make-файла не забывайте использовать табуляции вместо пробелов.

> cd ~/webapps/fooredis/
> nano Makefile

# Redis Makefile
client cli:
    ./redis-cli -p 23015

start restart:
    ./redis-server redis.conf

stop:
    cat redis.pid | xargs kill

Правила вполне понятны. Особенность второго правила заключается в том, что в режиме демона вызов ./redis-server не создает новый процесс, если он уже запущен.

В третьем правиле есть некоторая спокойная мудрость. Если бы redis.pid хранился не в каталоге fooredis, а, например, в /var/run/redis.pid, то остановить сервер было бы не так просто. Это особенно верно, если вы запускаете несколько экземпляров Redis одновременно.

Чтобы выполнить правило:

> make start

Поддержание сервера в рабочем состоянии

Теперь у вас есть экземпляр Redis, работающий в режиме демона, который позволяет вам выйти из оболочки, не останавливая ее. Этого еще недостаточно. Что делать, если процесс падает? Что делать, если серверная машина перезагружена? Для этого вам нужно создать два cronjobs.

> export EDITOR=nano
> crontab -e

Добавьте следующие две строки и сохраните.

*/5 * * * * make -C ~/webapps/fooredis/ -f ~/webapps/fooredis/Makefile start
@reboot make -C ~/webapps/fooredis/ -f ~/webapps/fooredis/Makefile start

Первый обеспечивает каждые пять минут работы fooredis. Как сказано выше, это не запускает новый процесс, если он уже запущен. Второй гарантирует, что fooredis запустится сразу после перезагрузки сервера и задолго до того, как сработает первое правило.

Для этого можно использовать более тонкие методы, например forever. См. также эту тему сообщества Webfaction, чтобы узнать больше об этой теме.

Заключение

Теперь у вас есть это. Сделано много, но, возможно, будет больше. Вещи, которые вы, возможно, захотите сделать в будущем, которые не были рассмотрены здесь, включают следующее.

  • Установка пароля, предотвращающего сброс ваших баз данных другими пользователями. (См. redis.conf)
  • Ограничение использования памяти (см. redis.conf)
  • Регистрация использования и ошибок (см. redis.conf)
  • Резервное копирование данных время от времени.

Любые идеи, комментарии или исправления?

person Akseli Palén    schedule 04.09.2013
comment
Почему бы не использовать подключение к сокету redis вместо tcp? Более высокая производительность и более простая настройка. В остальном браво! - person gabn88; 26.10.2015
comment
Это все еще работает в январе 2018 года, хотя вам необходимо обновить последнюю версию Redis. На моем сервере уже был установлен Tcl. - person El Tea; 23.01.2018

Подводя итог отличному ответу Аксели:

assume your user is named "magic_r_user"

cd ~
wget "http://download.redis.io/releases/redis-3.0.0.tar.gz"
tar -xzf redis-3.0.0.tar.gz
mv redis-3.0.0 redis
cd redis
make
make test
create a custom app "listening on port" through the Webfaction management website
    assume we named it magic_r_app
    assume it was assigned port 18932
cp ~/redis/redis.conf ~/webapps/magic_r_app/
vi ~/webapps/magic_r_app/redis.conf
    daemonize yes   
    pidfile ~/webapps/magic_r_app/redis.pid
    port 18932
test it
    ~/redis/src/redis-server ~/webapps/magic_r_app/redis.conf
    ~/redis/src/redis-cli -p 18932
    ctrl-d
    cat ~/webapps/magic_r_app/redis.pid | xargs kill
crontab -e
    */1 * * * * /home/magic_r_user/redis/src/redis-server /home/magic_r_user/webapps/magic_r_app/redis.conf &>> /home/magic_r_user/logs/user/cron.log
don't forget to set a password!
person HostedMetrics.com    schedule 05.05.2015

К вашему сведению, если вы устанавливаете redis 2.8.8+, вы можете получить ошибку, неопределенную ссылку на __sync_add_and_fetch_4 при компиляции. См. http://www.eschrade.com/page/undefined-reference-to-__sync_add_and_fetch_4/ для информации.

Я вставил соответствующую часть с этой страницы ниже на случай, если страница когда-либо отключится. По сути, вам нужно экспортировать переменную CFLAGS и перезапустить процесс сборки.

[root@devvm1 redis-2.6.7]# export CFLAGS=-march=i686
[root@devvm1 redis-2.6.7]# make distclean
[root@devvm1 redis-2.6.7]# make
person Brad    schedule 16.04.2014