• redis主从同步及redis哨兵机制


    1.主从和哨兵的作用:

    角色

                               作用

    主从

    1.(提供)数据副本:多一份数据副本,保证redis高可用

    2.  扩展(读)性能:如容量、QPS等

    哨兵

    1.监控: 监控redis主库及从库运行状态;

    2.通知: 如果redis发生故障转移,可以通过邮件通知管员;

    3.自动故障转移: 一旦发现主库宕机,则在从库中通过选举新的master进行故障转移。

    2、部署redis主从及哨兵,解释其工作原理(结合日志分析);
    redis主从同步:

    master:     192.168.1.16
    slave1:     192.168.1.17
    slave2:     192.168.1.18

    主库配置:
    不设置密码,从库可以直接使用slaveof ip port连接主库。

    #修改配置文件:  6379.conf
    以守护进程在后台运行:
    daemonize yes
    bind 0.0.0.0

    设置一个认证密码,从库需要指定master的密码才能完成同步,否则日志会有报错提示:

    #修改配置文件                   redis.conf
    #以守护进程在后台运行:
    daemonize yes       
    #可选设置认证密码:
    requirepass "123456"         (294行设置)
    bind 0.0.0.0    

    从库配置:

    #修改配置文件设置(重启服务器生效)需要关闭防火墙
    bind 0.0.0.0
    #指定隶属谁;
    slaveof 192.168.1.16 6379
    #或者
    REPLICAOF 192.168.1.16 6379
    #指定master的认证密码(如果远程服务器设置了密码,则需要认证密码)
    masterauth "123456"              (294行设置)
    
    #指定在命令行设置(直接生效,重启服务失效);
    #指定谁是主库;
    slaveof 192.168.1.16 6379
    #或者
    REPLICAOF 192.168.1.16 6379
    #设置master的认证密码:
    CONFIG set masterauth 123456
    #取消主从关系,恢复master身份:
    SLAVEOF no one

     

    从库查看状态:
    [root@localhost]# redis-cli
    192.168.1.17:6379> info replication

     

     主库查看状态:

    [root@localhost]# redis-cli
    192.168.1.16:6379> info replication

    日志分析:

    tailf /usr/local/redis/6379.log

    redis同步过程:

    Connecting to MASTER 192.168.1.16:6379 
    MASTER <-> REPLICA sync started 
    # 开始非阻塞同步 
    Non blocking connect for SYNC fired the event. 
    Master replied to PING, replication can continue... 
    Partial resynchronization not possible (no cached master) 
    # 全量同步 
    Full resync from master: 74fb29643971834fdf701beb1708ce9ddc23bdee:0 
    # 接受数据 
    MASTER <-> REPLICA sync: receiving 193 bytes from master 
    # 清空以前缓存得数据 
    MASTER <-> REPLICA sync: Flushing old data 
    # 加载数据库到内存
    MASTER <-> REPLICA sync: Loading DB in memory 
    # 完成同步 
    MASTER <-> REPLICA sync: Finished with success

    主从复制相关参数解读: 
    # 指定主库IP和端口: 
    replicaof  192.168.75.136  6379 
    # 指定主库得认证密码: 
    masterauth 123456 
    # 从库正在复制时,从库可以相应用户读请求,如果设置为no,则返回报错信息。 
    replica-serve-stale-data yes 
    # 设置从库为只读 
    replica-read-only yes 
    # 启动socket方式复制数据库,master生成rdb文件,不在是先保存到磁盘,然后发给从库,而是直接把 rdb发送给从库,减少了磁盘IO 
    repl-diskless-sync yes 
    # 配置延时时间,让更多slave加入传输队列,如果复制已经开始,则5秒内,不接受新的slave同步请求 
    repl-diskless-sync-delay 5 
    # 指定从库定期检查主库状态,默认10秒 
    repl-ping-replica-period 10 
    # 同步超时时间 
    repl-timeout 60 
    # 是否禁用tcp-nodelay,yes表示禁用,redis会在写缓存积累到一定量之后一起发送,节省带宽,但是 会导致master和slave数据延迟,no,表示启用,redis会立即发送数据包,即使是很小数据,数据同步会 比较快,但是消耗更多带宽 
    repl-disable-tcp-nodelay no 
    # 设置在同步过程中,写缓冲区得大小,需要考虑到同步的时间和数据的写入速度 
    repl-backlog-size 1mb 
    # 设置从库的优先级,在主库宕机后,根据优先级选择slave,值越小,则优先级越高,0,表示不参与竞选, 故永远不会被选中。 
    replica-priority 100
    同步策略:
    全量同步:
    Redis全量复制一般发生在Slave初始化阶段,这时Slave需要在Master上的所有数据都复制一份。具体步骤如下:

    1)从服务器连接主服务器,发送SYNC命令;

    2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命 令;

    3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

    4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

    5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

    6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

    完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接受来自用户的读请求。

    Redis主从同步策略:
    Redis主从同步略:
    主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任 何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从 机进行全量同步。
    注意点:
    如果多个Slave重启或者master重启,会因为master_replid不一致导致全量同步,当多个同时出现的时 候,可能会导致Master IO剧增宕机。
    哨兵模式:
    redis主从虽然解决了单点导致的数据丢失问题,但是还是没有解决无缝的故障转移,也就是说在主库宕机后,从库无法自动切换为主库,需要手工去切换,在这一瞬间会对后端数据库造成极大的负载,可能直接导致后端数据宕机。
    工作原理:
    哨兵(sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel)进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols) 来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。 每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如 果发现对方在指定时间(可配置)内未回应,则暂时认为对方宕机了,这就是所谓的”主观认为宕机” Subjective Down,简称sdown)。

    若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master真正宕机,即客观上认 为宕机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为 master,然后自动修改相关配置。

    哨兵模式配置:

    master:     192.168.1.16
    slave1:     192.168.1.17
    slave2:     192.168.1.18

     首先得配置主从:(前边已经配置了,这里就不在配置)

    #配置master,开启网卡监听,(可选设置密码 294行);
    vim /usr/local/redis/6379/6379.conf
    bind  0.0.0.0
    #配置slave1,指定master:
    bind  0.0.0.0
    replicatof  192.168.1.16  6379
    
    #配置slave2,指定master:
    bind  0.0.0.0
    replicaof  192.168.1.16  6379

    查看主从状态:

    # 在master执行以下指令,均可查看同步信息: 
    127.0.0.1:6379> role 
    1) "master" 
    2) (integer) 322 
    3) 1) 1) "192.168.1.17"      
          2) "6379"      
          3) "322"  
       2) 1) "192.168.1.18"      
          2) "6379"      
         3) "322"
    127.0.0.1:6379> info replication 
    # Replication 
    role:master 
    connected_slaves:2 
    slave0:ip=192.168.1.17,port=6379,state=online,offset=784,lag=1 
    slave1:ip=192.168.1.18,port=6379,state=online,offset=784,lag=1 

    配置哨兵:

    master配置sentinel:
    #复制哨兵的配置文件:
    [root@localhost ~]# cp /usr/src/redis-stable/sentinel.conf  /usr/local/redis/
    #修改配置文件:
    vim /usr/local/redis/sentinel.conf
    
    #绑定监听IP
    bind 0.0.0.0
    #监听端口
    port 26379
    #后台运行
    daemonize yes
    pidfile /var/run/redis-sentinel.pid
    #哨兵的日志文件
    logfile "sentinel.log"
    #日志文件存放路径
    dir /usr/local/redis/
    #设置初始化master以及法定认为下线人数:
    sentinel monitor mymaster 192.168.1.16 6379
    #master主观下线时间,默认30秒,30秒内没有回复pong,则认为下线了
    sentinel down-after-milliseconds mymaster 30000
    #指定在故障转移期间,多少个slave向新的master同步数量,如果slave是提供查询服务,则应该设置小一点更好
    sentinel parallel-syncs mymaster 1 
    # 指定故障转移超时时间,默认为3分钟 
    sentinel failover-timeout mymaster 180000 
    # 设置通知脚本,发生故障转移可以向管理员发送通知(可选) 
    sentinel notification-script mymaster /usr/local/redis/notify.sh 
    # 禁止修改脚本,避免脚本重置 
    sentinel deny-scripts-reconfig yes 
    --------------

     

    创建notify.sh脚本 

    vim /usr/local/redis/notify.sh
    #!/bin/bash 
    # lutixia 
    #####################
    TO="1550684538@qq.com" 
    SUBJECT="redis 发生故障转移" 
    CONTEXT="redis 发生故障转移" 
    echo -e "$CONTEXT"|mailx -s "$SUBJECT" "$TO"
    
    #授予权限:
    chmod +x /usr/local/redis/notofy.sh
    #执行脚本
    /usr/local/redis/notify.sh

    启动哨兵模式:

    [root@bogon ~]# /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
    [root@bogon ~]# netstat -nutlp

     复制哨兵配置文件及notify.sh脚本到slave服务器/并且在slave服务器启动哨兵:

    #远程scp哨兵配置文件:
    [root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.17:/usr/local/redis/
    root@192.168.1.17's password: 
    sentinel.conf                                                        100% 9901     3.1MB/s   00:00    
    [root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.18:/usr/local/redis/
    root@192.168.1.18's password: 
    sentinel.conf 
    #远程scp notify.sh脚本:                                                       100% 9901     2.6MB/s   00:00  
    [root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.17:/usr/local/redis/
    root@192.168.1.17's password: 
    notify.sh                                                            100%  186   131.8KB/s   00:00    
    [root@localhost ~]# scp /usr/local/redis/notify.sh 192.168.1.18:/usr/local/redis/
    root@192.168.1.18's password: 
    notify.sh                                                            100%  186   111.4KB/s   00:00 

    slave节点启动哨兵:

    [root@bogon ~]# /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf 

    master哨兵查看;

    [root@bogon ~]# redis-cli -p 26379
    127.0.0.1:26379> 
    127.0.0.1:26379> info sentinel
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=mymaster,status=ok,address=192.168.1.16:6379,slaves=2,sentinels=3
    以上配置哨兵完成:当哨兵发现master主库宕机时, 哨兵(sentinel)slave从库提升为主库 master,可通过stop关闭master模拟

    谢谢关注!!!

  • 相关阅读:
    链表重排 【模板题】
    链表的插入排序
    链表归并排序
    判断链表成环| 删除第K个节点【快慢指针】
    vue骨架屏制作
    前端常用的网站+插件
    点击canvas图片下载图片
    判断dom是否出现在可视区域
    canvas截取图片
    .如果在input上加上@keyup.enter.native,第一次回车时还是会刷新界面,在el-from上加上 @submit.native.prevent
  • 原文地址:https://www.cnblogs.com/fengyuanfei/p/13830706.html
Copyright © 2020-2023  润新知