文章目录
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
测试结束