古有民主选举,今有Redis哨兵选举,到底哪家强
Redis 到底 哨兵 选举 哪家
2023-09-14 09:14:06 时间
Redis哨兵模式
由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
主节点如果挂掉以后,从节点就进行选举,选举出来的从节点升级为新的主节点继续提供服务,高可用就这么来。如果主节点又恢复了,那它会变为从节点。
安装docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如果慢,可以换一个源:
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
加上可执行权限,不然报错:
chmod +x /usr/local/bin/docker-compose
Sentinel配置
Sentinel配置文件路径:
/usr/local/etc/redis/sentinel/sentinel
redis-sentinel-1.conf
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26379
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
redis-sentinel-2.conf
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26380
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
redis-sentinel-3.conf
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26381
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
Redis服务配置
Redis配置文件路径:
/usr/local/etc/redis/sentinel/server
redis-master.conf
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6379
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
redis-slave1.conf
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6380
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 127.0.0.1 6379
# 设定连接主节点所使用的密码
masterauth "123456"
redis-slave2.conf
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6381
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 127.0.0.1 6379
# 设定连接主节点所使用的密码
masterauth "123456"
docker-compose配置
sentinel和redis-server分别用两个docker-compose文件来管理
sentinel的docker-compose.yml文件
version: '3'
services:
redis-sentinel-1:
image: redis
container_name: redis-sentinel-1
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
volumes:
- ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
sysctls:
net.core.somaxconn: '511'
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis-sentinel-2:
image: redis
container_name: redis-sentinel-2
restart: always
network_mode: host
volumes:
- ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
environment:
TZ: "Asia/Shanghai"
sysctls:
net.core.somaxconn: '511'
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis-sentinel-3:
image: redis
container_name: redis-sentinel-3
restart: always
network_mode: host
volumes:
- ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
environment:
TZ: "Asia/Shanghai"
sysctls:
net.core.somaxconn: '511'
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis的docker-compose文件
version: '3'
services:
# 主节点的容器
redis-server-master:
image: redis
container_name: redis-server-master
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
volumes:
# 映射配置文件和数据目录
- ./redis-master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-master:/data
sysctls:
# 必要的内核参数
net.core.somaxconn: '511'
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# 从节点1的容器
redis-server-slave-1:
image: redis
container_name: redis-server-slave-1
restart: always
network_mode: host
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-slave-1:/data
sysctls:
net.core.somaxconn: '511'
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# 从节点2的容器
redis-server-slave-2:
image: redis
container_name: redis-server-slave-2
restart: always
network_mode: host
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-slave-2:/data
sysctls:
net.core.somaxconn: '511'
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
验证
启动redis
在/usr/local/etc/redis/sentinel/server路径下执行:
docker-compose up
启动sentinel
在/usr/local/etc/redis/sentinel/sentinel路径下执行:
docker-compose up
进入master容器 查看主从架构是否生效了,如下即成功:
[root@localhost ~]# docker exec -it redis-server-master redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=190590,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=190590,lag=1
master_failover_state:no-failover
master_replid:8d6ec50446b2306270b70356d5cf81ea76129b54
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:190590
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:190590
127.0.0.1:6379>
docker logs -f d939e819ac13观察某个从节点的sentinel日志,如下主节点被监视了:
1:X 12 Sep 2021 10:11:45.905 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:X 12 Sep 2021 10:11:45.905 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started
1:X 12 Sep 2021 10:11:45.905 # Configuration loaded
1:X 12 Sep 2021 10:11:45.906 * monotonic clock: POSIX clock_gettime
1:X 12 Sep 2021 10:11:45.906 * Running mode=sentinel, port=26381.
1:X 12 Sep 2021 10:11:45.908 # Could not rename tmp config file (Device or resource busy)
1:X 12 Sep 2021 10:11:45.908 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 12 Sep 2021 10:11:45.908 # Sentinel ID is 4df8fd12a5a280636083a61c7e594e6138882ff5
1:X 12 Sep 2021 10:11:45.908 # +monitor master local-master 127.0.0.1 6379 quorum 2
1:X 12 Sep 2021 10:11:45.909 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ local-master 127.0.0.1 6379
1:X 12 Sep 2021 10:11:45.910 # Could not rename tmp config file (Device or resource busy)
1:X 12 Sep 2021 10:11:45.910 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 12 Sep 2021 10:11:45.910 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ local-master 127.0.0.1 6379
1:X 12 Sep 2021 10:11:45.911 # Could not rename tmp config file (Device or resource busy)
1:X 12 Sep 2021 10:11:45.911 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 12 Sep 2021 10:11:46.126 * +sentinel sentinel fecee9b49cacd13b4d2bade4c5769b267c55e123 127.0.0.1 26380 @ local-master 127.0.0.1 6379
1:X 12 Sep 2021 10:11:46.127 # Could not rename tmp config file (Device or resource busy)
1:X 12 Sep 2021 10:11:46.127 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 12 Sep 2021 10:11:46.832 * +sentinel sentinel 0aedbee9c2fc1b6f6622cd1502ab6d9ffaf4c5c6 127.0.0.1 26379 @ local-master 127.0.0.1 6379
1:X 12 Sep 2021 10:11:46.833 # Could not rename tmp config file (Device or resource busy)
1:X 12 Sep 2021 10:11:46.833 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
关闭master
docker stop redis-server-master
docker logs -f d939e819ac13观察某个从节点的sentinel日志,查看选主过程
查看从节点是否变为了主节点
slave-1 正式上位
恢复master 看看是否变为了从节点
[root@localhost ~]# docker exec -it redis-server-master /bin/bash
root@localhost:/data# redis-cli -p 6379
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:ef06dce07bf7c4d76008a68ba1789d33dea59773
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
相关文章
- Redis实战:中文PDF版(redis实战中文pdf)
- Redis:超越传统内存数据库(redis内存数据库)
- 构建Java应用程序中Redis集群的方法(java连redis集群)
- Redis哨兵保障系统高可用性(redis连接哨兵)
- 中数据入Redis一步一步实现(怎么把数据存入redis)
- 腾讯云购买Redis 云存储新开启(腾讯云购买云redis)
- 探索Redis 查询当前里面的宝藏(查询当前redis里有啥)
- 查看Redis哨兵集群一步一步的指南(查看redis哨兵集群)
- 享受最快速度,搭建Redis集群吧(最快redis集群)
- 数据库与Redis实现卓越性能的典范(数据库和redis)
- Redis中的一主一从一哨兵模式(一主一从一哨兵redis)
- wdcpv3优化之Redis缓存的极致体验(wdcpv3 redis)
- 使用Redis技术实现精确的阻塞锁(利用redis实现阻塞锁)
- 如何查看Redis链接数的简单方法(如何查redis链接数)
- 增强Redis安全性,就需要多哨兵(多哨兵redis)
- 服务基于Redis开发的即时通讯系统(基于redis的即时通讯)
- 利用Redis哨兵模式实现高可用性(redis高可用哨兵模式)
- Redis高可用架构引入哨兵保障(redis 高可用和哨兵)
- Redis是否需要哨兵服务(redis 需要哨兵吗)
- Redis集群实现高可用哨兵的神奇功能(redis集群哨兵的功能)
- 实现高可用构建Redis集群和哨兵集群(redis集群和哨兵集群)
- 使用分布式存储构建之道Redis集群哨兵混合配置(redis集群和哨兵混合)
- 密码登录禁用密码,安全使用Redis集群(redis集群不使用)
- Redis阻塞如何快速排查原因(redis阻塞 如何排查)
- 解析Redis队列它到底是否阻塞(redis队列是阻塞的吗)
- 揭秘Redis到底用哪个版本(redis 都用什么版本)
- 哨兵助力Redis高效实现集群连接(redis通过哨兵连接)
- Redis选举与哨兵双重保障(redis选举和哨兵)
- Redis安全守护连哨兵协助(redis连哨兵)