Sessions Failover with PHP-memcache against memcached

12,889

Solution 1

I would like to thank everybody who participated this question, the answer is the following: in reality memcache (not memcached) as session handler supports comma separated servers as the session.save_path, moreover it supports failover. The error mentioned above Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111) had only 8th (Notice) level. In fact engine just informs you about the fact that one of the servers is unavailable (which is logical, as otherwise how will you know?) and then successfully connects to the second server and using it.

So all of the misunderstanding has been caused by weak documentation, memcache/memcached confusions and paranoid (E_ALL) settings of my custom error handler. In the meantime the issue has been resolved by ignoring notices referring to error Connection refused (111) in the session establishing context

Solution 2

Use the Memcached extension. Note that there are two memcache plugins for PHP. One is called Memcache, the other is called Memcached. Yes, that's confusing, but true anyway.

The Memcache plugin supports those complex URL's you're using, with the protocol identifier (tcp) and the parameters (persistency and so on), while the Memcached plugin supports connection pools.

The documentation you're mentioning in the comments above (http://www.php.net/manual/en/memcached.sessions.php) is about the Memcached extension, not about Memcache.

Update: Some interesting read: https://serverfault.com/questions/164350/can-a-pool-of-memcache-daemons-be-used-to-share-sessions-more-efficiently

Share:
12,889
Eugene
Author by

Eugene

Updated on June 05, 2022

Comments

  • Eugene
    Eugene almost 2 years

    Colleagues!

    I'm running php 5.3 (5.3.8) with memcache (2.2.6) client library (http://pecl.php.net/package/memcache) to deal with memcached server. My goal is to have failover solution for sessions engine, namely:

    • Only native php sessions support (no custom handlers)
    • Few memcached servers in the pool

    What I expect is that in case if one of memcached servers is down, php will attempt to utilize the second server in the pool [will successfully connect it and become happy], however when first memcached server in the pool is down I'm receiving the following error:

    Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111)
    

    while relevant php settings are:

    session.save_handler memcache
    session.save_path tcp://10.0.10.111:11211?persistent=1&weight=1&timeout=1&retry_interval=10, tcp://10.0.10.110:11211?persistent=1&weight=1&timeout=1&retry_interval=10
    

    and memcache settings (while I think that it's near to standard) are:

    Directive   Local Value
    memcache.allow_failover 1
    memcache.chunk_size 8192
    memcache.default_port   11211
    memcache.default_timeout_ms 1000
    memcache.hash_function  crc32
    memcache.hash_strategy  standard
    memcache.max_failover_attempts  20
    

    Memcached still running on the second server and perfectly accessible from the WEB server:

    telnet 10.0.10.110  11211
    Trying 10.0.10.110...
    Connected to 10.0.10.110 (10.0.10.110).
    Escape character is '^]'.
    get aaa
    END
    quit
    Connection closed by foreign host.
    

    So in other words, instead of querying all of the listed servers sequentially it crashes after unsuccessful attempt to connect the first server in the queue. Finally I do realize that there are releases of 3.0.x client library available, however it does not look too reliable for me as it still in beta version.

    Please advice how can I get desired behavior with standard PHP, client lib and server.

    Thanks a lot!

    Best, Eugene