Если у меня будет 4 или 5 средних сайтов на одном сервере, я хочу быть уверен, что на каждом из них, для которого требуется memcached, есть как минимум выделенное пространство. Есть простой способ сделать это? Единственный способ, который приходит в голову, - это иметь отдельные процессы на разных портах для каждого из них. Есть ли способ попроще / другой? Я просто не хочу, чтобы один сайт забирал всю память для memcached.
У меня тонны оперативной памяти, и я хочу предоставить одному из моих сайтов magento ровно 512 МБ для memcached. Еще хочу дать другому кастомному приложению ровно 512мб для memcached. Идеи?
Memcached не имеет понятия о пространствах имен, разделах и т. Д. Поэтому единственный способ - запустить несколько экземпляров memcached. Это не проблема, поскольку memcached смехотворно прост в настройке (целенаправленно).
Его можно просто привязать, например, к 5 различным портам (один для доступного сайта) или 5 различным IP-адресам.
Я согласен с Найлом здесь. Другая возможность заключается в том, что вы можете использовать частное IP-пространство. Допустим, вашему серверу может быть назначено 4 IP-адреса от 10.x.x.1 до 4. Вы можете запустить Memcached с 4-мя серверами и выполнить привязку к каждому IP, тем самым предоставив всем сайтам один и тот же порт, но другой IP-адрес memcache.
Кроме того, вы можете изменить сценарий инициализации для memcached, чтобы запускать все 4 сервера и останавливать их вместе за один раз. Это можно использовать с методом привязки IP или порта. Это будет очень просто для вас.
Вот пример одновременного использования нескольких серверов. Сценарий запуска /etc/init.d нескольких серверов Memcached, который работает? (см. источник сценария вопроса).
Существует причина, по которой memcached требует отдельного процесса, это больше связано с управлением памятью, чем с самим memcached. Раздельные процессы, совместно использующие память, не кажутся хорошей идеей. Управление памятью лучше оставить системе.
В этом нет необходимости. Если вы считаете, что хранилище memcache на самом деле работает как LRU стека, тогда становится очевидным, что неоптимально отдавать некоторую часть памяти сайту, который используется меньше, когда сайт, который должен быть больше в memcached, будет иметь меньшую часть памяти, и записи для него будут выталкиваться чаще, чем необходимо, в то время как сайт получает меньше трафика в этой выделенной части будет храниться меньше неиспользуемых данных, которые можно было бы лучше использовать для более активных сайтов, которые вместо использования записей memcached должны будут обращаться к данным в некотором бэкэнде SQL.
Я согласен с обоими ответами здесь, но хотел бы добавить еще несколько комментариев.
Я не думаю, что есть способ разделить объекты с именами и связанное использование оперативной памяти в одном экземпляре memcache. Как и в других ответах, лучше всего запускать несколько экземпляров.
Хотя это может быть простой задачей, если это крупномасштабный проект, они также могут быть хорошими ресурсами для изучения:
https://github.com/twitter/twemproxy
Позволяет вам установить прокси перед memcache. Это означает, что все сайты / клиенты подключаются к процессам «Щелкунчик», которые балансируют нагрузку между пулами кэша памяти.
http://code.google.com/p/moxi/
Еще одно прокси-решение для балансировки нагрузки кэша памяти.
Опять же, это зависит от размера вашей инфраструктуры, но это могут быть инструменты, которые помогут вам в более крупной или растущей инфраструктуре. Разделение их позволит вам иметь несколько меньших экземпляров, и вместо того, чтобы добавлять, скажем, новый экземпляр 512 МБ для каждого сайта, вы можете придерживаться еще меньших, скажем, 64 МБ экземпляров и расширяться с гораздо меньшей скоростью.
Крайне маловероятно, что Memcache когда-либо будет потреблять более 32 МБ ОЗУ для магазина Magento. Если учесть, что каждая кешируемая страница имеет размер около 4 Кбайт - у вас есть немало возможностей для кэшированного контента.
Я бы предложил настроить несколько экземпляров Memcached с использованием сокетов unix (это быстрее и безопаснее, чем TCP / IP). Вы можете запустить Memcached со следующими флагами
-d
-m 32
-u myuser
-s /home/myuser/cache.sock
-a 0700
Ваша конфигурация memcache local.xml будет выглядеть так, и прочтите это, чтобы понять, зачем нужен slow_backend - http://www.sonassi.com/knowledge-base/magento-kb/what-is-memcache-actually-caching-in-magento/
<cache>
<slow_backend>database</slow_backend>
<fast_backend>Memcached</fast_backend>
<fast_backend_options>
<servers>
<server>
<host>unix:///home/myuser/cache.sock</host>
<port>0</port>
<persistent>0</persistent>
</server>
</servers>
</fast_backend_options>
<backend>memcached</backend>
<memcached>
<servers>
<server>
<host>unix:///home/myuser/cache.sock</host>
<port>0</port>
<persistent>0</persistent>
</server>
</servers>
<compression><!--[CDATA[0]]></compression-->
<cache_dir><!--[CDATA[]]></cache_dir-->
<hashed_directory_level><!--[CDATA[]]></hashed_directory_level-->
<hashed_directory_umask><!--[CDATA[]]></hashed_directory_umask-->
<file_name_prefix><!--[CDATA[]]></file_name_prefix-->
</file_name_prefix></hashed_directory_umask></hashed_directory_level></cache_dir></compression></memcached>
</cache>
Как вы и подозревали, самым простым способом будет иметь несколько экземпляров memcached. memcache намеренно поддерживается как можно более простым для скорости, поэтому не предлагает внутренних форм разделения, подобных тому, что вы ищете. По той же причине он даже не предлагает никаких форм аутентификации!