Redis一主二从三哨兵模式

Redis一主二从三哨兵模式

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

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

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

哨兵节点(Sentinel):监控主服务器和从服务器的状态,进行故障检测,并在主服务器发生故障时自动进行故障转移和故障恢复
在一主而从三哨兵模式中,有一个主节点和多个从节点,同时还有三个哨兵节点来监控主节点的健康状态。当主节点出现故障时,哨兵节点会自动选举一个从节点作为新的主节点,并将其他从节点切换到新的主节点上,这个过程是自动的,不需要手动干预

如图

image-20230720165608782

环境配置

主机 系统 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)修改主机名(所有节点均操作)

[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(所有节点均执行)

# 安装工具包和编译依赖
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(所有节点均修改)

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服务并放行端口(所有节点均修改)

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

(5)登录redis测试

[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环境

127.0.0.1:6379> quit

(2)配置哨兵模式

[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

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

(4)查看是否配置成功

[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了!

测试

主从复制测试

# 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宕机

192.168.200.10:6379> SHUTDOWN
(0.83s)
not connected> quit

哨兵日志查询

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

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

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

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

image-20230721232049987

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

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

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

[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是否可写

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

再次查看master 192.168.200.20 主从信息

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

测试结束

猜你喜欢

转载自blog.csdn.net/qq_52089863/article/details/131861949