Назад | Перейти на главную страницу

Несколько веб-серверов Magento, проблемы с кешем памяти одного экземпляра

У меня есть два веб-сервера с экземпляром Magento на обоих. Каждый из них использует одинаковые httpd.conf, php.ini и my.cnf, а также файлы конфигурации magento local.xml и config.xml.

У меня есть еще один сервер, на котором хранятся как общая БД, так и общий экземпляр Memcache. Оба веб-сервера Magento могут успешно подключаться к экземпляру БД, но только ОДИН из экземпляров Magento правильно работает с memcache.

Когда я делаю запрос к экземпляру magento, который НЕ работает с memcache, я получаю следующую ошибку:

There has been an error processing your request

Warning: session_start() [function.session-start]: open(tcp://INTERNAL_IP_OF_MEMCACHE_SERVER:11211?persistent=1&weight=2&timeout=10&retry_interval=10/sess_9bmgdui99pr39fagpnoa53prl5, O_RDWR) failed: No such file or directory (2)  in /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php on line 113

Trace:
#0 [internal function]: mageCoreErrorHandler(2, 'session_start()...', '/var/www/html/p...', 113, Array)
#1 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php(113): session_start()
#2 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php(153): Mage_Core_Model_Session_Abstract_Varien->start('frontend')
#3 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract.php(84): Mage_Core_Model_Session_Abstract_Varien->init('core', 'frontend')
#4 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session.php(39): Mage_Core_Model_Session_Abstract->init('core', 'frontend')
#5 /var/www/html/production-host/app/code/core/Mage/Core/Model/Config.php(1206): Mage_Core_Model_Session->__construct(Array)
#6 /var/www/html/production-host/app/Mage.php(432): Mage_Core_Model_Config->getModelInstance('core/session', Array)
#7 /var/www/html/production-host/app/Mage.php(446): Mage::getModel('core/session', Array)
#8 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Action.php(483): Mage::getSingleton('core/session', Array)
#9 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Front/Action.php(59): Mage_Core_Controller_Varien_Action->preDispatch()
#10 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Action.php(407): Mage_Core_Controller_Front_Action->preDispatch()
#11 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('index')
#12 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Front.php(177): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#13 /var/www/html/production-host/app/code/core/Mage/Core/Model/App.php(304): Mage_Core_Controller_Varien_Front->dispatch()
#14 /var/www/html/production-host/app/Mage.php(596): Mage_Core_Model_App->run(Array)
#15 /var/www/html/production-host/index.php(83): Mage::run('', 'store')
#16 {main}

Я успешно подключился с этой машины к серверу memcache на порт 11211 и могу нормально подключиться к экземпляру memcache. Я также удостоверился, что каждая система имеет правильные расширения, установленные через php -m, и различал вывод «php_info» (они идентичны).

Я понимаю, что у session_start () возникла проблема с подключением к экземпляру memcache, но я не понимаю почему? TIA!

ИЗМЕНИТЬ / ОБНОВИТЬ:

Это корпоративная версия Magento: 1.5, я считаю (сейчас проверяю), а local.xml:

> <config>   <global>
>     <install>
>       <date><![CDATA[REDACTED]]></date>
>     </install>
>     <crypt>
>       <key><![CDATA[REDACTED]]></key>
>     </crypt>
>     <disable_local_modules>false</disable_local_modules>
>     <resources>
>       <db>
>         <table_prefix></table_prefix>
>       </db>
>       <default_setup>
>         <connection>
>           <host><![CDATA[REDACTED]]></host>
>           <username><![CDATA[REDACTED]]></username>
>           <password><![CDATA[REDACTED]]></password>
>           <dbname><![CDATA[REDACTED]]></dbname>
>           <active>1</active>
>         </connection>
>       </default_setup>
>     </resources>
>     <session_save><![CDATA[memcached]]></session_save>
>    
> <session_save_path><![CDATA[tcp://REDACTED:11211?persistent=1&weight=2&timeout=10&retry_interval=10]]></session_save_path>
>     <session_cache_limiter></session_cache_limiter> <cache>
> <slow_backend>database</slow_backend>
> <fast_backend>Memcached</fast_backend> <fast_backend_options>  
> <servers>
>     <server>
>       <host>REDACTED</host>
>       <port>11211</port>
>       <persistent>1</persistent>
>     </server>   </servers> </fast_backend_options>
> 
> <backend>memcached</backend> <memcached>   <servers>
>     <server>
>       <host>REDACTED</host>
>       <port>11211</port>
>       <persistent>1</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> </memcached>
> </cache>   </global>   <admin>
>     <routers>
>       <adminhtml>
>         <args>
>           <frontName><![CDATA[REDACTED]]></frontName>
>         </args>
>       </adminhtml>
>     </routers>   </admin> </config>

И вот значения в файле прямо перед вызовом session_start:

[x] метод = memcached

[x] savepath = tcp: // УДАЛЕНО: 11211? persistent = 1 & weight = 2 & timeout = 10 & retry_interval = 10

ОБНОВИТЬ:

Я также создал тестовый скрипт, который содержит:

$fp = fsockopen('REDACTED', '11211');
if (!$fp)
{

И я запускаю его как apache:

sudo -u apache php test.php

и он умеет нормально подключаться.

Вы должны начать отладку проблемы, исключив Magento из числа возможных виновников. Т.е. работают ли обычные сессии PHP memcache?

Попробуйте test.php с помощью:

<?php
ini_set("session.save_handler","memcache");
ini_set("session.save_path","127.0.0.1:11211");
session_start();
print "Session started..\n<br />\n";
?>

Если это сработает, посмотрите в код (app / code / core / Mage / Core / Model / Session / Abstract / Varien.php), чтобы увидеть, возможно ли, что Magento перезаписывает save_path.

Кроме того, вы абсолютно уверены, что ваш обработчик сеанса - это memcached? Дважды проверьте результат работы phpinfo () (в разделе: зарегистрированные обработчики сеансов).

Я рекомендую рассмотреть возможность перехода на Redis как для хранилища сеансов, так и для хранилища кеша. Причины:

  • Memcached не подходит для кеширования Magento из-за сильной зависимости от тегов кеша. Наличие двухуровневого бэкенда излишне сложно и медленно, мой Бэкэнд Redis поддерживает теги без TwoLevels.
  • Использование непостоянного хранилища кеша означает, что при перезагрузке у вас будет холодный кеш.
  • Использование непостоянного хранилища сеансов означает, что если вам нужно перезагрузить, все пользователи потеряют свои сеансы.
  • Redis чертовски быстр.

Redis можно настроить с максимальным ограничением памяти. Вы можете запустить два экземпляра для независимого управления размером кеша и хранилища сеансов, если это необходимо, и его можно настроить для использования LRU для вытеснения, когда он заполнен.

В расширение phpredis поддерживает собственный плагин для хранения сеансов, но я не тестировал его с Magento.