美文网首页互联网科技JavaJava 杂谈
重中之重基础-Redis介绍

重中之重基础-Redis介绍

作者: java欧阳丰 | 来源:发表于2019-07-30 21:43 被阅读9次

    Redis概述

    Redis是Salvatore Sanfilippo在2009年为其初创公司LLOOGG开发的,目前仍是独立项目,但VMWare赞劣了项目(作者是其雇员)。它采用C语言实现,因此性能很好。采用BSD许可证,使用键值存储,和Amazon Dynamo,Cassandra,Riak,Voldemort,Memcache类似。支持丰富的数据类型,比如数组,链表,集合等,非常适合需要表达时间线的web服务,例如微博。

    Redis支持的数据类型有:

    1.字符串
    2.链表
    3.集合
    4.有序集合
    5.散列表

    Redis的主从复制

    Redis自带有主从复制的功能,只要设置配置文件redis.conf的slaveof选项即可,如下所示:


    但我们可以使用keepalived+redis的方法实现高可用,如下所示:

    1. redis的配置
      主机 端口 角色
      redis0 6379 master
      redis1 6379 slave
    1. keepalived的配置
      redis0和redis1使用一个虚拟ip

    并使用如下脚本监控redis服务是否存活:

    #!/bin/bash
    /usr/local/bin/redis-cli -h 192.168.1.53 -p 6379 info > /dev/null
    if [ $? -eq 0 ]; then
            echo "redis OK"
            exit 0
    else
            echo "no redis service found!"
            /usr/local/bin/redis-server /path/to/redis.conf
            # try to start it again
            /usr/local/bin/redis-cli -h 192.168.11.53 -p 6380 info > /dev/null
            if [ $? -eq 0 ]; then
                    exit 0
            else
                    # restart failed
                    killall keepalived
                    echo "error"
            fi
    fi
    

    要实现redis的故障恢复,可以使用keepalived配置的notify_master, notify_backup这两个方法执行特有的脚本。实际上只要在slave(即redis1)上有2个脚本,第一个用于在redis1接管虚拟ip之后,执行slaveof no one把自己变成master。第二个是在redis1交出虚拟ip之后,在redis0执行slaveof no one确保redis0恢复为主的状态,并对redis1执行slaveof redis0 6379开始重新从master同步数据,如果自己已经是slave就没必要同步了。
    redis1上keepalived的配置方法如下,redis0只要去掉notify_master, notify_backup两行即可。

    ! Configuration File for keepalived
    global_defs {
    router_id redis1
    }
    vrrp_script Monitor_Redis {
     script "/opt/redis_keepalive.sh"
     interval 10
     weight 2
    }
    vrrp_instance 360 {
     state BUCKUP #(主机为MASTER,备用机为BACKUP)
     interface eth0 #(HA监测网络接口)
     virtual_router_id 110 #(主、备机的virtual_router_id必须相同)
     mcast_src_ip 192.168.11.53 #(多播的源IP,设置为本机外网IP,与VIP同一网卡)此项可不设置
     priority 70 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
     advert_int 1 #(VRRP Multicast广播周期秒数)
     authentication {
      ......
    }
     notify_master /opt/redis_2master.sh
     notify_backup /opt/redis_2backup.sh
     track_script {
     Monitor_Redis #(调用nginx进程检测脚本)
    }
     virtual_ipaddress {
     192.168.11.4 #(VRRP HA虚拟地址)
     }
    }
    

    Redis的持久化

    Redis的有以下2种的持久化机制:
    1.快照(snapshot)
    2.AOF(Append Only File)

    Redis的快照功能配置如下:

    Redis快照原理如下:

    Redis借助了fork命令的copy on write机制。在生成快照时,将当前迚程fork出一个子进程,然后在子迚程中循环所有的数据,将数据写成为RDB文件。
    Redis原来的RDB文件不会坏掉,因为其写操作是在一个新迚程中迚行的,当生成一个新的,RDB文件时,Redis生成的子迚程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件,这样在仸何时候出现故障,Redis的RDB文件都总是可用的。
    同时,Redis的RDB文件也是Redis主从同步内部实现中的一环。
    我们可以很明显的看到,RDB有它的不足,就是一旦数据库出现问题,那么我们的RDB文件中保存的数据并不是全新的,从上次RDB文件生成到Redis停机这段时间的数据全部丢掉了。在某些业务下,这是可以忍受的,我们也推荐这些业务使用RDB的方式进行持久化,因为开启RDB的代价并不高。

    AOF的配置如下:


    AOF优先于RDB(即快照),RDB性能优于AOF,因为里面没有重复。
    AOF Rewrite:
    重新生成一份AOF文件,新的AOF文件中一条记录的操作只会有一次,而不像一份老文件那样,可能记录了对同一个值的多次操作。其生成过程和RDB类似, 也是fork一个进程,直接遍历数据,写入新的AOF临时文件。在写入新文件的过程中,所有的写操作日志还是会写到原来老的 AOF文件中,同时还会记录在内存缓冲区中。当重完操作完成后,会将所有缓冲区中的日志一次性写入到临时文件中。然后调用原子性的rename命令用新的 AOF文件取代老的AOF文件。
    谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!

    相关文章

      网友评论

        本文标题:重中之重基础-Redis介绍

        本文链接:https://www.haomeiwen.com/subject/cjvorctx.html