redis大型攻略!
# cd /usr/local/src/# wget -c http://download.redis.io/releases/redis-2.8.9.tar.gz
# tar xf redis-2.8.9.tar.gz
# cd redis-2.8.9 //在redis-2.8.9 目录下面有个README文档,有兴趣的,可以去看看!
# make //如果出现如下错误信息,说明你的机器上没有安装gcc gcc-c++ tcl
make: gcc:命令未找到
/bin/sh: cc: command not found
# yum install -y gcc gcc-c++ tcl //yum完成后,再次make,就不会报错了
# make //竟然又出现错误了
cd src && make all
make: Entering directory `/usr/local/src/redis-2.8.9/src'
CC adlist.o
在包含自 adlist.c:34 的文件中:
zmalloc.h:50:31: 错误:jemalloc/jemalloc.h:没有那个文件或目录
zmalloc.h:55:2: 错误:#error "Newer version of jemalloc required"
make: *** 错误 1
make: Leaving directory `/usr/local/src/redis-2.8.9/src'
make: *** 错误 2 //这个错误该怎么解决呢?很简单,把redis目录删除,重新tar xf redis-2.8.9.tar.gz,再次进入新的redis目录下,make,就不会报错了
# rm -rf redis-2.8.9
# tar xf redis-2.8.9.tar.gz
# cd redis-2.8.9
# make
Hint: To run 'make test' is a good idea ;)
make: Leaving directory `/usr/local/src/redis-2.8.9/src'
# echo $? //echo $? 返回状态码是0,make基本上就没问题了
0
# make test //不放心,就用make test检测一下。但是在: unit/obuf-limits (68 seconds)这里,会停止大概几分钟,并不是卡住了,请耐心等待
\o/ All tests passed without errors! //经过几分钟的等待,出现这个,就表示没有错误了
PS:其实在make那步,可以用make PREFIX=/usr/local/redis/ install意思是,我们可以选择redis的安装路径,然后在make test。
# mkdir -pv /usr/local/redis/{bin,conf}
mkdir: 已创建目录 "/usr/local/redis"
mkdir: 已创建目录 "/usr/local/redis/bin"
mkdir: 已创建目录 "/usr/local/redis/conf"
# cd src/ //进入src目录下,因为我们在make时,会产生5个文件,分别是: redis-benchmarkredis-check-aof redis-check-dump redis-cli redis-server
# pwd //后面会解释这几个文件作用
/usr/local/src/redis-2.8.9/src
# cp redis-benchmark redis-check-aof redis-check-dump redis-sentinel redis-server redis-cli /usr/local/redis/bin/
# cd ../ && cp redis.conf /usr/local/redis/conf/ //从redis-2.8.9目录下拷贝redis配置文件redis.conf到/usr/local/redis/conf/我们刚才建立的conf目录下
#vi /usr/local/redis/conf/redis.conf //注意,我们修改的redis.conf文件是在/usr/local/redis/conf/目录下的,而不是redis-2.8.9目录下的,切记!
将配置文本中的daemonize yes 由no改为yes,启动守护进程。 //redis.conf配置文本中,我们可以定义很多东西,比如redis的日志及日志存放的路径,redis产生的数据名称,默认是dump.rdb,我们可以去修改它的名字,它的存放路径等等
修改完毕后,保存退出,启动redis。
# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf //每次都写这么长长的一串,很不方便,我们将redis添加到环境变量中去,我们就可以直接redis-server了。redis启动,要带上redis.conf的配置文件
# echo "PATH=$PATH:/usr/local/redis/bin/" >> /etc/profile
# ./etc/profile
为redis提供启动脚本
# cp/usr/local/src/redis-2.8.9/utils/redis_init_script/etc/init.d/redis
修改文件
在第二行添加 # chkconfig: 2345 80 90注意:前面的#带上
以下内容根据实际情况做修改
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/usr/local/redis/var/redis.pid
CONF="/usr/local/redis/etc/redis.conf"
# chkconfig --add redis
# service redis start
# redis-cli
127.0.0.1:6379> set 1 2
OK
127.0.0.1:6379> get 1
"2"
127.0.0.1:6379> quit
# //至此,redis安装完成了
二:redis主从(master/slave)
Redis的master/slave数据复制方式可以是一主一从或者是一主多从的方式,Redis在master是非阻塞模式,也就是说在slave执行数据同步的时候master是可以接受客户端的请求的,并不影响同步数据的一致性,然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询。
Redis的 master/slave 模式下,master提供数据读写服务,而slave只提供读服务。
Redis的master/slave的配置方式是在slave主机的Redis目录下的redis.conf配置文件中添加:
安装redis(从:192.168.210.101)
# wget -c http://download.redis.io/releases/redis-2.8.9.tar.gz
# yum -y install gcc gcc-c++ tcl
# tar xf redis-2.8.9.tar.gz
# cd redis-2.8.9
# make PREFIX=/usr/local/redis install //注意:我在这里,选择安装路径了,完成后,会在/usr/local/redis/下面产生一个bin目录。其中bin目录中就有了5个文件。这就不需要我们去拷贝了。
# make test
# mkdir -pv /usr/local/redis/{log,conf} //一个是存放log日志,另一个是存放配置文件的
# mkdir -pv /data/redis //这里是存放数据的,就是那个dump.rdb
# cd /usr/local/redis/conf
# cp /usr/local/src/redis-2.8.9/redis.conf .
# vi redis.conf
在从服务器上,我们修改redis.conf这几个地方:
daemonize yes //由no改成yes
logfile "" //日志存放路径,这里等写上redis6379.log,这个文档会在/usr/local/redis/log/下自动生成,日志名字可以随便写!改成 logfile "/usr/local/redis/log/redis6379.log"
slaveof //slaveof 主服务器ip地址 端口,改成 slaveof 192.168.210.102 6379
dir ./ //改成dir /data/redis,我们前面创建的一个专门用来放数据的
# echo "PATH=$PATH:/usr/local/redis/bin/" >>/etc/profile
# . /etc/profile
# redis-server /usr/local/redis/conf/redis.conf //启动脚本,我就不写了
# redis-cli -p 6379 //如果你以后遇到,redis的默认端口不是6379,那么带上端口启动
127.0.0.1:6379> get 1
"null" //为什么会是null呢?明明在主的redis上面,我们set 1 2 ,那么,在从服务器上面的redis,我们去get 1,应该会得到2,我们去看看日志!
# vim ../log/redis6379.log
日志显示:
30 Jul 19:37:29.147 # Server started, Redis version 2.8.9
30 Jul 19:37:29.147 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sys ctl vm.overcommit_memory=1' for this to take effect.
30 Jul 19:37:29.147 * The server is now ready to accept connections on port 6379
30 Jul 19:37:29.148 * Connecting to MASTER 192.168.210.102:6379
30 Jul 19:37:29.148 * MASTERSLAVE sync started
30 Jul 19:37:29.149 * Non blocking connect for SYNC fired the event.
30 Jul 19:37:29.150 * Master replied to PING, replication can continue...
30 Jul 19:37:29.150 * Partial resynchronization not possible (no cached master)
很明显,我们的防火墙没有关闭,但是在实际,线上服务器上,你可不能直接用iptables -F。。。去把redis端口放开即可!
# iptables -F //这里就是直接清空了,因为是虚拟机
# /etc/init.d/iptables save //使得上一步生效,主服务器上,也要关闭防火墙
# redis-cli -p 6379
127.0.0.1:6379> get 1
"2"
127.0.0.1:6379> info //get得到了2了,主从同步了!也可以使用info测试
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
三:redis在线升级 PS:把服务器上的redis给升级到redis-3.0.3
# redis-server -v
Redis server v=2.8.9 sha=00000000:0 malloc=jemalloc-3.2.0 bits=64 build=68789c703e196441//查看版本
redis默认有持久化的特点,持久化是由2个方式起作用的,一个是快照方式,一个是日志追加方式。
快照方式:
这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名是dump.rdb。客户端也可以使用bgsave或者save命令通知redis做一次快照的持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有用户的请求的。这种方式会阻塞所有用户的请求。每次快照持久化都是将内存中的数据完整的写入到硬盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较多,必然会引起大量的磁盘IO,可能会严重影响性能。
注意:由于快照方式是在一定的间隔时间去做一次,所以如果redis意外宕机的话,就会丢失最后一次快照后的所有数据的修改。
日志追加方式:(Append-only file)
aof比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。(原理性比较强,不对请指出来!)
# redis-cli
127.0.0.1:6379> get 1
"2"
127.0.0.1:6379> quit
# cd /usr/local/src
#wget -c http://download.redis.io/releases/redis-3.0.3.tar.gz
# tar xf redis-3.0.3.tar.gz
# cd redis-3.0.3
# mkae
# cd src/
# cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin///覆盖掉,关于这步,我也不太肯定,到底会不会对线上的redis服务有什么影响,有会的,指点一下呗!
# redis-cli
127.0.0.1:6379> get 1
"2"
127.0.0.1:6379> quit
# redis-server -v
Redis server v=3.0.3 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=398767c84084f77f
# pwd
/usr/local/src/redis-3.0.3/src/redis-3.0.3/src
# //即使主从上redis的版本变了不一样了,可是依旧能够主从同步!
四:redis多实例
这次,我们在从上做实验!从上的版本目前是# redis-server -v
Redis server v=2.8.9 sha=00000000:0 malloc=jemalloc-3.2.0 bits=64 build=68789c703e196441
# cd /usr/local/redis/
# ls
binconflog
# mkdir -pv /home/test/redis
mkdir: 已创建目录 "/home/test"
mkdir: 已创建目录 "/home/test/redis"
# mkdir -pv /home/test/redis/{log,bin,conf,data}
mkdir: 已创建目录 "/home/test/redis/log"
mkdir: 已创建目录 "/home/test/redis/bin"
mkdir: 已创建目录 "/home/test/redis/conf"
mkdir: 已创建目录 "/home/test/redis/data"
# cp /usr/local/redis/conf/redis.conf /home/test/redis/conf/redis6380.conf//拷配置文件,名字注意区别。
# vim !$
修改配置文件了,注意端口改成6380,日志的路径,数据的路径等等。
# redis-server /home/test/redis/conf/redis6380.conf //启动6380这个实例
# redis-cli
127.0.0.1:6379> quit
# redis-cli -p 6380 //与redis交互要带上端口,否则就是默认的6379
127.0.0.1:6380> get 1
(nil)
127.0.0.1:6380> get 3
(nil)
127.0.0.1:6380> quit //新的数据,没有受到别的redis的影响!
#
总结一下:所谓的单主机多redis实例,就是一个非常方便的redis多用技术, 他的实现方法也是非常简答,就是把配置文件拷贝一份,到你指定的地方,改一改,,然后就去用redis-server ,带上实例的配置文件,启动就ok了!
五:redis常见的操作
就初级运维而言,学会了安装redis,主从,升级,实例,和对其原理性的知识懂得一点,就可以了。但是,平时,工作当中,redis操作,我们也要会使用一些简单的。
redis-server 带上配置文件,这就是启动redis的命令
redis-cli 带上端口号, 在linux上与redis实现交互
redis-cli shutdown 关闭redsi,redis进程没有了
页:
[1]