redis哨兵模式实现主从故障切换

本文详细介绍了如何使用Docker Machine快速搭建Redis哨兵模式集群,包括主从服务器及哨兵节点的配置,实现自动故障迁移及主从切换,确保Redis服务高可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式系统:
分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。

介绍:

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

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

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

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

搭建:

1.搭建docker-machine
我使用的是docker-machine搭建的,因为可以减少搭建系统、重新搭建docker的多诸多繁琐步骤。
(1)首先安装docker-machine:

curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
install /tmp/docker-machine /usr/local/bin/docker-machine

(2)完成后,查看版本信息。

docker-machine -v
docker-machine version 0.14.0, build 89b8332

(3)创建虚拟机:


docker-machine create -d virtualbox master
docker-machine create -d virtualbox slave
docker-machine create -d virtualbox sentinel


(4)获取IP

docker-machine ls
xqkang@xqkang:~$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
master     -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5   
sentinel   -        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.5   
slave      -        virtualbox   Running   tcp://192.168.99.101:2376           v19.03.5  

(5)连接虚拟机

docker-machine ssh master
docker-machine ssh slave
docker-machine ssh sentinel

搭建redis哨兵模式

设计思想:

id主从
192.168.99.100主redis
192.168.99.101从redis

一、主redis搭建
在主节点master上的/qj/redis/data目录下创建redis.conf文件,文件配置如下

bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380                       
timeout 300                     
loglevel warning                        
logfile "redis.log"                    
databases 16                        
rdbcompression yes                     
dbfilename "redis.rdb"                     
dir "/data"                    
requirepass qj12345678@
masterauth qj12345678@
maxclients 10000
maxmemory 1000mb                        
maxmemory-policy allkeys-lru                        
appendonly yes          
appendfsync always

docker启动命令

docker run -d --name redis --restart=always -p 6380:6380 -v /qj/redis/data/:/data -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone redis:latest redis-server redis.conf

二、从redis搭建

在从节点/qj/redis/data目录下,创建redis.conf配置文件
配置内容如下所示:

bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"                       
port 6380                       
timeout 300                     
loglevel warning                        
logfile "redis.log"                    
databases 16                       
rdbcompression yes                     
dbfilename "redis.rdb"                     
dir "/data"                    
requirepass qj12345678@
masterauth qj12345678@
maxclients 10000                        
maxmemory 1000mb                        
maxmemory-policy allkeys-lru                        
appendonly  yes                       
appendfsync always                      
slaveof 192.168.99.100 6380

docker启动命令如下:

docker run -d --name redis --restart=always -p 6380:6380 -v /qj/redis/data/:/data -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone redis:latest redis-server redis.conf

搭建哨兵集群:

服务器名称IP端口
sentinel-1192.168.99.10026379
sentinel-2192.168.99.10126379
sentinel-3192.168.99.10226379

配置文件目录:/qj/sentinel/sentinel.conf
192.168.99.100搭建sentinel-1
sentinel.conf配置文件如下所示:

daemonize no
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10

docker启动命令如下所示:

docker run -d -p 26379:26379 --name sentinel-1 --network host -v /qj/sentinel/sentinel.conf:/data/sentinel.conf -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone --restart=always redis:latest redis-sentinel sentinel.conf

192.168.99.101搭建sentinel-2
sentinel.conf配置文件如下所示:

daemonize no
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10

docker启动命令如下所示:

docker run -d -p 26379:26379 --name sentinel-2 --network host -v /qj/sentinel/sentinel.conf:/data/sentinel.conf -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone --restart=always redis:latest redis-sentinel sentinel.conf

192.168.99.102搭建sentinel-3
sentinel.conf配置文件如下所示:

daemonize no
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.99.100 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10

docker启动命令如下所示:

docker run -d -p 26379:26379 --name sentinel-3 --network host -v /qj/sentinel/sentinel.conf:/data/sentinel.conf -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone --restart=always redis:latest redis-sentinel sentinel.conf

4.检测哨兵集群是否成功
查看sentinel.conf文件,当出现如下内容代表搭建成功:

aemonize no
port 26379
dir "/tmp"
sentinel myid 2a8f24182fde40322890851d5e0c1558c0ae5ef6
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@

#Generated by CONFIG REWRITE
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10
sentinel known-replica mymaster 192.168.99.101 6380
sentinel known-sentinel mymaster 192.168.99.102 26379 1d9fe6afcd83efc6c73ca997da8b236bc90da25d
sentinel known-sentinel mymaster 192.168.99.100 26379 db7a72938a470e372d87fa0c7c564d5bb161950b
sentinel current-epoch 10

检查主从是否搭建成功:

进入主redis,出现以下代表成功:

docker@master:/qj/redis$ docker exec -it redis bash                             
root@2f11645ef4de:/data# redis-cli -p 6380
127.0.0.1:6380> AUTH qj12345678@
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.99.101,port=6380,state=online,offset=32998,lag=0
master_replid:436241f908c8f739b972f87ba4ed886a1f784efc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32998
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:32998
127.0.0.1:6380> 

查看从redis,出现一下代表成功:

docker@slave:/qj/sentinel$ docker exec -it redis bash                                                                                                                                                             
root@7511a0387088:/data# redis-cli -p 6380
127.0.0.1:6380> AUTh qj12345678@
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:192.168.99.100
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:402953
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:436241f908c8f739b972f87ba4ed886a1f784efc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:402953
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:5099
repl_backlog_histlen:397855
### Redis Sentinel 主从切换的工作原理 在Redis哨兵模式下,主从切换机制旨在提高数据库服务的高可用性。当监控到节点发生故障时,Sentinel会自动执行一系列操作来选举节点并完成角色转换[^2]。 具体来说,在正常运行期间,多个哨兵实例持续监测所有库及其副本的状态。一旦检测到当前正在提供写入服务的要实例不可达(例如网络中断或硬件故障),其余存活的哨兵成员之间就会发起投票过程决定由哪个现有的只读副本来接替成为任领导者继续对外界请求作出响应。为了防止脑裂现象的发生——即同一时间存在两个以上互相都认为自己是合法领导者的实体——整个决策流程遵循严格的仲裁协议以确保最终只会有一个胜利者被选出来接管原人职责[^1]。 ### 配置方法 要实现上述功能,则需按照如下方式设置环境: #### 启动Redis Server 和 Sentinel Service 对于每台参与构成集群架构的服务端机器而言,应当先开启相应的Redis进程,并指定其监听特定端口;之后再单独启动一个关联着该机上已部署完毕的标准配置文件`redis-sentinel.conf` 的哨兵守护程序作为监视器使用[^3]。 ```bash # 开启Redis server /etc/init.d/redis_6379 start # 启动sentinel service redis-sentinel /etc/redis-sentinel.conf & ``` #### 编辑 `redis-sentinel.conf` 文件 此步骤涉及修改哨兵专用配置文档中的若干参数选项以便于自定义化调整行为逻辑。比如设定最低票数门槛、通知邮箱地址列表等个性化需求均可在此处体现。特别需要注意的是关于quorum值的选择,它决定了多少比例以上的哨兵同意才能触发一次完整的故障转移动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值