Как добавлять NoSQL-запросы в MySQL, интегрированный с memcached, на Ubuntu 14

О том, как использовать memcached и его функцию в качестве автономного сервера вместе с MySQL, уже написано во множестве прекрасных статей – например, Установка и использование Memcache на Ubuntu 14.04. Но в качестве автономного сервера memcached выполняет промежуточную функцию, предшествуя уровню доступа MySQL-клиента, и работает только с той информацией, которая находится в памяти, без возможности ее постоянного хранения. Это позволяет выполнять такие задания, как кэширование результатов повторных MySQL-запросов, что экономит ресурсы и оптимизирует работу нагруженных сайтов.

Но в этой статье мы поговорим о другом. Memcached будет установлен как MySQL-плагин и тесно интегрирован в MySQL. Это создаст уровень доступа в стиле NoSQL для управления информацией прямо в стандартных MySQL-таблицах InnoDB. Как станет ясно из статьи, это дает ряд преимуществ.

Базовая информация

Чтобы понимать, о чем идет речь в этой статье, вам нужно иметь хотя бы общее представление о том, что такое NoSQL и memcached. NoSQL работает с информацией в форме элементов «ключ-значение (значения)». Это более простой подход по сравнению со стандартным SQL. Более того, он обеспечивает бОльшую эффективность и лучшее масштабирование, что особенно важно для работы с большими объемами информации (Big Data).

Но для того, чтобы заменить стандартный SQL, одной только хорошей работы NoSQL недостаточно. Из-за своей простоты NoSQL не подходит для работы со структурированными данными, содержащими сложные взаимосвязи. Поэтому NoSQL скорее можно назвать важным дополнением к SQL, нежели его заменой.

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

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

  • Key (Ключ) — буквенно-цифровое значение, которое является ключом доступа к значению элемента.
  • Value (Значение) — произвольные данные, в которых хранится наиболее важная часть передаваемых данных.
  • Flag (Флаг) — обычно это значение, используемое для задания дополнительных параметров, относящихся к основному значению. Например, флаг использовать или не использовать сжатие.
  • Expiration time (Срок истечения)— время истечения в секундах. Не забывайте о том, что memcached изначально предназначался для кэширования.
  • CAS value (Значение CAS) — уникальный идентификатор для каждого элемента.

Требования

Тестирование, описанное в данной статье, проводилось на Ubuntu 14.04. Описанный здесь процесс установки и конфигурации будет похож на процесс установки и конфигурации на других операционных системах или их версиях, но команды и расположение файлов конфигурации могут отличаться.

Вам понадобится следующее:

  • Недавно установленная Ubuntu 14.04
  • Пользователь non-root с привилегиями sudo

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

Шаг 1 — Установка MySQL 5.6

Плагин memcached в MySQL доступен в версиях MySQL выше 5.6.6. Это значит, что использовать пакет MySQL (версия 5.5) из стандартного хранилища Ubuntu 14.04 не получится. Вместо этого сделайте следующее :

  1. Добавьте официальное хранилище MySQL
  2. Установите из него MySQL-сервер, клиента и библиотеки

Сначала перейдите на страницу хранилища MySQL  и загрузите пакет, который добавит MySQL-хранилище на вашу Ubuntu 14.04 . Вы также можете загрузить пакет напрямую на своем сервере:

wget https://dev.mysql.com/get/mysql-apt-config_0.3.5-1ubuntu14.04_all.deb

Затем установите его при помощи dpkg:

sudo dpkg -i mysql-apt-config_0.3.5-1ubuntu14.04_all.deb

При выполнении этой команды появляется диалоговое окно с двумя вопросами:

  1. Какой продукт MySQL вы желаете конфигурировать? Отвечайте Server.
  2. Какую версию сервера вы желаете получить? Отвечайте mysql-5.6.

После ответа на эти два вопроса вы будете перенаправлены к первому вопросу о продукте, который вы хотите установить. Нажмите на «Apply» (Применить) внизу, чтобы подтвердить свой выбор, и выйдите из диалогового окна.

Теперь, когда у вас есть новое хранилище MySQL, вы должны обновить apt cache, т.е. информацию о пакетах, доступных для установки на Ubuntu. Таким образом, когда вы будете устанавливать MySQL, он будет извлечен из нового хранилища. Для обновления apt cache выполните следующую команду:

sudo apt-get update

Теперь вы можете установить MySQL 5.6 на Ubuntu 14.04 при помощи следующей команды:

sudo apt-get install mysql-server

При выполнении этой команды вас попросят задать root-пароль (пароль администратора) для MySQL. Для удобства вы можете не задавать пароль на этом этапе, а при запросе пароля просто нажимать ENTER. Но когда вы решите использовать этот сервер, то для безопасной установки MySQL рекомендуется выполнить команду sudo mysql_secure_installation и задать root-пароль.

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

mysql -u root

Для задания пароля вы должны будете выполнить следующую команду и при запросе пароля ввести свой root-пароль для MySQL:

mysql -u root -p

Вы увидите следующее:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25 MySQL Community Server (GPL)
...

Оставаясь в окне MySQL (клиентском терминале), создайте новую базу данных под названием test:

CREATE DATABASE test;

Эта база потребуется нам для дальнейшего тестирования. Чтобы выйти из MySQL-клиента, введите:

quit

Наконец, вам также нужно установить пакет для асинхронных уведомлений — libevent-dev. Для этого выполните команду:

sudo apt-get install libevent-dev

Шаг 2 — Установка плагина memcached на MySQL

Перед установкой плагина memcached необходимо выполнить запросы, находящиеся в файле /usr/share/mysql/innodb_memcached_config.sql. Запустите MySQL-клиент:

mysql -u root

или, если вы задали пароль:

mysql -u root -p

и выполните:

source /usr/share/mysql/innodb_memcached_config.sql;

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

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

install plugin daemon_memcached soname "libmemcached.so";

Выйдите из сеанса MySQL:

quit

Итак, вы установили плагин memcached, находящийся в папке /usr/lib/mysql/plugin/ в Ubuntu 14.04. Этот файл доступен только в MySQL 5.6 и выше.

После завершения установки вам необходимо сконфигурировать слушателя плагина memcached. Это необходимо для подключения к плагину memcached. Для этого откройте файл  /etc/mysql/my.cnf с помощью предпочитаемого вами редактора (конечно же nano):

sudo nano /etc/mysql/my.cnf

После строки [mysqld] добавьте новую строку:

daemon_memcached_option="-p11222 -l 127.0.0.1"

Эта команда cконфигурирует слушателя плагина memcached на порте 11222, который активен только для IP 127.0.0.1. Это значит, что подключиться смогут только клиенты с вашего сервера. Если вы не укажите IP (-l 127.0.0.1), то беспрепятственно подключиться сможет абсолютно любой клиент, а это представляет серьезную угрозу безопасности. Чтобы узнать больше о безопасности плагина memcached, вы можете ознакомиться с его документацией по вопросам безопасности.

Для запуска нового процесса прослушивания для плагина memcached, перезапустите MySQL-сервер с помощью команды:

sudo service mysql restart

Шаг 3 — Тестирование плагина memcached

Чтобы проверить, что установка прошла успешно, выполните следующую команду в MySQL-клиенте (запустите клиента при помощи mysql -u root или mysql -u root -p):

show plugins;

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

| daemon_memcached           | ACTIVE  | DAEMON             | libmemcached.so | GPL     |

В противном случае, убедитесь, что вы используете MySQL 5.6 (выше чем 5.6.19 так как на этой версии не работало) или выше и что вы в точности следовали описанному выше процессу установки. Вы также можете попытаться подключиться к интерфейсу нового плагина memcached через telnet с вашего сервера:

telnet localhost 11222

При успешном подключении в выходной строке вы увидите:

Connected to localhost.
Escape character is '^]'.

Чтобы проверить, как работает соединение, вы можете выполнить команду, например stats, чтобы посмотреть статистику. Чтобы закрыть окно, нажмите одновременно на CTRL и ] на клавиатуре. Затем введите quit, чтобы выйти из клиента Telnet.

Telnet представляет собой самый простой способ подключиться к плагину memcached и к самим данным MySQL. Этот способ отлично подходит для тестирования, но если вы решите использовать его на профессиональном уровне, вам следует почитать доступные библиотеки для популярных языков программирования (например, PHP и Python).

Шаг 4 — Выполнение NoSQL-запросов в MySQL через плагин memcached

Если вы вернетесь к той части этой статьи, где описывалась установка плагина memcached, вы увидите, что мы выполняли операторы из файла /usr/share/mysql/innodb_memcached_config.sql. Эти операторы создали в базе данных test новую таблицу demo_test. Таблица demo_test имеет следующие столбцы, соответствующие протоколу memcached:

  • c1 соответствует полю key (ключ).
  • c2 соответствует полю value (значение).
  • c3 соответствует полю flag (флаг).
  • c4 соответствует полю CAS.
  • c5 соответствует полю expiration (истечение).

При помощи этой таблицы demo_test мы и будем проводить тестирование. Для начала откроем базу данных/таблицу через MySQL-клиент с помощью следующей команды:

mysql -u root test

Или, если вы задали пароль для MySQL:

mysql -u root test -p

В таблице demo_test уже должен быть одна запись:

SELECT * FROM demo_test;

Результаты должны выглядеть следующим образом:

+-------------+--------------+------+------+------+
| c1          | c2           | c3   | c4   | c5   |
+-------------+--------------+------+------+------+
| AA          | HELLO, HELLO |    8 |    0 |    0 |
+-------------+--------------+------+------+------+
1 rows in set (0.00 sec)

Выйдите из сеанса MySQL:

quit

Теперь создадим вторую запись при помощи NoSQL-интерфейса memcached и telnet. Снова подключитесь к рабочей станции через TCP-порт 11222:

telnet localhost 11222

Затем используйте следующие синтаксические конструкции:

set [key] [flag] [expiration] [length in bytes]
[value]

Обратите внимание на то, что компонент value (значение) должен располагаться на следующей строке. Более того, при работе описанным выше способом для каждой записи необходимо в качестве значения указывать длину в битах.

В качестве примера создадим новый элемент (запись в таблице) с ключом newkey, значением 0 для флага и значением 0 для истечения (срок истечения отсутствует). Значение — 12 бит в длину.

set newkey 0 0 12 NewTestValue

Конечно, вы также можете извлечь значения через этот NoSQL-интерфейс. Это можно сделать при помощи команды get, после которой необходимо указать название ключа, которые вы хотите извлечь. Не выходя из сеанса Telnet, введите:

get newkey

Результат должен выглядеть следующим образом:

VALUE newkey 0 12
NewTestValue

Упомянутые выше команды set и get работают для любого сервера memcached. Здесь мы привели всего несколько простых примеров того, как вставить и извлечь записи в стиле NoSQL.

Теперь снова подключимся к MySQL-клиенту при помощи команды mysql -u root test или mysql -u root test -p и снова посмотрим содержание таблицы demo_test  с выполненной командой:

SELECT * FROM demo_test WHERE c1="newkey";

В таблице должна появиться новая запись:

+--------+--------------+------+------+------+
| c1     | c2           | c3   | c4   | c5   |
+--------+--------------+------+------+------+
| newkey | NewTestValue |    0 |    1 |    0 |
+--------+--------------+------+------+------+

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

Выполните следующий оператор select:

use innodb_memcache;
select * from containers \G

Вы увидите следующее:

*************************** 1. row ***************************
                  name: aaa
             db_schema: test
              db_table: demo_test
           key_columns: c1
         value_columns: c2
                 flags: c3
            cas_column: c4
    expire_time_column: c5
unique_idx_name_on_key: PRIMARY
1 row in set (0.00 sec)

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

Преимущества интеграции MySQL с плагином memcached

Приведенная выше информация и примеры выделяют несколько важных преимуществ интеграции MySQL с NoSQL через плагин memcached:

Все ваши данные (MySQL и NoSQL) хранятся в одном месте. Вам не нужно устанавливать и поддерживать дополнительно программное обеспечение для NoSQL-данных. Сохраняемость, восстановление и репликация NoSQL-данных возможны за счет мощного движка lnnoDB.

Невероятный быстрый уровень доступа к данным memcached можно по-прежнему использовать для работы с большими объемами информации (сравните с работой с более медленным MySQL-клиентом).

Управление NoSQL-данными можно осуществлять через интерфейс и синтаксис MySQL. Так вы сможете включать NoSQL-данные в более сложные SQL-запросы (например, операторы left join).

Заключение

Эта статья рассказывает о новых возможностях работы с NoSQL-данными, предоставленными через MySQL. Хоть этот способ и не является полноценной заменой NoSQL-серверов (таких, например, как MongoDB), но все же обладает определенными преимуществами.