• redis学习总结(二)


    redis 持久化 交换

    什么是持久化: 将数据从掉电易失的内存存放到能够永久存储的设备上

    redis持久化方式:RDB(Redis DB) hdfs:fsimage(产生持久化镜像文件,以二进制格式文件的形式存储,对应reids的RDB文件)

       AOF(AppendOnlyFile)  hdfs: edit logs 关闭   (以客户端向redis发送指令的形式来存储文件 ,对应redis的AOF文件)

    RDB: 在默认情况下,redis将数据库快照保存在名字为dump.rdb的二进制文件中

    方式: 1、阻塞方式  客户端执行save命令  2、非阻塞方式  bgsave

    策略: 自动:按照配置文件中的条件满足就执行BGSAVE

    save 60 1000,redis要满足在60秒内至少有1000个键被改动,会自动保存一次

    手动:客户端发起save,bgsave

    BGSAVE命令:

    redis> bgsave

    非阻塞,redis服务正常接收处理客户端请求

    redis会 fork() 一个新的子进程来创建RDB文件,子进程处理完后,会像父进程发送一个信号,通知它处理完毕

    父进程用新的dump.rdb替代旧文件

    持久化默认配置:

    save 9001

    save 300 10

    save 10 10000

    只要上面三个条件满足一个就会自动执行备份

    创建RDB文件之后,时间计数器和次数计数器会清零,所以多个条件的效果不是叠加的

    redis持久化的优点和缺点:

    优点 1、完全备份,不同时间的数据集备份可以做到多版本恢复

    2、紧凑的单一文件,方便网络传输,适合灾难恢复

    3、恢复大数据集速度较AOF快

    缺点:

    1、会丢失最近写入、修改的而未能持久化的数据

    2、fork过程非常耗时,会造成毫秒级不能响应客户端请求

    AOF写入机制:

     AOF不能保证绝对不丢失数据

    目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会将内容直接写入到硬盘里面。而是现将内容放入一个内存缓冲区中,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将存储在缓冲区的内容真正写入到硬盘里面,未写入磁盘之前,数据可能会丢失

    写入磁盘的策略:

    appendfsync选项,这个选项的值可以是always,everysec或者no 

    always: 服务器没写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,也不会丢失任何已经成功执行的命令 数据

    Everysec(默认): 服务器每一秒重调用一次fdatasync,将缓冲区里面的数据写入到硬盘,这种模式下,服务器出现故障,最多只丢失一秒钟内执行的命令数据

    NO: 服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到磁盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的

    运行速度:always运行速度慢,everysec和no都很快

    AOF重写过程:

    fork一个子进程负责重写AOF文件

    子进程会创建一个临时文件写入AOF信息

    父进程会开辟一个内存缓冲区接受新的命令

    子进程重写完成之后,父进程会获得一个信号,将进程收到的新的写操作由子进程写入到临时文件之中,新文件替代旧的文件

    注:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复

    reids持久化 -AOF 操作

    优点:  写入机制,默认fysec每秒执行,性能很好不阻塞服务,最多丢失一秒的数据

    重写机制,优化AOF文件

    如果误操作了,只要AOF未重写,停止服务移除AOF文件尾部FLUSHALL命令,重启redis,可以将数据集恢复到FLUSHALL执行之前的状态

    缺点:

    相同的数据集,AOF文件体积较RDB大了很多

    恢复数据库速度较RDB慢

    开启AOF操作之后,默认不在使用RDB作为备选,但二者任然可以同时开启

    搭建集群时需要遵循的原则: CAP原则,指的是在一个分布式系统之中,Consistency(一致性),Availability(可用性),partitiontolerance(分区容错性),三者不可兼得 

    redis主从复制

    一个redis服务可以有多个该服务的复制品,这个redis服务称为master,其他复制品称为slaves

    只要网络连接正常,master会一直将自己的数据同步更新给slaves,保持主从同步

    只有master可以执行写命令,slaves才可以执行读命令

    主从复制创建:

       redis-server-slaveof<master-ip> <master-port> ,配置当前服务称为某redis服务的slave

       example:   #redis-server--port 6308 --slaveof 127.0.0.1 6379

    SLAVEOF  host port 命令,将当前服务器状态从master修改为别的服务器的slave

      redis > SLAVEOF 192.168.1.1. 6379, 将服务器转换为slave

      redis > SLAVEOF NO ONE ,将服务器重新恢复到master,不会丢弃已同步数据

    配置方式,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器

    、slaveof <masterip> <masterport>

    slaveof 127.0.0.1 6379

    单节点模拟主从架构模式:

    手动实现主从模式

    1、创建redis 文件夹  在该文件夹下面创建三个子文件夹

    2、分别进入这三个文件夹,并在着三个文件夹之中分别启动redis 服务

    3、启动redis服务 : redis-server --port 6380 (在第一个文件夹中创建,相当于创建了一个redis实例 )

    reids-server --port 6381 --slaveof 127.0.0.1 6380  (在第二个文件夹中创建一个redis实例)

    reids-server --port 6382 --slaveof 127.0.0.1 6380  (在第三个文件夹中创建一个redis实例)

    启动一个客户端实例: redis-cli -p 6380

    插入一条数据验证之前插入的数据,与其他节点的数据是同步的

    当主节点初夏故障之后,手动切换主从节点: 在6381客户端输入 SLAVEOF no one 就实现了将6381节点命名为新的注节点

    在6382的节点将6382节点切换为6381的从节点: SLAVEOF 127.0.0.1 6381

    实现自动切换主从架构:

    redis哨兵paxos

    监控 monitoring

       sentinel会不断检查master和slaves是否正常

      每一个sentinel可以同步监控任意多个master和该master 下的slaves

    sentinel网络:

      监控同一个master的sentinel会自动连接,组成一个分布式sentinel网络,互相通信并交换彼此关于被监控服务器的信息

     哨兵一般也以集群的方式来运行

    redis哨兵 senlinel配置文件

     至少包含一个监控配置选项,用于监控被指定master的相关信息

     sentinel monitor<name><ip><port><quorum>,l例如 sentinel monitor mymaster 127.0.0.1 6379 2

     监视master的主服务器,服务器ip和端口,将这个主服务器下线失效至少需要2个sentinel同意,如果多数sentinel同意才会执行故障转移

    sentinel会根据master的配置自动发现master的slaves

    sentiNel默认端口是26279 

    哨兵的使用方法:(所有的操作都在模拟的单节点上运行)

    1、mkdir sent

    2、在新建文件夹下创建三个哨兵启动时的启动目录

    3、启动文件的名称是固定的 vi s1.conf

    在新建文件夹中分别设置哨兵的启动条件:

    port 26380 (设置哨兵的启动节点端口号)

    sentinel monitor xxx 127.0.0.1 6380 2  (设置哨兵监控的端口号以及某个节点提升为主节点需要的投票数)

    cp s1.conf s2.conf    cp s1.conf s3.conf  

    修改每个配置文件中哨兵的端口号

    需要将哨兵的启动目录放置到bin目录之下,目的是可以在任意的目录都可以进行启动

    4、启动哨兵: 首先进入到节点sent目录下

    redis-sentinel s1.conf 

    redis-sentinel s2.conf 

    redis-sentinel s3.conf 

    当主节点当掉之后,会自动选举一个节点作为主节点

    redis集群分片

       集群将整个数据库分为16384个槽位slot,所有key的数据都是这些slot中的一个,key的槽位计算公式为slot_number = crc16(key)%16384,其中crc16位的循环冗余校验和函数

      集群中每个节点都可以处理0个至16383个槽,当16383个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求

      每个节点拥有的槽位数量是可以进行自由分配的

      用这种方式可以解决数据迁移以及数据倾斜的问题

     

    搭建redis集群: 

    上传redis 3.0.0.4 版本的安装目录 ,并进行解压

    2、对redis安装文件进行编译  make && make PREFIX= /opt/wcg/redis/ install

    3、3.0版本和2.8版本的区别在于 服务器启动时即是服务器有事哨兵

    4、搭建一个完整的redis集群至少需要六个节点 ,启动之后需要进行区分主从,同时要进行一个槽位的认领

    5、安装ruby (脚本)环境,该环境的作用是支持槽位分发  安装ruby环境的命令: yum -y install ruby rubtgems 

    6、安装gcc 以及tcl 环境

    7、redis-cluster 目录下安装 redis gem 模块:  # gem install --local redis-3.3.0.gem
    8、创建文件夹 redis-test 并创建6个启动文件
    9、分别在每个文件下启动redis服务器 (共六个)

    10、 完成之后用ruby进行分槽  # ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001
    127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

    11、槽位分发完成之后,服务器才算是真正的运作了起来

    12、启动客户端集群的命令: redis-cli -p 7000 -c

     

  • 相关阅读:
    在windows上使用win2000资源工具
    Apache与Tomcat整合
    web服务器和应用服务器概念比较
    linux定时删除N天前的文件(文件夹)
    程序员如何自我学习和成长?
    20210708总结
    Docker 常用命令!还有谁不会?
    Redis常用命令set
    laravel与thinkphp之间的区别与优缺点
    2021年7月总结
  • 原文地址:https://www.cnblogs.com/wcgstudy/p/11143716.html
Copyright © 2020-2023  润新知