美文网首页
Redis 单机不能保证高可用 从主从模型到哨兵的演变

Redis 单机不能保证高可用 从主从模型到哨兵的演变

作者: 是龙台呀 | 来源:发表于2020-05-28 12:12 被阅读0次

    下载并且编译安装

    配置主从的conf

    创建一个redis的主从文件夹

    mkdir redis_master_slave

    在redis_master_slave文件夹内创建三个文件7001、7002、7003

    mkdir -p 7001/conf 7002/conf 7003/conf

    将redis中的配置文件redis.conf复制到上面各个conf中去

    在700相关文件夹中的redis.conf中的配置进行修改

    # 端口7001,7002,7003
    port  7001                                              
    # bind 0.0.0.0,这样是允许任何机器都可以访问该服务器 
    # 默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,否则无法主从
    bind 主机ip   
    # redis后台运行                                    
    daemonize    yes                     
    # pidfile文件对应6379,6380,6381          
    pidfile  /var/run/redis_7000.pid     
    # aof日志开启  有需要就开启,它会每次写操作都记    
    appendonly  yes              
    # 和dir 有关系             
    logfile "文件名"                   
    # 数据存储路径
    dir "/usr/local/software/redis_master_slave/7001/data"   
    # 在7002,7003里面配置,作为从                    
    slaveof 绑定ip 7001    
    # 其他配置一句需求做响应的设置
    # 本机redis密码 如果哨兵中配置,那么主从都配置
    requirepass 123456 
    # 主机redis密码 如果哨兵中配置,那么主从都配置
    masterauth "123456" 
    

    启动redis

    #!/bin/sh
    ​
    for ((i=1;i<4;i++))
    do
     redis-server ./700$i/conf/redis.conf
    done
    

    哨兵机制简介

    哨兵机制的消息介绍

    配置哨兵

    哨兵的 conf文件一般都在redis的当前解压目录下

    redis_master_slave 目录下创建 mkdir -p sentinel/conf mkdir -p sentinel/log

    在redis的根目录mv sentinel.conf ../sentinel/conf

    # 端口
    port 26379
    # 工作路径,注意路径不要和主重复
    dir "/usr/local/software/redis_master_slave/sentinel/log"
    # 指明日志文件名
    logfile "./sentinel.log"
    ​
    sentinel myid bea48b4599058ed53d7b43b1b13c886bcbda232c
    # 绑定主机
    bind 172.16.93.101
    # 守护进程模式
    daemonize yes
    ​
    sentinel deny-scripts-reconfig yes
    # 哨兵监控的master,主从配置一样,这里只用输入redis主节点的ip/port和法定人数 
    # 这个1代表,当集群中有2个sentinel认为master挂了时,才能真正认为该master已经不可用了
    sentinel monitor mymaster 127.0.0.1 7001 1
    ​
    sentinel config-epoch mymaster 1
    ​
    sentinel leader-epoch mymaster 1
    # 密码  没有可不设置
    # sentinel auth-pass mymaster 123456
    ​
    # Generated by CONFIG REWRITE 下面三个配置是自动生成的
    sentinel known-slave mymaster 127.0.0.1 7001
    sentinel known-slave mymaster 127.0.0.1 7002
    sentinel current-epoch 1
    

    启动哨兵

    redis-sentinel /usr/local/software/redis_master_slave/sentinel/conf
    

    哨兵机制起到的作用

    sentinel架构的主要作用是解决主从模式下主节点的故障转移工作的。这里如果主节点因为故障下线,那么某个sentinel节点发送检测消息给主节点时,如果在指定时间内收不到回复,那么该sentinel就会主观的判断该主节点已经下线,那么其会发送消息给其余的sentinel节点,询问其是否“认为”该主节点已下线,其余的sentinel收到消息后也会发送检测消息给主节点,如果其认为该主节点已经下线,那么其会回复向其询问的sentinel节点,告知其也认为主节点已经下线,当该sentinel节点最先收到超过指定数目(配置文件中配置的数目和当前sentinel节点集合数的一半,这里两个数目的较大值)的sentinel节点回复说当前主节点已下线,那么其就会对主节点进行故障转移工作,故障转移的基本思路是在从节点中选取某个从节点向其发送slaveof no one(假设选取的从节点为127.0.0.1:6380),使其称为独立的节点(也就是新的主节点),然后sentinel向其余的从节点发送slaveof 127.0.0.1 6380命令使它们重新成为新的主节点的从节点。重新分配之后sentinel节点集合还会继续监控已经下线的主节点(假设为127.0.0.1:6379),如果其重新上线,那么sentinel会向其发送slaveof命令,使其成为新的主机点的从节点,如此故障转移工作完成

    优点及解决问题

    • 同一个Master可以同步多个Slaves
    • Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构
    • Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求
    • Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
    • 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高
    • Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作
    • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离

    ❗️❗️❗️注意点

    在实现redis客户端API工具类时,出现的问题

    使用StringRedisSerializer序列化方式,**不能在string类型中存储对象等非string信息

    使用JdkSerializationRedisSerializer序列化方式,不能对整数、浮点进行incr自增操作

    使用GenericJackson2JsonRedisSerializer序列化方式,存储的json串信息较比byte方式性能较

    相关文章

      网友评论

          本文标题:Redis 单机不能保证高可用 从主从模型到哨兵的演变

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