当前位置: 首页 > 知识库问答 >
问题:

Laravel多memcached:故障转移不工作

郑高驰
2023-03-14

我有两个memcached服务器。我设置了以下配置,我的期望是,即使两个服务器中的一个关闭,我的PHP应用程序也可以使用alive memcached。但没有奏效。当我执行Memcached的get()方法时,我遇到了“No Memcached servers added”错误。

'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

你有什么想法吗?

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

编辑2

我发现memcached::xxx选项是整数值。因此选项值不会传递给服务器。我修复了这个,但结果没有改变。

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

编辑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

共有1个答案

梁鸿风
2023-03-14

我为此纠结了几天,终于找到了一个解决方案https://packagist.org/packages/fingo/laravel-cache-fallback

安装起来相当容易:

>

  • Composer需要Fingo/Laravel-Cache-Fallback

    Le:我实现了从一个Memcached服务器到另一个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',
        ]
    ];
    

  •  类似资料:
    • 我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运

    • 我在端口7000、7001和7002上设置了三个服务器(一个主服务器和两个从服务器),在端口26379、26380和26381上设置了三个哨兵,它们都在同一台机器(ubuntu VM)上。 当我启动它们时,根据日志,一切看起来都很好,当我对哨兵运行信息命令时,看起来也很健康。但是当我放下主程序(通过Ctrl+C或redis-cli SLEEP命令使其停止工作)时,没有一个从程序实例被引入为新的主程

    • 我们使用MQ作为传递消息的主要路径。这是我们的制度运作不可或缺的一部分。消息代理有时会失败,所有相关的队列也会随之失败。在camel中,有没有一种方法可以启动故障切换,并在其启动时恢复到主故障切换?

    • 我们有一个mongodb副本集,其中包含两个实例(127.0.0.1:27017-主要,127.0.0.1:27018-次要)和一个仲裁器(127.0.0.1:27019)。当我使用rs.steppdown(60)从主实例中退出时,它应该成为辅助实例,辅助实例应该成为主实例,所有写操作都应该在辅助实例中发生(退出后的主实例)。但在卸任后,我遇到了一个异常“无法将数据写入传输连接:远程主机强制关闭了

    • 对于复制,我们设置Server1作为主服务器,设置server2作为次服务器...一切正常。 期望:当server1停机时,次要的server2不会自动变成主要的。它仍然是次要的。server2也有可能自动成为主服务器。 情况2:MongoDB复制是否需要3台强制服务器,以便当server1宕机时,server2将自动成为主要服务器,server3将保持次要服务器。(这很管用)

    • 问题内容: 在简单情况下,如果3台服务器具有1个主服务器和2个从属服务器而没有分片。是否有使用Java和Jedis的经过验证的解决方案,该解决方案没有单点故障,并且将自动处理单个服务器(无论是主服务器还是从服务器)(自动故障转移)。例如,提升主机并在故障后重置,而不会丢失任何数据。 在我看来,这似乎应该是一个已解决的问题,但是我找不到关于它的任何代码,而仅是对实现此方法的高级描述。 谁实际覆盖并在