安装
Redis是REmote DIctionary Server(远程字典服务器)的缩写。一个开源的、高性能的、基于键值对的缓存与存储系统,目前redis稳定版是5.0.8,下载安装:
1 | cd /usr/local/src/ |
在实际安装中,可以使用 make test 命令来测试redis是否编译正常。安装完成后,在/usr/local/redis/bin/目录下面有以下文件
1 | [root@node2 redis-stable]# ll /usr/local/redis/bin/ |
配置
单机版
如果在一台机器上面运行一个redis,是可以使用以下方法。
redis.conf修改配置如下:
1 | # /usr/local/src/redis-stable/在目录下运行: |
dir默认值为dir ./,会保存到/usr/local/redis/目录下。
启动redis以及验证服务:
1 | [root@node2 etc]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf |
使用systemctl来启动服务。参考:https://gist.github.com/hackedunit/a53f0b5376b3772d278078f686b04d38 ,注意type的区别。
1 | [Unit] |
这样就可以启动服务了,设置一下自启:
1 | systemctl daemon-reload |
注意:
- 如果redis设置了密码,就不能stop了,需要加上密码才能正常stop。或者使用killproc方式来停止。
- centos6系统的话,可以直接复制
utils/redis_init_script这个文件到/etc/init.d下,然后修改一些参数即可使用。
多实例版
如果要在一台机器上面运行多个实例,那使用官方提供的安装配置脚本会比较方便。
在运行完make install之后,不需要去复制配置,直接运行 ./utils/install_server.sh 会自动生成一份redis配置文件,redis启动脚本,配置好日志以及数据路径等,如下:
1 | #生成启动脚本 |
或者也可以交互式运行生成:
1 | [root@node2 ~]# /usr/local/src/redis-stable/utils |
这样生成的启动的配置文件为:
1 |
|
配置文件
redis.conf里面的配置项 https://www.cnblogs.com/linuxk/p/9474928.html ,这一篇文章写得很详细了。以下是我认为比较重要的配置解释:
持久化数据
redis持久化数据有2种方法,AOF以及RDB。
RDB
RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。
对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。
相关的配置有:
1 | # 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 |
主要定义了dump.rdb是在保存在哪个目录下面,以及需要满足什么条件会再次备份。
AOF
AOF,英文是Append Only File,即只允许追加不允许改写的文件。如前面介绍的,AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,就这么简单。
默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。相关的配置有:
1 | appendonly no #yes表示开启aof持久化。指定是否在每次更新操作后进行日志记录, |
持久化套路
根据 https://www.cnblogs.com/rjzheng/p/10990713.html 的经验,一般我们在生产上采用的持久化策略为
- (1)master关闭持久化
- (2)slave开RDB即可,必要的时候AOF和RDB都开启
Reids6种淘汰策略
- noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。大多数写命令都会导致占用更多的内存(有极少数会例外。
- allkeys-lru:所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
- volatile-lru:只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
- allkeys-random:所有key通用; 随机删除一部分 key。
- volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
- volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。
主从配置
使用上文配置好的2个redis实例,即redis_6379以及redis_6380,进行主从的配置。
我们将redis_6379配置为主,redis_6380配置为备。默认情况下,redis就是主的角色,所以redis_6379不需要修改配置。在redis_6380修改配置:
1 | replicaof 127.0.0.1 6379 #配置为master的从,如果master上有密码配置,还需要增加下面一项密码配置 |
再重启:/etc/init.d/redis_6380 restart,进入redis,使用info replication查看状态:
1 | [root@node2 ~]# redis-cli -p 6380 |
role为slave,master_link_status是up状态的。也可以正常获取到key,说明主从已经配置好了。很简单,redis主从和mysql主从不一样,redis主从不用事先同步数据,它会自动同步过去。
建立复制的配置方式有三种:
- 在
redis.conf文件中配置replicaof选项,然后指定该配置文件启动Redis生效。 - 在
redis-server启动命令后加上--replicaof启动生效。即./redis-server /etc/redis/6379.conf --replicaof 127.0.0.1 8888 - 直接使用
replicaof命令在从节点执行生效。
如果想要复制断开,在从节点执行命令REPLICAOF on one来断开于主节点的复制关系。
1 | 127.0.0.1:6380> REPLICAOF no one |
但是主从是有问题的,当主有异常时,redis没有机制将从升级为主,需要再进行配置才能支持。有2个方法,一是sentinel模式,二是cluster模式。
Redis哨兵模式
Sentinel简介
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:
- 监控:Sentinel会不断的检查主服务器和从服务器是否正常运行。
- 通知:当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
- 自动故障转移:当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
- 配置提供者:在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求 。如下图:

Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程还是蛮复杂的。
- 主观失效:
SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态. - 客观失效:
ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
Sentinel部署
准备工作
分别有3个Sentinel节点,1个主节点,2个从节点组成一个Redis Sentinel。
| role | IP | port |
|---|---|---|
| master | 127.0.0.1 | 6379 |
| slave1 | 127.0.0.1 | 6380 |
| slave2 | 127.0.0.1 | 6381 |
| Sentinel1 | 127.0.0.1 | 26379 |
| Sentinel2 | 127.0.0.1 | 26380 |
| Sentinel3 | 127.0.0.1 | 26381 |
使用多实例的方法,配置好主从模式。在主上面运行info replication,查看slave信息:
1 | [root@node2 ~]# redis-cli -p 6379 info replication |grep slave |
Sentinel配置讲解
1 | # 端口 |
启动Sentinel
先进入编译目录,然后运行以下命令:
1 | mkdir /usr/local/redis/sentinel/{log,pidfile,dir,etc} -p |
查看进程,保证进程都有正常启动。
1 | [root@node2 log]# ps aux |grep redis-sentinel |
查看sentinel信息
登陆sentinel,来查看info信息,可以看到,有启动了一个master0名为mymaster,从节点有2个。
1 | [root@node2 log]# redis-cli -p 26379 info sentinel |
可以使用 sentinel master mymaster 查看更详细的信息:
1 | #输出被监控的主节点的状态信息 |
sentinel切换
先把主redis停止掉,/etc/init.d/redis_6379 stop,稍等一会,这时可以看到日志:
1 | [root@node2 ~]# tailf /usr/local/redis/sentinel/log/sentinel_26379.log |
可以看到自切到6380上面了。登陆redis_6380查看信息:
1 | [root@node2 ~]# redis-cli -p 6380 info replication |head -n4 |
如果把redis_6379再启动会发现什么事情呢?运行 /etc/init.d/redis_6379 start 之后,可以发现,redis_6379变成了从。
1 | [root@node2 ~]# redis-cli -p 6380 info replication |head -n4 |
本小节主要参考文档:
Redis集群
Redis Cluster简介
Redis Cluster为Redis官方提供的一种分布式集群解决方案。它支持在线节点增加和减少。 集群中的节点角色可能是主,也可能是从,但需要保证每个主节点都要有对应的从节点, 这样保证了其高可用。
Redis Cluster采用了分布式系统的分片(分区)的思路,每个主节点为一个分片,这样也就意味着 存储的数据是分散在所有分片中的。当增加节点或删除主节点时,原存储在某个主节点中的数据 会自动再次分配到其他主节点。
如下图,各节点间是相互通信的,通信端口为各节点Redis服务端口+10000,这个端口是固定的,所以注意防火墙设置, 节点之间通过二进制协议通信,这样的目的是减少带宽消耗。
在Redis Cluster中有一个概念slot,我们翻译为槽。Slot数量是固定的,为16384个。这些slot会均匀地分布到各个 节点上。另外Redis的键和值会根据hash算法存储在对应的slot中。简单讲,对于一个键值对,存的时候在哪里是通过 hash算法算出来的,那么取得时候也会算一下,知道值在哪个slot上。根据slot编号再到对应的节点上去取。
Redis Cluster无法保证数据的强一致性,这是因为当数据存储时,只要在主节点上存好了,就会告诉客户端存好了, 如果等所有从节点上都同步完再跟客户端确认,那么会有很大的延迟,这个对于客户端来讲是无法容忍的。所以, 最终Redis Cluster只好放弃了数据强一致性,而把性能放在了首位。
Redis Cluster搭建
准备节点
Redis 集群一般由多个节点组成,节点数量为6个才能保证组成完整高可用的集群。下面给出一个节点的配置,其他的节点和该节点只是端口不同。整体规划如下:
| role | IP | slave信息 |
|---|---|---|
| master01 | 127.0.0.1:6379 | 127.0.0.1:6382 |
| master02 | 127.0.0.1:6380 | 127.0.0.1:6383 |
| master03 | 127.0.0.1:6381 | 127.0.0.1:6384 |
要启用集群,需要开启以下redis配置:
1 | cluster-enabled yes #开启集群 |
按多实例版开启6个节点:
1 | cd /usr/local/src/redis-stable/ |
有日志文件可得,节点已经启动成功。这个日志文件是Redis服务器普通的日志文件,在集群模式下,第一次也会自动创建一个日志文件,由配置文件cluster-config-file指定文件。
集群配置文件的作用:当集群内节点发生信息变化时,如添加节点、节点下线、故障转移等。节点会自动保存集群的状态到配置文件中。该配置文件由Redis自行维护,不要手动修改,防止节点重启时产生集群信息错乱。
可以查看日志以及使用 CLUSTER NODES 查看现在的状态:
1 | [root@node2 redis]# cat logs/redis_6379.log |tail -n 3 |
创建集群
下面在任一节点上执行以下构建集群的命令,将这里面的6个节点组建集群模式,--cluster-replicas 1表示每个主对应一个从。使用以下命令会自动实现一主对应一从。
1 | [root@node2 redis]# redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1 |
到此提示,集群创建成功!!!!!
查看集群状态
可以使用 CLUSTER INFO 以及 CLUSTER NODES 查看集群的一些信息。
1 | [root@node2 redis]# redis-cli -p 6381 |
还可以使用 redis-cli --cluster check 127.0.0.1:6379 查看KEY、slot分布:
1 | [root@node2 redis]# redis-cli --cluster check 127.0.0.1:6379 |
测试集群
随意连接一个redis,redis-cli -p 6381 -c 添加数据进行测试,可以看到KEY是分别保存到不同的redis主上面。
1 | [root@node2 redis]# redis-cli -p 6381 -c |
有关集群节点的添加、删除等操作,请查看参考文档:
数据库导出与导入
使用redis-dump命令来导出,此命令需要安装
1 | [root@xmxyk rvm]# redis-dump -u :123456@192.168.1.55:3389 >/root/test.json |
使用redis-load进行导入
1 | [root@xmxyk rvm]# < /root/test.json redis-load -u :123456@192.168.1.55:3389 |
- 超强、超详细Redis数据库入门教程
- redis中文文档:http://www.redis.net.cn/
- 分布式缓存Redis之bitmap、setbit:https://blog.csdn.net/u011489043/article/details/78990162
- Redis-Dump安装及使用 https://www.jianshu.com/p/19b5e7b3bffb
- Redis 学习笔记系列
- 深入剖析Redis系列
- 分布式之redis复习精讲
- 10分钟彻底理解Redis持久化和主从复制
- 听说Redis都会遇到并发、雪崩等难题?我用10分钟就解决了
- Redis Sentinel 架构搭建、日志分析以及运维注意事项
- 深入理解Redis高可用方案-Sentinel