Статьи

Использование Memcache для доступа к выделенному кешу Windows Azure

Несколько недель назад мы с Ларри написали несколько постов о том, как настроить совместное кэширование с помощью Windows Azure Caching (предварительный просмотр) и получить к нему доступ из Ruby и PHP: Windows Azure Caching (предварительный просмотр) и Ruby Cloud Services and PHP, Memcache и Windows Azure Caching . В этих постах мы не рассмотрели, как настроить роль в качестве выделенного кэша, а затем получить к нему доступ, используя протокол Memcache. (В совместном сценарии вы посвятили часть памяти роли кешированию и доступу из одной и той же роли.) Итак, в этом посте я расскажу, как настроить рабочую роль Node.js, которая служит выделенной кеш и веб-роль PHP, которая обращается к кешу с помощью php_memcacheрасширение. Чтобы выполнить следующие действия, вам потребуется учетная запись Windows Azure (вы можете подписаться на бесплатную пробную версию ) и учетную запись хранения Windows Azure .

Прежде чем я углублюсь в детали, здесь необходимо отметить пару вещей:

  1. Шаги в этом руководстве предполагают, что вы работаете на компьютере с Windows. Команда Windows Azure работает над расширением разработки облачных сервисов на другие платформы.
  2. Кэширование Windows Azure (предварительный просмотр) в настоящее время недоступно на веб-сайтах Windows Azure.
  3. Как вы увидите в деталях ниже, все шаги для включения этого сценария являются шагами настройки. В будущем вы можете рассчитывать на поддержку инструментов, что значительно облегчит эту работу.
  4. Я решил использовать рабочую роль Node.js в качестве выделенного кэша просто потому, что хотел. Вы можете использовать рабочую роль в любой среде по вашему выбору. То же самое верно и для веб-роли.

Имея это в виду, вот как это настроить:

1. Убедитесь, что у вас установлен Windows Azure SDK 1.7: скачать .

2. Установите командлеты Windows Azure PowerShell: установите . (Сведения об использовании командлетов см. В разделе Как использовать Windows Azure PowerShell .)

3. Создайте новый проект Windows Azure с помощью этой команды: New-AzureServiceProject <имя проекта> . Это создаст новый каталог (с тем же именем, что и <имя проекта> ). Из этого каталога добавьте веб-роль PHP и рабочую роль Node.js с помощью следующих команд: Add-AzurePHPWebRole и Add-AzureNodeWorkerRole . По умолчанию имена ролей будут WebRole1 и WorkerRole1 . При желании вы можете включить удаленный доступ к этим ролям с помощью следующей команды: Enable-AzureServiceProjectRemoteDesktop .

4. Найдите папку CachingPreview в .NET SDK. (Обычно это находится здесь: C: \ Program Files \ Microsoft SDK \ Windows Azure \ .NET SDK \ 2012-06 \ ref .) Скопируйте эту папку и вставьте ее в папку bin вашей веб-роли ( <имя проекта> / WebRole1 / bin ). Наконец, переименуйте вставленную папку WindowsAzure.Caching.MemcacheShim . (Подкладка будет установлена ​​в задаче запуска, определенной на следующем шаге.)

5. Откройте файл ServiceDefinition.csdef проекта папке <имя проекта> ) и найдите элемент <WebRole> . Добавьте элемент подсветки (ниже) как дочерний элемент к элементу <Startup>. Это определяет задачу, которая установит прокладку Memcache при запуске роли.

<Startup>
   <Task commandLine = «setup_web.cmd & gt; log.txt» executeContext = «повышенный уровень»>
     <Среда>
       <Имя переменной = «EMULATED»>
          <RoleInstanceValue xpath = «/ RoleEnvironment / Deployment / @ emulated» />
       < / Переменная>
       <Имя переменной = «VERSION» value = «5.3.13» />
       <Имя переменной = «DATACENTER» value = «» />
       <Имя переменной = «RUNTIMEURL» value = «» />
       <Имя переменной = » MANIFESTURL «value =» http://azurertscu.blob.core.windows.net/php/runtimemanifest.xml « />
     </ Environment>
   </ Task>
   <Task commandLine = «WindowsAzure.Caching.MemcacheShim \ MemcacheShimInstaller.exe» executeContext = «повышенный» />
</ Startup>

6. Все еще в элементе <WebRole> . В файле csdef добавьте выделенный элемент (ниже) к элементу <Endpoints> . Это устанавливает внутренний порт для связи по протоколу Memcache. Мы настроим его для связи с выделенным кешем позже.

<
   Конечные точки> <InputEndpoint name = «Endpoint1» protocol = «http» port = «80» />
   <InternalEndpoint name = «memcache_default» protocol = «tcp»>
     <FixedPort port = «11211» />
   </ InternalEndpoint>

</ Endpoints>

7. Теперь перейдем к элементу <WorkerRole> . В файле csdef добавьте следующий элемент (ниже) в качестве дочернего элемента элемента <WorkerRole> . Это импортирует модуль, который позволяет рабочей роли служить в качестве выделенного кэша.

<Imports>
  <Import moduleName = «Caching» />
</ Imports>

8. Также как дочерний элемент элемента <WorkerRole> , добавьте элемент ниже. Это устанавливает ресурс для сбора журналов и дампов.

<LocalResources>
   <LocalStorage name = «Microsoft.WindowsAzure.Plugins.Cache.FileStore» sizeInMB = «1000» cleanOnRoleRecycle = «false» />
</ LocalResources>

9. Теперь откройте файл ServiceConfiguration.cscfgпапке <имя проекта> ). Добавьте выделенные элементы (ниже) к элементу <ServiceConfiguration> для WorkerRole1 . Обратите внимание, что вам также нужно будет указать имя и ключ своей учетной записи хранения.

<Role name = «WorkerRole1»>
  <ConfigurationSettings>
    <Имя настройки = «Microsoft.WindowsAzure.Plugins.Caching.NamedCaches» value = «» />
    <Имя настройки = «Microsoft.WindowsAzure.Plugins.Caching.Loglevel» value = » «/>
    <Имя настройки =» Microsoft.WindowsAzure.Plugins.Caching.CacheSizePercentage «value =» «/>
    <Имя настройки =» Microsoft.WindowsAzure.Plugins.Caching.ConfigStoreConnectionString «value =» DefaultEndpointsProtocol = https; AccountName = Ваше хранилище имя учетной записи ; AccountKey = Ваш ключ учетной записи хранения «/>

  </ ConfigurationSettings>
  <Количество экземпляров =» 1 «/>
</ Роль>

На следующих нескольких шагах мы позволим shim memcache (в веб-роли PHP) взаимодействовать с выделенным кешем для рабочей роли).

10. Из папки WebRole1 удалите файл Web.cloud.config . Шим будет искать файл Web.config .

11. Откройте файл Web.config и удалите следующий элемент. Если вы планируете запустить свой проект в эмуляторах Windows Azure , оставьте пока этот элемент, но удалите его, прежде чем публиковать свой проект в Windows Azure.

<appSettings>
   <add key = «EMULATED» value = «true» />
</ appSettings>

12. Еще в файле Web.config добавьте следующий элемент в качестве первого дочернего элемента элемента <configuration> :

<configSections>
  <section name = «dataCacheClients»   
           type = «Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core»
           allowLocation = «true»
           allowDefinition = «Everywhere» />
</ configSections>

13. Снова в файле Web.config добавьте следующий элемент как дочерний элемент элемента <configuration> (только не первый дочерний элемент). Убедитесь, что значением элемента идентификатора является имя рабочей роли ( WorkerRole1 — это имя по умолчанию).

<dataCacheClients>
     <трассировка sinkType = «DiagnosticSink» TraceLevel = «Ошибка» />
     <dataCacheClient название = «DefaultShimConfig» useLegacyProtocol = «ложных»>
     <AutoDiscover IsEnabled = «истина» Идентификатор = «WorkerRole1» />
  </ dataCacheClient>
</ dataCacheClients>

14. Наконец, вам нужно добавить расширение PHP memcache к веб-роли (оно не включено по умолчанию). Сделайте это, добавив папку php в каталог bin вашей веб-роли. В папке php добавьте файл php.ini с одной строкой (он будет добавлен в конфигурацию PHP роли: extension = php_memcache.dll . Также добавьте каталог ext в папку php и поместите туда файл php_memcache.dll (убедитесь, что это версия dll php 5.3, nts, VC9, которую вы можете найти здесь ).

Это все, что нужно для конфигурации. УлыбкаКак я уже упоминал ранее, поищите инструмент в ближайшее время, который облегчит эту работу.

На этом этапе ваше приложение готово к развертыванию, но мы должны добавить немного кода PHP, который проверяет, работает ли кеш. Для этого я предлагаю добавить файл PHP ( cachetest.php ) в корень вашей веб-роли со следующим кодом:

<?php
    $memcache = new Memcache;
    $memcache->connect('localhost_WebRole1', 11211) or die ("Could not connect");

    $version = $memcache->getVersion();
    echo "Server's version: ".$version."<br/>\n";

    $tmp_object = new stdClass;
    $tmp_object->str_attr = 'test';
    $tmp_object->int_attr = 123;

    $memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
    echo "Store data in the cache (data will expire in 10 seconds)<br/>\n";

    $get_result = $memcache->get('key');
    echo "Data from the cache:<br/>\n";

    var_dump($get_result);
    ?>

 

Обратите внимание на код подключения (имя сервера «localhost_ <имя веб-роли>» ):

$ memcache-> connect ( ‘localhost_WebRole1’ , 11211) или die («Не удалось подключиться»);

После развертывания вашего проекта ( Publish-AzureServiceProject ) вы сможете перейти к cachetest.php и увидеть вывод кода выше.

Как всегда, мы будем рады получить отзывы об этом, если вы попробуете.