Принцип и реализация распределенного Memcached
0x01 Обзор
1.1 Что такое кэширование памяти
memcached — это распределенный механизм хранения данных с открытым исходным кодом.
memcached — это высокопроизводительный сервер кэширования с распределенной памятью, который компенсирует тяжелые и медленные наборы данных или вызовы API за счет сокращения количества запросов, повышения скорости отклика приложений и улучшения масштабируемости.
В сценариях с высокой степенью параллелизма к базе данных поступает большое количество запросов на чтение/запись, а дисковый ввод-вывод становится узким местом, что приводит к чрезмерной задержке ответа, поэтому вступает в действие кэш.
Memcached работает, сохраняя ключевые слова и соответствующие им значения (до 1 МБ) в матрице сходства (например, в хэш-таблице), разбросанной и распределенной по большому количеству виртуальных серверов.
Конечно, является ли автономный или распределенный кэш-кэш кэш-память, имеет свои преимущества и недостатки и сценарии приложений, наиболее распространенными являются Redis и Memcached. Эта статья заключается в том, чтобы ввести мемкаченные.
1.2 Введение в кэш — системный кэш компьютера
Жесткий диск --> Память --> Кэш L3 --> Кэш L2 --> Кэш L1
1.3 Введение в кэш — система приложений кэша
Сначала осуществляется доступ к более быстрому носителю данных, и содержимое возвращается, если оно попадает и не вступает в силу.Если оно попадает или терпит неудачу, осуществляется доступ к более медленному носителю данных, и содержимое возвращается при обновлении кеша.
1.4 функции кэширования памяти
Функции | описывать |
---|---|
Простой протокол | Это протокол на основе текстовой строки, который может напрямую обращаться к операциям с данными на сервере memcached через telnet. |
Обработка событий на основе libevent | Асинхронный ввод-вывод, один процесс и один поток на основе событий, использование libevent в качестве механизма обработки событий; |
Встроенная память, непостоянное хранилище | Все данные хранятся в памяти, а доступ к данным происходит быстрее, чем на жестком диске.При заполнении памяти неиспользуемый кеш автоматически удаляется по алгоритму LRU, но аварийное восстановление данных не рассматривается.Если служба перезагрузка, все данные будут потеряны. |
распределенный | Каждый сервер memcached не взаимодействует друг с другом, получает доступ к данным независимо и не делится какой-либо информацией. Сервер не имеет распределенных возможностей, а распределенное развертывание зависит от клиента memcache. |
0x02 Установка и использование
2.1 Как начать - установка источника
# 安装依赖包
apt-get install libevent-dev
#安装Memcached
wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install
#启动memcached
memcached -p 11211 -d -u root -P /tmp/memcached.pid
-P означает использование TCP, порт по умолчанию 11211. -d означает запуск демона в фоновом режиме -u означает указать пользователя root для запуска, по умолчанию запуск с пользователем root невозможен. -P указывает место хранения pid процесса, где «p» — заглавная «P». -l, за которым следует IP-адрес, вручную указать прослушиваемый IP-адрес, по умолчанию прослушиваются все IP-адреса -m, за которым следует размер выделенной памяти в МБ, по умолчанию 64 МБ. -c максимальное количество запущенных одновременных подключений, по умолчанию 1024 -f коэффициент роста размера блока, по умолчанию 1,25 -M возвращает ошибку при исчерпании памяти, вместо удаления элемента, то есть, если алгоритм LRU не используется в 64-битной системе, сообщит, что файл libevent-1.4.so.2 не найден Решение состоит в том, чтобы связать файл с таким же именем в 32-битной директории с 64-битной директорией, то есть создать ярлыки наподобие windows. Shell > /usr/local/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2 После запуска, если вы обнаружите, что порт не прослушивается, это происходит потому, что «p» с Параметр pid в команде command Это заглавная буква «P», возможно, вы написали ее строчными буквами.
2.2 Как начать установку докера
// 运行一个内存限制为1024MB的容器:
sudo docker run -name csphere-memcached -m 1024m -d -p 11211:11211 memcached:alpine
может просматриватьMemcached:latest
в использованииDockerfile, чтобы получить метод установки memcached под debian
2.3 Как использовать
Классификация | метод | описывать |
---|---|---|
реальный | set | Добавьте новую запись в memcached или замените существующую запись новыми данными |
реальный | add | Когда KEY не существует, он сохраняет данные в memcached, в противном случае возвращает ответ NOT_STORED. |
реальный | replace | При наличии КЛЮЧА данные будут сохраняться в memcached, иначе ответ NOT_STORED |
реальный | cas | Измените существующее значение KEY, но это также принесет функцию проверки |
реальный | append | вставить новое значение после этого значения |
реальный | prepend | вставить новое значение перед этим значением |
Выбирать | get | Возьмите одно значение, при возврате данных из кеша вы получите имя КЛЮЧА, значение флага и длину возвращаемого значения в первой строке, реальные данные во второй строке, и, наконец, верните END, если KEY не существует, первая строка просто возвращается к END |
Выбирать | get_multi | Принимать сразу несколько значений |
Удалить | delete |
# 清空memcache数据
telnet 10.27.5.71 11211
flush_all
quit //退出telnet
2.4 PHP использует memcached
yum -y install libmemcached.x86_64 libmemcached-devel.x86_64
cd /usr/src
git clone https://github.com/php-memcached-dev/php-memcached.git
cd php-memcached/
git checkout php7
/alidata/server/php/bin/phpize
./configure --with-php-config=/alidata/server/php/bin/php-config
make
make install
2.5 Управление и мониторинг производительности
Им можно напрямую управлять и отслеживать через командную строку или с помощью программного обеспечения для мониторинга, такого как nagios. Командная строка:
// 如果在启动时指定了IP及端口号,这里要作相应改动,连接成功后命令
telnet 127.0.0.1 11211
Заказ | описывать |
---|---|
stats | Статистическая информация о memcached |
stats reset | Повторная статистика |
stats slabs | Отображение информации о плитах, вы можете подробно увидеть сегментированное хранилище данных |
stats items | Отображение количества элементов в плите |
stats cachedump 1 0 | Перечислите значения KEY, хранящиеся в первом абзаце slabs |
set/get | сохранить/получить данные |
STAT evictions 0 | Указывает количество легальных элементов, перемещенных, чтобы освободить место для новых элементов. |
Принципы и анализ архитектуры 0x03
3.1 Алгоритмы памяти
Эксплойт Memcachedslab allocationМеханизм для выделения и управления памятью. Он разделяет выделенную память в блоки памяти определенной длины в соответствии с заранее определенным размером, а затем делит блоки памяти одинакового размера на группы. Когда данные хранятся, она соответствует размеру плиты в соответствии с к размеру ключевой стоимости. Найдите ближайшую плиту для хранения, поэтому есть пустая трата пространства.
Традиционный способ управления памятью заключается в использованииПосле того, как память, выделенная malloc, память освобождается свободной,СюдаЛегко создать фрагментацию памяти и снизить эффективность управления памятью операционной системы..
Система управления памятью Memcached эффективна и не вызывает фрагментации памяти, но ее самый большой недостаток заключается в том, что она приводит к нерациональному использованию пространства. Поскольку каждому фрагменту выделяется память определенной длины, данные переменной длины не могут полностью использовать это пространство. Как показано на рис. 2, 100 байт данных кэшируются в 128-байтовом фрагменте, а оставшиеся 28 байтов теряются.
Как избежать потери памяти
- Заранее рассчитайте размер данных, хранящихся в приложении, или сохраните данные одного и того же бизнес-типа на сервере Memcached, чтобы гарантировать, что размер хранимых данных будет относительно однородным, что может сократить потери памяти.
- Указание параметра "-f" при запуске может в некоторой степени контролировать разницу в размерах между группами памяти.
- При использовании Memcached в приложении обычно нет необходимости сбрасывать этот параметр и развертывать со значением по умолчанию 1,25.
- Если вы хотите оптимизировать использование памяти Memcached, вы можете пересчитать ожидаемую среднюю длину данных и настроить этот параметр, чтобы получить подходящее значение настройки.
3.2 Механизм удаления (политика кэширования)
Стратегия кэширования Memcached - ** LRU (наименее недавно использована) ** Plus истекает политику. Когда вы храните элемент данных в MEMCACHED, вам, возможно, придется указать его в срок действия кэширования, по умолчанию является постоянным. Когда сервер заканчивается назначенный MEMCACHED, он сначала заменяет сбой данных, то данные также не использовались в последнее время. В LRU Memcached использует стратегию ленивого истечения срока действия,Он не отслеживает, истекает ли срок хранения сохраненной пары ключ/значение., но посмотрите на метку времени записи при получении значения ключа,Проверьте, не истек ли срок действия пространства пары ключ/значение, что снижает нагрузку на сервер.
Когда пространство заполнено
- Используйте LRU алгоритм для распределения пространства, наименее недавно использованные пару / значение ключа удаления / значение
- Если LRU не используется, добавьте «-M» к параметрам запуска, и при исчерпании памяти будет возвращено сообщение об ошибке.
3.3 Распределенный обзор
memcached не взаимодействует друг с другом, так как же memcached обеспечивает распределенность?
Распределенная реализация memcached в основном зависит от реализации клиента.
Когда данные приходят к клиенту,Алгоритмы реализованные клиентомСервер memcached для сохранения будет определяться на основе «ключа». После того, как сервер выбран, приказано сохранить данные. То же самое и при выборке, клиент выбирает сервер по «ключу», и этот же сервер можно сохранить, используя тот же алгоритм при сохранении.
То есть доступ к данным делится на два этапа: первый шаг — выбор сервера, а второй — доступ к данным.
Какой алгоритм используется для выбора сервера?
client 使用Hash算法来完成数据分散存储.
3.4 Распределенный алгоритм (алгоритм хеширования)
При сохранении/получении ключа/значения из кластера memcached клиентская программа memcachedопределенный алгоритмВычислите, на каком сервере хранить, а затем сохраните значение ключа/значения на этом сервере. То есть доступ к данным делится на два этапа: первый шаг — выбор сервера, а второй — доступ к данным.
Существует два широко используемых алгоритма: децентрализованный метод расчета остатка и последовательный алгоритм хеширования.
3.4.1 Дисперсионный метод расчета остатка
- Стандартный распределенный алгоритм memcached
CRC($key)%N
Клиент сначала вычисляет цену за клик по ключу, а затем результат по модулю сервера, чтобы получить узел сервера memcached.
- Когда соответствующий сервер не может быть подключен
- перефразировать: попробуйте добавить количество подключений к обратной стороне ключа и перефразировать
- Добавить/удалить сервер
- Расчет остатка достаточно прост, дисперсия данных тоже отличная
- Почти все кеши будут признаны недействительными, а стоимость реорганизации кеша довольно велика.
- Достичь весов не так-то просто
3.4.2 Согласованный алгоритм хеширования
Назначьте хеш-значение сервера кругу 0~2^32 и используйте тот же метод, чтобы найти хеш-значение сохраненного числового ключа и сопоставить его с кругом.Затем начните поиск по часовой стрелке с места, где находятся данные. сопоставляются и сохраняют данные на первый найденный сервер.Если не удается найти более 0~2^32, сохраняем данные на первый сервер.
Если новый сервер будет добавлен/удален, как это повлияет на последовательный алгоритм хеширования?
Как показано на рисунке, при добавлении/удалении сервера будет затронут только ключ на первом сервере против часовой стрелки сервера, добавленного в круг.
Оптимизировать последовательный алгоритм хеширования
- Общий непротиворечивый алгоритм хэширования в наибольшей степени подавляет перераспределение ключей, а некоторые реализации также используют идею виртуальных узлов.
- Распределение местоположений сопоставления серверов очень неравномерно, что приводит к неравномерному доступу к данным, и большое количество ключей сопоставляется с одним и тем же сервером.
- Виртуальный узел: каждая машина вычисляет несколько хеш-значений, каждое значение соответствует позиции узла в кольце.
- Метод сопоставления ключей остается неизменным, и существует дополнительный уровень процесса от виртуальных узлов до повторного сопоставления с физическими машинами.
После оптимизации: в случае небольшого числа физических машин, при наличии достаточного количества виртуальных узлов, распределение ключей может быть относительно равномерным.Балансировка алгоритма улучшается.
3.5 Метрики алгоритма хеширования
3.5.1 — монотонность
单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
3.5.2 Баланс
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。
Алгоритм хеширования не гарантирует абсолютного баланса
Часто задаваемые вопросы по 0x04
4.1 В чем разница между memcached и redis?
Контрастная точка | memcached | redis |
---|---|---|
структура данных | Одиночный (типы хранимых данных - все типы String) | Rich (String, List, Set, Sortedset, Hash) |
использование памяти | Используя простое хранилище ключей и значений, Memcached использует больше памяти. | Redis использует хэш-структуру для хранения ключей и значений, поэтому из-за комбинированного сжатия его использование памяти будет выше, чем у Memcached. |
Упорство | Не может | Да (вы можете хранить данные на диске в любое время) |
синхронизация данных | Не может | Может |
многоядерный | Может использовать несколько ядер (многопоточность) | одно ядро |
размер данных | Данные, хранящиеся в одном ключе (переменной), имеют ограничение в 1M. | Данные, хранящиеся в одном ключе (переменной), ограничены 1 ГБ. |
Рассчитать способность | никто | Он имеет определенную функцию расчета |
- Redis работает лучше, чем Memcached, при хранении небольших данных
- В данных выше 100 000 производительность Memcached выше, чем у Redis.
- memcached увеличивает количество сетевых операций ввода-вывода и объем данных
Обработка просроченных данных memcached и redis
Redis — это ленивая обработка, она будет отмечать период действия данных с периодом действия и будет обрабатывать данные со временем истечения срока действия в указанное время. Случайным образом выньте часть данных, проверьте, есть ли просроченные данные, если просроченные данные превышают 25/100, повторите этот процесс.
4.2 Почему memcache быстрый?
Он использует libevent, может обрабатывать любое количество открытых подключений (используя epoll вместо poll), использует неблокирующий сетевой ввод-вывод, распределяет хешированные объекты по разным серверам и имеет сложность запросов O(1).
4.3 Частота попаданий в кэш Memcache?
коэффициент попадания в кеш =get_hits/cmd_get * 100%
4.4 Реализация кластера Memcache
Согласованный хэш
0x05 Сводка
а. В реальной битве проектов разработки программного обеспечения часто встречаются компромиссы между временем и пространством.Кэш — это типичная технология, которая была исследована на компромиссы, и memcached является лидером в таких технологиях.
б) В среде с высокой степенью параллелизма к базе данных поступает большое количество запросов на чтение и запись.
в) В этой статье представлен принцип реализации распределенного алгоритма memcached при условии понимания основных концепций кэширования.