Laravel多Memcached节点故障:单节点宕机致服务完全不可用
Laravel Memcached多节点宕机导致整体不可用的问题解决
环境信息
- Laravel版本:10.4.1
- PHP版本:8.2.1
问题描述
配置两台Memcached服务器后出现异常:当其中一台服务器宕机时,整个Memcached服务完全无法使用。预期单节点宕机后,另一节点仍可正常提供服务,但未实现该效果,需确认是配置失误还是框架问题。
问题分析
当前src/Illuminate/Cache/MemcachedConnector.php中的connect方法仅通过addServer添加节点,但未配置Memcached扩展的故障转移相关选项。Memcached扩展默认行为下,若某个节点不可达,请求会直接失败,而非自动切换到可用节点。
涉及源码:
public function connect(array $servers, $connectionId = null, array $options = [], array $credentials = []) { $memcached = $this->getMemcached( $connectionId, $credentials, $options ); if (! $memcached->getServerList()) { // For each server in the array, we'll just extract the configuration and add // the server to the Memcached connection. Once we have added all of these // servers we'll verify the connection is successful and return it back. foreach ($servers as $server) { $memcached->addServer( $server['host'], $server['port'], $server['weight'] ); } } return $memcached; }
解决方法
需要在Memcached连接时添加故障转移相关配置,具体步骤如下:
- 修改缓存配置文件
在config/cache.php的memcached配置项中,新增options数组配置故障转移、重试等参数:
'memcached' => [ 'driver' => 'memcached', 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 'sasl' => [ env('MEMCACHED_USERNAME'), env('MEMCACHED_PASSWORD'), ], 'options' => [ // 启用一致性哈希,节点宕机时保持key分布稳定 \Memcached::OPT_DISTRIBUTION => \Memcached::DISTRIBUTION_CONSISTENT, // 节点不可达后的重试间隔(秒) \Memcached::OPT_RETRY_TIMEOUT => 1, // 连接超时时间(毫秒) \Memcached::OPT_CONNECT_TIMEOUT => 100, // 节点连续失败次数阈值,超过后标记为不可用 \Memcached::OPT_SERVER_FAILURE_LIMIT => 3, // 允许重试已标记为不可用的节点 \Memcached::OPT_RETRY_FAILED_SERVERS => true, ], 'servers' => [ [ 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 'port' => env('MEMCACHED_PORT', 11211), 'weight' => 100, ], [ 'host' => env('MEMCACHED_HOST_2', '127.0.0.1'), 'port' => env('MEMCACHED_PORT_2', 11212), 'weight' => 100, ], ], ],
- 生效配置
修改后执行php artisan config:clear清除配置缓存,或重启Laravel应用,然后测试单节点宕机场景,确认剩余节点可正常提供服务。
补充说明
DISTRIBUTION_CONSISTENT:避免节点增减时大量key重新分布,提升故障转移稳定性RETRY_TIMEOUT:控制不可用节点的重试间隔,避免无效等待SERVER_FAILURE_LIMIT:防止偶发网络波动误标记节点为不可用
内容的提问来源于stack exchange,提问作者arpidev
相关产品推荐
相关产品推荐

