一、Redis的持久化方案
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。
Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。
【RDB方式】
快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。
在redis.conf配置文件中配置:
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。
问题总结:
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。
【AOF方式】
把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可。
默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof
【对比】
RDB:可以设置间隔多长时间保存一次(redis不用任何配置默认的持久化方案)
优点:让redis的数据存取速度变快
缺点:服务器断电时会丢失部分数据(数据的完整性得不到保障)
AOF:可以设置实时保存
优点:持久化良好,能够保障数据的完整性
缺点:大大降低了redis系统的存取速度
二、Redis集群的搭建
2.1 redis-cluster架构图
redis-cluster投票:容错
:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
fail是通过集群中超过半数的节点检测失效时才生效.
redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,
然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
2.2 Redis集群的搭建
Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。Redis集群至少需要6台服务器。
搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006
【集群搭建环境】
- 使用ruby脚本搭建集群。需要ruby的运行环境。安装ruby:
yum install ruby
yum install rubygems
- 安装ruby脚本运行使用的包。下载
redis-3.0.0.gem,并上传到Linux系统中,然后执行命令:
gem install redis-3.0.0.gem
【搭建步骤】
需要6个redis实例。运行在不同的端口7001-7006
第一步:创建6个redis实例(redis/bin就是一个实例)
- 创建一个文件夹(redis-cluster),里面装着6个redis实例
- 将redis/bin(redis.conf放在bin目录下作为后端启动的配置文件)复制6份到redis-cluster文件夹中,并命名redis01-redis06
cp redis/bin/ redis-cluster/redis01 -r
第二步:修改6个redis节点的redis.conf,将端口号分别改为7001-7006,还需要把配置文件中的cluster-enabled yes前的注释去掉
第三步:将redis
源文件src
目录下的redis-trib.rb
文件复制到redis-cluster文件夹中
第四步:编写集群启动和停止脚本,放在redis-cluster目录下
- 启动脚本start-all.sh(使用vim start-all.sh命令创建文件并直接进入编辑状态)
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
注意:新建的start-all.sh默认没有执行权限(x为可执行)
赋予用户可执行的权限(chmod u+x start-all.sh)
- 停止脚本stop-all.sh
./redis01/redis-cli -p 7001 shutdown
./redis02/redis-cli -p 7002 shutdown
./redis03/redis-cli -p 7003 shutdown
./redis04/redis-cli -p 7004 shutdown
./redis05/redis-cli -p 7005 shutdown
./redis06/redis-cli -p 7006 shutdown
第五步:执行start-all.sh脚本,启动每个redis实例
第六步:使用ruby脚本搭建集群
./redis-trib.rb create --replicas 1 192.168.25.129:7001 192.168.25.129:7002 192.168.25.129:7003 192.168.25.129:7004 192.168.25.129:7005 192.168.25.129:7006
2.3 集群的使用方法
使用redis提供的客户端,连接集群中任一节点即可
[root@localhost redis-cluster]# redis01/redis-cli -p 7002 -c
-c:代表连接的是redis集群