redis持久化机制以及集群操作

redis提供了两种持久化策略

RDB

    rdb的持久化策略:按照规则,定时将内存中的数据同步到磁盘当中

    snapshot

        redis在指定的情况下会触发快照

        1.自己配置的快照规则

        2.手动执行 save或者 bgsave方法

           save 执行内存的数据同步到磁盘上的操作,这个操作会阻塞客户端的请求

            bgsave  在后台异步执行快照操作,这个操作不会阻塞客户端的请求

        3.执行flushall的时候

            清除内存中的数据,只要快照规则不为空,也就是第一个规则存在,那么redis会执行快照

        4.执行复制的时候

             执行复制的时候

        快照文件的存在位置在   redis的bin目录下,里面有一个 dump.rdb文件

            快照的实现原理:redis会使用fork函数复制一份当前进程的副本(子进程),fork进程负责把内存的数据同步到磁盘的临时文件,父进程继续处理客户端请求

            redis的优缺点:

                1.redis会出现数据丢失的情况,执行快照到下一次快照的过程中可能丢失数据

                2.可以最大化redis的性能。

            

AOF

    AOF策略,每次执行命令后,把命令本身记录下来

    aof会把redis执行的每一条命令追加到磁盘当中。

   

两种持久化策略可以同时使用,也可以只使用其中的一种,如果同时使用的话,那么redis重启时,会优先使用AOF文件来还原数据。


默认在redis当中aof是没有开启的,我们可以在   redis.conf 文件中开启aof持久化策略,找到 appendonly yes  这样就开启了持久化策略

在redis中执行set命令之后可以看到在redis的bin目录下生成了一个appendonly.aof文件,这个文件中记录了 aof持久化的数据

redis持久化机制以及集群操作_第1张图片

修改redis.conf中的 appendonly yes,重启后执行对数据的变更命令,会在bin目录下生成对应的aof文件,aof文件中会记录所有的操作命令,如下两个参数可以去对aof文件做优化。

在redis.conf文件中还有这样两个属性

auto-aof-rewrite-percentage 100    表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写,如果之前没有重写过,以启动时aof文件大小为准

auto-aof-rewrite-min-size  64mb   限制允许重写最小aof文件大小,也就是文件大小小于64m的时候不需要进行优化。

aof重写的原理

    aof重写的整个过程是安全的,

    同步磁盘数据,redis每次更改数据的时候,aof机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实时的写入到硬盘,而是进入到硬盘的缓存,再通过硬盘缓存机制刷新保存到文件。

appendfsync always    每次执行写入都会进行同步,这个是最安全但是效率比较低的方式

appendfsync everysec    每一秒执行一次

appendfsync no  不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式


aof文件损坏之后如何修复

通过  redis-check-aof-fix   命令对原来的文件进行修复


redis的集群

复制 (master、slave)

哨兵机制

集群



安装redis,然后make,make install PREFIX=/usr/local/redis  然后把安装目录下的  redis.conf  文件拷贝到  启动目录下

redis集群操作,首先先找到    redis.conf目录下的    

bind 127.0.0.1  注释掉

daemonize属性设置成 yes

protected-mode no    

把改好的redis复制多份到其他的机器上

然后选择一台机器作为主master的redis节点,其他的作为 slave的节点,在slave的节点的 redis.conf中配置下面的信息。

找到  slaveof  ip port    给这个属性配置上相应的  master节点的  ip和port(默认6379)

然后把三台服务器都重新启动

使用   redis-cli   命令进入到redis的控制台执行  info replication命令可以看到下面的信息:

redis持久化机制以及集群操作_第2张图片

代表这台机器是redis中的master机器

在master中set一条值  set aaa xxx

然后可以在slave这个节点中获取到 aaa的实际值  get aaa

但是如果在从服务器上set值的话会报错 



实现原理

    slave第一次或者重连接到master上以后,会向master发送一个 SYNC的命令

    master收到 SYNC的时候会做两件事情,

        a)执行 bgsave (rdb快照文件)

        b)master会把新收到的数据修改命令存入到缓冲区,


可以通过  replconf listening-port 6379 这个命令来检测 master上发出的指令

    redis持久化机制以及集群操作_第3张图片

为了不使slave读取的时候出现脏数据

需要在 slave那端的  redis.conf文件中更改上面的配置

slave-server-stale-data yes     这个配置的含义是必须要完成一个master的同步之后才能去做接下来的操作,否则,读取都会报错。

slave中无法对数据进行写的操作,没有办法对master进行动态选举


复制的方式

   1.基于rdb文件的复制

    2.无硬盘复制

    3.增量复制


redis中的哨兵机制

    通过哨兵机制去监控服务器master的状态。

    

使用redis当中的哨兵机制

首先把 redis安装包下的seentinel.conf 文件拷贝到运行目录下的 sentinel.conf下。

该文件中的port 参数表示的是哨兵监控的端口号,

有一个这样的配置  sentinel monitor mymaster 127.0.0.1 6379 2   ,后面的三个参数表示的意思是监控的主机、监控的端口号、控制有多少投票数(如果三个哨兵集群的话最少两个哨兵投票同意才生效)

sentinel down-after-milliseconds mymaster 30000,这个配置表示的意思是 30秒内如果没有连上则表示已经宕机

redis的哨兵启动

 ./redis-sentinel ../sentinel.conf

启动之后也同样出现了启动redis的界面

redis持久化机制以及集群操作_第4张图片

然后这里做一个 让主机 ./redis-cli shutdown  这样的操作,可以看到哨兵的控制台会进行 master的重新选举操作。

重新投票选举出来新的 master机器,


redis中的集群原理

slot槽的概念,在redis当中一共有 16384个槽

根据 key的 CRC16算法,得到的结果再对 16384进行取模,假如有三个节点 16384/3 = 5000多个槽

node1 0  5460

node2 5461  10922

node3 10923 16383

当出现第四个节点的时候,就会出现节点数据的重新分配,涉及到数据的迁移,会从每个节点拿个数据到node4节点








你可能感兴趣的:(redis持久化机制以及集群操作)