You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接时添加故障转移相关配置,具体步骤如下:

  1. 修改缓存配置文件
    在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,
        ],
    ],
],
  1. 生效配置
    修改后执行php artisan config:clear清除配置缓存,或重启Laravel应用,然后测试单节点宕机场景,确认剩余节点可正常提供服务。

补充说明

  • DISTRIBUTION_CONSISTENT:避免节点增减时大量key重新分布,提升故障转移稳定性
  • RETRY_TIMEOUT:控制不可用节点的重试间隔,避免无效等待
  • SERVER_FAILURE_LIMIT:防止偶发网络波动误标记节点为不可用

内容的提问来源于stack exchange,提问作者arpidev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:45:05