Magento和Redis: 在升级/降级Redis后,连接到Redis失败并出现“2次失败错误”。

3
我最近在一个演示服务器上为Magento实例设置了Redis缓存(单独的Web服务器和DB服务器,DB服务器在运行Redis),并且它已经工作了一段时间,问题很少。唯一的问题是偶尔出现通信错误,因此为了解决这个问题,我将Redis版本从2.4.10升级到了最新的3.2.1。我还应该注意的是,从一开始我就在三个不同的端口上运行了三个不同的实例,因为这通常是当你想在Magento中使用Redis进行所有三种类型的缓存时推荐的做法。
在升级后确保我可以在所有三个端口上ping到Redis之后,我重新连接了Magento,并立即开始收到错误提示,指示它根本无法连接:Connection to Redis failed after 2 failures 。我试图排除这个问题一段时间,最终将Redis包降级回2.4.10,只是遇到了同样的问题。我之前甚至在本地环境中使用了Redis 3.2.1,没有遇到任何这些问题。我觉得我一定是错过了什么,但感觉尝试了一切。Redis日志文件完全正常,只报告成功启动。所有Magento Redis库都是最新的,从Github拉取的。 / etc / init.d / redis文件是标准文件的修改版本,从GitHub的某个地方拉取以支持启动多个实例。
Magento的local.xml:
<config>
    <global>
        <install>
            <date><![CDATA[Sat, 11 Jul 2015 08:00:49 +0000]]></date>
        </install>
        <crypt>
            <key><![CDATA[24d48474f523332d6dbcd9d1d6931c98]]></key>
        </crypt>
        <disable_local_modules>false</disable_local_modules>
        <resources>
            <db>
                <table_prefix><![CDATA[]]></table_prefix>
            </db>
            <default_setup>
                <connection>
                    <host><![CDATA[(address)]]></host>
                    <username><![CDATA[root]]></username>
                    <password><![CDATA[password]]></password>
                    <dbname><![CDATA[magento]]></dbname>
                    <initStatements><![CDATA[SET NAMES utf8]]></initStatements>
                    <model><![CDATA[mysql4]]></model>
                    <type><![CDATA[pdo_mysql]]></type>
                    <pdoType><![CDATA[]]></pdoType>
                    <active>1</active>
                </connection>
            </default_setup>
        </resources>
        <cache>
          <backend>Cm_Cache_Backend_Redis</backend>
          <backend_options>
            <server><![CDATA[(address)]]></server>                               <!-- or absolute path to unix socket -->
            <port><![CDATA[6379]]></port>
            <persistent></persistent>                                <!-- Specify unique string to enable persistent connections. E.g.: sess-db0; bugs with phpredis and php-fpm are known: https://github.com/nicolasff/phpredis/issues/70 -->
            <database>0</database>                                   <!-- Redis database number; protection against accidental data loss is improved by not sharing databases -->
            <password></password>                                    <!-- Specify if your Redis server requires authentication -->
            <force_standalone>0</force_standalone>                   <!-- 0 for phpredis, 1 for standalone PHP -->
            <connect_retries>1</connect_retries>                     <!-- Reduces errors due to random connection failures; a value of 1 will not retry after the first failure -->
            <read_timeout>10</read_timeout>                          <!-- Set read timeout duration; phpredis does not currently support setting read timeouts -->
            <automatic_cleaning_factor>0</automatic_cleaning_factor> <!-- Disabled by default -->
            <compress_data>1</compress_data>                         <!-- 0-9 for compression level, recommended: 0 or 1 -->
            <compress_tags>1</compress_tags>                         <!-- 0-9 for compression level, recommended: 0 or 1 -->
            <compress_threshold>20480</compress_threshold>           <!-- Strings below this size will not be compressed -->
            <compression_lib>gzip</compression_lib>                  <!-- Support gzip, lzf, lz4 (https://github.com/kjdev/php-ext-lz4) or snappy (https://github.com/goatherd/php-snappy) -->
            <use_lua>0</use_lua>                                     <!-- Set to 1 if Lua scripts should be used for some operations -->
          </backend_options>
        </cache>
        <full_page_cache>
          <backend>Cm_Cache_Backend_Redis</backend>
          <backend_options>
            <server><![CDATA[(address)]]></server>              <!-- or absolute path to unix socket -->
            <port><![CDATA[6380]]></port>
            <persistent></persistent>               <!-- Specify unique string to enable persistent connections. E.g.: sess-db0; bugs with phpredis and php-fpm are known: https://github.com/nicolasff/phpredis/issues/70 -->
            <database>0</database>                  <!-- Redis database number; protection against accidental data loss is improved by not sharing databases -->
            <password></password>                   <!-- Specify if your Redis server requires authentication -->
            <force_standalone>0</force_standalone>  <!-- 0 for phpredis, 1 for standalone PHP -->
            <connect_retries>1</connect_retries>    <!-- Reduces errors due to random connection failures -->
            <read_timeout>10</read_timeout>                          <!-- Set read timeout duration; phpredis does not currently support setting read timeouts -->
            <lifetimelimit>57600</lifetimelimit>    <!-- 16 hours of lifetime for cache record -->
            <compress_data>0</compress_data>        <!-- DISABLE compression for EE FPC since it already uses compression -->
          </backend_options>
        </full_page_cache>
        <session_save>db</session_save>
        <redis_session>                                          <!-- All options seen here are the defaults -->
            <host><![CDATA[(address)]]></host>                               <!-- Specify an absolute path if using a unix socket -->
            <port><![CDATA[6381)]]></port>
            <password></password>                                <!-- Specify if your Redis server requires authentication -->
            <timeout>4</timeout>                               <!-- This is the Redis connection timeout, not the locking timeout -->
            <persistent></persistent>                            <!-- Specify unique string to enable persistent connections. E.g.: sess-db0; bugs with phpredis and php-fpm are known: https://github.com/nicolasff/phpredis/issues/70 -->
            <db>0</db>                                           <!-- Redis database number; protection from accidental loss is improved by using a unique DB number for sessions -->
            <compression_threshold>2048</compression_threshold>  <!-- Set to 0 to disable compression (recommended when suhosin.session.encrypt=on); known bug with strings over 64k: https://github.com/colinmollenhour/Cm_Cache_Backend_Redis/issues/18 -->
            <compression_lib>gzip</compression_lib>              <!-- gzip, lzf, lz4 (https://github.com/kjdev/php-ext-lz4) or snappy (https://github.com/goatherd/php-snappy) -->
            <log_level>1</log_level>                             <!-- 0 (emergency: system is unusable), 4 (warning; additional information, recommended), 5 (notice: normal but significant condition), 6 (info: informational messages), 7 (debug: the most information for development/testing) -->
            <max_concurrency>6</max_concurrency>                 <!-- maximum number of processes that can wait for a lock on one session; for large production clusters, set this to at least 10% of the number of PHP processes -->
            <break_after_frontend>5</break_after_frontend>       <!-- seconds to wait for a session lock in the frontend; not as critical as admin -->
            <break_after_adminhtml>30</break_after_adminhtml>
            <first_lifetime>600</first_lifetime>                 <!-- Lifetime of session for non-bots on the first write. 0 to disable -->
            <bot_first_lifetime>60</bot_first_lifetime>          <!-- Lifetime of session for bots on the first write. 0 to disable -->
            <bot_lifetime>7200</bot_lifetime>                    <!-- Lifetime of session for bots on subsequent writes. 0 to disable -->
            <disable_locking>0</disable_locking>                 <!-- Disable session locking entirely. -->
            <min_lifetime>60</min_lifetime>                      <!-- Set the minimum session lifetime -->
            <max_lifetime>2592000</max_lifetime>                 <!-- Set the maximum session lifetime -->
        </redis_session>
    </global>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <frontName><![CDATA[admin]]></frontName>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

/etc/init.d/redis:

#!/bin/sh
#
# redis        init file for starting up the redis daemon
#
# chkconfig:   - 20 80
# description: Starts and stops the redis daemon.

# Source function library.
. /etc/rc.d/init.d/functions

name="redis-server"
exec="/usr/sbin/$name"
#shut="/usr/bin/redis-shutdown"
#pidfile="/var/run/redis/redis.pid"
#REDIS_CONFIG="/etc/redis.conf"
PORT_NUMBERS=$(grep "^port" /etc/redis.conf-* | awk '{print $NF}')

[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis

#lockfile=/var/lock/subsys/redis

start() {
    for PORT in $PORT_NUMBERS; do
                REDIS_CONFIG="/etc/redis.conf-${PORT}"
                pidfile="/var/run/redis/redis-${PORT}.pid"
                lockfile="/var/lock/subsys/redis-${PORT}"
        [ -f $REDIS_CONFIG ] || exit 6
        [ -x $exec ] || exit 5
        echo -n $"Starting $name on $PORT: "
        daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        done
    return $retval
}

stop() {
    for PORT in $PORT_NUMBERS; do
       REDIS_CONFIG="/etc/redis.conf-${PORT}"
                pidfile="/var/run/redis/redis-${PORT}.pid"
                lockfile="/var/lock/subsys/redis-${PORT}"
        [ -f $REDIS_CONFIG ] || exit 6
        [ -x $exec ] || exit 5
        echo -n $"Starting $name on $PORT: "
        daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        done
    return $retval
}

stop() {
    for PORT in $PORT_NUMBERS; do
        echo -n $"Stopping $name on $PORT: "
                pidfile="/var/run/redis/redis-${PORT}.pid"
                lockfile="/var/lock/subsys/redis-${PORT}"
        [ -x $shut ] && $shut
        retval=$?
        if [ -f $pidfile ]
        then
                # shutdown haven't work, try old way
                killproc -p $pidfile $name
                retval=$?
        else
                success "$name shutdown"
        fi
         echo
        [ $retval -eq 0 ] && rm -f $lockfile
        done
    return $retval
}
restart() {
    stop
    start
}

reload() {
    false
}

rh_status() {
    for PORT in $PORT_NUMBERS; do
                pidfile="/var/run/redis/redis-${PORT}.pid"
        status -p $pidfile $name
        done
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}


case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}"
        exit 2
esac
exit $?

如果您有其他想法,我们非常感谢。


1
我成功找到了解决方案。在升级过程中,我反复修改配置文件时,我的原始“bind 0.0.0.0”行被更改为“bind 127.0.0.1”。将其改回去后,一切都恢复正常了。 - BClarkOMP
2
@BClarkOMP,您能否将该发现发布为答案并接受它,以便于日后帮助其他人呢? - scrowler
请详细解释问题,以便其他人可以参考并获得解决方案。 - tru.d
2个回答

0

我只需要运行两个命令就解决了。

通过终端ssh命令连接服务器并运行以下命令:

# service redis restart
# redis-cli flushall

-1

我成功找到了解决方案。在升级过程中,我在配置文件的来回修改中,原本的"bind 0.0.0.0"这一行被改成了"bind 127.0.0.1"。将其改回去后,问题得到了解决。


3
这个绑定的IP位于哪里? - tru.d
我正在使用Magento 2版本,env.php文件中有三个位置:1)前端,2)后端,3)会话数组。我应该更改哪一个? @BClarkOMP - Amol Bhandari SJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接