标签归档:Redis

insserv错误解决办法

今天使用apt-get安装命令时突然系统报的如下错误。Google未果,之前有人遇到了类似错误但是最后也并没有解决。

insserv: Starting redis depends on rc.local and therefore on system facility `$all' which can not be true!
insserv: Starting redis depends on rc.local and therefore on system facility `$all' which can not be true!
insserv: Starting redis depends on rc.local and therefore on system facility `$all' which can not be true!
insserv: Max recursions depth 99 reached
insserv:  loop involving service bootmisc at depth 8
insserv: exiting now without changing boot order!
update-rc.d: error: insserv rejected the script header

错误内容为超过了最大搜索深度99,看样子像是一个由死循环带来的错误。但是并不知道错误的具体原因。只是在错误中反复出现redis和rc.local。这里我就想到,可能是由于Redis的启动项问题。因为redis是我自己编译安装的,配置使用的也是自己的配置文件。

为了解决问题,我先使用sysv-rc-conf工具去掉redis的开机启动:

sysv-rc-conf

再次重新使用apt-get安装程序,发现已经能够正常安装。看来确实是由于redis的配置引发的问题。

于是,删除redis,默认的redis配置在/usr/local/bin/中

cd /usr/local/bin
rm redis-*
apt-get install redis-server

重新安装后,问题解决。

Redis的部署与配置

介绍

Redis是一个开源、支持网络、基于内存、键值对存储数据库,使用ANSI C编写。它具有以下优点:

  • 异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
  • 支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
  • 操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
  • 多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

安装和配置

wget http://download.redis.io/releases/redis-3.0.5.tar.gz
tar -zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
make
make install

将四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf 分别拷贝到/usr/redis下,和/etc下

mkdir -p /usr/redis/
cd src
cp redis-server  /usr/redis
cp redis-benchmark /usr/redis
cp redis-cli  /usr/redis
cd ..
cp redis.conf  /etc
# 安装php5-redis
apt-get install php5-redis

配置

在/etc/init.d/中创建redis启动脚本

#!/bin/bash
# chkconfig: 2345 10 90
# description: Start and Stop redis

REDISPORT=6379 
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
EXEC=/usr/redis/redis-server 
REDIS_CLI=/usr/redis/redis-cli 

PIDFILE=/var/run/redis.pid
CONF="/etc/redis.conf" #
case "$1" in
        start)
                if [ -f $PIDFILE ]
                then
                        echo "$PIDFILE exists, process is already running or crashed."
                else
                        echo "Starting Redis server..."
                        $EXEC $CONF
                fi
                if [ "$?"="0" ]
                then
                        echo "Redis is running..."
                fi
                ;;
        stop)
                if [ ! -f $PIDFILE ]
                then
                        echo "$PIDFILE exists, process is not running."
                else
                        PID=$(cat $PIDFILE)
                        echo "Stopping..."
                        $REDIS_CLI -p $REDISPORT SHUTDOWN
                        while [ -x $PIDFILE ]
                        do
                                echo "Waiting for Redis to shutdown..."
                                sleep 1
                        done
                        echo "Redis stopped"
                fi
                ;;
        restart|force-reload)
                ${0} stop
                ${0} start
                ;;
        *)
                echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
                exit 1
esac

设置开机启动和daemon进程

# 开机启动
chmod u+x redis    
sysv-rc-conf redis on
# 将redis设置为daemon方式启动
vi /etc/redis.conf
daemonize yes

启动redis时出现的两个warning信息解决

echo 1 > /proc/sys/vm/overcommit_memory
echo 511 > /proc/sys/net/core/somaxconn

Redis缓存不起效的一种可能原因解决

今天公司新上了一个网站,但是页面缓存却没有起作用,每次刷新页面在页面中的随机内容都再次随机而不是被缓存下来。显然,原因是Redis挂了。

先看一眼

~# redis-cli
127.0.0.1:6379> keys *
1) "cgi"

进入了Redis的bash,但是查询发现只有一条记录。说明Redis并没有Down,但是确实是出现了问题。

127.0.0.1:6379> set 0 1
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. 

随意插入一条key:value记录,报错,错误内容为“not able to persist on disk”,无法更改磁盘内容。

考虑到可能是Redis配置问题,先看下Redis的配置文件

~# vi /etc/redis/6379.conf

找到了以下内容

# The filename where to dump the DB
dbfilename dump.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/redis/6379

Redis将缓存数据库存在到了/var/redis/6379/dump.rdb这个文件内。顺势找到这个文件并查看权限

~# cd /var/redis/6379
~# ll
-rw-r--r-- 1 root root   18 Nov 13 03:25 dump.rdb

没有修改权限。看来原因找到了,Redis无法修改缓存数据库,导致内容没有写入。修改权限为777,重启Redis。

root@localhost:/var/redis/6379# chmod 777 dump.rdb 
root@localhost:/var/redis/6379# ll
-rwxrwxrwx 1 root root   18 Nov 13 03:25 dump.rdb*
root@localhost:/var/redis/6379# ps aux|grep redis
root      3392  0.1  0.0  39648  3156 ?        Ssl  Nov13  21:00 /usr/local/bin/redis-server *:6379              
root     29174  0.0  0.0   9392  2096 pts/3    R+   09:25   0:00 grep --color=auto redis
root@localhost:/var/redis/6379# kill -9 3392
root@localhost:/var/redis/6379# /usr/local/bin/redis-server /etc/redis/6379.conf

这里有一段插曲,因为尝试使用service redis restart失败,考虑到可能Redis并没有被写入Service中,所以就查询了以下进程然后重启。再次刷新页面,测试Redis是否工作。

root@localhost:/var/redis/6379# redis-cli
127.0.0.1:6379> set 1 1
OK
127.0.0.1:6379> keys *
  1) "<CONTENTS>"
  ...
  8) "<CONTENTS>"

显示正常,Redis已经可用。

附:

后来去init.d下查找了一下,发现Redis是有service,只不过名字是redis_6379

~# cd /etc/init.d/
~# ll
-rwxr-xr-x  1 root root 1098 Nov  4 09:45 redis_6379*
~# service redis_6379 restart
Please use start or stop as first argument
~# service redis_6379 stop
Stopping ...
Redis stopped
~# service redis_6379 start
Starting Redis server...