zoukankan      html  css  js  c++  java
  • Redis主从复制与哨兵机制

    主从复制

      通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,

    但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。

      为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,

    即使有一台服务器出现故障其他服务器依然可以继续提供服务。

    这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,这时候就用到了Redis的主从复制。

       Redis提供了复制(replication)功能来自动实现多台redis服务器的数据同步,

    我们可以通过部署多台redis,并在配置文件中指定这几台redis之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,

    这种模式叫做主从复制,即master(主服务器)/slave(从服务器),并且redis默认master用于写,slave用于读,向slave写数据会导致错误。

    Redis的主从复制的配置

    第一种方式: 修改配置文件

      启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系.

    # slaveof <masterip> <masterport>
    slaveof 127.0.0.1 6379

    第二种方式: 在启动redis服务器时(cmd中)

      使用 redis-server.exe  redis-server --slaveof <master-ip> <master-port>, 在启动的时候,指定当前redis服务器成为某个主redis服务器的从服务器.

    redis-server.exe  redis.windows.conf --slaveof 127.0.0.1 6379

    启动成功

     登录到redis, 使用info replication可以查看主从复制的服务器的信息

    //cmd中
    info replication

     

    容灾处理

      当Master服务出现故障,需手动将slave中的一个提升为master, 剩下的slave挂至新的master上(冷处理:机器挂掉了,再处理)

    命令(cmd):

    slaveof no one,将一台slave服务器提升为Master (提升某slave为master)
    slaveof 主服务器ip 主服务器端口号(将slave挂至新的master上)

    哨兵机制

      前面我们使用主从复制,解决了单点故障问题,从而提高了redis服务器的稳定性, 但是当redis主服务器出现故障了, 我们采用的是手动来进行故障的迁移,也就是前面说的,手动把某个从服务器提升为主服务器,再把其他从服务器重新作为新主服务器的从机,但是这种手动不够智能, 需要工作人员每时每分盯着,哨兵机制自动处理服务器故障.

      Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:

    • 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
    • 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
    • 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。

    sdown(主观认为宕机 Subjective Down:每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂。

    odown(客观上的真正宕机 Objective Down):若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡

    它们会选举出一个 Sentinel 节点来完成自动故障转移的工作(通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置),同时会将这个变化实时通知给 Redis 应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。

      虽然哨兵(sentinel) 释出为一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel)。

     本机配置redis集群,模拟主从复制,哨兵机制

    1、创建三个redis服务器(因为本机ip只有一个,只能通过改端口,或者通过局域网来实现案例)

     2、在每一个redis中更改配置文件redis.windows.conf改为(redis6379.conf、redis6380.conf、redis6381.conf)方便区分

    将6379设置为主服务器,6380、6381为从服务器

    1、主服务器中的配置不做改变
    2、从服务器(63806381)添加如下配置
    # slaveof <masterip> <masterport>
    slaveof 127.0.0.1 6379

    3、创建服务器快捷启动方式(cmd命名:方便快速启动)--start.bat

    //title为窗口名
    //三台redis配置文件名填对应的
    title redis6379
    redis-server.exe redis6379.conf

    4、创建客户端快捷启动方式(cmd命名:方便快速启动)--startClient.bat

    //窗口文件名
    title redisCilent6379
    //客户端配置文件名  -h ip -p 端口
    redis-cli.exe -h 127.0.0.1 -p 6379

    以上配置就完成了主从复制

    哨兵机制

    5、在redis6379文件夹中创建三个哨兵配置文件(任意redis服务器都可以,或者创建一/三个新的redis)

    //文件名 startsentinel-10001.bat
    port 10001
    sentinel monitor mymaster 127.0.0.1 6379 1
    sentinel down-after-milliseconds mymaster 5000 
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 15000
    sentinel monitor mymaster 127.0.0.1 6379 1 最后的1表示有几个哨兵服务器监控sdown,
    如果放在一个redis服务器中设置为1,如果放在三个redis,设置为2
    //文件名 startsentinel-10002.bat
    port 10002
    sentinel monitor mymaster 127.0.0.1 6380 1
    sentinel down-after-milliseconds mymaster 5000 
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 15000
    //文件名 startsentinel-10003.bat
    port 10003
    sentinel monitor mymaster 127.0.0.1 6381 1
    sentinel down-after-milliseconds mymaster 5000 
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 15000

    6、哨兵的快捷启动方式(.bat文件)

    //文件名:startsentinel-10001.bat
    title sentinel1001
    redis-server sentinel-10001.conf --sentinel
    //文件名:startsentinel-10002.bat
    title sentinel1002
    redis-server sentinel-10002.conf --sentinel
    //文件名:startsentinel-10003.bat
    title sentinel1003
    redis-server sentinel-10003.conf --sentinel

    7、最后开启服务器

    分别点击三个redis服务器的start文件

     8、分别开启哨兵

     验证哨兵自动处理容灾(关闭主服务器)

    当原来的主服务器修好,重启,默认当成从服务器 

    此时redis中的配置文件,此时的主服务器中(原来的从服务器)的

    # slaveof <masterip> <masterport>  配置文件被删除

    从服务器被修改为此时主服务器的端口,原来的主服务器(现在的从服务器)被默认加上主服务器的slaveof

    哨兵的配置文件说明:

    1. port :当前Sentinel服务运行的端口 

    2.sentinel monitor mymaster 127.0.0.1 6379 2: Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行 

    3.sentinel down-after-milliseconds mymaster 5000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行 

    4.sentinel parallel-syncs mymaster 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长 

    5.sentinel failover-timeout mymaster 15000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败 

  • 相关阅读:
    Java基础---多线程
    Java基础---多态、内部类、异常、包
    Java基础---继承、抽象、接口
    Java基础---面向对象
    NSOperation使用
    根据两个日期计算相差的年月日
    代理模式简单说明
    Lua程序设计入门
    zmq-ios framwork
    cocoapods安装与使用
  • 原文地址:https://www.cnblogs.com/64Byte/p/13210195.html
Copyright © 2011-2022 走看看