【问题标题】:Laravel multiple memcached: failover does not workLaravel 多个 memcached:故障转移不起作用
【发布时间】:2016-10-12 15:49:42
【问题描述】:

我有两个 memcached 服务器。我设置了以下配置,我的期望是即使两台服务器之一关闭,我的 PHP 应用程序也可以使用活动的 memcached。但它没有用。执行 memcached 的 get() 方法时出现“未添加 Memcached 服务器”错误。

'memcached' => [
    'driver'  => 'memcached',
    'options' => [
        Memcached::OPT_CONNECT_TIMEOUT => 10,
        Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
        Memcached::OPT_SERVER_FAILURE_LIMIT => 2,
        Memcached::OPT_REMOVE_FAILED_SERVERS  => true,
        Memcached::OPT_RETRY_TIMEOUT => 1,
    ],
    'servers' => [
        [
            'host' => 'xxx.0.0.1', 'port' => 11211, 'weight' => 100,
        ],
        [
            'host' => 'xxx.0.0.2', 'port' => 11211, 'weight' => 100,
        ],
    ],
],

我正在使用最新版本的 memcached 服务器和客户端。

memcached 1.4.25-2ubuntu1
php-memcached version 3.0.0b1
libmemcached version 1.0.18

你有什么想法吗?


编辑 1

“没有添加 Memcached 服务器”错误来自这里。

https://github.com/illuminate/cache/blob/master/MemcachedConnector.php


编辑 2

我发现 Memcached::XXX 选项是整数值。所以选项值不会传递给服务器。我解决了这个问题,但结果没有改变。

'options' => array('10', '1', '2', true, '1')

编辑 3

这里提到了 Laravel 的缓存示例设置

https://github.com/laravel/laravel/blob/master/config/cache.php#L60


编辑 4

我在没有 Laravel 的情况下使用 PHP 进行了尝试,然后我发现当两个服务器之一死机时 getVersion() 返回 null。

<?php

$m = new Memcached();

$m->addServer('127.0.0.1', 11211);
$m->addServer('127.0.0.1', 11212);

$status = $m->getVersion();

if ($status == null){
  echo "null";
} else {
  echo "not null";
}

* when both the two servers are alive

// not null
// $status = array('127.0.0.1:11211' => '1.4.25', '127.0.0.1:11212' => '1.4.14')

* when one of the two server is dead

// null
// $status = null

【问题讨论】:

    标签: php laravel laravel-5 memcached


    【解决方案1】:

    我为此苦苦挣扎了几天,终于找到了解决方案https://packagist.org/packages/fingo/laravel-cache-fallback

    很容易安装:

    1. composer require fingo/laravel-cache-fallback

    2. 将提供程序Fingo\LaravelCacheFallback\CacheFallbackServiceProvider::class 添加到'config/app.php`

    3. 默认后备顺序为:redis、memcached、数据库、cookie、文件、数组。如果需要更改后备顺序,请发布供应商:php artisan vendor:publish --provider="Fingo\LaravelCacheFallback\CacheFallbackServiceProvider"

    我正在使用 Laravel 5.2 和 PhP7,对库的要求是:php: ~5.6|~7.0, illuminate/cache: ~5.1

    LE:我已经实现了一种从一个 Memcached 服务器故障转移到另一个服务器的不同方法,如果它们都关闭,那么它将故障转移到“文件”驱动程序。

    config/cache.php:

    'memcached' => [
            'driver'  => 'memcached',
            // To use the options we need to install the PHP driver: sudo yum install php-memcached
            'options' => [
                Memcached::OPT_CONNECT_TIMEOUT => 3,
                Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
                Memcached::OPT_SERVER_FAILURE_LIMIT => 2,
                Memcached::OPT_REMOVE_FAILED_SERVERS  => true,
                Memcached::OPT_RETRY_TIMEOUT => 1,
            ],
            'servers' => [
                [
                    'host' => 'xxx.xxx.xxx.xxx',
                    'port' => 11211,
                    'weight' => 90,
                ],
            ]
        ],
    
        'memcached249' => [
            'driver'  => 'memcached',
            // To use the options we need to install the PHP driver: sudo yum install php-memcached
            'options' => [
                Memcached::OPT_CONNECT_TIMEOUT => 3,
                Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
                Memcached::OPT_SERVER_FAILURE_LIMIT => 2,
                Memcached::OPT_REMOVE_FAILED_SERVERS  => true,
                Memcached::OPT_RETRY_TIMEOUT => 1,
            ],
            'servers' => [
                [
                    'host' => 'xxx.xxx.xxx.xxx',
                    'port' => 11211,
                    'weight' => 100,
                ],
            ]
        ],
    

    config/cache_fallback.php

    return [
        'fallback_order' => [
            'memcached',
            'memcached249',
            'file',
        ]
    ];
    

    唯一的问题是,如果第一台 memcached 服务器停机,它会减慢整个系统的速度(但至少不会破坏主服务器)。希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 2018-12-28
      • 2014-01-21
      • 2011-12-09
      相关资源
      最近更新 更多