Статьи

Распределенный кеш на стероидах: Amazon ElastiCache

Веб-приложения часто можно заставить работать лучше и быстрее, кэшируя важные части данных в памяти. Часто используемые данные, результаты длительных / дорогостоящих запросов к базе данных, результаты поиска, данные сеанса и результаты сложных вычислений обычно являются очень хорошими кандидатами для хранения в кэш-памяти. Мы разберемся с основами кеширования постов, которые мы углубимся в Amazon ElastiCache

Типы кэширующих архитектур

Локальное кэширование в памяти

Объекты Cache хранятся локально в памяти (например, Java Heap) серверов приложений. Платформы с открытым исходным кодом, такие как EHCache, OSCache, могут использоваться внутри серверов приложений Java для обслуживания кэшированных элементов из кучи. Поскольку доступ к элементам кэша осуществляется из одной и той же кучи процессов прикладных программ, эта модель предлагает очень быстрые операции «Set / Get» для элементов кэша. С другой стороны, из-за ограниченности ОЗУ в модели локального кэширования в памяти может быть кэшировано всего несколько ГБ.

Сетевое Кэширование

Объекты Cache хранятся на отдельном сервере Cache, доступном по сети TCP. Клиенты кэша или драйверы кэша должны быть встроены в серверы приложений, которые позволяют выполнять операции GET / PUT / Sync. Кэш ведет себя как оперативная память, подключенная к сети. Terracotta Cache является примером сетевого кэширования ОЗУ. Поскольку операции кэширования должны проходить по сети, задержка в операциях «Set / Get» может ощущаться за несколько миллисекунд. Поскольку кэш-память централизована и консолидирована, этот уровень легко управлять, расширять и поддерживать.

Распределенное кеширование

Распределенное кеширование может выполняться на нескольких серверах кеша, поэтому оно может увеличиваться в размерах и в транзакционной емкости Он в основном используется для хранения данных приложения, находящихся в базе данных и данных веб-сеанса. Веб-приложения могут получать доступ к распределенному кешу, развернутому локально или удаленно с использованием клиентской библиотеки. Самым популярным распределенным программным обеспечением для кэширования является Memcached. Развертывание крупных ферм Memcached стало возможным, поскольку память теперь доступна и дешева, а сети стали очень быстрыми. Распределенный кеш хорошо работает на недорогих компьютерах и облачных провайдерах. Amazon ElastiCache — один из таких популярных распределенных кешей в AWS, о котором мы поговорим в этой статье.

Представляем Amazon ElastiCache:

Amazon ElastiCache — это управляемый сервис распределенного кэширования, предоставляемый веб-сервисами Amazon. В настоящее время Amazon ElastiCache использует memcached в качестве механизма кэширования, поэтому совместимые с memcached программы можно легко перенести в Amazon ElastiCache, как правило, без изменения кода. Поскольку Amazon ElastiCache работает как отдельный уровень, команда AWS снимает с себя типичные задачи управления уровнем кэша, подобные перечисленным ниже, из групп приложений и инфраструктуры заказчика:

  • Управление работой, связанной с настройкой уровня распределенного кэша в памяти
  • Предоставление ресурсов сервера, которые вы запрашиваете для установки программного обеспечения для кэширования.
  • Общие административные задачи, такие как обнаружение сбоев, восстановление и исправление программного обеспечения
  • Добавление / удаление узлов Cache из кластера

Теперь давайте подробно рассмотрим основные компоненты Amazon ElastiCache.

Компоненты Amazon ElastiCache


Узел Amazon ElastiCache:

Узел Amazon ElastiCache — это экземпляр memcached с уникальным URL-адресом и портом конечной точки. Вы можете настроить конфигурационный файл memcached, используемый популярными клиентами memcached, с помощью предоставленных URL-адресов конечных точек. Клиенты Memcached доступны для всех популярных языков программирования, а последний список можно найти здесь . Узлы Amazon ElastiCache соответствуют протоколу с сервером memcached, и обычно тот же клиент memcached, упомянутый выше, может быть переключен на узлы Amazon ElastiCache без необходимости изменения кода. Вы можете использовать стандартные операции Memcached, такие как get, set, incr и decr, точно так же, как в существующих установках Memcached, а также выполнять запросы с использованием как двоичных, так и текстовых сообщений по протоколу TCP.

Пример псевдокода, иллюстрирующий работу SET в текстовом протоколе TCP с использованием библиотеки Java Spymemcached и уровня Amazon ElastiCache:

import java.io.IOException;
import java.util.concurrent.ExecutionException;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.DefaultConnectionFactory;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.*;
import java.util.*;
public class ElastiCacheTextTCPSet {
 public void setTextValue() throws IOException {
 MemcachedClient memcachedClient = new MemcachedClient( new DefaultConnectionFactory(),AddrUtil.getAddresses("ecache1a.sqjbuo.0001.use1.cache.amazonaws.com:11211"));
 String key = "1000002";
 String value = "1000002-Test value in Text";
 Integer expires = Integer.parseInt("1000");
 try {
 Future<Boolean> result = memcachedClient.set(key, expires, value);
…………
…………
 } catch (InterruptedException e) {
 e.printStackTrace();
 } catch (ExecutionException e) {
 e.printStackTrace();
 }
 memcachedClient.shutdown();
 }

}

Пример программы, иллюстрирующей работу GET в протоколе Text TCP с использованием библиотеки Java Spymemcached и уровня Amazon ElastiCache:

 import java.io.IOException;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.ConnectionFactory;
import net.spy.memcached.DefaultConnectionFactory;
import net.spy.memcached.HashAlgorithm;
import net.spy.memcached.MemcachedClient;
import java.util.*;

public class ElastiCacheTextTCPGet {
 public void getTextValue() throws Exception {
 MemcachedClient memcachedClient = new MemcachedClient( new DefaultConnectionFactory(),AddrUtil.getAddresses("ecache1a.sqjbuo.0001.use1.cache.amazonaws.com:11211"));
 String key = "1000002";
 Object obj=null;
 try {
 obj = memcachedClient.get(key);
 System.out.println("Value = :"+obj.toString());
 } catch (Exception e) {
 e.printStackTrace();
 }
 memcachedClient.shutdown();
 }

}

Вы также можете общаться с Amazon ElastiCache, используя двоичный протокол Memcached. Пример программы, иллюстрирующей работу SET с использованием двоичного протокола Java Spymemcached-TCP и уровня Amazon ElastiCache:

 import java.io.IOException;
import java.util.concurrent.ExecutionException;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.DefaultConnectionFactory;
import net.spy.memcached.BinaryConnectionFactory;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.*;
import java.util.*;
public class ElastiCacheBinaryTCPSet {
 public void setBinaryValue() throws Exception {
 MemcachedClient memcachedClient = new MemcachedClient( new BinaryConnectionFactory(),AddrUtil.getAddresses("ecache1a.sqjbuo.0001.use1.cache.amazonaws.com:11211"));
 String key = "1000004";
 String value = "1000004-Test value in Binary-TCP protocol";
 Integer expires = Integer.parseInt("1000");
 try {
 Future<Boolean> result = memcachedClient.set(key, expires, value);
 } catch (InterruptedException e) {
 e.printStackTrace();
 } catch (ExecutionException e) {
 e.printStackTrace();
 }
 memcachedClient.shutdown();
 }
}

Программное обеспечение Memcached версии 1.4.5 используется в качестве механизма кэширования в узлах Amazon ElastiCache. Узлы кэша принимают соединения через порт 11211 и только для сети Amazon EC2. Чтобы разрешить сетевые запросы к вашим узлам кэша от экземпляров web / application EC2, вам потребуется авторизовать доступ в группах безопасности AWS. Amazon ElastiCache предоставляет множество типов узлов (емкостей) кеша и моделей ценообразования в соответствии с требованиями заказчика. Самую последнюю информацию о типе узла кэша можно найти здесь

Amazon ElastiCache Cluster:

Кластер Amazon ElastiCache представляет собой набор из одного или нескольких узлов Amazon ElastiCache. Все узлы кэша в кластере кэша будут иметь одинаковый тип узла (емкость). Тип узла — это связанный объем памяти узлов кэша, которые будут развернуты в вашем кластере кэша. В настоящее время узлы кэша имеют 11 различных мощностей в AWS для удовлетворения различных ваших потребностей, в будущем AWS добавит новые типы емкости. Если вам нужны кеш-узлы различной емкости в ваших прикладных системах, вам нужно создать несколько кеш-кластеров в своей учетной записи. Кластер кэша должен быть предоставлен с именем идентификатора заказчиком в процессе его создания. Например: если вы дадите имя «ecache1a» для кластера кеша, URL-адрес конечной точки конкретного узла кеша может выглядеть следующим образом ecache1a .sqjbuo.0001.use1.cache.amazonaws.com: 11211.Это имя идентифицирует конкретный кеш Кластер при взаимодействии с API и командами Amazon ElastiCache. Идентификатор кластера кэша должен быть уникальным для этого клиента в регионе AWS.

При настройке кластера необходимо указать зону доступности, в которой вы бы предпочли развернуть кластер кэша. В настоящее время один кластер Amazon ElastiCache не может охватывать несколько зон доступности внутри региона Amazon EC2. Рекомендуется хранить кластер кэша и связанные с ним экземпляры web / приложения ec2 в одной зоне доступности для большей задержки. Обратитесь сюда для ознакомления с общими архитектурами развертывания Amazon ElastiCache в инфраструктуре AWS . Параметры и параметры группы безопасности всех узлов внутри кластера Amazon ElastiCache можно группировать и контролировать на уровне кластера. Такая кластеризация / группировка узлов кэша помогает легко управлять и обслуживать огромные фермы узлов кэша. Кластеры Amazon ElastiCache можно создавать с помощью Консоли управления AWS, API-интерфейсов Amazon ElastiCache или инструментов командной строки. В дополнение к вышесказанному вы можете указать, хотите ли вы получать уведомления SNS, связанные с вашими узлами / кластером кэша, с помощью системы Amazon Simple Notification Service (SNS) . Вы можете выбрать существующую тему SNS или полностью отключить уведомления для всего кластера Amazon ElastiCache.

Группа параметров Amazon ElastiCache:

Группы параметров Amazon ElastiCache позволяют контролировать параметры времени выполнения и значения конфигурации механизма кэширования ваших узлов. Сконфигурированные значения будут переданы узлам memcached во время запуска и будут применены ко всем узлам, связанным в кластере Amazon ElastiCache. Если вы не укажете группу параметров кэша для своего кластера кэша, то будет использоваться группа параметров кэша по умолчанию (default.memcached1.4). Обычно группа параметров по умолчанию содержит значения по умолчанию для движка и системные настройки Amazon ElastiCache, оптимизированные для узлов Cache Cluster, которые вы используете. Поскольку Amazon ElastiCache по умолчанию выбирает оптимальные параметры конфигурации для вашего кластера кэша с учетом емкости памяти / вычислительных ресурсов типа узла, для большинства случаев не требуется изменений. Однако, если вы хотите, чтобы ваш кластер кэша работал с вашими пользовательскими значениями конфигурации, вы можете просто создать новую группу параметров кэша, изменить нужные параметры и использовать ее для новых или существующих кластеров. В случае применения настраиваемой группы параметров к работающему кластеру кэша изменения не будут применены к узлам кэша, пока кластер кэша не будет перезагружен.

Amazon ElastiCache Security Group:

Amazon ElastiCache Security Group действует как брандмауэр, контролирующий сетевой доступ к вашему Cache Cluster. Поскольку управление доступом на основе диапазона IP-адресов в настоящее время не включено для кластеров Amazon ElastiCache, все клиенты в кластере кэша должны быть в сети EC2 и авторизованы через группы безопасности. Если вы хотите, чтобы экземпляры вашего веб-приложения EC2 имели доступ к вашему кластеру кэша, вы должны явно разрешить доступ с хостов в их определенных группах безопасности EC2. Например: чтобы разрешить сетевой доступ к вашему кластеру кэша, сначала нужно создать группу безопасности кэша и связать с ней нужные группы безопасности EC2 (которые, в свою очередь, указывают разрешенные экземпляры EC2).

Какие функции предлагает Amazon ElastiCache по сравнению с MemCached на EC2

Операция 1: модификация кластера кэша

Кластер Amazon ElastiCache можно изменить в любое время. Такие свойства, как группа безопасности кэша, группа параметров кэша, период окна обслуживания, уведомления SNS и автоматическое обновление версии, можно изменить на уровне кластера, применяя ко всем узлам. Изменение группы безопасности может занять несколько минут для применения к кластеру. Изменения группы параметров вступят в силу только после перезагрузки узлов кэша. Тип емкости экземпляра узла кэша не может быть изменен во время выполнения.

Операция 2: перезагрузка

Используя эту опцию, вы можете перезагрузить один узел кэша или весь кластер кэша. Узлы кэша не будут доступны во время операции перезагрузки кластера. В случае перезагрузки одного узла кеша другие узлы кеша доступны для обработки запросов. Операцию перезагрузки можно выполнить с помощью консоли AWS или API. Перезагрузка обычно выполняется:

  • Когда кеш-узел (ы) не отвечает
  • Применяемые изменения группы параметров должны вступать в силу на всех узлах кластера кэша

В наших тестах мы обнаружили, что перезагрузка 5 x m1.large типа узла кэша в Amazon EC2 US-EAST занимает около 140 секунд. Время от времени это может варьироваться в зависимости от типа узла кэша и рассматриваемых регионов Amazon EC2. Из-за эфемерной природы кэша узел кэша начинает пустой (также называемый «холодным») после операции перезагрузки, и в зависимости от модели рабочей нагрузки может потребоваться некоторое время для повторного заполнения данными (также называемыми «прогревом»). Фаза).

Операция 3: удаление и удаление

Вы можете удалить один или несколько узлов из кластера кэша или удалить весь кластер. Если в кластере кеша присутствует только один узел, необходимо удалить сам кластер кеша. Удаление одного или нескольких узлов занимает ~ 200 секунд. Время от времени это может варьироваться в зависимости от типа узла кэша и рассматриваемых регионов Amazon EC2. В случае удаления кластера вы можете позднее создать кластер кэша с тем же именем в тот же регион Amazon EC2.

Операция 4: добавление узлов кэша

Amazon ElastiCache, как следует из названия, позволяет автоматически / вручную добавлять узлы кэша в существующий кластер ElastiCache, делая весь уровень эластичным. Один или несколько узлов кэша могут быть добавлены к существующему кластеру кэша одновременно. В наших тестах мы обнаружили, что добавление 5 x m1.large типа узла кэша в Amazon EC2 в регионе США-ВОСТОК занимает около 320 секунд. Время от времени это может варьироваться в зависимости от типа узла кэша и рассматриваемых регионов Amazon EC2. При добавлении новых узлов кеша в существующий кластер тип узла кеша должен быть того же размера, что и существующий тип узла. Вы не можете изменить этот размер, если вам нужна другая емкость кеш-узла, необходимо создать новый кеш-кластер.

При использовании обычного алгоритма хеширования увеличение количества узлов кэша memcached может привести к тому, что многие ключи будут переназначены на другой узел кэша, что приведет к огромному набору кеша. Представьте, что у вас есть 10 узлов Amazon ElastiCache в вашем кластере кеша, добавление одиннадцатого сервера может привести к тому, что ~ 40% + ваших ключей внезапно укажут на серверы, отличные от обычных. Это может привести к отсутствию кэша и заполнить базу данных вашей базы данных запросами. Чтобы минимизировать этот процесс переназначения, рекомендуется следовать согласованному хешированию в клиентах кеша. Согласованное хеширование обеспечивает более стабильное распределение ключей и минимальное переназначение при добавлении новых узлов кеша. Используя этот алгоритм, добавление одиннадцатого сервера должно привести к переназначению менее 10% ваших ключей. Этот% может варьироваться в производстве, но он гораздо более эффективен в таких гибких сценариях по сравнению с обычными алгоритмами хеширования. Также рекомендуется сохранять порядок узлов кэша и количество записей узлов кэша одинаковыми во всех конфигурациях клиента при использовании согласованного алгоритма хеширования. Приложения Java могут использовать «библиотеку Ketama» через библиотеку Spymemcached для интеграции этого алгоритма в свои приложения. Обратитесь к URL, чтобы узнать больше о согласованном хешировании в memcached.

Пример псевдокода, иллюстрирующего работу SET в протоколе TEXT-TCP с использованием библиотеки Java Spymemcached –Ketama Hashing и уровня Amazon ElastiCache:

 import java.io.IOException;
import java.util.concurrent.ExecutionException;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.DefaultConnectionFactory;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.*;
import java.util.*;
public class ElastiCacheKetamaTCPSet {
 public void setValue() throws IOException {
 ConnectionFactory connFactory = new DefaultConnectionFactory(
 DefaultConnectionFactory.DEFAULT_OP_QUEUE_LEN,
 DefaultConnectionFactory.DEFAULT_READ_BUFFER_SIZE,
 HashAlgorithm.KETAMA_HASH);
 MemcachedClient memcachedClient = new MemcachedClient(connFactory,AddrUtil.getAddresses("ecache1a.sqjbuo.0001.use1.cache.amazonaws.com:11211"));
 String key = "1000001";
 String value = "1000001-Test value in Consistent Hashing";
 Integer expires = Integer.parseInt("1000");
 try {
 Future<Boolean> result = memcachedClient.set(key, expires, value);
………………..
………………..
 } catch (InterruptedException e) {
 e.printStackTrace();
 } catch (ExecutionException e) {
 e.printStackTrace();
 }
 memcachedClient.shutdown();
 }
}