redis如何配置哨兵集群?

2023-10-27

前言

前面我们介绍了主从复制集群模式, 但是存在一个问题, redis在主从集群中好像没有共识算法, 比如raft

那么在master挂掉的情况下, 就无法从几个slave节点中自主选举出一个新的 master 节点

redis提供了新的方案, 哨兵机制

本章内容

  1. 哨兵如何发现redis节点的状态? (哨兵是如何工作的?)
  2. 如何搭建哨兵集群?

哨兵是如何工作的?

发现问题

哨兵监控redis主从集群各个节点的状态, 以ping pong的方式发送心跳包

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

•主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。(个人认为它下线了)

•客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。(大多数人都认为它下线了)

解决问题

集群故障转移Failover

发现master客观下线, 那么哨兵就会在几个salve集群中选举出一个新的master

Q: 选举条件是什么?

A: 受害者陈某某挂了, 你觉得作为侦探你应该找谁?

条件大概就这些:

  • 谁是最后跟陈某某接触的?(数据最新)
  • 谁跟陈某某已经就存在矛盾(数据相同, 选slave优先级高的)
  • 大家都有嫌疑, 那就找住离陈某某最近的(根据slave的id大小选择, 越小优先级越高)

既然选出了master节点, 那么我们需要怎么切换节点呢?

流程如下:

  • sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
  • sentinel给所有其它slave发送slaveof 192.168.150.101 7002 命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
  • 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的masterslave节点

image.png

搭建哨兵集群

准备

由于哨兵集群有超过一半的投票的确定客观下线的功能, 所以一般哨兵集群为单数, 所以我准备建立三台sentinel哨兵

image.png

步骤

  1. 编写sentinel.conf
  2. 编写docker-compose.yml

编写sentinel.conf

# sentinel_26379.conf
port 26379
dir /tmp
# 自定义集群名, 其中 192.168.7.2 为 redis 集群 master 主节点的 ip
# 6379 是 master 主节点在本机的端口
# 2 为最小投票数量, 3 台 sentinel 有两台才算投票通过
sentinel monitor mymaster 192.168.7.2 6379 2
# 主节点下线10秒才开始选新节点
sentinel down-after-milliseconds mymaster 10000
# 指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步
# 这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大
# 就意味着越多的slave因为replication而不可用
# 可以通过将这个值设为1来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
#sentinel_26380.conf
port 26380
dir /tmp
sentinel monitor mymaster 192.168.7.2 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
#sentinel_26381.conf
port 26381
dir /tmp
sentinel monitor mymaster 192.168.7.2 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

192.168.7.2这个ip, 就是redis主从集群的master ip地址, 端口也是 master的端口

编写docker-compose.yml

version: '3.9'

services:
  redis-sentinel-26379:
    image: redis:7.0.9
    restart: always
    privileged: true
    hostname: redis_sentinel_26379
    container_name: redis_sentinel_26379
    ports:
      - 26379:26379
    volumes:
      - /root/redis_sentinel_cluster/26379/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.5
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  redis-sentinel-26380:
    image: redis:7.0.9
    restart: always
    privileged: true
    hostname: redis_sentinel_26380
    container_name: redis_sentinel_26380
    ports:
      - 26380:26380
    volumes:
      - /root/redis_sentinel_cluster/26380/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.6
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  redis-sentinel-26381:
    image: redis:7.0.9
    restart: always
    privileged: true
    hostname: redis_sentinel_26381
    container_name: redis_sentinel_26381
    ports:
      - 26381:26381
    volumes:
      - /root/redis_sentinel_cluster/26381/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.7
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
networks:
  redis_cluster:
    name: redis_cluster
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.7.1/24

验证

关闭掉

image.png

主节点

然后进入

image.png

image.png

说明 sentinel 集群生效了

当然我们也可以通过 下面方式查看sentinel状态

root@redis_sentinel_26381:/data# redis-cli -p 26381
127.0.0.1:26381> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.7.3"
 5) "port"
 6) "6379"
 7) "runid"
 8) "6ea1efe878683bfbfe519cf72f5b0967a1883079"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "716"
19) "last-ping-reply"
20) "716"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "2145"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "534140"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26381> 

mymaster就是在sentinel.conf中配置的名字

总结

哨兵存在的意义是redis主从集群没有共识算法, 或者说没有选举算法, 所以在master挂掉之后, 无法执行选举出一个新的master, 需要sentinel哨兵集群做监控

sentinel哨兵集群使用心跳包的方法, 监听redis主从集群的状态, 通常是每秒1次, ping

发现问题之后, 走故障转移流程, 通过选举出新的master, 然后切换master链接

选举的条件是 数据越新越好, 如果数据的版本一直的话(offset), 那么看哪个slave等级越高越好, 如果等级都一样, 那么看哪个slave的id越小越好

如果优先级为 0 则不参与master选举

image.png

从这里看

image.png

我们的redis_cluster集群配置文件 docker-compose.yml 需要更改下

version: '3.9'

services:
  redis-master-6379:
    build: .
    restart: always
    privileged: true
    hostname: redis_6379
    container_name: redis_6379
    ports:
      - 6379:6379
      - 16379:16379
    volumes:
      - /root/redis_cluster/master/6379/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/master/6379/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.2
    command: redis-server /usr/local/etc/redis/redis.conf
  redis-slave-6380:
    build: .
    restart: always
    privileged: true
    hostname: redis_6380
    container_name: redis_6380
    ports:
      - 6380:6379
      - 16380:16379
    volumes:
      - /root/redis_cluster/slave/6380/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/slave/6380/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.3
    command: redis-server /usr/local/etc/redis/redis.conf
  redis-slave-6381:
    build: .
    restart: always
    privileged: true
    hostname: redis_6381
    container_name: redis_6381
    ports:
      - 6381:6379
      - 16381:16379
    volumes:
      - /root/redis_cluster/slave/6381/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/slave/6381/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.4
    command: redis-server /usr/local/etc/redis/redis.conf
networks:
  redis_cluster:
    name: redis_cluster
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.7.1/24

改成

version: '3.9'

services:
  redis-6379:
    build: .
    restart: always
    privileged: true
    hostname: redis_6379
    container_name: redis_6379
    ports:
      - 6379:6379
      - 16379:16379
    volumes:
      - /root/redis_cluster/master/6379/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/master/6379/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.2
    command: redis-server /usr/local/etc/redis/redis.conf
  redis-6380:
    build: .
    restart: always
    privileged: true
    hostname: redis_6380
    container_name: redis_6380
    ports:
      - 6380:6379
      - 16380:16379
    volumes:
      - /root/redis_cluster/slave/6380/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/slave/6380/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.3
    command: redis-server /usr/local/etc/redis/redis.conf
  redis-6381:
    build: .
    restart: always
    privileged: true
    hostname: redis_6381
    container_name: redis_6381
    ports:
      - 6381:6379
      - 16381:16379
    volumes:
      - /root/redis_cluster/slave/6381/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/slave/6381/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.4
    command: redis-server /usr/local/etc/redis/redis.conf
networks:
  redis_cluster:
    name: redis_cluster
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.7.1/24

把预先设定的 master 和 slave 容器名字改下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis如何配置哨兵集群? 的相关文章

随机推荐

  • 矩阵特征值与行列式、迹的关系

    矩阵的特征值之和等于矩阵的行列式 矩阵的特征值之积等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思考 x 2 bx c 0 这个方程的所有根的和等于多少 所有根的积等于多少 2 把二次方程推广到 N 次
  • Linux下安装opencv with-ffmpeg解决无法读取视频的问题

    Linux下安装opencv with ffmpeg解决无法读取视频的问题 参考文章 1 Linux下安装opencv with ffmpeg解决无法读取视频的问题 2 https www cnblogs com haiyang21 p 1
  • 求最大公约数,最小公倍数(c++)

    文章目录 最大公约数 质数和合数 公约数 计算最大公约数 辗转相除法 最小公倍数 最大公约数 质数和合数 质数也称素数 指大于1 并且除了1和它自己 不能被任何其他自然数整除的数 除了1和质数的其他自然数称为合数 合数必定可以分解成2个或以
  • Spring Cloud中的服务注册和发现是怎样实现的?Spring Boot和Spring Cloud的关系是怎样的?Spring的核心容器包括哪些模块?Spring的Bean作用域有哪些?它们的区

    1 Spring Cloud中的服务注册和发现是怎样实现的 在Spring Cloud中 服务注册和发现是通过Eureka来实现的 Eureka是Netflix开源的一个服务治理组件 用于实现服务注册和发现的功能 具体来说 服务的提供方会在
  • vue3使用jodit富文本编辑器,自定义各项配置及组件封装

    目录 常用配置 设置中文 字体设置 CDN的引用 图片上传 对编辑器中生成的元素添加默认属性 组件封装 本文使用时的版本 vue 3 2 36 jodit 3 24 7 Jodit 是国外编写的一个功能强大的富文本编辑器 有常规版本和PRO
  • “数据库事务(Database Transaction)

    事务的使用 关于事务 我今天要把自己放在一个初学者的心态来写这篇文章 之前几篇文章大多讲的是对于Winner的应用 今天要从根本上来讲 一下 事务 以及事务在Winner中的应用 首先从基础讲起 什么是 事务 事务能帮我们解决哪些问题 摘录
  • 每日一解 戳气球(困难的动归)

    题目 戳气球 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 如果你戳破气球 i 就可以获得 nums left nums i nums right 个硬币 这里的
  • Unit Test 5--编写第一个单元测试

    大家好 我是神韵 是一个技术 生活博主 出文章目的主要是两个 一是好记忆不如烂笔头 记录总结中提高自己 二是希望我的文章可以帮到大家 欢迎来点赞打卡 你们的行动将是我无限的动力 本篇主题是 编写第一个单元测试 其它文章链接 Unit Tes
  • 几个小程序

    1 求变量val中1的个数 方法1 逐个去比较 int getNum1 int val int num 0 while val num val 0x01 val val gt gt 1 return num 方法2 使用x x 1 int
  • pycharm中通过命令行运行程序,进行程序调试

    1 点击菜单栏run gt edit configurations 2 如果命令行输入python ecode py users items 则在parameters框中输入 users items
  • Ubuntu下启动idea的方法

    最近在ubuntu下部署网站 使用IDEA进行开发 但是平时使用linux比较少 所以一路上踩到了很多坑 光是idea的启动就折腾了半天 后来发现是输入的命令有问题 安装好IDEA以后 应该进入安装目录的bin文件夹下 关键点来了 linu
  • K8S 网络问题导致 ns 相关的服务不能互相访问

    背景 近期重新部署了一套K8S环境 是基于本机虚拟机 采用 Kuboard Spray 方式 使用 KuboardSpray 安装kubernetes v1 23 1 Kuboard 安装成功后 并无感觉不妥 看到 pod 状态都是 run
  • 初探强化学习

    1 引言 人生中充满选择 每次选择就是一次决策 我们正是从一次次决策中 把自己带领到人生的下一段旅程中 在回忆往事的时候 我们会对生命中某些时刻的决策印象深刻 还好当时选择了读研 毕业后找到了一份自己喜欢的工作 如果当初接受那家公司的off
  • Docker : Docker 查看容器 IP 地址以及相关信息

    1 美图 2 查看Docker的底层信息 docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 base lcc lcc docker inspect es4 Id 4b1215a95bf712
  • js深拷贝与浅拷贝

    区别 浅拷贝只是增加了一个指针指向已存在的内存地址 仅仅是指向被复制的内存地址 如果原地址发生改变 那么浅拷贝复制出来的对象也会相应的改变 深拷贝是增加了一个指针并且申请了一个新的内存 使这个增加的指针指向这个新的内存 浅拷贝 一 Java
  • C++ 如何从string中删除一个字符

    使用编程软件 dev5 4 0 方法一 使用iterator和erase 删除与 it 所指字符第一个相同的 注 经反应将第一个代码改了下并在VS2017里运行通过了 代码如下 include
  • Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】

    我在B站学运维之Jenkins持续集成和交付快速入门介绍与安装 1 https www bilibili com read cv13512558 我在B站学运维之Jenkins持续集成和交付入门基础使用与集成部署实践 2 https www
  • Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map

    Reason No converter found capable of converting from type java lang String to type java util Map
  • mmdetection源码笔记(五):测试之test.py的解读

    引言 在test阶段有以下几个方法 single gpu test 顾名思义 就是单GPU测试 该方法在main 中调用 当不分布式测试的时候 则运行次测试方法 该方法的实现中 其实是调用了检测器测试过程的forward 前向计算过程 以c
  • redis如何配置哨兵集群?

    前言 前面我们介绍了主从复制集群模式 但是存在一个问题 redis在主从集群中好像没有共识算法 比如raft 那么在master挂掉的情况下 就无法从几个slave节点中自主选举出一个新的 master 节点 redis提供了新的方案 哨兵