MemcacheDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:34, 26 декабря 2017.
MemcacheDB
Memcachedbscreen.jpg
Выпущена: December 25, 2008 (2008-12-25)
Написана на: C
Операционная система: Кроссплатформенная
Тип ПО: distributed memory caching system
Лицензия: BSD License[1]
Веб-сайт memcachedb.org

MemcacheDB — распределённая база данных. Это система распределённого хранения данных в виде пар ключ-значение, которая совместима с API memcached, а значит любой клиент прозрачно может работать как с кешем, так и с хранилищем данных, даже не замечая этого. Но, в отличии от кеша, данные в memcacheDB хранятся на диске — в качестве бекенда используется встраиваемая промышленная база Berkeley DB и используются все возможности для обеспечения эффективности и надёжности хранения, в частности, транзакционность и реплицирование.

Общее

По скорости доступа к данным memcacheDB стоит на уровне того же memcache и сравнимо с специализированными базами данных, например, CouchDB, а в цифрах это составляет десятки тысяч операций записи и чтения в секунду. Сами разработчики предупреждают, что memcacheDB никак не кеш, поэтому не стоит использовать его везде как замену для самого memcached, он просто реализует другую стратегию хранения данных с совместимым доступом, аналогично memcached[2].

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

Развёртывается memcacheDB просто — устанавливаете и компилируете с исходников, устанавливаете базу данных (она не требует администрирования) и все. Настройте просто параметры доступа для клиентов — порт и несколько других параметров, влияющих на производительность, например, размер буфера данных, каталог для хранения базы данных, размер кеша в памяти.

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

С помощью клиентской библиотеки (для C/ C++, Ruby, Perl, PHP, Python, Java, .Net и др.) позволяет кэшировать данные в оперативной памяти множества доступных серверов. Распределение реализуется путём сегментирования данных по значению хэша ключа по аналогии с сокетами хэш-таблицы. Клиентская библиотека, используя ключ данных, вычисляет хэш и использует его для выбора соответствующего сервера. Ситуация сбоя сервера трактуется как промах кэша, что позволяет повышать отказоустойчивость комплекса за счет наращивания количества memcached серверов и возможности производить их горячую замену.

В API memcached есть только базовые функции: выбор сервера, установка и разрыв соединения, добавление, удаление, обновление и получение объекта, а также Compare-and-swap. Для каждого объекта устанавливается время жизни, от 1 секунды до бесконечности. При исчерпании памяти более старые объекты автоматически удаляются. Для PHP также есть уже готовые библиотеки PECL для работы с memcached, которые дают дополнительную функциональность.

По умолчанию memcached использует порт 11211.

Особенности

  • Высокая производительность чтения и записи для объектов структуры key/value
  • Высокая надежность
  • Высокая доступность данных
  • Совместимость с протоколом memcache

Клиентское API

MemcacheDB совместима с протоколом memcache. Список команд:

  • get(also mutiple get)
  • set, add, replace
  • append/prepend
  • incr, decr
  • delete
  • stats

Доступные приватные команды:

  • rget
  • db_checkpoint
  • db_archive

Протокол

Клиенты memcached взаимодействуют с сервером через TCP (UDP также доступен). На данном memcached сервере прослушивается соответствующий порт, клиент коннектится к этому порту, отсылает команды, получает ответы и в конечном итоге закрывает соединение.

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

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

Ключи

Данные, хранящиеся memcached идентифицируются через ключи. Ключ это строка, которая уникальным образом идентифицирует данные для клиента, который заинтересован в их хранении и извлечении. На данный момент длина ключа ограничена набором в 250 знаков.

Команды

Всего есть три типа команд.

Команды хранилища (set, add, replace, append prepend и cas) просят сервер сохранить данные по ключу. Клиент посылает команду и блок данных, полсе этого клиенту приходит ответ, в котором будет отображен результат операции.

Команды извлечения (get и gets) запрашивают у сервера извлечение данных по заданному набору ключей. Клиент отсылает команду с набором запрашиваемых ключей, затем для каждого ключа сервер находит блок дынных и отсылает его обратно. Это продолжается пока сервера не закончит на коде END.

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

Быстродействие [3]

Среда

Стенд: Dell 2950III ОС: Linux CentOS 5 Версия: memcachedb-1.0.0-beta Client API: libmemcached

Non-thread Edition

memcachedb -d -r -u root -H /data1/mdbtest/ -N -v

Write

key: 16 value: 100B, 8 concurrents, every process does 2,000,000 set

1 2 3 4 5 6 7 8 avg.
Cost 807 835 840 853 859 857 865 868 848

2000000 * 8 / 848 = 18868 w/s

Read

key: 16 value: 100B, 8 concurrents, every process does 2,000,000 get

1 2 3 4 5 6 7 8 avg.
Cost 354 354 359 358 357 364 363 365 360

2000000 * 8 / 360 = 44444 r/s

Thread Edition(4 Threads)

memcachedb -d -r -u root -H /data1/mdbtest/ -N -t 4 -v

Write

key: 16 value: 100B, 8 concurrents, every process does 2,000,000 set

1 2 3 4 5 6 7 8 avg.
Cost 663 669 680 680 684 683 687 686 679

2000000 * 8 / 679 = 23564 w/s

Read

key: 16 value: 100B, 8 concurrents, every process does 2,000,000 get

1 2 3 4 5 6 7 8 avg.
Cost 245 249 250 248 248 249 251 250 249

2000000 * 8 / 249 = 64257 r/s

Установка

Для установки memcachedb необходимо загрузить следующие tar.gz архивы на обе машины(в данной инструкции @PC1-VirtualBox, @PC2-VirtualBox)

  • Berkley DB 4.7 или новее
  • libevent 1.3e или новее
  • memcachedb 1.2.0 или новее

Загрузив архивы приступаем к установке(процесс аналогичен для PC1 и PC2) . Начинаем с BerkleyDB:

$tar xvzf db-4.7.25.tar.gz
$cd db-4.7.25/
$cd build_unix/
$../dist/configure --prefix=/opt/bdb47
$make
$sudo make install

Устанавливаем libevent:

$tar xvzf libevent-1.3.e.tar.gz
$cd libevent-1.3e
$./configure --prefix=/opt/livevent13e
$make
$sudo make install

Отредактируем файл ld.so.conf добавив следующие строки:

$cd /etc
$sudo nano /etc/ld.so.conf
 include /etc/ld.so.conf.d/*.conf
 /opt/livevent13e/lib
 /opt/bdb47/lib

Загрузим библиотеки в кэш:

$sudo ldconfig

Устанавливаем memcachedb:

$tar xvzf memcachedb-1.2.0.tar.gz
$cd memcachedb-1.2.0
$./configure --enable-threads --with-bdb=/opt/bdb47 --with-libevent-/opt/livevent13e
$make
$sudo make install

Создаем репликативную группу из master(чтение-запись) и slave(только чтение). PC1 и PC2 должны быть в одной сети.
Настроим master на PC1.

root@PC1-VirtualBox$memcachedb -p21201 -d -r -u root -H ./env1 -N -R 192.168.1.100:31201 -M

Подключаемся к мастеру через telnet(будет доступен как localhost через порт 21201, так и через TCP/IP по адресу 192.168.1.100:31201:

root@PC1-VirtualBox$telnet 192.168.1.100 31201
Trying 192.168.1.100...
Connected to 192.168.1.100
Escape character is '^]'.
set test 0 0 4
1234
STORED
get test
VALUE  test 0 4
1234
END

Настраиваем slave на PC2:

root@PC2-VirtualBox$memcachedb -p21202 -d -r -u root -H ./env1 -N -R 192.168.1.101:31202 -O 192.168.1.100:31201 -S

Настроим параметры репликации на slave:

root@PC2-VirtualBox$telnet 192.168.1.101 31202
Trying 192.168.1.101...
Connected to 192.168.1.101
Escape character is '^]'.
rep set priority 0
0
rep set ack policy 5
5
rep set ack timeout 50000
50000
rep set request 2 4
2/4

Перезапустим соединение чтобы проверить конфигурацию.

root@PC2-VirtualBox$telnet 192.168.1.101 31202
Trying 192.168.1.101...
Connected to 192.168.1.101
Escape character is '^]'.
STAT rep whoismaster 192.168.1.100:31201
STAT rep localhp 192.168.1.101:31202
STAT rep ismaster REP FALSE
STAT rep priority 0
STAT rep ack policy 5
STAT rep ack timeout 50000
STAT rep bulk 1
STAT rep request 2/4
STAT rep next lsn 25/6752622
END
get test
VALUE  test 0 4
1234
END

Настройка завершена.

Ссылки

Примечания