Memcached

advertisement
Memcached
Приемы реализации высоконагруженных систем
Что такое Memcached

Это хранилище записей в формате ключ-значение, где
ключом является строка, а данные представляют
собой неинтерпретируемый массив байтов.




Free & open source
Высокопроизводительная
Распределенная система
Широкого назначения



Прежде всего – для ускорения работы веб-приложений за счет
снижения нагрузки на базу данных
Кеширование результатров запросов к БД, вызовов внешних API,
отрендеренных страниц и др.
Простота применения

Простые API
Использование


Реализации клиентских библиотек для многих языков
программирования (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 Bay etc.
Концепция и архитектура


Клиент(ы)-сервер(ы)
Серверы поддерживают ассоциативный массив (ключ-значение)







Ключи - до 250 байт
Значения – до 1 мегабайта
Клиенты заполняют массив данными, в дальнейшем их запрашивают
Клиенты используют специальные библиотеки доступа для контакта с
сервером, по умолчанию с портом 11211
Каждый клиент имеет информацию о всех серверах
Серверы не взаимодействуют между собой
Логика хранения распределяется между клиентом и сервером



Для чтения или записи по ключу клиент вычисляет хеш ключа для
определения номера сервера
Обращается к серверу
Сервер в свою очередь вычисляет хеш ключа для поиска данных во
внутренних структурах
Концепция и архитектура



На сервере значения хранятся в RAM
Если память заканчивается, то старые значения удаляются (алгоритм
least recently used (LRU))
Memcached надо рассматривать как промежуточное хранилище,
нужного объекта в нем может и не оказаться



Типичная среда – несколько серверов и множество клиентов, однако,
ничего не мешает клиенту и серверу находиться на одной машине
Время выполнения определенного операций – примерно постоянная
величина



Расширение MemcacheDB поддерживает постоянное хранение
Существенных задержек нет
Конструктивно memcached выполнен как отдельный процесс,
взаимодействие с которым ведётся через сокеты по простому
протоколу на базе «сырых» TCP или UDP.
Немного упрощаяя, можно сказать, что memcached это удалённая
реализация интерфейса java.util.Map на базе хэш-таблицы.
Для чего может применяться

PHP или Perl




серьёзную проблему представляет то, что на каждый
клиентский запрос порождается отдельный экземпляр
интерпретатора
без использования внешних механизмов два
выполняющихся запроса не могут иметь доступ к одним и
тем же объектам, так как имеют не связанные между собой
адресные пространства
Традиционно в мире LAMP для кэширования
использовалась база данных
HTTP-сессии: либо хранить все сессионные данные в БД,
тем самым ещё больше увеличивая на неё нагрузку, либо
хранить эти данные локально (в файле), теряя их в случае
отказа узла в кластере
Применение с Java



Здесь, в отличие от PHP, всё, что происходит внутри
сервера приложений, делит общее адресное
пространство, а значит нет никаких трудностей с
организацией кэширования, по крайней мере
локального.
Помещённый в HashMap объект будет оставаться
одним и тем же объектом вне зависимости от того, из
какого потока будет произведено обращение.
Это позволяет локальным кэшам внутри JVM работать
на порядки быстрее, чем memcached, поскольку не
требует затрат на сериализацию объектов и
взаимодействие по сети.
Применение с Java



+ memcached в отличие от локального варианта также
решает проблему согласованности кэша внутри кластера
+ это отдельный процесс, а значит он спокойно
переживает перезапуск серверов приложений
+ он более эффективно расходует память, что заметно при
хранении большого количества больших объектов


Это делает целесообразным хранение в memcached объектов
«высокого уровня готовности» типа фрагментов веб-страниц,
количество обращений к которым при выполнении одного
запроса будет не столь высоким, как если кэшировать отдельные
мелкозернисные объекты.
+cуществует аппаратная реализация memcached от Gear6

(в виде отдельной коробочки по формату серверной стойки),
которая позволяет хранить гиганский объём данных
Использование memcached из Java

клиентские библиотеки


Такой вариант хорошо подходит для «высокоуровневого»
кэширования, реализованного на уровне прикладных
сервисов или даже презентационной логики.
Второй вариант прячет детали работы с memcached
внутри привычных механизмов и инструментов


Реализация кэша второго уровня Hibernate на базе
memcached
Реализация менеджера HTTP-сессий Tomcat
Веб-приложение с memcached
Команды сохранения значения
<command name> <key> <flags> <exptime> <bytes>
[noreply]\r\n
cas <key> <flags> <exptime> <bytes> <cas unqiue>
[noreply]\r\n
<command name> =
set / add / replace / append / prepend / cas (check and set)
Команды извлечения значения
get <key>*\r\n
gets <key>*\r\n
Библиотека 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");
Библиотека 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
}
Библиотека spymemcached



get
public Object get(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
Библиотека 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
Простой пример использования
spymemcached
package use_memcached;
import net.spy.memcached.*;
import java.net.*;
public class Use_memcached {
public static void main(String[] args) {
try{
MemcachedClient c=new MemcachedClient(new
InetSocketAddress("127.0.0.1", 11211));
c.set("keyA", 3600, "valueA");
c.set("keyB", 3600, "valueB");
c.set("keyC", 3600, "valueC");
Простой пример использования
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
alex@HP620:~$ 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
Проверка через 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
Статистика
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
Download