Follow Me Widget

суббота, 17 сентября 2011 г.

Запускаем Memcached в Windows Azure.

Тема сегодняшнего поста будет посвящена запуску в облаке механизма распределенного кеширования под названием Memcached. Почему собственно Memcached ? Windows Azure предлагает нам встроенное распределенное кеширование (Windows Azure Caching), которое является прекрасным выбором для разработчиков пытающихся добавить слой кеширования в свое Windows Azure приложение. Тем не менее бывают ситуации, в которых требуется использование альтернативного механизма, а именно Memcached.

Например, я считаю, что применение мемкеша полностью обоснованно в случае наличия у наших веб-ролей дополнительной оперативной памяти. В таком случае мы имеем возможность поднять дополнительный слой распределенного кеширования в памяти без необходимости запуска дополнительных виртуальных машин (и следовательно без каких-либо дополнительных затрат). Да, Windows Azure Сaching имеет в своем арсенале такую мощную штуку как локальный кеш, но для использования этой возможности все также необходим удаленный кеш и кроме того локальный кеш доступен только одному инстансу (поэтому он собственно и называется локальным).
Еще одна причина, по которой люди выбирают мемкеш – это возможность полного ручного контроля поведения кеш-памяти. Это конечно же занятие не для слабонервных, но это хороший вариант для тех людей, которые являются экспертами в тюнинге мемкеша.

Как это работает ?

Итак, мы решили все-таки использовать мемкеш как основной слой распределённого кеширования. Для этого у нас уже есть готовые реквизиты: серверная часть и клиентская доступны в виде NuGet пакетов. Серверная часть относительно проста – она просто запускает мемкеш демон и открывает прослушивание входящих соединений на определенном порту. Клиентская часть является чуть более сложной по той причине, что она должна выполнять 2 основных требования :
  • Использовать консистентное хеширование, сводящее к минимуму сбои добавления и удаления серверов
  • Автоматически реагировать на добавление и удаление серверов из кластера (во время масштабирования, апгрейдов и падений)
Первое требование выполняется при помощи использования Enyim Memcached Client, который по умолчанию использует консистентное хеширование. Второе требование достигается расширением Enyim путем кастомной реализации интерфейса IServerPool под названием WindowsAzureServerPool. Код регулярно проверяет кластер на предмет добавленных и удаленных серверов и в случае изменения количества серверов заново перенастраивает мемкеш-клиент. Очень важно здесь то, что новый сервер задействуется лишь тогда когда он становится способным принимать входящие соединения, но не в момент когда он запущен.

Установка и настройка серверной части.

Сам мемкеш сервер мы имеем возможность запустить в рамках web или worker роли. В высоконагруженных приложениях я рекомендовал бы запускать сервер в контексте отдельной worker-роли. В других же случаях более оптимальным вариантом будет вариант запуска сервера в контексте запущенной web-роли. Для установки и запуска сервера необходимо выполнить следующие шаги:
  1. При помощи NuGet инсталлировать сервер (делается в Package Manager при помощи команды install-package WazMemcachedServer). После этого к проекту  будут подключены все необходимые бинарники и небольшой helper-класс
  2. Добавить внутреннюю TCP точку доступа, через которую будет осуществляться прослушивание входящих соединений. (это можно сделать в Visual Studio путем двойного клика на роли и выбора категории “Endpoints” в панельке слева)
  3. Добавить код для запуска мемкеша в наши WebRole.cs или WorkerRole.cs.
      Process proc;
      public override void Run()
    {
        proc.WaitForExit();
    }

      public override bool OnStart()
    {
       proc = WindowsAzureMemcachedHelpers.StartMemcached("Memcached", 512);
       return base.OnStart();
    }

Первый параметр – это название точки доступа. созданной нами во 2-м пункте, второй параметр – это размер резервируемой под сервер оперативной памяти. Обратите внимание на метод Run – он прослушивает memcached-процесс (это может быть вечно :) ) на предмет выхода, поэтому если наш мемкеш-сервер по какой-то причине завернется, инфраструктура Windows Azure автоматически перезапустит все для нас. После того как все пункты выполнены нами успешно, наш сервер будет способен принимать соединения.

Установка и настройка клиентской части.


Для того чтобы воспользоваться кластером Memcached из нашей программы, необходимо настроить клиент, который знает как найти экземпляры серверов даже если они будут добавляться и удаляться из-за масштабирования или апгрейдов. Установка клиента не отличается повышенной сложностью, для того чтобы это сделать необходимо выполнить ряд действий:
  1. При помощи NuGet инсталлировать клиентские библиотеки (делается в Package Manager при помощи команды install-package WazMemcachedClient). Это добавит небольшое подмножество классов, расширяющих клиент Enyim для Memcached.
  2. Создать в коде экземпляр класса-клиента (как вариант хранения объекта можно использовать статическую переменную), способного взаимодействовать с серверной частью
static MemcachedClient client = WindowsAzureMemcachedHelpers.CreateDefaultClient("WorkerRole", "Memcached");

Первый параметр – это имя роли, в которой запущен мемкеш и второй параметр – это название внутренней точки доступа, через которую происходит прослушивание подключений. Другой удобный вариант инициализации клиента – это старт приложения.
    Application["memcache"] = WindowsAzureMemcachedHelpers.CreateDefaultClient("WorkerRole", "Memcached");
Как только наш клиент был успешно проинициализирован мы получим доступ к полному спектру доступных операций. Например :

     string value = client.Get(key) as string;
     if (value == null)
    {
        value = FetchFromStorage(key);
        client.Store(StoreMode.Set, key, value);
    }
    return value;

Итак, мы с Вами познакомились с тем как можно запускать и работать с Memcached в условиях Windows Azure. Для этого нам необходимы 2 основных пакета (серверная и клиентская части):
Blogpost sources: http://blog.smarx.com/posts/memcached-in-windows-azure,http://www.davidaiken.com/2011/01/11/windows-azure-memcached-plugin/

Комментариев нет: