PHP Cluster with MEMCACHED

Hello friends, how are you?

I created a php cluster with 8 machines. Each one have his own memcached server because the main
idea is for session HA too. I setup owncloud distributed cache to use all these machines like this:

'memcache.local' => '\OC\Memcache\APCu'
'memcache.distributed' => '\OC\Memcache\Memcached'

and machines are:

'memcached_servers' =>
array (
0 =>
array (
0 => '10.10.128.71',
1 => 11211,
),
1 =>
array (
0 => '10.10.128.72',
1 => 11211,
),
2 =>
array (
0 => '10.10.128.73',
1 => 11211,
),
3 =>
array (
0 => '10.10.128.74',
1 => 11211,
),
4 =>
array (
0 => '10.10.128.75',
1 => 11211,
),
5 =>
array (
0 => '10.10.128.76',
1 => 11211,
),
6 =>
array (
0 => '10.10.128.77',
1 => 11211,
),
7 =>
array (
0 => '10.10.128.78',
1 => 11211,
),
),

The problem occurs when some of the machines are offline. I'm unable to login via web interface and the client lost connection too.

Is the configuration is correct for HA?

Hello friends. Do you have some idea of it?

Are all your memcaches server connected to each other properly? I'm not an expert when it comes down to memcached - but I miss this information in your description above.

Are there any error messages in the log file as soon as the login issue arises?

The configuration seems ok.

According to https://github.com/php-memcached-dev/php-memcached/issues/154 it seems the behaviour is kind of expected because you might be hitting one of the down servers and an error could happen.
If this is true, I guess there is no solution on our side at the moment, and I'm not sure if ownCloud can provide a solution for it because of the same reasons the php-memcached guys argue.

I don't know if redis has the same problem, but you might give it a try.

Hello friends.

Servers are okay.

This is my memcached config file:

; Enable memcached extension module
extension=memcached.so

; ----- Options to use the memcached session handler

; RPM note : save_handler and save_path are defined
; for mod_php, in /etc/httpd/conf.d/php.conf
; for php-fpm, in /etc/php-fpm.d/*conf

; Use memcache as a session handler
;session.save_handler=memcached
; Defines a comma separated list of server urls to use for session storage
;session.save_path="localhost:11211"

; ----- Configuration options
; http://php.net/manual/en/memcached.configuration.php

[memcached]
; Use session locking
; valid values: On, Off
; the default is On
memcached.sess_locking = On

; Session spin lock retry wait time in microseconds.
; Be carefull when setting this value.
; Valid values are integers, where 0 is interpreted as
; the default value. Negative values result in a reduces
; locking to a try lock.
; the default is 150000
memcached.sess_lock_wait = 150000

; The maximum time, in seconds, to wait for a session lock
; before timing out.
; Setting to 0 results in default behavior, which is to
; use max_execution_time.
memcached.sess_lock_max_wait = 0;

; The time, in seconds, before a lock should release itself.
; Setting to 0 results in the default behaviour, which is to
; use the memcached.sess_lock_max_wait setting. If that is
; also 0, max_execution_time will be used.
memcached.sess_lock_expire = 0;

; memcached session key prefix
; valid values are strings less than 219 bytes long
; the default value is "memc.sess.key."
memcached.sess_prefix = ""

; memcached session consistent hash mode
; if set to On, consistent hashing (libketama) is used
; for session handling.
; When consistent hashing is used, one can add or remove cache
; node(s) without messing up too much with existing keys
; default is Off
memcached.sess_consistent_hash = On

; Allow failed memcached server to automatically be removed
memcached.sess_remove_failed = 1

; Write data to a number of additional memcached servers
; This is "poor man's HA" as libmemcached calls it.
; If this value is positive and sess_remove_failed is enabled
; when a memcached server fails the session will continue to be available
; from a replica. However, if the failed memcache server
; becomes available again it will read the session from there
; which could have old data or no data at all
memcached.sess_number_of_replicas = 7

; memcached session binary mode
; libmemcached replicas only work if binary mode is enabled
memcached.sess_binary = On

; memcached session replica read randomize
memcached.sess_randomize_replica_read = Off

; memcached connect timeout value
; In non-blocking mode this changes the value of the timeout
; during socket connection in milliseconds. Specifying -1 means an infinite timeout.
memcached.sess_connect_timeout = 1000

; Session SASL username
; Both username and password need to be set for SASL to be enabled
; In addition to this memcached.use_sasl needs to be on
memcached.sess_sasl_username = NULL

; Session SASL password
memcached.sess_sasl_password = NULL

; Set the compression type
; valid values are: fastlz, zlib
; the default is fastlz
memcached.compression_type = "fastlz"

; Compression factor
; Store compressed value only if the compression
; factor (saving) exceeds the set limit.
;
; store compressed if:
; plain_len > comp_len * factor
;
; the default value is 1.3 (23% space saving)
memcached.compression_factor = "1.3"

; The compression threshold
;
; Do not compress serialized values below this threshold.
; the default is 2000 bytes
memcached.compression_threshold = 2000

; Set the default serializer for new memcached objects.
; valid values are: php, igbinary, json, json_array, msgpack
;
; json - standard php JSON encoding. This serializer
; is fast and compact but only works on UTF-8
; encoded data and does not fully implement
; serializing. See the JSON extension.
; json_array - as json, but decodes into arrays
; php - the standard php serializer
; igbinary - a binary serializer
; msgpack - a cross-language binary serializer
;
; The default is igbinary if available, then msgpack if available, then php otherwise.
memcached.serializer = "igbinary"

; Use SASL authentication for connections
; valid values: On, Off
; the default is Off
memcached.use_sasl = Off

; The amount of retries for failed store commands.
; This mechanism allows transparent fail-over to secondary servers when
; set/increment/decrement/setMulti operations fail on the desired server in a multi-server
; environment.
; the default is 2
memcached.store_retry_count = 2