首页 > 数据库 >Redis搭建哨兵模式架构

Redis搭建哨兵模式架构

时间:2023-09-24 11:11:55浏览次数:52  
标签:架构 6379 Redis redis 哨兵 etc master conf sentinel

使用Docker安装

因为配置太复杂,所以这里我们使用 docker compose 来一键部署

不使用内部网络搭建

编写redis主从docker-compose.yml

version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    restart: always
    command: redis-server --requirepass test123  --appendonly yes
    ports:
      - 6390:6379
    volumes:
      - /root/test_redis/master_slave/data1:/data
  slave1:
    image: redis
    container_name: redis-slave1
    restart: always
    command: redis-server --slaveof ${your_ip} 6390  --requirepass test123 --masterauth test123  --appendonly yes
    ports:
      - 6391:6379
    volumes:
      - /root/test_redis/master_slave/data2:/data
  slave2:
    image: redis
    container_name: redis-slave2
    restart: always
    command: redis-server --slaveof ${your_ip} 6390  --requirepass test123 --masterauth test123  --appendonly yes
    ports:
      - 6392:6379
    volumes:
      - /root/test_redis/master_slave/data3:/data

配置主机密码为 test123 并开启AOF,端口号为6390

启动Redis主从

docker-compose up -d

编写哨兵docker-compose.yml

version: '3'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel1
    restart: always
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - /root/test_redis/sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel2
    restart: always
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - /root/test_redis/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - /root/test_redis/sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf

注意,两个docker-compose.yml文件必须位于不同的目录下,也要打开防火墙的端口 26379,26380,26381。

编写哨兵sentinel.conf

# 自定义集群名,其中 master_host 为 redis-master 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
port 26379
dir /tmp
sentinel monitor mymaster ${master_host} 6390 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster test123
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

将上述文件拷贝3份分别命名为sentinel1.conf、sentinel2.conf、sentinel3.conf,与docker-compose.yml中的配置文件对应。

启动哨兵

docker-compose up -d

查看容器,可以看到哨兵和主从redis都起来了

关掉master节点

docker stop redis-master

出现的问题

master节点停掉之后,哨兵并没有将另外的slave节点提升为master,结合网上资料,可能是因为没有使用同一个网络,所以哨兵和master/slave节点不能进行通信。

使用内部网络搭建

配置docker-compose.yml文件

version: "3"

networks:
  redis-replication:
    driver: bridge
    ipam:
      config:
        - subnet: 172.25.0.0/24

services:
  master:
    image: redis
    container_name: redis-master
    ports:
      - "6380:6379"
    volumes:
      - "/root/test_redis/sentinel_with_network/redis1.conf:/etc/redis.conf"
      - "/root/test_redis/sentinel_with_network/data1:/data"
    command: ["redis-server", "/etc/redis.conf"]
    restart: always
    networks:
      redis-replication:
        ipv4_address: 172.25.0.101

  slave1:
    image: redis
    container_name: redis-slave1
    ports:
      - "6381:6379"
    volumes:
      - "/root/test_redis/sentinel_with_network/redis2.conf:/etc/redis.conf"
      - "/root/test_redis/sentinel_with_network/data2:/data"
    command: ["redis-server", "/etc/redis.conf"]
    restart: always
    networks:
      redis-replication:
        ipv4_address: 172.25.0.102

  slave2:
    image: redis
    container_name: redis-slave2
    ports:
      - "6382:6379"
    volumes:
      - "/root/test_redis/sentinel_with_network/redis3.conf:/etc/redis.conf"
      - "/root/test_redis/sentinel_with_network/data3:/data"
    command: ["redis-server", "/etc/redis.conf"]
    restart: always
    networks:
      redis-replication:
        ipv4_address: 172.25.0.103
  
  sentinel1:
    image: redis
    container_name: redis-sentinel1
    ports:
      - "26380:26379"
    volumes: 
      - "/root/test_redis/sentinel_with_network/sentinel1.conf:/etc/sentinel.conf"
    command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]
    restart: always
    networks:
      redis-replication:
        ipv4_address: 172.25.0.201

  sentinel2:
    image: redis
    container_name: redis-sentinel2
    ports:
      - "26381:26379"
    volumes: 
      - "/root/test_redis/sentinel_with_network/sentinel2.conf:/etc/sentinel.conf"
    command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]
    restart: always
    networks:
      redis-replication:
        ipv4_address: 172.25.0.202

  sentinel3:
    image: redis
    container_name: redis-sentinel3
    ports:
      - "26382:26379"
    volumes: 
      - "/root/test_redis/sentinel_with_network/sentinel3.conf:/etc/sentinel.conf"
    command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]
    restart: always
    networks:
      redis-replication:
        ipv4_address: 172.25.0.203

配置 redis.conf 文件

  • Master:
port 6379
pidfile /var/run/redis_6379.pid
protected-mode no
timeout 0
tcp-keepalive 300
loglevel notice
requirepass szz123
masterauth szz123
################################# REPLICATION #################################
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no

##################################### RDB #####################################
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dir ./

##################################### AOF #####################################
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
aof-load-truncated yes
aof-use-rdb-preamble no

由于在切换master的时候,原本的master可能变成slave,故也需要在原本的master上配置masterauth

  • Slave1:
    在 REPLICATION 中添加 slaveof 设置即可:
slaveof 172.25.0.101 6379
  • Slave2:
slaveof 172.25.0.101 6379

redis1.conf,redis2.conf,redis3.conf

配置 sentinel.conf 文件

三个哨兵文件夹都配置一份

# 所有哨兵端口都一致,因为使用 Docker 桥接网络映射 
port 26379

# 哨兵设置,所有哨兵皆一致,都指向 Master
sentinel monitor mymaster 172.25.0.101 6379 2
sentinel auth-pass mymaster test123
sentinel parallel-syncs mymaster 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000

bind 0.0.0.0
protected-mode no
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp

sentinel1.conf,sentinel2.conf,sentinel3.conf 内容都一样

启动服务

docker-compose up -d

查看主从配置是否正常

Master 的输出:

查看各哨兵是否正常

Sentinel1:

可以看到 +monitor 配置、两次 +sentinel 记录和两次 +slave 记录,且各连接的 ip 和 port 信息都正确,此哨兵正常运行。Sentinel2 和 Sentinel3 也是同样的输出。

验证哨兵

Master宕机

主动停止 Master 容器,等待配置的失活判定时间过后,看哨兵是否识别并选举新的 Master:

docker stop redis-master

此时 Sentinel1 输出

  • 哨兵 sdown 主观判断 Master 失活,接着所有哨兵 odown 客观判断 Master 失活。此时 +new-epoch 1 进入第一轮选举。
  • 接着 +selected-slave slave 172.25.0.102:6379 选举出 102,即 Slave2 作为新的 Master,再 +promoted-slave 推举 Slave2 为新的 Master。
  • 最终依旧会去看 101 是否回来了,+sdown slave 172.25.0.101:6379 172.25.0.101 6379 @ mymaster 172.25.0.102 6379 发现 101 还没上线。

登录 slave2 查看

info replication

结果可以看到确实已经变成了master,且有一个slave

原 Master 重新上线

查看哨兵反应:

发现 -sdown slave 172.25.0.101:6379,即把 101 Slave(原 Master)的 down 状态取消掉。

再次查看 slave2

info replication

已经有了两个slave,至此,关于哨兵模式的配置终于搞定了。

参考

【Redis】docker compose 部署哨兵集群模式-重要
5分钟实现用docker搭建Redis集群模式和哨兵模式
使用Docker-Compose搭建高可用redis哨兵集群-主要是桥接网络
Docker Compose-菜鸟教程

标签:架构,6379,Redis,redis,哨兵,etc,master,conf,sentinel
From: https://www.cnblogs.com/strongmore/p/17131259.html

相关文章

  • 组播网络基本架构
    组播关键技术1)源端网路:将组播源产生的组播数据发送至组播网络2)组播转发网络:形成无环的组播转发路径,该转发路径也称为组播分发树(MulticastDistributionTree)3)成员端网络:让组播网络感知组播成员位置与加入的组播组组播协议1)组播协议:PIMDM、PIMSM2)成员端管理协议:IGMPv1、v2、v3......
  • Redis7 数据持久化RDB
    一、概述1、官网介绍2、是什么在指定时间间隔,执行数据集的时间点快照实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。这个快照文件就称为RDB文件(dump.rdb),其中,R......
  • Hadoop架构原理 hadoop 架构
    Hadoop1、Hadoop2.0提供分布式存储(HDFS)和分布式操作系统(Yarn)两大功能软件包2、Hadoop1.0项目模块HadoopCommon:支持其他模块的公用组件HadoopDistributedFileSystem(HDFS):Hadoop的分布式文件系统HadoopMapReduce:分布式计算框架。Common是联系HDFS和MapReduce的纽带,它一......
  • Redis 下载和安装(Windows)教程
    下载虽然Redis官方网站没有提供Windows版的安装包,但可以通过GitHub来下载Windows版Redis安装包。下载地址:https://github.com/tporadowski/redis/releases打开上述的下载链接,Redis支持32位和64位的Window系统,如图所示:下载完成后,解压压缩包,您会看到如下图......
  • Redis主从复制,高可用性面试题
    参考链接:https://xiaolincoding.com/redis/cluster/master_slave_replication.html#%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%90%8C%E6%AD%A5 主从第一步同步的过程? 分成三步进行:1、建立连接,从服务器获得主服务的id和复制位置,一开始是-1。2、主服务器fork一个子进程用来创建当前的R......
  • Redis 安装部署
    ---Redis安装部署---//环境准备systemctlstopfirewalldsystemctldisablefirewalldsetenforce0sed-i's/enforcing/disabled/'/etc/selinux/config#修改内核参数vim/etc/sysctl.confvm.overcommit_memory=1#当设置为1时,表示内存过度承诺启用net.core.somax......
  • yum安装最新版redis
    因为yum默认安装的是redis3.0.7,无法使用布隆插件,所以升级redis最新版。网上找了一大把资料,全是编译安装,心累,所以记录下面yum安装方式。1.安装epel源:yuminstallepel-release2.安装remi软件源yuminstall(废弃)3.安装redis yum--enableerepo=remiinstallredis4.启动r......
  • redis Cluster(主从集群)
    redisCluster(主从集群)Redis的主从同步机制得分点psync,全量复制、部分复制标准回答Redis主从同步是指任意数量的从节点(slavenode)都可以从主节点上(masternode)同步数据。而除了多个slave可以连接到同一个master之外,slave还可以接受其他slave的连接,这就形成一个树形......
  • Redis 数据类型
    Redis数据类型参考文档:Redis命令中心(Rediscommands)--Redis中国用户组(CRUG)redis基本操作命令-简书(jianshu.com)Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zsetsortedset(有序集合)。我们实际项目中比较常用的是string,hash如果你是Redis中高......
  • Redis持久化
    Redis持久化Redis的持久化-WK_BlogYard-博客园(cnblogs.com)‍我们知道,Redis数据库中的数据都是存放在内存中,虽然很高效,但是这样存在一个非常严重的问题,如果突然停电,那我们的数据不就全部丢失了吗?它不像硬盘上的数据,断电依然能够保存。这个时候我们就需要持久化,我们需......