Redis一主二从三哨兵模式

文章目录

Redis一主二从三哨兵模式

当你使用Redis作为主从复制的架构,并且希望在出现主节点故障时自动进行故障转移时,适用于一主而从三哨兵模式。这种架构可以提高系统的可用性和容错性。

哨兵模式的主要组件包括

主服务器(Master):负责处理写操作和响应客户端的读写请求。

从服务器(Slave):复制主服务器的数据,负责读操作,并在主服务器发生故障时接管主服务器的角色。

哨兵节点(Sentinel):监控主服务器和从服务器的状态,进行故障检测,并在主服务器发生故障时自动进行故障转移和故障恢复

在一主而从三哨兵模式中,有一个主节点和多个从节点,同时还有三个哨兵节点来监控主节点的健康状态。当主节点出现故障时,哨兵节点会自动选举一个从节点作为新的主节点,并将其他从节点切换到新的主节点上,这个过程是自动的,不需要手动干预

如图

环境配置

主机 系统 IP地址 安装包
Master节点 Centos7.9.2009 192.168.200.10 redis-7.0.9.tar.gz
Slave1节点 Centos7.9.2009 192.168.200.20 redis-7.0.9.tar.gz
Slave2节点 Centos7.9.2009 192.168.200.30 redis-7.0.9.tar.gz

达成的目的:在三个节点自行安装 Redis 服务并启动,配置 Redis 的访问需要密码,密码设置为123456。然后将这三个 Redis 节点配置为 Redis 的一主二从三哨兵架构,即一个 Redis 主节点,两个从节点,三个节点均为哨兵节点

实践

配置主从

(1)修改主机名(所有节点均操作)

shell 复制代码
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]# 
[root@localhost ~]# hostnamectl set-hostname slave1
[root@localhost ~]# bash
[root@slave1 ~]# 
[root@localhost ~]# hostnamectl set-hostname slave2
[root@localhost ~]# bash
[root@slave2 ~]# 

(2)安装redis(所有节点均执行)

shell 复制代码
# 安装工具包和编译依赖
yum install -y gcc wget net-tools vim  tree
# 下载软件包
wget  https://download.redis.io/releases/redis-7.0.9.tar.gz
# 解压
tar -zxf redis-7.0.9.tar.gz  -C /opt/
# 编译安装
cd /opt/redis-7.0.9/ && make && make install
# 搜索一下redis-server在哪,一般都在/usr/local/bin/ 下面
find / -name redis-server
# 复制一下所需要的配置文件到工作目录
cd /usr/local/bin/ && cp  -rf /opt/redis-7.0.9/redis.conf ./

(3)修改配置文件redis.conf(所有节点均修改)

shell 复制代码
vim redis.conf
# 修改如下信息
bind 0.0.0.0   
protected-mode no
daemonize yes  
replicaof 192.168.200.10 6379
requirepass 123456 
masterauth 123456
# replicaof 选项Master节点不配置,从节点配置

(4)启动redis服务并放行端口(所有节点均修改)

shell 复制代码
redis-server redis.conf      # 启动redis
netstat -tlnp |grep redis    # 查看是否开放了6379端口
firewall-cmd --add-port=6379/tcp --permanent && firewall-cmd --reload   # 防火墙放行6379

(5)登录redis测试

shell 复制代码
[root@master bin]# redis-cli -h 192.168.200.10 -p 6379 -a 123456   # 连接master节点
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.200.10:6379> ping
PONG
192.168.200.10:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.200.20,port=6379,state=online,offset=70,lag=1
slave1:ip=192.168.200.30,port=6379,state=online,offset=70,lag=1
master_failover_state:no-failover
master_replid:c486a9c578d65459edb9d496220ac11d1f7d790e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70

配置哨兵模式

(1)先退出redis环境

shell 复制代码
127.0.0.1:6379> quit

(2)配置哨兵模式

shell 复制代码
[root@master bin]# vim sentinel.conf 
# 添加如下内容
daemonize yes
sentinel monitor master 192.168.200.10 6379 2
sentinel auth-pass master 123456
logfile "/var/log/sentinel.log"

# 再将配置的内容远程传输到20 30主机上
[root@master bin]# scp sentinel.conf 192.168.200.20:/usr/local/bin/sentinel.conf
[root@master bin]# scp sentinel.conf 192.168.200.30:/usr/local/bin/sentinel.conf

(3)开启哨兵模式并放行默认端口26379

shell 复制代码
redis-sentinel sentinel.conf      # 启动哨兵模式
netstat -tlnp |grep 26379   # 开放默认端口26379
firewall-cmd  --add-port=26379/tcp --permanent && firewall-cmd --reload  # 防火墙开放端口

(4)查看是否配置成功

shell 复制代码
[root@master bin]#  redis-cli  -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master,status=ok,address=192.168.200.10:6379,slaves=2,sentinels=3
# 发现有3个哨兵节点就OK了!

测试

主从复制测试

shell 复制代码
# master写
[root@master bin]# redis-cli -h 192.168.200.10 -p 6379 -a 123456
192.168.200.10:6379> ping
PONG
192.168.200.10:6379> MSET name csq age 18 sex man
OK
# slave1读
[root@slave1 bin]# redis-cli -h 192.168.200.20 -p 6379 -a 123456
192.168.200.20:6379> ping
PONG
192.168.200.20:6379> MGET name age sex
1) "csq"
2) "18"
3) "man"
# slave2读
[root@slave2 bin]# redis-cli -h 192.168.200.30 -p 6379 -a 123456
192.168.200.30:6379> ping
PONG
192.168.200.30:6379> MGET name age sex
1) "csq"
2) "18"
3) "man"

模拟master宕机

shell 复制代码
192.168.200.10:6379> SHUTDOWN
(0.83s)
not connected> quit

哨兵日志查询

Sentinel节点通过向Redis实例发送PING命令来监测实例的存活状态。

如果主服务器或从服务器无法响应哨兵节点的PING命令,哨兵节点会将该实例标记为主观下线

当哨兵节点检测到主服务器下线后,它会请求其他哨兵节点对该下线主服务器进行确认。一旦大部分哨兵节点都确认主服务器已下线,该主服务器就会被标记为客观下线

哨兵节点会从当前可用的从服务器中选出一个成为新的主服务器,并将其他从服务器切换为新的主服务器的从服务器。

登录192.168.200.20redis查看 是否变为了master

shell 复制代码
192.168.200.20:6379> info replication
# Replication
role:master   # 之前的slave1 变为了master
connected_slaves:1
slave0:ip=192.168.200.30,port=6379,state=online,offset=243852,lag=1  # 从节点
master_failover_state:no-failover
master_replid:1fcb24a95055f3bb705997e3f4cbe9dc231d5fb7
master_replid2:c486a9c578d65459edb9d496220ac11d1f7d790e
master_repl_offset:243993
second_repl_offset:74074
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:243993

登录192.168.200.30redis 查看是否变为了slave

shell 复制代码
192.168.200.30:6379> INFO replication
# Replication
role:slave                      # 从节点
master_host:192.168.200.20      # IP
master_port:6379                # 端口
master_link_status:up           # 从节点能连接到主节点
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:263732
slave_repl_offset:263732
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1fcb24a95055f3bb705997e3f4cbe9dc231d5fb7
master_replid2:c486a9c578d65459edb9d496220ac11d1f7d790e
master_repl_offset:263732
second_repl_offset:74074
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:263732

恢复master

shell 复制代码
[root@master bin]# redis-server redis.conf   # 启动redis
[root@master bin]# redis-cli -h 192.168.200.10 -p 6379 -a 123456
192.168.200.10:6379> ping
PONG
192.168.200.10:6379> INFO replication
# Replication
role:slave                  # 变为了从节点
master_host:192.168.200.20  # IP
master_port:6379            # 端口
master_link_status:up       # 从节点和主节点连接状态
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:301513
slave_repl_offset:301513
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1fcb24a95055f3bb705997e3f4cbe9dc231d5fb7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:301513
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:299080
repl_backlog_histlen:2434

测试旧master是否可写

shell 复制代码
# 很显然是不可写的
192.168.200.10:6379> set a b
(error) READONLY You can't write against a read only replica.

再次查看master 192.168.200.20 主从信息

shell 复制代码
192.168.200.20:6379> INFO replication
# Replication
role:master
connected_slaves:2  # 成功添加进去了
slave0:ip=192.168.200.30,port=6379,state=online,offset=352750,lag=1
slave1:ip=192.168.200.10,port=6379,state=online,offset=352609,lag=1
master_failover_state:no-failover
master_replid:1fcb24a95055f3bb705997e3f4cbe9dc231d5fb7
master_replid2:c486a9c578d65459edb9d496220ac11d1f7d790e
master_repl_offset:352750
second_repl_offset:74074
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:352750

测试结束

相关推荐
烙印6014 分钟前
MyBatis原理剖析(二)
java·数据库·mybatis
RestCloud5 分钟前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
你是狒狒吗6 分钟前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
懒羊羊大王呀9 分钟前
Ubuntu20.04中 Redis 的安装和配置
linux·redis
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠1 小时前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水2 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song2 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes2 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop