Magento和Redis:在升级/降级Redis

时间:2016-07-27 16:11:34

标签: magento redis

我最近设置Redis用于在登台服务器上使用Magento实例进行缓存(单独的Web服务器和数据库服务器,数据库服务器是运行Redis的服务器),并且它已经工作了一段时间,几乎没有问题。唯一的一个是非常偶然的通信错误,所以为了解决这个问题,我将Redis版本从2.4.10升级到最新版本3.2.1。我还应该注意,从一开始我就在三个独立的端口上运行了三个独立的实例,因为它通常建议当你想将Redis用于它可以在Magento中进行的所有三种类型的缓存时。

在升级后确保我可以在所有三个端口上ping Redis之后,我将Magento重新连接到它并立即开始收到错误,表明它根本无法连接:在2次失败后连接到Redis失败。我试图解决这个问题一段时间,最终最终将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 个答案:

答案 0 :(得分:0)

我设法找到了解决方案。在升级过程中我来回使用配置文件,我原来的“绑定0.0.0.0”行改为“绑定127.0.0.1”。改变它修复了一切。