× К оглавлению На главную Об авторе

Дата и время публикации:    

Назначение и использование

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

Таблица 2.1.2 . Статистические данные Memcached
Наименование данных статистики Описание
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

3.8 How to Install Memcached on Ubuntu 20.04

Сайт разработан в соответствии с рекомендациями консорциума W3C для языка разметки HTML5.

Об авторе можно прочитать здесь.

Copyright © 2015-2019 Андрей Ржавсков