Memcached master-to-master replication

Имеем два сервера (fail-over), на которых крутятся несколько веб сайтов. Естественно, оба -сервера работают по схеме master-to-master . Все вроде бы хорошо, файлы автоматически обновляются раз в 15 минут (rsync), базы также (master-to-master replication). При падении одного из серверов – второй вполне нормально справляется. Для снижения нагрузки файлы сессий стали писать в мемкашед-сервер.
И вот тут столкнулись с проблемой потери сессий в случае сбоя одного из серверов.

Проблему решили благодаря использованию патча для мемкашед сервера – repcached
repcached – add data replication feature to memcached 1.2.x
Этот патч позволяет получить мульти-мастер репликации,
также поддерживается асинхронный режим репликаций,
поддерживаются все memcached команды: set, add, delete, incr/decr, flush_all, cas

Качаем уже патченые исходники и распаковываем.

# cd /usr/local/src
# wget http://downloads.sourceforge.net/project/repcached/repcached/2.2-1.2.8/memcached-1.2.8-repcached-2.2.tar.gz\?use_mirror=sunet
# tar xvf memcached-1.2.8-repcached-2.2.tar.gz
# cd memcached-1.2.8-repcached-2.2/

Для компиляции потребуется libevent-dev, поэтому поставим нужный пакет:

# aptitude install libevent-dev

При конфигурировании указываем опцию –enable-replication и компилируем:

# ./configure --enable-replication
# make
# make install

Новый мемкашед сервер будет установлен в /usr/local/bin, поэтому можно не беспокоиться, если установлен стандартный memcached-сервер.

Создадим небольшой простенький конфиг и запишем его в файл /etc/default/memcachedrep

## extra commandline options to start memcached in replicated mode
# -x  ip_addr hostname or IP address of the master replication server
# -X  num  TCP port number of the master (default: 11212)
DAEMON_ARGS="-m 32 -p 11211 -u nobody -P /var/run/memcachedrep.pid -d -x 192.168.1.2"

Также нарисуем init-скрипт в /etc/init.d/memcachedrep:


сделаем его исполняемым и запустим (предварительно нужно остановить оригинальный memcached)

root@s1:/# chmod +x /etc/init.d/memcachedrep
root@s1:/# /etc/init.d/ stop
root@s1:/# /etc/init.d/memcachedrep start

Повторим те же операции на втором сервере.

Запускаем на обоих серверах memcachedrep и проверяем как работает репликация:

root@s1:/# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set foo 0 0 3
bar
STORED

Перейдем на второй сервер и попробуем получить сохраненные данные на первом сервере:

root@s2:/# root@s2:/# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get foo
VALUE foo 0 3
bar
END

Этим убедились, что данные на обоих мемкашед-серверах одинаковые. Собственно, ради чего все это и делалось.
Если что-то не так и обмен данными между серверами не происходит – необходимо проверить, чтобы оба сервера запущены и могут подключаться друг к другу на порт 11212 или на тот, который указан в /etc/default/memcachedrep

Вот, собственно и все.

Оригинал статьи тут