Тема сегодняшнего поста будет посвящена запуску в облаке механизма распределенного кеширования под названием Memcached. Почему собственно Memcached ? Windows Azure предлагает нам встроенное распределенное кеширование (Windows Azure Caching), которое является прекрасным выбором для разработчиков пытающихся добавить слой кеширования в свое Windows Azure приложение. Тем не менее бывают ситуации, в которых требуется использование альтернативного механизма, а именно Memcached.
Например, я считаю, что применение мемкеша полностью обоснованно в случае наличия у наших веб-ролей дополнительной оперативной памяти. В таком случае мы имеем возможность поднять дополнительный слой распределенного кеширования в памяти без необходимости запуска дополнительных виртуальных машин (и следовательно без каких-либо дополнительных затрат). Да, Windows Azure Сaching имеет в своем арсенале такую мощную штуку как локальный кеш, но для использования этой возможности все также необходим удаленный кеш и кроме того локальный кеш доступен только одному инстансу (поэтому он собственно и называется локальным).
Еще одна причина, по которой люди выбирают мемкеш – это возможность полного ручного контроля поведения кеш-памяти. Это конечно же занятие не для слабонервных, но это хороший вариант для тех людей, которые являются экспертами в тюнинге мемкеша.
Как это работает ?
Итак, мы решили все-таки использовать мемкеш как основной слой распределённого кеширования. Для этого у нас уже есть готовые реквизиты: серверная часть и клиентская доступны в виде NuGet пакетов. Серверная часть относительно проста – она просто запускает мемкеш демон и открывает прослушивание входящих соединений на определенном порту. Клиентская часть является чуть более сложной по той причине, что она должна выполнять 2 основных требования :
Установка и настройка серверной части.
Сам мемкеш сервер мы имеем возможность запустить в рамках web или worker роли. В высоконагруженных приложениях я рекомендовал бы запускать сервер в контексте отдельной worker-роли. В других же случаях более оптимальным вариантом будет вариант запуска сервера в контексте запущенной web-роли. Для установки и запуска сервера необходимо выполнить следующие шаги:
Первый параметр – это название точки доступа. созданной нами во 2-м пункте, второй параметр – это размер резервируемой под сервер оперативной памяти. Обратите внимание на метод Run – он прослушивает memcached-процесс (это может быть вечно :) ) на предмет выхода, поэтому если наш мемкеш-сервер по какой-то причине завернется, инфраструктура Windows Azure автоматически перезапустит все для нас. После того как все пункты выполнены нами успешно, наш сервер будет способен принимать соединения.
Установка и настройка клиентской части.
Для того чтобы воспользоваться кластером Memcached из нашей программы, необходимо настроить клиент, который знает как найти экземпляры серверов даже если они будут добавляться и удаляться из-за масштабирования или апгрейдов. Установка клиента не отличается повышенной сложностью, для того чтобы это сделать необходимо выполнить ряд действий:
Первый параметр – это имя роли, в которой запущен мемкеш и второй параметр – это название внутренней точки доступа, через которую происходит прослушивание подключений. Другой удобный вариант инициализации клиента – это старт приложения.
Итак, мы с Вами познакомились с тем как можно запускать и работать с 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/
Например, я считаю, что применение мемкеша полностью обоснованно в случае наличия у наших веб-ролей дополнительной оперативной памяти. В таком случае мы имеем возможность поднять дополнительный слой распределенного кеширования в памяти без необходимости запуска дополнительных виртуальных машин (и следовательно без каких-либо дополнительных затрат). Да, Windows Azure Сaching имеет в своем арсенале такую мощную штуку как локальный кеш, но для использования этой возможности все также необходим удаленный кеш и кроме того локальный кеш доступен только одному инстансу (поэтому он собственно и называется локальным).
Еще одна причина, по которой люди выбирают мемкеш – это возможность полного ручного контроля поведения кеш-памяти. Это конечно же занятие не для слабонервных, но это хороший вариант для тех людей, которые являются экспертами в тюнинге мемкеша.
Как это работает ?
Итак, мы решили все-таки использовать мемкеш как основной слой распределённого кеширования. Для этого у нас уже есть готовые реквизиты: серверная часть и клиентская доступны в виде NuGet пакетов. Серверная часть относительно проста – она просто запускает мемкеш демон и открывает прослушивание входящих соединений на определенном порту. Клиентская часть является чуть более сложной по той причине, что она должна выполнять 2 основных требования :
- Использовать консистентное хеширование, сводящее к минимуму сбои добавления и удаления серверов
- Автоматически реагировать на добавление и удаление серверов из кластера (во время масштабирования, апгрейдов и падений)
Установка и настройка серверной части.
Сам мемкеш сервер мы имеем возможность запустить в рамках web или worker роли. В высоконагруженных приложениях я рекомендовал бы запускать сервер в контексте отдельной worker-роли. В других же случаях более оптимальным вариантом будет вариант запуска сервера в контексте запущенной web-роли. Для установки и запуска сервера необходимо выполнить следующие шаги:
- При помощи NuGet инсталлировать сервер (делается в Package Manager при помощи команды
install-package WazMemcachedServer
). После этого к проекту будут подключены все необходимые бинарники и небольшой helper-класс - Добавить внутреннюю TCP точку доступа, через которую будет осуществляться прослушивание входящих соединений. (это можно сделать в Visual Studio путем двойного клика на роли и выбора категории “Endpoints” в панельке слева)
- Добавить код для запуска мемкеша в наши 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 из нашей программы, необходимо настроить клиент, который знает как найти экземпляры серверов даже если они будут добавляться и удаляться из-за масштабирования или апгрейдов. Установка клиента не отличается повышенной сложностью, для того чтобы это сделать необходимо выполнить ряд действий:
- При помощи NuGet инсталлировать клиентские библиотеки (делается в Package Manager при помощи команды
install-package
). Это добавит небольшое подмножество классов, расширяющих клиент Enyim для Memcached.WazMemcachedClient
- Создать в коде экземпляр класса-клиента (как вариант хранения объекта можно использовать статическую переменную), способного взаимодействовать с серверной частью
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/
Комментариев нет:
Отправить комментарий