精华内容
下载资源
问答
  • 主要介绍了SpringBoot结合Redis哨兵模式的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 哨兵模式三台一主一从一哨兵
  • 本文是我花了一周时间整理出来的Redis哨兵模式(sentinel)学习总结,包括部署过程,主从复制、读写分离、主从切换等都已验证通过,可以作为完整手册使用.有需要的朋友,请拿走不谢.
  • 主从复制和哨兵模式的搭建,请参考其他文章,很简单,而且别人写的很详细,这里主要解决哨兵模式无法切换的问题。 目前我这边的配置为: 一主二从三哨兵 出现的问题主要有: 问题1:没有看到切换master节点的信息: ...

    主从复制和哨兵模式的搭建,请参考其他文章,很简单,而且别人写的很详细,这里主要解决哨兵模式无法切换的问题。
    目前我这边的配置为:
    一主二从三哨兵
    出现的问题主要有:

    问题1:没有看到切换master节点的信息:

    在这里插入图片描述
    解决方法:修改redis-sentinel.conf 配置文件,将最少投票数改为1,(大于3个哨兵的,建议投票数为:哨兵数/2 -1 不为别的,我只怕redis抽风!! ) 注:官方文档并没有说需要【(哨兵数/2)-1 】,是我自己设置并解决我当前的问题的,官方文档只说如果哨兵数过少,则故障转移是不会产生的,也就是说,一两个哨兵,并不是高可用配置,当master挂掉后,不一定会给你进行故障转移。:
    详见:https://redis.io/topics/sentinel
    在这里插入图片描述

    问题二:哨兵选举后,无法真正地切换。

    在这里插入图片描述

    无法切换,有几种情况:
    1-redis保护模式开启了
    2-端口没有放开;
    3-master密码和从密码不一致。
    4-master节点的redis.conf没有添加masterauth

    建议处理方法如下:
    每一台机子下的:redis.conf配置文件,还有哨兵的redis-sentinel.conf 配置文件修改成:

    bind 0.0.0.0
    protected-mode no
    

    2-各个哨兵,端口要能相互telnet 对应的ip 端口
    查看想开的端口是否已开:firewall-cmd --query-port=26379/tcp
    添加指定需要开放的端口:firewall-cmd --add-port=26379/tcp --permanent
    重载入添加的端口:firewall-cmd --reload
    查询指定端口是否开启成功:firewall-cmd --query-port=26379/tcp
    返回yes即可

    3–master密码和从密码不一致
    由于哨兵配置的时候没有配置从密码,只配置了master的密码,那么问题来了,如果master挂掉了,哨兵sentinel切换master的时候,怎么去修改其他节点的配置信息呢。实际上,哨兵是拿master的密码去认证的,所以,我们在配置redis的时候,建议redis的账号密码一致(至少主账号的master-auth密码和从节点的一致)

    4-master节点也要设置masterauth,避免当master重启后无法变成新master节点的从节点

    各位参考以上的配置进行操作即可。如果还有其他的配置需要注意的,欢迎留言

    展开全文
  • docker搭建redis哨兵模式集群 一、搭建redis一主两从集群 1.创建docker网络,为了容器间相互通信 docker network create redis 2.运行redis容器 docker run -it -d --network redis --restart=always --name redis...


    一、搭建redis一主两从集群

    1.创建docker网络,为了容器间相互通信

    docker network create redis
    

    2.运行redis容器

    docker run  -it -d --network redis --restart=always --name redis-master -p 6379:6379 -p 26379:26379  redis
    docker run  -it -d --network redis --restart=always --name redis-slave-1 -p 6380:6379 -p 26380:26379  redis
    docker run  -it -d --network redis --restart=always --name redis-slave-2 -p 6381:6379 -p 26381:26379  redis
    

    3.查看master的ip地址

    [root@aliyun ~]# docker inspect redis-master|grep IPAddress
                "SecondaryIPAddresses": null,
                "IPAddress": "172.17.0.2",
                        "IPAddress": "172.17.0.2",
    

    4.添加第一个slave节点

    #进入redis-slave-1的容器内部
    [root@aliyun ~]# docker exec -it redis-slave-1 /bin/bash
    root@38493fef3e03:/data# redis-cli
    127.0.0.1:6379> slaveof 172.17.0.2  6379
    OK
    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:172.17.0.2
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:14
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:14
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:14
    

    可以看到第一个slave节点添加成功

    5.添加第二个slave节点

    #进入第二个slave节点(添加成功)
    [root@aliyun ~]# docker exec -it redis-slave-2 /bin/bash
    root@7d4124eb4f7b:/data# redis-cli
    127.0.0.1:6379> slaveof 172.17.0.2  6379
    OK
    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:172.17.0.2
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:42
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:42
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:43
    repl_backlog_histlen:0
    

    添加成功

    6.登陆master查看信息

    [root@aliyun ~]# docker exec -it redis-master /bin/bash
    root@fb8299058ead:/data# redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.17.0.3,port=6379,state=online,offset=574,lag=1
    slave1:ip=172.17.0.4,port=6379,state=online,offset=574,lag=1
    master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:574
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:574
    

    信息中可以看到两个slave的信息(ip、端口、状态等内容)

    7.测试主从同步

    在master节点存数据,看slave节点是否能获取到

    [root@aliyun ~]# docker exec -it redis-master /bin/bash
    root@fb8299058ead:/data# redis-cli
    127.0.0.1:6379> set name 12345
    OK
    127.0.0.1:6379> get name
    "12345"
    127.0.0.1:6379> exit
    root@fb8299058ead:/data# exit
    exit
    

    进入slave1节点查看数据(同步成功)

    [root@aliyun ~]# docker exec -it redis-slave-1  /bin/bash
    root@38493fef3e03:/data# redis-cli
    127.0.0.1:6379> get name
    "12345"
    127.0.0.1:6379> exit
    root@38493fef3e03:/data# exit
    exit
    

    进入slave2节点查看数据(同步成功)

    [root@aliyun ~]# docker exec -it redis-slave-2  /bin/bash
    root@7d4124eb4f7b:/data# redis-cli
    127.0.0.1:6379> get name
    "12345"
    127.0.0.1:6379>
    
    

    二、搭建哨兵

    1.在每个容器中安装vim,psutils

    #需要进入容器中执行
    apt-get update
    apt-get install vim
    apt-get install procps
    

    2.在每个容器中创建哨兵文件

    #sentinel.conf
    port 26379
    daemonize yes
    logfile "sentinel.log"
    sentinel monitor mymaster  172.17.0.2   6379 2
    

    其中,sentinel monitor mymaster 172.17.0.2 6379 2配置的含义是:该哨兵节点监控172.17.0.2:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移

    启动哨兵(每个节点都需要启动)

    哨兵节点的启动有两种方式,二者作用是完全相同的:

    redis-sentinel sentinel.conf
    redis-server   sentinel --sentinel
    

    下面可以看到redis-sentinel已经启动

    root@7d4124eb4f7b:/data# ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    redis        1     0  0 06:16 pts/0    00:00:11 redis-server *:6379
    root      1370     0  0 09:02 ?        00:00:01 redis-sentinel *:26379 [sentinel]
    root      1380     0  0 09:03 pts/1    00:00:00 /bin/bash
    root      1390  1380  0 09:10 pts/1    00:00:00 ps -ef
    

    3.查看哨兵信息

    root@7d4124eb4f7b:/data# redis-cli -p 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=172.17.0.2:6379,slaves=2,sentinels=3
    127.0.0.1:26379>
    

    4.演示故障转移

    [root@aliyun ~]# docker stop redis-master
    redis-master
    

    随便进入一个slave节点内部

    [root@aliyun ~]# docker exec -it redis-slave-2  /bin/bash
    root@7d4124eb4f7b:/data# redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:172.17.0.2
    master_port:6379
    master_link_status:down(这里可以看到master状态为down)
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_repl_offset:149730
    master_link_down_since_seconds:14
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:afd4ad72b47ce253b15470232f20ae5e4f768b29
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:149730
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:43
    repl_backlog_histlen:149688
    
    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:172.17.0.3(这里可以看到master的ip已经发生了改变)
    master_port:6379
    master_link_status:up(状态正常)
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:150428
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:c9bea460cf62fdc27109798770e115609594e541
    master_replid2:afd4ad72b47ce253b15470232f20ae5e4f768b29
    master_repl_offset:150428
    second_repl_offset:149731
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:43
    repl_backlog_histlen:150386
    

    redis主节点挂掉,两个slave会进行选举,时间为30秒

    再将之前的master节点start,会发现之前的master已经成为slave节点

    [root@aliyun ~]# docker start redis-master
    [root@aliyun ~]# docker exec -it redis-master /bin/bash
    root@fb8299058ead:/data# redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:172.17.0.3
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    

    进去当前的master节点看下当前信息

    [root@aliyun ~]# docker exec -it redis-slave-1  /bin/bash
    root@38493fef3e03:/data# redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.17.0.4,port=6379,state=online,offset=268053,lag=1
    slave1:ip=172.17.0.2,port=6379,state=online,offset=268053,lag=1
    master_replid:c9bea460cf62fdc27109798770e115609594e541
    master_replid2:afd4ad72b47ce253b15470232f20ae5e4f768b29
    master_repl_offset:268323
    second_repl_offset:149731
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:268323
    127.0.0.1:6379> info sentinel
    127.0.0.1:6379> exit
    root@38493fef3e03:/data# redis-cli -p 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=172.17.0.3:6379,slaves=2,sentinels=3
    127.0.0.1:26379>
    

    到此就结束了!!!

    展开全文
  • redis哨兵模式

    千次阅读 2020-07-22 16:37:16
    通俗来讲哨兵模式的出现是就是为了解决我们主从复制模式中需要我们人为操作的东西变为自动版,并且它比人为要更及时 2.哨兵主要功能(做了哪些事) 监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作...

    1.是什么,能干嘛?

    • 在Redis 2.8版本开始引入。哨兵的核心功能是主节点的自动故障转移。
    • 通俗来讲哨兵模式的出现是就是为了解决我们主从复制模式中需要我们人为操作的东西变为自动版,并且它比人为要更及时

    2.哨兵主要功能(做了哪些事)

    • 监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
    • 自动故障转移(Automatic Failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
    • 配置提供者(Configuration Provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
    • 通知(Notification):哨兵可以将故障转移的结果发送给客户端。
      其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;而配置提供者和通知功能,则需要在与客户端的交互中才能体现。

    3.架构

    • 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的Redis节点,不存储数据。
    • 数据节点:主节点和从节点都是数据节点。

    4.怎么玩(实战)?

    1.部署主从节点

    哨兵系统中的主从节点,与普通的主从节点配置是一样的,并不需要做任何额外配置。下面分别是主节点(port=8000)和2个从节点(port=8001/8002)的配置文件;
    我们刚才搭建的主从复制就是主从节点

    2.部署哨兵节点

    哨兵节点本质上是特殊的Redis节点。
    3个哨兵节点的配置几乎是完全一样的,主要区别在于端口号的不同(26379 / 26380 / 26381)下面以26379节点为例介绍节点的配置和启动方式;配置部分尽量简化:
    #####sentinel-26379.conf

    port 26379
    daemonize yes
    logfile "26379.log"
    sentinel monitor mymaster 192.168.0.104 6379 2
    

    其中,sentinel monitor mymaster 192.168. 92.128 6379 2配置的含义是:该哨兵节点监92.168.0.104 6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移。
    哨兵节点的启动有两种方式,二者作用是完全相同的:

    redis-sentinel sentinel-26379.conf
    redis-server sentinel-26379.conf --sentinel
    

    5.故障转移演示(哨兵的监控和自动故障转移功能)

    • 使用kill命令杀掉主节点

    6.客户端(jedis)访问哨兵系统(自动故障转移功能)

    public static void main(String[] args)  {
            Logger logger= LoggerFactory.getLogger(TestJedisSentinel.class);
            Set<String> set=new HashSet<>();
            set.add("192.168.0.104:28000");
            set.add("192.168.0.104:28001");
            set.add("192.168.0.104:28002");
            JedisSentinelPool jedisSentinelPool=new JedisSentinelPool("mymaster",set,"123456");
            while (true) {
                Jedis jedis=null;
                try {
                    jedis = jedisSentinelPool.getResource();
                    String s = UUID.randomUUID().toString();
                    jedis.set("k" + s, "v" + s);
                    System.out.println(jedis.get("k" + s));
                    Thread.sleep(1000);
                }catch (Exception e){
                    logger.error(e.getMessage());
                }finally {
                    if(jedis!=null){
                        jedis.close();
                    }
                }
            }
        }
    

    7.基本原理

    关于哨兵的原理,关键是了解以下几个概念:

    • 主观下线:在心跳检测的定时任务中,如果其他节点超过一定时间没有回复,哨兵节点就会将其进行主观下线。顾名思义,主观下线的意思是一个哨兵节点“主观地”判断下线;与主观下线相对应的是客观下线。
    • 客观下线:哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。
    • 需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观- - 下线和故障转移操作。
    • 定时任务:每个哨兵节点维护了3个定时任务。定时任务的功能分别如下:

    1.每10秒通过向主从节点发送info命令获取最新的主从结构;

    发现slave节点
    确定主从关系

    2.每2秒通过发布订阅功能获取其他哨兵节点的信息;SUBSCRIBE c2 PUBLISH c2 hello-redis

    交互对节点的“看法”和自身情况

    3.每1秒通过向其他节点发送ping命令进行心跳检测,判断是否下线(monitor)。

    • 心跳检测,失败判断依据
    • 选举领导者哨兵节点:当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。
    • 监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。选举的具体过程这里不做详细描述,
    • 一般来说,哨兵选择的过程很快,谁先完成客观下线,一般就能成为领导者。
      故障转移:选举出的领导者哨兵,开始进行故障转移操作,该操作大体可以分为3个步骤:

    8.在从节点中选择新的主节点:选择的原则是,

    1.首先过滤掉不健康的从节点;
    2.过滤响应慢的节点
    3.过滤与master断开时间最久的
    4.优先原则
    先选择优先级最高的从节点(由replica-priority指定);如果优先级无法区分,
    则选择复制偏移量最大的从节点;如果仍无法区分,
    则选择runid最小的从节点。
    5.更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。
    6.将已经下线的主节点(即6379)保持关注,当6379从新上线后设置为新的主节点的从节点
    7.实践建议
    哨兵节点的数量应不止一个。一方面增加哨兵节点的冗余,避免哨兵本身成为高可用的瓶颈;另一方面减少对下线的误判。此外,这些不同的哨兵节点应部署在不同的物理机上。
    8.哨兵节点的数量应该是奇数,便于哨兵通过投票做出“决策”:领导者选举的决策、客观下线的决策等。
    各个哨兵节点的配置应一致,包括硬件、参数等;此外应保证时间准确、一致。

    9.总结

    在主从复制的基础上,哨兵引入了主节点的自动故障转移,进一步提高了Redis的高可用性;但是哨兵的缺陷同样很明显:哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要我们对从节点做额外的监控、切换操作。此外,哨兵仍然没有解决写操作无法负载均衡、及存储能力受到单机限制的问题

    展开全文
  • Redis哨兵模式 什么是Redis哨兵模式 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息,并...

    本文参考 嗨客网 Redis面试题

    Redis哨兵模式

    什么是Redis哨兵模式

    Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。

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

    哨兵模式简介

    Sentinel(哨兵)是用于监控 redis 集群中 Master 状态的工具,是 Redis 的高可用性解决方案,sentinel 哨兵模式已经被集成在 redis2.4 之后的版本中。sentinel 是 redis 高可用的解决方案,sentinel 系统可以监视一个或者多个 redis master 服务,以及这些 master 服务的所有从服务;当某个 master 服务下线时,自动将该 master 下的某个从服务升级为 master 服务替代已下线的 master 服务继续处理请求。

    sentinel 可以让 redis 实现主从复制,当一个集群中的 master 失效之后,sentinel 可以选举出一个新的 master 用于自动接替 master 的工作,集群中的其他 redis 服务器自动指向新的 master 同步数据。一般建议 sentinel 采取奇数台,防止某一台 sentinel 无法连接到 master 导致误切换。

    Redis Sentinel作用

    Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

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

    Sentinel的工作方式

    1. 每个 Sentinel 以每秒钟一次的频率向它所知的 Master,Slave 以及其他 Sentinel 实例发送一个 PING 命令。
    2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被 Sentinel 标记为主观下线。
    3. 如果一个 Master 被标记为主观下线,则正在监视这个 Master 的所有 Sentinel 要以每秒一次的频率确认 Master 的确进入了主观下线状态。
    4. 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master 的确进入了主观下线状态,则 Master 会被标记为客观下线。
    5. 在一般情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令。
    6. 当 Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
    7. 若没有足够数量的 Sentinel 同意 Master 已经下线,Master 的客观下线状态就会被移除。
    8. 若 Master 重新向 Sentinel 的 PING 命令返回有效回复,Master 的主观下线状态就会被移除。

    Redis Sentinel优缺点

    优点

    1. 监控主数据库和从数据库是否正常运行
    2. 主数据库出现故障时,可以自动将从数据库转换为主数据库,实现自动切换
    3. 如果 redis 服务出现问题,会发送通知

    缺点

    1. 主数据库出现故障时,选举切换的时候容易出现瞬间断线现象
    2. 不能自动扩容

    Redis Sentinel原理

    首先, 哨兵模式是一种特殊的模式,它是 Redis 高可用的一种实现方案。首先哨兵是一个独立的进程, 可以实现对 Redis 实例的监控、通知、自动故障转移。

    实际上,每个哨兵节点每秒通过 ping 去进行心跳监测(包括所有 redis 实例和 sentinel 同伴),并根据回复判断节点是否在线。

    如果某个 sentinel 线程发现主库没有在给定时间( down-after-milliseconds)内响应这个 PING,则这个 sentinel 线程认为主库是不可用的,这种情况叫 “主观失效”(即SDOWN);这种情况一般不会引起马上的故障自动转移,但是当多个 sentinel 线程确实发现主库是不可用并超过 sentinel.conf 里面的配置项 sentinel monitor mymaster {#ip} {#port} {#number} 中的 #number 时候(这里实际上采用了流言协议),一般其余 sentinel 线程会通过 RAFT 算法推举领导的 sentinel 线程负责主库的客观下线并同时负责故障自动转移,这种情况叫 “客观失效”(即 ODOWN)。

    具体流程如下图所示:

    嗨客网(www.haicoder.net)

    哨兵模式的配置项

    配置项参数类型作用
    port整数启动哨兵进程端口
    dir文件夹目录哨兵进程服务临时文件夹,默认为/tmp,要保证有可写入的权限
    sentinel down-after-milliseconds<服务名称><毫秒数(整数)>指定哨兵在监控Redis服务时,当Redis服务在一个默认毫秒数内都无法回答时,单个哨兵认为的主观下线时间,默认为30000(30秒)
    sentinel parallel-syncs<服务名称><服务器数(整数)>指定可以有多少个Redis服务同步新的主机,一般而言,这个数字越小同步时间越长,而越大,则对网络资源要求越高
    sentinel failover-timeout<服务名称><毫秒数(整数)>指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
    sentinel notification-script<服务名称><脚本路径>指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,比较常用

    Redis哨兵模式配置

    说明

    Redis 三主三从可以最完整的保证数据的完整性,但是所需要的服务器资源也是最多的。在一般情况,统筹兼顾数据完整性和方案经济性,一般最优解是采用一主两从三哨兵的模式,我们使用的配置如下所示:

    实例IP端口备注
    Redis(主)192.168.33.1359500
    Redis(从)192.168.33.1369501
    Redis(从)192.168.33.1339502
    Sentinel(1)192.168.33.13526379默认端口
    Sentinel(2)192.168.33.13626379默认端口
    Sentinel(3)192.168.33.13326379默认端口

    创建目录

    首先,我们在 135 机器上,创建配置存放的目录,命令如下:

    mkdir -p /usr/local/redis/master
    mkdir -p /usr/local/redis/sentinel
    

    创建完毕,如下图所示:

    嗨客网(www.haicoder.net)

    接着,我们在 136 机器上,创建类似的目录,命令如下:

    mkdir -p /usr/local/redis/slave
    mkdir -p /usr/local/redis/sentinel
    

    创建完毕,如下图所示:

    嗨客网(www.haicoder.net)

    最后,我们在 133 机器上,创建目录,命令如下:

    mkdir -p /usr/local/redis/slave
    mkdir -p /usr/local/redis/sentinel
    

    创建完毕,如下图所示:

    嗨客网(www.haicoder.net)

    至此,所有的目录都创建完毕。

    创建主从配置

    我们首先,在 135 机器上,创建 master 的配置,使用 vim 创建对应的配置文件,具体命令如下:

    vim /usr/local/redis/master/redis-master.conf
    

    接着,我们写入如下配置内容:

    bind 0.0.0.0
    port 9500
    logfile "9500.log"
    dbfilename "dump-9500.rdb"
    daemonize yes
    rdbcompression yes
    

    接着,我们在 136 机器上,配置从的配置,使用 vim 创建对应的配置文件,具体命令如下:

    vim /usr/local/redis/slave/redis-slave.conf
    

    接着,我们写入如下配置内容:

    bind 0.0.0.0
    port 9501
    logfile "9501.log"
    dbfilename "dump-9501.rdb"
    daemonize yes
    rdbcompression yes
    
    slaveof 192.168.33.135 9500
    

    我们再次配置 133 机器上的从配置,使用 vim 创建对应的配置文件,具体命令如下:

    vim /usr/local/redis/slave/redis-slave.conf
    

    接着,我们写入如下配置内容:

    bind 0.0.0.0
    port 9502
    logfile "9502.log"
    dbfilename "dump-9502.rdb"
    daemonize yes
    rdbcompression yes
    
    slaveof 192.168.33.135 9502
    

    至此,我们的主从配置已经配置完毕了。

    创建sentinel配置

    我们首先,在 135 机器上,创建 sentinel 的配置,使用 vim 创建对应的配置文件,具体命令如下:

    vim /usr/local/redis/sentinel/sentinel.conf
    

    接着,我们写入如下配置内容:

    port 26379
    logfile "26379.log"
    daemonize yes
    
    # 这里定义主库的IP和端口,还有最后的2表示要达到2台sentinel认同才认为主库已经挂掉
    sentinel monitor mymaster 192.168.33.135 9500 2
    
    # 主库在30000毫秒(即30秒)内没有反应就认为主库挂掉(即主观失效)  
    sentinel down-after-milliseconds mymaster 30000
    
    # 若新主库当选后,允许最大可以同时从新主库同步数据的从库数  
    sentinel parallel-syncs mymaster 1    
    
    # 若在指定时间(即180000毫秒,即180秒)内没有实现故障转移,则会自动再发起一次  
    sentinel failover-timeout mymaster 180000
    

    接着,在 136 和 133 机器创建同样的配置文件,写入一模一样的配置内容。

    启动

    我们首先,在 135 机器启动 Redis 主,具体命令如下:

    redis-server /usr/local/redis/master/redis-master.conf
    

    接着,我们在 136 机器启动 Redis 从,具体命令如下:

    redis-server /usr/local/redis/slave/redis-slave.conf
    

    同样,我们在 133 机器启动 Redis 从,具体命令如下:

    redis-server /usr/local/redis/slave/redis-slave.conf
    

    至此,我们的主从已经启动完毕,现在,我们启动哨兵,首先在 135 机器启动,具体命令如下:

    redis-server /usr/local/redis/sentinel/sentinel.conf --sentinel
    

    接着,在 133 和 136 输入相同的命令启动即可。注意,这里我们直接使用了 redis-server 命令启动了 sentinel,也可以直接使用 redis 提供的 redis-sentinel 工具直接启动。全部启动完毕之后,我们可以使用 ps 命令,查看,具体命令如下:

    ps -ef | grep redis-server
    

    全部启动成功,则输出如下:

    嗨客网(www.haicoder.net)

    主从数据同步

    我们首先,使用 redis-cli 登录 redis master,即 135 机器的 9500 端口,具体命令如下:

    redis-cli -p 9500
    

    接着,我们使用 GET 命令,查看键 URL 的内容,具体命令如下:

    GET URL
    

    执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    同时,我们在 136 机器的 slave 上即 9501 端口,同样查看 URL 的值,执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    最后,我们同样在 133 的 slave 上即 9502 端口查看 URL 的值,执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    我们看到,此时三个机器上的 URL 都为空,现在,我们在 135 机器的 9500 端口也就是 redis master 上设置 URL 的值,具体命令如下:

    SET URL www.haicoder.net
    

    执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    现在,我们可以在两台 slave 上,再次查看 URL 的值,我们发现,这两台 slave 都有对应的值了,如下图所示:

    嗨客网(www.haicoder.net)

    即,我们的主从配置完毕了。

    高可用主从切换

    现在,我们验证高可用,也就是能够实现自动的主动切换,我们首先停掉 master,也就是 135 机器的 9500 端口,我们执行如下命令即可:

    shutdown
    

    执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    此时,我们模拟了主节点宕机了,现在,我们分别查看两个 slave 节点的配置,我们分别登录 133 和 136 机器的 slave,执行如下命令:

    INFO Replication
    

    在 9501 端口执行后,输出如下:

    嗨客网(www.haicoder.net)

    我们看到,此时原来是 slave 的已经自动切换为了 master,这就是哨兵在起作用,实现了故障后的主备切换,如果这时候我们在新的 9501 的 master 上设置数据,并在 9502 端口查看数据,此时也是可以同步数据的。

    更多

    原文链接链接

    其他目录

    更多文章,可以关注下方公众号:

    嗨客网(www.haicoder.net)

    展开全文
  • 搭建Redis高可用集群的哨兵模式Redis-Sentinel)的实例配置,可以为 Redis 容灾+高可用 应用场景提供解决方案Demo
  • 文章目录系列文章目录前言一、Sentinel模式概述二、配置哨兵模式1.启动哨兵总结 前言 在Redis中主从复制解决高可用的方案是:当主节点服务器宕机后,需要手动把一台从节点服务器切换为主节点服务器,手动实现老大...
  • Redis 哨兵模式配置

    2021-03-20 15:30:13
    Redis 哨兵模式配置
  • Redis 哨兵模式,哨兵模式优缺点,哨兵模式配置文件的配置信息 废话不多说,直接上代码(总结) Redis 哨兵模式 1.当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段...
  • redis哨兵模式配置

    2021-11-04 12:16:38
    哨兵是特殊的redis服务,不提供读写服务,主要用来监听redis节点,哨兵模式下,客户端第一次通过哨兵代理访问redis主节点,后续继续访问主节点; 不会每次都通过sentinel代理访问主节点,当redis主节点发生变化,...
  • Redis 哨兵模式原理

    2021-03-21 09:20:58
    Redis 哨兵模式原理
  • redis哨兵模式选举机制

    千次阅读 2020-10-15 10:29:20
    redis集群的主节点故障时,Sentinel集群将从剩余的从节点中选举一个新的主节点,有以下步骤: 故障节点主观下线故障节点客观下线Sentinel集群选举LeaderSentinel Leader决定新主节点 选举过程 1、主观下线 ...
  • Redis 哨兵模式

    2019-04-04 00:35:51
    Redis如何实现主从复制 这篇文章中已经介绍了我们如何搭建一个小的 Redis 集群,从而实现主从复制。但是有一个缺点,master 宕机之后,其余的 slave 会一直等待,这就导致了这...一、什么是哨兵模式 它是反客为...
  • Redis哨兵模式缺点

    2020-12-06 17:36:47
    哨兵模式的搭建过程见:...1. 启动哨兵模式: [root@localhost redis-5.0.10]# ps -ef | grep redis root 2916 1 0 03:19 ? 00:00:03 src/redis-server *:6380 root 3011 1 0
  • Redis哨兵模式 Redis主从模式会出现master挂了就不能用了的状态 什么是哨兵 Sentinel(哨兵)是用于监控Redis集群中Master状态的工具,是Redis高可用解决方案之一.哨兵可以监控一个或多个master服务. 当某个master服务...
  • centos7配置redis哨兵模式 本地服务器演示1主2从3哨兵模式 下载安装redis #安装gcc环境 yum install -y gcc #下载redis安装包 wget http://download.redis.io/releases/redis-5.0.3.tar.gz #解压文件 tar...
  • Redis哨兵模式搭建

    2021-08-24 21:25:44
    哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。 这里的哨兵有两个作用 ...
  • Redis 哨兵模式详解

    2020-06-21 15:28:06
    主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力...Redis哨兵 这里的哨兵有两个作用 1.通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和
  • Redis 哨兵模式主要是为Redis主从同步架构服务的,有时候主节点宕机,需要哨兵进行监控、通知,选举。 哨兵是干什么用的? sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: ...
  • Redis哨兵模式+主从同步 环境准备 参考教程 -主机配置有误可不配置replicaof-或重启后执行 replicaof no one 三台CentOS 7 64 位虚拟机1192.168.2.5-redis_master+sentinel1、192.168.2.6-redis_slave1+sentinel2、...
  • Redis哨兵模式(Sentinel)以及场景实践 根据我们上篇中所用到的模型是一个Master两个Salve节点,那么当Master宕机时,两个从节点是无法进行写操作的,那势必会影响我们程序的正常使用,有没有什么办法可以在Master宕...
  • Redis 哨兵模式设置密码

    千次阅读 2020-12-17 18:02:16
    1. redis.conf requirepass 123456 #添加密码 2. sentinel.conf sentinel auth-pass mymaster 123456 #连接master密码 slave修改 1. redis.conf masterauth 123456 #连接master密码 slaveof 10.100.134.109 6379 #...
  • map=C:\Users\YULIAN~1\AppData\Local\Temp\go-build993173394=/tmp/go-build -gno-record-gcc-switches D:\code> 二、安装依赖包 go get -u github.com/go-redis/redis/v8 三、代码功能 package main import ( ...
  • 前两天在做Redis主从复制、哨兵模式)部署时,启动哨兵模式时失败 服务起不来一般是环境问题,后来我查了配置文件啥的都没有任何问题 可能就是安装服务时没有做软链接 重新做一下软链接 就启动成功了 ...
  • 基于docker实现Redis哨兵模式

    千次阅读 2019-12-03 18:50:31
    基于docker实现Redis哨兵模式 下载docker Redis镜像 docker pull redis 运行容器 sudo docker run -d --name redis-0 -p 6380:6379 redis redis-server # 作为主机 sudo docker run -d --name redis-1 -p 6381:6379...
  • 在一台linux服务器上如何部署redis哨兵模式 本人第一次写技术博客,如有不妥,请大家多多指点,多多包涵,话不多说,直接进入正题。 loading。。。。。。 目标:在一台linux服务器上部署一主两从三哨兵。大致操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,676
精华内容 11,070
关键字:

redis哨兵模式

redis 订阅