redis提供了两种持久化策略node
RDB的持久化策略: 按照规则定时将内存的数据同步到磁盘redis
snapshot算法
redis在指定的状况下会触发快照数据库
save <seconds> <changes>缓存
默认配置规则安全
save 900 1 当在900秒内被更改的key的数量大于1的时候,就执行快照服务器
save 300 10架构
save 60 10000app
save: 执行内存的数据同步到磁盘的操做,这个操做会阻塞客户端的请求异步
bgsave: 在后台异步执行快照操做,这个操做不会阻塞客户端的请求
清除内存的全部数据,只要快照的规则不为空,也就是第一个规则存在。那么redis会执行快照
1:redis使用fork函数复制一份当前进程的副本(子进程)
2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
3:当子进程写入完全部数据后会用该临时文件替换旧的RDB文件,至此,一次快照操做完成。
注意:redis在进行快照的过程当中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任什么时候候RDB文件都是完整的。 这就使得咱们能够经过定时备份RDB文件来实现redis数据库的备份, RDB文件是通过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。
修改redis.conf中的appendonly yes ; 重启后执行对数据的变动命令, 会在bin目录下生成对应的.aof文件, aof文件中会记录全部的操做命令
以下两个参数能够去对aof文件作优化
auto-aof-rewrite-percentage 100 表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。若是以前没有重写过,以启动时aof文件大小为准
auto-aof-rewrite-min-size 64mb 限制容许重写最小aof文件大小,也就是文件大小小于64mb的时候,不须要进行优化
AOF能够将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会下降Redis的性能,但大部分状况下这个影响是可以接受的,另外使用较快的硬盘能够提升AOF的性能
默认状况下Redis没有开启AOF(append only file)方式的持久化,能够经过appendonly参数启用,在redis.conf中找到 appendonly yes
开启AOF持久化后每执行一条会更改Redis中的数据的命令后,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是经过dir参数设置的,默认的文件名是apendonly.aof. 能够在redis.conf中的属性 appendfilename appendonlyh.aof修改
Redis 能够在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操做是绝对安全的,由于 Redis 在建立新 AOF 文件的过程当中,会继续将命令追加到现有的 AOF 文件里面,即便重写过程当中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件建立完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操做。AOF 文件有序地保存了对数据库执行的全部写入操做, 这些写入操做以 Redis 协议的格式保存, 所以 AOF 文件的内容很是容易被人读懂, 对文件进行分析(parse)也很轻松
redis每次更改数据的时候, aof机制都会讲命令记录到aof文件,可是实际上因为操做系统的缓存机制,数据并无实时写入到硬盘,而是进入硬盘缓存。再经过硬盘缓存机制去刷新到保存到文件
# appendfsync always 每次执行写入都会进行同步 , 这个是最安全可是是效率比较低的方式
appendfsync everysec 每一秒执行
# appendfsync no 不主动进行同步操做,由操做系统去执行,这个是最快可是最不安全的方式
服务器可能在程序正在对 AOF 文件进行写入时停机, 若是停机形成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
当发生这种状况时, 能够用如下方法来修复出错的 AOF 文件:
redis-check-aof --fix
重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。
通常来讲,若是对数据的安全性要求很是高的话,应该同时使用两种持久化功能。若是能够承受数分钟之内的数据丢失,那么能够只使用 RDB 持久化。有不少用户都只使用 AOF 持久化, 但并不推荐这种方式: 由于定时生成 RDB 快照(snapshot)很是便于进行数据库备份, 而且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快 。
两种持久化策略能够同时使用,也可使用其中一种。若是同时使用的话, 那么Redis重启时,会优先使用AOF文件来还原数据
修改11.140和11.141的redis.conf文件,增长slaveof masterip masterport
增长这条slaveof 192.168.11.138 6379 就能将redis服务器设为slave从服务器
在客户端中输入info replication 查看服务器状态
a) 执行bgsave(rdb的快照文件)
b) master会把新收到的修改命令存入到缓冲区
缺点
没有办法对master进行动态选举
PSYNC master run id. offset
sentinel
根据key的hash值取模 服务器的数量 。
hash
Redis Cluster中,Sharding采用slot(槽)的概念,一共分红16384个槽,这有点儿相似前面讲的pre sharding思路。对于每一个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。Redis集群中的每一个node(节点)负责分摊这16384个slot中的一部分,也就是说,每一个slot都对应一个node负责处理。当动态添加或减小node节点时,须要将16384个槽作个再分配,槽中的键值也要迁移。固然,这一过程,在目前实现中,还处于半自动状态,须要人工介入。Redis集群,要保证16384个槽对应的node都正常工做,若是某个node发生故障,那它负责的slots也就失效,整个集群将不能工做。为了增长集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,若是主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。这很是相似服务器节点经过Sentinel监控架构成主从结构,只是Redis Cluster自己提供了故障转移容错的能力。
slot(槽)的概念,在redis集群中一共会有16384个槽,
根据key 的CRC16算法,获得的结果再对16384进行取模。 假若有3个节点
node1 0 5460
node2 5461 10922
node3 10923 16383
节点新增
node4 0-1364,5461-6826,10923-12287
删除节点
先将节点的数据移动到其余节点上,而后才能执行删除
3台虚拟机 redis 。可是我部署了9个节点 。每一台部署3个redis增长cpu的利用率
9台虚拟机单独拆分到9台服务器