Статьи

Amazon DynamoDB: магазин PHP-сессий с балансировщиком нагрузки

Эта статья опубликована на одном из наших родственных сайтов CloudSpring . Если вы найдете это полезным, обязательно посетите их!

Из этого туториала вы узнаете, как использовать Amazon DynamoDB в качестве хранилища для сессий PHP. Этот метод становится очень полезным, когда ваши приложения пользуются услугами Elastic Load Balancing и Autoscaling. Вам необходимо включить учетную запись Amazon AWS, чтобы использовать EC2, Elastic Load Balancer и DynamoDB в качестве предварительного условия для прохождения обучения.

Что такое эластичный балансировщик нагрузки

Elastic Load Balancer выступает в качестве внешнего интерфейса для одного или нескольких ваших виртуальных серверов. Он принимает запросы и распределяет их по виртуальным серверам. Виртуальные серверы могут быть созданы путем клонирования машинного шаблона (AMI) или могут быть уничтожены при необходимости. Мощность процессора, если ваше приложение может быть изменено путем динамического добавления или уменьшения виртуальных серверов.

А автомасштабирование?

Когда Autoscaling присоединяется к игре, система также может:

  • Запустите больше клонов веб-серверов, когда есть большой трафик
  • Выключите некоторые из них, когда трафик падает ниже предопределенного порога
  • Завершите работу нездоровых экземпляров и замените их при необходимости

Как это сделать?

Может ли какое-либо из ваших приложений работать в этой среде? Да, если он удовлетворяет двум критическим требованиям:

  • Поскольку виртуальные серверы создаются динамически, серверы должны содержать только код приложения, а не какие-либо данные. Это легко сделать с помощью службы БД.
  • Любое состояние сеанса пользователя должно сохраняться вне виртуального сервера. Это немного сложнее, потому что по умолчанию модуль PHP сохраняет эти данные в файловой системе веб-сервера.

И это проблема, которую мы попытаемся решить на этой… хм… сессии.

Чего не делать: липкие сессии

Sticky session — это функция службы Elastic Load Balancer, которая связывает сеанс пользователя с конкретным экземпляром приложения, так что все запросы, поступающие от пользователя во время сеанса, будут отправляться на один и тот же виртуальный сервер. Cookie-файл сеанса может быть сгенерирован либо балансировщиком нагрузки, либо приложением, но это считается плохой практикой. Идеально было бы создать приложение без состояния, но это не всегда возможно.

Храните свои сессии в базе данных

Другой вариант: хранить наши сессии в базе данных. Это может быть та же самая внешняя база данных SQL, используемая приложением, или экземпляр Memcache, или другая база данных NoSQL. В этом случае DynamoDB кажется очень интересным, потому что это мощная и быстрая база данных NoSQL, она управляется самим Amazon и легко доступна с наших виртуальных серверов. Кроме того, класс AmazonDynamoDB официального PHP SDK уже оборудован для регистрации в качестве диспетчера сеансов. Если вы никогда не слышали о DynamoDB, я рекомендую вам посмотреть это вступительное видео .

Демо-приложение

Я собрал простое приложение для тестирования всего механизма, вы можете скачать исходный код из нашего репозитория Github . Мы запустим это приложение, используя эластичный балансировщик нагрузки и, по крайней мере, два экземпляра. Сейчас мы не будем использовать автоматическое масштабирование.

Экран приветствия

Приложение просит пользователя выбрать имя пользователя, которое сохраняется в текущем сеансе и действует как «логин». Если в сеансе присутствует имя пользователя, приложение позволяет пользователю вставить своего рода «профиль», по сути, последовательность информации ключ / значение, такую ​​как имя, фамилия, адрес электронной почты и т. Д. (Ключ и значение являются строками). Вся эта логика включена в файл index.php

Файл session.php Эта библиотека позволяет нам управлять данными сеанса с помощью дружественных методов, таких как $session->read('some_var') and $session->write('some_key', 'some_value') Этот объект сеанса может быть настроен для использования механизма сеанса PHP по умолчанию (если мы являемся локальным сервером тестирования) или пользовательского класса. Первый шаг нашего файла приложения — запуск сессии:

 require_once 'lib/session.php';
try {
 // Engine can be PHP or AmazonDynamoDB
 $session = new Session($config['session']['engine'], $config['session']['params']);
} catch (Exception $e) {
 exit($e->getMessage());
} // end try

Значением по умолчанию является PHP, который не нуждается в параметрах. Если мы выберем движок AmazonDynamoDB, конструктор сеанса выполнит дополнительный код:

 switch ($engine) {
case 'AmazonDynamoDB':
// Load AWS SDK
require_once 'AWSSDKforPHP/sdk.class.php';
// Create a list of credential sets that can be used with the SDK.
CFCredentials::set($params['credentials']);
// Instantiate a DynamoDB client
$dynamodb = new AmazonDynamoDB();
$dynamodb->set_region($params['region']);
// Instantiate, configure, and register the session handler
$this->handler = $dynamodb->register_session_handler(array(
'table_name'       => $params['table_name'],
'lifetime'         => $params['lifetime'],
));
break;

Сначала мы загружаем AWS SDK, который должен быть уже установлен и доступен, затем наши учетные данные загружаются в среду AWS. С этого момента мы можем использовать классы AWS, поэтому новый экземпляр AmazonDynamoDB создается и настраивается с правильным регионом, в котором находится наша таблица. Наконец, мы говорим нашему объекту DynamoDB зарегистрироваться как менеджер сеансов, передавая имя используемой таблицы, и это действительно то, что нам нужно.

В файле config.php В index.php Это полезно для проверки того, что сеанс поддерживается согласованным на наших серверах.

 function getServerName() {
 $host = $_SERVER['SERVER_NAME'];
 if ('localhost' != $host) {
 // Maybe we are on EC2, trying to catch the current instance ID
 $ch = curl_init('http://169.254.169.254/latest/meta-data/instance-id');
 curl_setopt($ch, CURLOPT_FAILONERROR, true);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
 if ($ret = curl_exec($ch)) {
 $host .= ' (instance ' . $ret . ')';
 } // end if
 curl_close($ch);
 } // end if
 return $host;
} // end function

Функция getServerName()API метаданных EC2 для поиска имени экземпляра.

Запустите приложение на своем автопарке

Чтобы протестировать это приложение, нам нужен парк из минимум двух веб-серверов за балансировщиком нагрузки. Сервер, который я использовал, является экземпляром Ubuntu GNU / Linux, оснащенным:

  • веб-сервер Apache,
  • PHP 5.3 (как для командной строки, так и для модуля Apache),
  • программа cURL и расширение PHP,
  • менеджер пакетов Pear (необходим для простой установки SDK),
  • AWS SDK для PHP (я предлагаю установку от Pear).

Если вы знаете, как создать AMI, вы можете создать свой с нуля. Но вы также можете использовать тот, который я подготовил и опубликовал: ami-4b42443f. Этот компьютер уже содержит исходный код PHP для приложения и все другие зависимости. Как только у вас будет готов AMI … поехали!

Инициализировать хранилище сеанса

Перейдите к консоли AWS, выберите сервис DynamoDB и ваш любимый регион (у меня есть EU West — Ирландия). Нажмите на кнопку «Создать таблицу».

Создайте таблицу, шаг 1

Введите «test_sessions» в качестве имени таблицы и выберите строковый первичный ключ с именем «id», тип ключа должен быть «hash». Если вы выбираете другое имя, оно должно быть скопировано позже в файл config.php Введите «10» для полей единиц чтения и записи (например, как быстро ваша таблица), этого достаточно для проверки.

Создайте таблицу, шаг 2

Теперь у вас есть таблица NoSQL, где каждая строка имеет обязательное поле идентификатора, но может иметь переменное число других различных полей типа строка, число, набор строк или набор номеров. Объект диспетчера сеансов будет использовать строковое поле с именем «data» для хранения переменных сеанса и числовое поле с именем «expires» для метки времени истечения сеанса.

Запустите и настройте серверы

Выберите AMI для запуска

Теперь выберите сервис EC2 и тот же регион, который вы выбрали для таблицы DynamoDB. Нажмите кнопку «Запуск экземпляра» на панели инструментов или в разделе «Экземпляры». Выберите свой пользовательский AMI или, с помощью классического мастера, перейдите на вкладку «AMI сообщества» и введите «ami – 4b42443f».

На следующем экране введите по крайней мере «2» для количества экземпляров и выберите тип экземпляра, я выбрал Micro (t1.micro). Вы можете оставить «без предпочтений» в раскрывающемся списке зон доступности, но в производственной среде лучше, если различные экземпляры распределены между двумя или более зонами внутри одного региона. Примите настройки по умолчанию для панелей конфигурации «Сведения об экземпляре» и «Устройство хранения», затем продолжите. Введите один или несколько дополнительных тегов, если хотите. Выберите пару ключей или создайте новую и выберите группу безопасности, которая позволяет использовать как минимум HTTP на порту 80 и SSH на порту 22.

Резюме настроек экземпляра

Проверьте ваши настройки и запустите экземпляры. Когда состояние экземпляров «работает», их можно настроить через SSH. Каждый экземпляр имеет общедоступное DNS-имя, похожее на ec2-xxx-xxx-xx-xx.region.compute.amazonaws.com. Вам нужно будет редактировать файл config.php в каждом созданном вами экземпляре. Подключитесь к экземпляру с помощью SSH или SFTP-клиента, используя ваш открытый ключ и имя пользователя «ubuntu» (если вы использовали мой открытый AMI):

$ ssh -i /path/to/key.pem [email protected]

Измените текущий каталог на / var / www, где находится тестовое приложение. Отредактируйте файл config.php, вставив свой ключ AWS и секрет. Затем проверьте, соответствуют ли ваши настройки таблицы DynamoDB, вам, безусловно, придется редактировать регион с соответствующим значением, которое можно найти в этой ссылке .

Затем создайте пустой файл с именем ping.html внутри / var / www: этот файл будет использоваться балансировщиком нагрузки для проверки достижимости каждого экземпляра.

Настройка балансировщика нагрузки

Имея базу данных и все экземпляры, мы можем теперь настроить балансировщик нагрузки внешнего интерфейса. В меню навигации EC2 в разделе «Сеть и безопасность» выберите «Балансировщики нагрузки» и нажмите кнопку «Создать балансировщик нагрузки».

Экран создания балансировщика нагрузки

Выберите имя для балансировщика нагрузки и убедитесь, что конфигурация прослушивателя совпадает с конфигурацией на снимке экрана, которая в основном гласит: перенаправить весь трафик HTTP на порт 80 балансировщика нагрузки на HTTP на порт 80 экземпляров.

Настройки работоспособности балансировщика нагрузки

На панели проверки работоспособности введите /ping.html в поле пути ping и оставьте другие параметры по умолчанию. Это означает: вызывать ресурс /ping.html каждого экземпляра каждые 30 секунд, если время ответа превышает 5 секунд, проверка не проходит, если экземпляр не проходит две последовательные проверки работоспособности, он вреден для здоровья, если он проходит 10 последовательных проверок, экземпляр является здоровый. Балансировщик нагрузки не будет перенаправлять трафик на нездоровый экземпляр, и если автоматическое масштабирование установлено, нездоровые экземпляры могут быть прекращены и заменены новыми свежими.

Прикрепить экземпляры

На следующем экране вы можете выбрать, какие из запущенных экземпляров могут быть добавлены в балансировщик нагрузки. Выберите два экземпляра, созданные ранее, и продолжайте. Просмотрите окончательную конфигурацию и подтвердите, подходит ли она вам. Теперь вы сможете увидеть детали балансировщика нагрузки и состояние всех подключенных экземпляров.

Экран резюме ELB

Вы можете протестировать приложение, поместив DNS-имя балансировщика нагрузки (что-то вроде yourname-12345678.region.elb.amazonaws.com) в браузер. Вы также можете настроить домен или поддомен (например, Dynamo.yourdomain.com), добавив CNAME на панели DNS, которая указывает на URL-адрес балансировщика нагрузки. Не рекомендуется использовать IP с записью A, потому что IP может меняться со временем.

Screenshot comparison

Каждый раз, когда вы отправляете форму или обновляете, запрашиваемая страница может обрабатываться другим экземпляром. Вы можете проверить, какой экземпляр обслуживает вас, по имени, отображаемому с помощью утилиты getServerName ().

Резюме

И это пока все. Мы рассмотрели важную тему в экосистеме AWS, но это только начало. Все это полностью программируется, например: вы можете добавить автоматическое масштабирование и настроить свои экземпляры так, чтобы они были самонастраиваемыми, а также загружать учетные данные AWS и другие данные из надежного места. Или вы можете использовать Cloud Formation для создания многократно используемого шаблона для всей инфраструктуры.

Отправной точкой для проверки является домашняя страница AWS . И теперь, если вы закончили тестирование, не забудьте прекратить все свои вещи, если не Happy Coding!

Изображение через Fotolia