Memcached
This presentation is the property of its rightful owner.
Sponsored Links
1 / 21

Memcached PowerPoint PPT Presentation


  • 87 Views
  • Uploaded on
  • Presentation posted in: General

Memcached. Приемы реализации высоконагруженных систем. Что такое Memcached. Это хранилище записей в формате ключ-значение, где ключом является строка, а данные представляют собой неинтерпретируемый массив байтов. Free & open source Высокопроизводительная Распределенная система

Download Presentation

Memcached

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Memcached

Memcached

Приемы реализации высоконагруженных систем


Memcached1

Что такое Memcached

  • Это хранилище записей в формате ключ-значение, где ключом является строка, а данные представляют собой неинтерпретируемый массив байтов.

    • Free & open source

    • Высокопроизводительная

    • Распределенная система

    • Широкого назначения

      • Прежде всего – для ускорения работы веб-приложений за счет снижения нагрузки на базу данных

      • Кешированиерезультатров запросов к БД, вызовов внешних API, отрендеренных страниц и др.

    • Простота применения

      • Простые API


Memcached

Использование

  • Реализации клиентских библиотек для многих языков программирования (C / C++, PHP, Java, Python, Ruby, Perl, .NET, MySQL, PostgreSQL, Erlang, Lua, и др.)

  • Используется в: YouTube LiveJournal, Wikipedia/Wikimedia, Amazon.com, Wikia,SourceForge, Metacafe,Facebook, Twitter, Fotolog, The Pirate Bayetc.


Memcached

Концепция и архитектура

  • Клиент(ы)-сервер(ы)

  • Серверы поддерживают ассоциативный массив (ключ-значение)

    • Ключи - до 250 байт

    • Значения – до 1 мегабайта

  • Клиенты заполняют массив данными, в дальнейшем их запрашивают

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

  • Каждый клиент имеет информацию о всех серверах

  • Серверы не взаимодействуют между собой

  • Логика хранения распределяется между клиентом и сервером

    • Для чтения или записи по ключу клиент вычисляет хеш ключа для определения номера сервера

    • Обращается к серверу

    • Сервер в свою очередь вычисляет хеш ключа для поиска данных во внутренних структурах


Memcached

Концепция и архитектура

  • На сервере значения хранятся в RAM

  • Если память заканчивается, то старые значения удаляются (алгоритм least recently used (LRU))

  • Memcached надо рассматривать как промежуточное хранилище, нужного объекта в нем может и не оказаться

    • Расширение MemcacheDB поддерживает постоянное хранение

  • Типичная среда – несколько серверов и множество клиентов, однако, ничего не мешает клиенту и серверу находиться на одной машине

  • Время выполнения определенного операций – примерно постоянная величина

    • Существенных задержек нет

  • Конструктивно memcached выполнен как отдельный процесс, взаимодействие с которым ведётся через сокеты по простому протоколу на базе «сырых» TCP или UDP.

  • Немного упрощаяя, можно сказать, что memcached это удалённая реализация интерфейса java.util.Map на базе хэш-таблицы.


Memcached

Для чего может применяться

  • PHP или Perl

    • серьёзную проблему представляет то, что на каждый клиентский запрос порождается отдельный экземпляр интерпретатора

    • без использования внешних механизмов два выполняющихся запроса не могут иметь доступ к одним и тем же объектам, так как имеют не связанные между собой адресные пространства

    • Традиционно в мире LAMP для кэширования использовалась база данных

    • HTTP-сессии: либо хранить все сессионные данные в БД, тем самым ещё больше увеличивая на неё нагрузку, либо хранить эти данные локально (в файле), теряя их в случае отказа узла в кластере


Memcached

Применение с Java

  • Здесь, в отличие от PHP, всё, что происходит внутри сервера приложений, делит общее адресное пространство, а значит нет никаких трудностей с организацией кэширования, по крайней мере локального.

  • Помещённый в HashMap объект будет оставаться одним и тем же объектом вне зависимости от того, из какого потока будет произведено обращение.

  • Это позволяет локальным кэшам внутри JVM работать на порядки быстрее, чем memcached, поскольку не требует затрат на сериализацию объектов и взаимодействие по сети.


Memcached

Применение с Java

  • + memcached в отличие от локального варианта также решает проблему согласованности кэша внутри кластера

  • + это отдельный процесс, а значит он спокойно переживает перезапуск серверов приложений

  • + он более эффективно расходует память, что заметно при хранении большого количества больших объектов

    • Это делает целесообразным хранение в memcached объектов «высокого уровня готовности» типа фрагментов веб-страниц, количество обращений к которым при выполнении одного запроса будет не столь высоким, как если кэшировать отдельные мелкозернисные объекты.

  • +cуществует аппаратная реализацияmemcached от Gear6

    • (в виде отдельной коробочки по формату серверной стойки), которая позволяет хранить гиганский объём данных


Memcached java

Использование memcachedиз Java

  • клиентские библиотеки

    • Такой вариант хорошо подходит для «высокоуровневого» кэширования, реализованного на уровне прикладных сервисов или даже презентационной логики.

  • Второй вариант прячет детали работы с memcached внутри привычных механизмов и инструментов

    • Реализация кэша второго уровня Hibernate на базе memcached

    • Реализация менеджера HTTP-сессий Tomcat


Memcached2

Веб-приложение с memcached


Memcached

Команды сохранения значения

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n

cas<key> <flags> <exptime> <bytes> <casunqiue> [noreply]\r\n

<command name>=

set / add / replace / append / prepend / cas (check and set)


Memcached

Команды извлечения значения

get <key>*\r\n

gets<key>*\r\n


Spymemcached

Библиотека spymemcached

  • MemcachedClient c=new MemcachedClient(

  • new InetSocketAddress("hostname", portNum));

  • // Store a value (async) for one hour

  • c.set("someKey", 3600, someObject);

  • // Retrieve a value (synchronously).

  • Object myObject=c.get("someKey");


Spymemcached1

Библиотека spymemcached

  • // Get a memcached client connected to several servers

  • MemcachedClient c=new MemcachedClient(

  • AddrUtil.getAddresses("server1:11211 server2:11211"));

  • // Try to get a value, for up to 5 seconds, and cancel if it doesn't return

  • Object myObj=null;

  • Future<Object> f=c.asyncGet("someKey");

  • try {

  • myObj=f.get(5, TimeUnit.SECONDS);

  • } catch(TimeoutException e) {

  • // Since we don't need this, go ahead and cancel the operation. This

  • // is not strictly necessary, but it'll save some work on the server.

  • f.cancel(false);

  • // Do other timeout related stuff

  • }


Spymemcached2

Библиотека spymemcached

  • get

  • public Objectget(String key)Get with a single key and decode using the default transcoder.

  • Specified by:get in interface MemcachedClientIFParameters:key - the key to getReturns:the result from the cache (null if there is none)Throws:OperationTimeoutException - if the global operation timeout is exceededIllegalStateException - in the rare circumstance where queue is too full to accept any more requests


Spymemcached3

Библиотека spymemcached

  • asyncGet

  • public Future<Object> asyncGet(String key)Get the given key asynchronously and decode with the default transcoder.

  • Specified by:asyncGet in interface MemcachedClientIFParameters:key - the key to fetchReturns:a future that will hold the return value of the fetchThrows:IllegalStateException - in the rare circumstance where queue is too full to accept any more requests


Spymemcached4

Простой пример использования spymemcached

packageuse_memcached;

importnet.spy.memcached.*;

import java.net.*;

publicclassUse_memcached{

publicstaticvoid main(String[]args){

try{

MemcachedClient c=newMemcachedClient(newInetSocketAddress("127.0.0.1",11211));

c.set("keyA",3600,"valueA");

c.set("keyB",3600,"valueB");

c.set("keyC",3600,"valueC");


Spymemcached5

Простой пример использования spymemcached

Object myObject=c.get("keyA");

System.out.println("myObject = "+myObject);

}catch(Exception e)

{

System.out.println(e.toString()+" "+e.getMessage());

}

}

}

run:

myObject= valueA


Telnet

Проверка через telnet

[email protected]:~$ telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get keyA

VALUE keyA 0 6

valueA

END

get keyB

VALUE keyB 0 6

valueB

END

get keyC

VALUE keyC 0 6

valueC

END


Telnet1

Проверка через telnet

gets keyA

VALUE keyA 0 6 6

valueA

END

gets keyB

VALUE keyB 0 6 7

valueB

END

gets keyC

VALUE keyC 0 6 8

valueC

END


Memcached

Статистика

stats

STAT pid 9839

STAT uptime 13649

STAT time 1330122057

STAT version 1.4.2

STAT pointer_size 32

STAT rusage_user 0.232014

STAT rusage_system 0.128008

STAT curr_connections 11

STAT total_connections 13

STAT connection_structures 12

STAT cmd_get 19

STAT cmd_set 9

STAT cmd_flush 0

STAT get_hits 19

STAT get_misses 8

STAT delete_misses 0

STAT delete_hits 0

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 1

STAT cas_hits 0

STAT cas_badval 0

STAT bytes_read 609

STAT bytes_written 764

STAT limit_maxbytes 67108864

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT bytes 177

STAT curr_items 3

STAT total_items 8

STAT evictions 0

END


  • Login