210 likes | 380 Views
Memcached. Приемы реализации высоконагруженных систем. Что такое Memcached. Это хранилище записей в формате ключ-значение, где ключом является строка, а данные представляют собой неинтерпретируемый массив байтов. Free & open source Высокопроизводительная Распределенная система
E N D
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 Bayetc.
Концепция и архитектура • Клиент(ы)-сервер(ы) • Серверы поддерживают ассоциативный массив (ключ-значение) • Ключи - до 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
Команды сохранения значения <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)
Команды извлечения значения 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 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
Библиотека 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 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");
Простой пример использования 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