Дата и время публикации:
Назначение и использование
1. Назначение
Memcached хранилище в памяти ключевых значений, состоящие из небольших сегментов произвольных данных, таких как строки и объекты, возвращаемых в результате выполнения вызов баз данных, функций API или перерисовки страницы.
Поэтому, как можно догадаться, Memcached, предназначена для повышения быстродействие динамических приложений WEB путем облегчения нагрузки на базу данных за счет использования КЭШирования данных. При этом основным достоинством этого проекта является свободный распространяемый и открытый исходный код. Также, кроме БД, можно использовать сохранение часто обращаем данных, например и как показано ниже, сохранение журнала результата регистрации используемых файлов исходного кода.
2. Использование
2.1 Организация доступа клиента
Сервис Memcached реализует доступ к своему КЭШу по клиент-серверной технологии и запускается сервером в фоновом режиме на локальном или удаленном узле вычислительной сети. Обмен между клиентом может производиться по портам 11211/tcp и 11211/udp .
Для проверки доступности сервера следует использовать telnet(1), как показано в дампе 2.1.1
Дамп 2.1.1
$telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. get foo VALUE foo 0 2 hi END stats ... STAT pid 9696 STAT uptime 3997 ... STAT max_connections 1024 STAT curr_connections 1 STAT total_connections 4 ... STAT cmd_get 1 STAT cmd_set 2 ... STAT get_hits 8 STAT get_misses 1 ... STAT bytes_read 93 STAT bytes_written 4220 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 ... STAT bytes 0 STAT curr_items 0 STAT total_items 0 ... (etc)
В котором приводится пример использование команды get, которая для получения ключевого значения foo, и stats, возвращает слепок текущего состояния, из которого приводится небольшая часть наиболее интересных и широко используемых данных статистики в таблице 2.1.2
Наименование данных статистики | Описание |
---|---|
uptime | Время в секундах от начало работу |
curr_items | Текущее количество объектов в КЭШе |
bytes | Общее количество объектов в КЭШе |
limit_maxbytes | Количество задействованной памяти для сохранение объектов |
bytes_read | количество прочитанных (принятых) данных из сети |
bytes_written | количество записанных (переданных) данных из сети |
curr_connections | Количество открытых в данный момент соединений с сервером memcached |
total_connenctions | Всего сделанных соединений с сервером memcached даже те, которые были закрыты |
cmd_get | Количество раз использования команды get |
cmd_set | Количество раз использования команды set |
get_hits | Количество успешно выполненных запросов |
get_misses | Количество отбракованных запросов |
evictions | количество объектов удаленных из КЭШа для "заселения" новыми |
threads | Количество используемых для обслуживания клиентов работающих потоков |
listen_disabled_num | Количество попыток создания новых соединений, в которых было отказано memcached |
Соответственно, запись значений ключа foo, который ранее прочитали командой get, можно записать используя встраиваемое решение в исходный код программного продукта функции API библиотеки libmemcached, как показано в листинг 2.1.2
Листинг 2.1.2
char *key= "foo"; char *value= "hi"; size_t value_length=strlen(value); memcached_return_t rc= memcached_set(memc, key, strlen(key), value, value_length, (time_t)0, (uint32_t)0); if (rc != MEMCACHED_SUCCESS) { ... // handle failure }
Тоже самое можно добиться используя библиотеку python3-memcache, которая позволяет набросать более компактный код, не правда ли? Смотрим в листинг 2.1.3
Листинг 2.1.3
from pymemcache.client.base import Client ... client = Client(('localhost', 11211)) client.set('foo', 'hi') ...
При этом в двух строчках уместилось не только установка значения, но и инициализации соединения с сервером Memcached .
2.2 Настройки сервера
Требуют к себе внимания, чтобы обеспечить удобство и безопасную работу клиентов из-за возможности проведения атаки с лавинным увеличением данных, которая сводится к обычному DDOS, наподобие атак на DNS или NTP, источником неприятностей которых является протокол транспортного уровня UDP .
Поэтому рекомендуется отключать в /etc/memcached.conf обмен по UDP в сервисе memcached, несмотря на отключение по умолчанию начиная с версии 1.5.6, как показано в листинге 2.2.1
Листинг 2.2.1
... # Disable UDP protocol -U 0 ...
Также рекомендуется ограничивать (привязывать) подключение к определенному адресу IP, чтобы избежать приема запросов, например, извне и разрешить только локальный доступ через IP-петлю :
Листинг 2.2.2
... # Only listen on localhost --listen 127.0.0.1 ...
Кроме того, также рекомендуется ограничить число подключений к серверу, путем ограничения их числа в /etc/memcached.conf, как и размер буфера, установка которых показана в листинге
Листинг 2.2.3
... # Start with a cap of 64 megs of memory. It's reasonable, and the daemon default # Note that the daemon will grow to this size, but does not start out holding this much # memory -m 64 # Limit the number of simultaneous incoming connections. The daemon default is 1024 # -c 1024 ...
Так, дистрибутив Debian/bulsey предлагает ограничить значение выделяемой памяти на диске под кэшируемые данные до 64МB, а RedHat – до 256МВ .
2.3 Установка программного обеспечения
В дистрибутиве Debian/bulsey необходимо установить следующие пакеты, как показано в дампе 2.3.1
Дамп 2.3.1
... $ sudo apt update $ sudo apt install memcached libmemcached-tools ...
После завершения установки, проверить состояние сервиса memcached , как показано в дампе 2.3.2
Дамп 2.3.2
$ sudo systemctl status memcached ● memcached.service - memcached daemon Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-07-18 05:49:34 MSK; 1h 52min ago Docs: man:memcached(1) Main PID: 9696 (memcached) Tasks: 10 (limit: 16648) Memory: 1.6M CGroup: /system.slice/memcached.service └─9696 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -P /var/run/memcached/memcached.pid июл 18 05:49:34 home2 systemd[1]: Started memcached daemon.
В результате чего, получим не только сведение о запущенном сервисе memcached, но и указанные ранее конфигурационные параметры в /etc/memcached.conf .
Для поддержки Python необходимо установить пакет с клиентом python3-pymemcache, как показано в дампе 2.3.3
Дамп 2.3.2
$ sudo apt install python3-pymemcache
(Продолжение следует)
Библиография
3.1 Malasuk. Memcached Installation and Optimization
3.2 Memcached. DDOS
3.3 Python-memcached
3.4 Using MySQL and memcached with Python
3.5 MEMCACHED_SET(3)
3.6 MEMCACHED_GET(3)
3.7 Python + Memcached: Efficient Caching in Distributed Applications