Имеем два сервера (fail-over), на которых крутятся несколько веб сайтов. Естественно, оба mysql-сервера работают по схеме master-to-master replication. Все вроде бы хорошо, файлы автоматически обновляются раз в 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/memcache 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
Вот, собственно и все.
Оригинал статьи тут
Останні коментарі