Поиск по сайту:

Как установить и использовать Memcache в Ubuntu 14.04


Введение

По мере роста ваших веб-сайтов и увеличения трафика одним из компонентов, который быстрее всего подвергается нагрузке, является серверная база данных. Если ваша база данных не распределена и не настроена для работы с высокими нагрузками, она может быть легко перегружена из-за относительно небольшого увеличения трафика.

Один из способов справиться с этим — использовать систему кэширования объектов памяти, например memcached. Memcached — это система кэширования, которая работает путем временного хранения информации в памяти, которая обычно извлекается из базы данных. Затем следующий запрос информации в памяти выполняется невероятно быстро, не создавая нагрузки на серверную базу данных.

В этом руководстве мы обсудим, как установить и использовать memcached на сервере Ubuntu 14.04.

Предпосылки

Прежде чем мы начнем, на вашем сервере должен быть обычный пользователь без полномочий root, который имеет доступ к привилегиям sudo. Если вы еще не создали такого пользователя, вы можете сделать это, выполнив шаги 1-4 в нашем руководстве по первоначальной настройке для Ubuntu 14.04.

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

Установите Memcached и компоненты

Для начала мы должны получить все необходимые компоненты из репозиториев Ubuntu. К счастью, все, что нам нужно, имеется.

Поскольку это наша первая операция с apt в этом сеансе, мы должны обновить наш локальный индекс пакета. Затем мы можем установить наши программы.

Мы собираемся установить memcached, а также серверную часть базы данных MySQL и PHP для обработки взаимодействия. Мы также устанавливаем расширение PHP, которое обрабатывает взаимодействия с memcached. Вы можете получить все, что вам нужно, набрав:

sudo apt-get update
sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached

Обратите внимание, что доступно *два расширения PHP memcache. Одно называется php5-memcache, а другое называется php5-memcached (обратите внимание на символ \d в конце второй пример). Мы используем второй из них, потому что он стабилен и реализует более широкий спектр функций.

Если у вас еще не установлен MySQL, установка предложит вам выбрать и подтвердить пароль администратора.

Это должно установить и настроить все, что вам нужно.

Проверьте установку

Хотите верьте, хотите нет, но memcached уже полностью установлен и готов к работе. Мы можем проверить это разными способами.

Первый способ довольно прост. Мы можем просто спросить PHP, знает ли он о нашем расширении memcached и включено оно или нет. Мы можем сделать это, создав вездесущую информационную страницу PHP.

Это легко сделать, создав файл с именем info.php в корне нашего документа. В Apache на Ubuntu 14.04 наш корень документа по умолчанию — /var/www/html. Откройте файл здесь с привилегиями root:

sudo nano /var/www/html/info.php

В этом файле введите это. Это в основном просто вызывает функцию PHP, которая собирает и печатает информацию о нашем сервере в удобном для Интернета формате.

<?php
phpinfo();
?>

Теперь вы можете посетить доменное имя вашего сервера или общедоступный IP-адрес, за которым следует /info.php, и вы должны увидеть информационную страницу.

<пред>

Если вы прокрутите вниз или выполните поиск по заголовку раздела \memcached, вы должны найти что-то похожее на это:

Это означает, что расширение memcached включено и найдено веб-сервером.

Мы также можем проверить, работает ли служба memcached, набрав:

ps aux | grep memcached
memcache  6584  0.0  0.0 327448  3004 ?        Sl   14:07   0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1
demouser  6636  0.0  0.0  11744   904 pts/0    S+   14:29   0:00 grep --color=auto memcached

Вы можете запросить у службы статистику, набрав:

echo "stats settings" | nc localhost 11211

Если вам когда-нибудь понадобится остановить, запустить или перезапустить службу memcached, это можно сделать, набрав что-то вроде этого:

<пред>

Проверьте, может ли Memcached кэшировать данные

Теперь, когда мы убедились, что memcached запущен и что наше расширение PHP для подключения к нему включено, мы можем попытаться заставить его хранить данные.

Мы собираемся сделать это, создав еще один PHP-скрипт. На этот раз все будет сложнее.

Откройте файл с именем cache_test.php в корне нашего документа:

sudo nano /var/www/html/cache_test.php

Внутри начните с создания тегов-оболочек PHP:

<пред>

В них мы создадим новый экземпляр объекта PHP Memcached и сохраним его в переменной. Мы собираемся определить место, где этот объект PHP может подключиться к фактической службе memcached, работающей на нашем сервере. Memcached работает на порту 11211 по умолчанию:

<пред>

Далее мы скажем нашему экземпляру Memcached запросить ключ из нашего кеша. Этот ключ можно назвать как угодно, потому что мы его еще не создали. Мы будем использовать \blah. Результат этого запроса будет сохранен в переменной $result:

<пред>

$result=$mem->get(\blah);

Далее нам просто нужно проверить, было ли что-то возвращено. Если memcached нашел ключ с именем \blah, мы хотим, чтобы он напечатал значение, связанное с этим ключом. Если memcached не смог найти соответствующий ключ, мы должны распечатать сообщение об этом.

Затем мы должны установить ключ со значением, чтобы в следующий раз, когда мы запросим значение, memcached нашел значение, которое мы ему даем:

<пред>

$result=$mem->get(\бла);

if ($result) {

На этом наш скрипт готов. Если мы посетим эту страницу в нашем веб-браузере, мы увидим, как это работает:

<пред>

Сначала вы должны увидеть страницу, которая выглядит следующим образом:

Однако, если мы обновим страницу, мы должны увидеть другое сообщение:

Как видите, наш сервис memcached теперь кэширует данные, установленные нашим скриптом.

Проверка временного кэширования значений базы данных

Теперь, когда мы проверили нашу способность хранить данные в memcached, мы можем продемонстрировать более реалистичный сценарий: временное кэширование результатов запроса к базе данных.

Создайте образцы данных в MySQL

Для этого нам сначала нужно сохранить некоторую информацию в нашей базе данных.

Подключитесь к вашему экземпляру MySQL в качестве администратора, введя это. Вам нужно будет ввести корневой пароль MySQL, который вы установили во время установки:

mysql -u root -p

После этого вам будет предоставлено приглашение MySQL.

Во-первых, мы хотим создать базу данных для тестирования. Затем мы выберем базу данных:

CREATE DATABASE mem_test;
USE mem_test;

Давайте создадим пользователя с именем test с паролем testing123, у которого есть доступ к созданной нами базе данных:

GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123';

Теперь мы собираемся создать действительно простую таблицу и вставить в нее запись. Таблица будет называться sample_data и будет иметь только индекс и строковое поле:

CREATE TABLE sample_data (id int, name varchar(30));
INSERT INTO sample_data VALUES (1, "some_data");

Теперь у нас есть созданная структура и вставленные данные. Мы можем выйти из MySQL:

exit

Создайте скрипт PHP для кэширования данных MySQL

Теперь, когда у нас есть данные в MySQL, мы можем создать еще один PHP-скрипт, который будет работать аналогично производственному PHP-приложению.

Он будет искать данные в memcached и возвращать их, если найдет данные. Если он не найдет данные, он сделает запрос из самой базы данных, а затем сохранит результаты в memcached для будущих запросов.

Для начала создайте еще один PHP-скрипт в корне нашего документа. Мы назовем этот скрипт database_test.php:

sudo nano /var/www/html/database_test.php

Начните аналогично нашему последнему сценарию. Мы собираемся создать экземпляр PHP memcached, а затем сообщить ему, где находится служба memcached, работающая на нашем сервере, как мы делали в прошлый раз:

<пред>

Далее, в нашем первом отходе от нашего последнего скрипта, нам нужно будет определить, как PHP может подключаться к нашей базе данных MySQL. Нам нужно указать учетные данные для входа в систему для пользователя, которого мы создали, а затем нам нужно указать ему, какую базу данных использовать:

<пред>

mysql_connect(\localhost, \test, \testing123) или die(mysql_error());

Далее нам нужно разработать запрос, который нам нужен для извлечения данных, которые мы вставили в нашу таблицу. Мы сохраним это в переменной $query.

Затем мы создадим переменную $querykey для хранения ключа, который memcached будет использовать для ссылки на нашу информацию.

Мы создаем этот ключ, используя строку «KEY», а затем добавляем в конец контрольную сумму md5 (метод хэширования) нашего запроса. Это гарантирует, что каждый ключ уникален, если мы будем использовать эту технику для большего набора данных. Это также гарантирует, что соответствующий запрос будет создавать тот же ключ для последующих запросов.

<пред>

mysql_connect(\localhost, \test, \testing123) или die(mysql_error());

$query=\SELECT ID FROM sample_data WHERE name=‘some_data’»;

Далее мы создадим переменную $result, как и в предыдущем скрипте. Это будет содержать результат нашего запроса memcached, как и раньше. Мы запрашиваем у memcached ключ запроса, который мы сгенерировали, чтобы увидеть, есть ли в его системе запись, идентифицируемая этим ключом.

<пред>

mysql_connect(\localhost, \test, \testing123) или die(mysql_error());

$query=\ВЫБЕРИТЕ имя ИЗ sample_data, ГДЕ id=1;

$result=$mem->get($querykey);

Теперь мы готовы выполнить реальную логику тестирования, которая определит, что произойдет, когда результат будет найден в memcached. Если результаты найдены, мы хотим распечатать данные, которые мы вытащили, и сообщить пользователю, что мы смогли получить их напрямую из memcached:

<пред>

mysql_connect(\localhost, \test, \testing123) или die(mysql_error());

$query=\ВЫБЕРИТЕ имя ИЗ sample_data, ГДЕ id=1;

$result=$mem->get($querykey);

if ($result) {

Теперь давайте добавим логику для альтернативного сценария. Если результаты не найдены, мы хотим использовать созданный нами запрос, чтобы запросить данные у MySQL. Мы сохраним это в созданной нами переменной $result. Это будет в виде массива.

После того, как мы получим результат запроса, нам нужно добавить этот результат в memcached, чтобы данные были там в следующий раз, когда мы это сделаем. Мы можем сделать это, передав memcached ключ, который мы хотим использовать для ссылки на данные (мы уже создали его с помощью переменной $querykey), сами данные (хранящиеся в $result из запроса MySQL) и время кэширования данных в секундах.

Мы собираемся кэшировать наш контент на 10 секунд. В реальном мире, скорее всего, было бы выгодно кэшировать контент дольше. Возможно, что-то ближе к 10 минутам (600 секундам), если ваш контент не сильно изменится. Для тестирования меньшее значение позволяет нам быстрее увидеть, что происходит, без перезапуска нашей службы memcached.

После этого мы распечатаем аналогичное сообщение с результатами запроса и сообщим пользователю, что произошло. Мы должны добавить весь этот блок как else для нашего предыдущего if:

<пред>

mysql_connect(\localhost, \test, \testing123) или die(mysql_error());

$query=\ВЫБЕРИТЕ имя ИЗ sample_data, ГДЕ id=1;

$result=$mem->get($querykey);

если ($результат) {

Это наш готовый скрипт. Он попытается получить данные из memcached и вернуть их. В противном случае он будет запрашивать напрямую из MySQL и кэшировать результаты на 10 секунд.

Протестируйте скрипт

Теперь, когда у нас написан сценарий, мы можем запустить его, перейдя в папку с файлом в нашем веб-браузере:

<пред>

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

Если мы обновим это (в течение 10 секунд после нашего последнего посещения), страница теперь должна отображать другое сообщение:

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

Заключение

К настоящему времени вы должны хорошо понимать, как работает memcached и как вы можете использовать его, чтобы ваш веб-сервер не обращался к базе данных повторно для одного и того же контента.

Хотя сценарии PHP, которые мы создали в этом руководстве, были только примерами, они должны дать вам хорошее представление о том, как работает система. Это также должно дать вам хорошее представление о том, как структурировать ваш код, чтобы вы могли проверить memcached и при необходимости вернуться к базе данных.

Джастин Эллингвуд