redis安装部署维护备份

redis安装部署维护备份

环境: Centos 6.5

一、安装

下载redis最新版源码包;
如: wget http://download.redis.io/releases/redis-2.6.16.tar.gz
解压
tar zxvf redis-2.6.16.tar.gz
编译

进入到解压开的目录,执行:make && make install

在make成功以后,会在src目录下多出一些可执行文件:redis-server,redis-cli等等。

用cp命令复制到usr目录下运行。

cp redis-server /usr/local/bin/
cp redis-cli /usr/local/bin/

然后新建目录,存放配置文件

mkdir /etc/redis
mkdir /var/redis
mkdir /var/redis/log
mkdir /var/redis/run
mkdir /var/redis/6379

在redis解压根目录中找到配置文件模板,复制到如下位置。

cp redis.conf /etc/redis/6379.conf

通过vim命令修改

daemonize yes
pidfile /var/redis/run/redis_6379.pid
logfile /var/redis/log/redis_6379.log
dir /var/redis/6379

最后运行redis:

$ redis-server /etc/redis/6379.conf

添加到系统服务并配置开机启动

进入到redis源码的utils目录,执行 ./install_server.sh ,所有选项默认即可。
修改 /etc/init.d/redis_6379 为 redis : mv /etc/init.d/redis_6379 /etc/init.d/redis

添加到系统服务:chkconfig --add redis
开机启动:chkconfig redis on

这样执行 service redis start|restart|stop 就可以控制redis的启动、重启、停止了。

注:此配置在centos 6.5 上用的时候有点问题,用下面则可

--redis conf begin-- 
#!/bin/sh
#chkconfig: 345 86 14
#description: Startup and shutdown script for Redis
PROGDIR=/usr/redis #安装路径
PROGNAME=redis-server
DAEMON=$PROGDIR/$PROGNAME
CONFIG=/usr/redis.conf
PIDFILE=/var/run/redis.pid
DESC="redis daemon"
SCRIPTNAME=/etc/rc.d/init.d/redisd
start()
{
         if test -x $DAEMON
         then
        echo -e "Starting $DESC: $PROGNAME"
                   if $DAEMON $CONFIG
                   then
                            echo -e "OK"
                   else
                            echo -e "failed"
                   fi
         else
                   echo -e "Couldn't find Redis Server ($DAEMON)"
         fi
}
 
stop()
{
         if test -e $PIDFILE
         then
                   echo -e "Stopping $DESC: $PROGNAME"
                   if kill `cat $PIDFILE`
                   then
                            echo -e "OK"
                   else
                            echo -e "failed"
                   fi
         else
                   echo -e "No Redis Server ($DAEMON) running"
         fi
}
 
restart()
{
    echo -e "Restarting $DESC: $PROGNAME"
    stop
         start
}
 
list()
{
         ps aux | grep $PROGNAME
}
 
case $1 in
         start)
                   start
        ;;
         stop)
        stop
        ;;
         restart)
        restart
        ;;
         list)
        list
        ;;
 
         *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|list}" >&2
        exit 1
        ;;
esac
exit 0


--conf end--

安装完服务,redis自动启动,可以用ps命令查看到相关信息:

[root@XXXX utils]# ps -ef | grep redis
root      4554     1  0 10:55 ?        00:00:02 /usr/local/bin/redis-server /etc/redis/6379.conf
root      4564  2808  0 10:59 pts/0    00:00:00 grep redis

2、手动启动关闭服务
[root@xsf003 utils]# /etc/init.d/redis_6379 stop   #关闭
[root@xsf003 utils]# /etc/init.d/redis_6379 start  #启动

--- other end---

注意,默认复制过去的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新开一个终端。修改为yes则为后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修改,默认log信息定向到stdout.

redis.conf的主要配置参数的意义

daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)


二、监控及配置

./redis-cli 进入到Redis命令行, 直接输入:INFO命令即可查看Redis服务器的所有运行信息。
以下是几个常用的命令:

DBSIZE 返回当前打开的数据库中Keys的数量。
FLUSHALL 清空当前服务器管理的数据库中的所有Keys,不仅限于当前打开的数据库。
FLUSHDB 清空当前数据库中的所有Keys。
SAVE 设置RDB持久化模式的保存策略。
SHUTDOWN 停止所有的客户端,同时以阻塞的方式执行内存数据持久化。
SLOWLOG GET 10 查看最新10条日志记录。
动态修改参数,也就是 redis.conf 中的参数,在命令行直接修改的好处是不需要重启Redis服务参数即可生效。注意并不是所有的配置参数都会生效,查看所有可以动态修改的参数执行命令:CONFIG GET * 查看。

得到配置参数:CONFIG GET parameter
注意在命令中不能使用数量缩写格式,如GB、KB等,只能使用表示字节数量的整数值。
设置配置参数:CONFIG SET parameter value

如果想在一个命令中设置多个同类型参数,如redis.conf配置文件中的save参数:save 900 1/save 300 10。在该命令中我们可以将多个key/value用双引号括起,并用空格符隔开,如:config set save "900 1 300 10"。

三、持久化策略

Redis默认的持久化文件放在:/var/lib/redis/6379,可在配置文件中修改。有如下几种持久化策略:

RDB持久化:
该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
AOF持久化:
该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
无持久化:
我们可以通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了。
同时应用AOF和RDB。

1、RDB策略:

将整个Redis数据库整体备份到一个文件,此文件以二进制格式保存,所以恢复会非常快,RDB采用的是每隔几秒备份一次,所以如果意外宕机,会有几秒的数据丢失。另外Redis是采用fork出子线程执行备份操作,这回导致Redis在备份时会变慢。
Redis默认采用RDB持久化策略:

save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10            #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000          #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
RDB备份过程:

Redis先fork子进程。
子进程将快照数据写入到临时RDB文件中。
当子进程完成数据写入操作后,再用临时文件替换老的文件。
修复坏损的AOF文件:执行命令:redis-check-aof --fix

2、AOF策略:

将所有执行的命令备份到文件,恢复数据库时,会依次执行Redis命令,所以会恢复会比较慢且备份文件比RDB策略大。好处是数据不会丢失。
启用AOF策略:appendonly no改为appendonly yes
策略配置:

appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。

3、恢复:

直接把备份好的数据文件,放到Redis的持久化目录下,启动Redis即可。要保证文件名与Redis配置的备份文件名相同。
Redis备份有以下策略:

如果只配置AOF,重启时加载AOF文件恢复数据;
如果同时 配置了RBD和AOF,启动是只加载AOF文件恢复数据;
如果只配置RBD,启动是讲加载dump文件恢复数据。
四、虚拟内存
Redis是一个内存数据库,默认情况下会把所有的数据存到内存中,这样会导致数据量大了以后内存消耗非常大。Redis引入了虚拟内存来解决这个问题。
Redis的虚拟内存与操作系统的虚拟内存不是一码事,Redis采用自己实现的策略来进行内存与硬盘的数据交换,原因如下:

操作系统的虚拟内存是已4k页面为最小单位进行交换的,而Redis的内容大部分都远远小于4K,会导致资源的浪费。
Redis的集合对象类型如list,set可能存在与多个操作系统页面上。最终可能造成只有10%key被经常访问,但是所有操作系统页面都会被操作系统认为是活跃的。
Redis在写到硬盘上时会执行压缩,节省空间并减少操作系统的CPU、IO负担。
下面是vm相关配置:
vm-enabled yes                       #开启vm功能
vm-swap-file /tmp/redis.swap         #交换出来的value保存的文件路径
vm-max-memory 1000000                #redis使用的最大内存上限
vm-page-size 32                      #每个页面的大小32个字节
vm-pages 134217728                   #最多使用多少页面
vm-max-threads 4                     #用于执行value对象换入换出的工作线程数量
策略:

Redis为了保证Key的查找速度,永远不会将Key保存到磁盘,只会将Value保存;
当Redis内存占用达到vm-max-memory设置的值,就会选择最长时间不访问的对象,如果两个对象时间一样老,则会选择较大的对象;
和操作系统一样redis也是按页面来交换对象的。redis规定同一个页面只能保存一个对象;
最佳实践:

如果数据库中有大量的keys,其中每个key仅仅关联很小的value,那么这种场景就不是非常适合使用虚拟内存。
根据自己的应用场景,合理设置每个页面的大小vm-page-size ;

如果vm-max-threads设置为0,则会同步的执行,那么当某一客户端正在访问交换文件中的数据时,其它客户端如果再试图访问交换文件中的数据,该客户端的请求就将被挂起,直到之前的操作结束为止。

四.redis数据结构

redis 的作者antirez曾称其为一个数据结构服务器(data structures server),这是一个非常准确的表述,redis的所有功能就是将数据以其固有的几种结构保存,并提供给用户操作这几种结构的接口。我们可以想象我们在各种语言中的那些固有数据类型及其操作。

redis目前提供四种数据类型:string,list,setzset(sorted set)和Hash

  • string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
  • list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
  • set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
  • zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
  • Hash数据类型允许用户用Redis存储对象类型,Hash数据类型的一个重要优点是,当你存储的数据对象只有很少几个key值时,数据存储的内存消耗会很小.更多关于Hash数据类型的说明请见:http://code.google.com/p/redis/wiki/Hashes

在官网上给出了所有支持的接口列表,并副副附有详细的介绍,地址:

http://code.google.com/p/redis/wiki/CommandReference

另外,作者还提供了一个非常贴心的web命令行模拟页面,供初学者试用redis,地址:

http://try.redis-db.com/

五.redis主从配置

redis支持master-slave的主从配置,配置方法是在从机的配置文件中指定slaveof参数为主机的ip和port即可

六 数据备份与还原脚本

-----自动备份redis数据并压缩---
#!/bin/bash
filename=`date +%Y%m%d%H`
backredisFile=redis$filename.tar.gz
cd /home/redis/back
mkdir redis_dump
cd redis_dump
cp /usr/redis/data/* /home/redis/back/redis_dump -rf
cd ..
tar czf $backredisFile  redis_dump/
rm redis_dump -rf 

-----自动解压并还原redis数据---
#!/bin/bash
filename='20150330013'
backredisFile=redis$filename.tar.gz
cd /home/redis/back
tar zxvf $backredisFile
/etc/init.d/redisd stop
cp /home/redis/back/redis_dump/* /usr/redis/data -r -f
/etc/init.d/redisd start
rm redis_dump -rf 


十.redis起步(链接整理)

项目首页,下方是各种语言支持列表:

http://code.google.com/p/redis/

作者在wiki中给出了一个非常好的例子,以使我们可以快速上手,地址:

http://code.google.com/p/redis/wiki/TwitterAlikeExample

同时作者推荐的另一个教程,地址:

http://labs.alcacoop.it/doku.php?id=articles:redis_land

一个redis爱好者创建的相关问题讨论网站:

http://www.rediscookbook.org/

为什么使用 Redis及其产品定位

http://www.infoq.com/cn/articles/tq-why-choose-redis

Redis内存使用优化与存储

http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage


你可能感兴趣的:(数据与性能,redis,内存数据库)