一、基础介绍
Redis 主从模式是一种在分布式系统中用于提高性能、可靠性和可扩展性的架构。在这种模式中,一个 Redis 服务器(主节点)可以有多个从节点,从而形成主从复制。
基础概念:
主节点(Master):
主节点是负责写入和读取的节点。
所有写入操作都在主节点上进行。
主节点将写入的数据同步到所有从节点。
从节点(Slave):
从节点复制主节点的数据,起到备份的作用。
从节点可以接收读请求,分担主节点的读负载。
从节点可以提供故障转移(failover)支持,即当主节点宕机时,其中一个从节点可以被提升为新的主节点。
复制方式:
主从复制是通过异步传播数据的方式进行的,即主节点将数据变更写入到本地 RDB 快照文件,并将快照文件和增量数据发送给从节点。
主从模式应用场景:
读写分离:
主从模式允许将读请求分发到从节点,从而减轻主节点的读取压力。
这对于读多写少的应用场景非常有用,提高了整体性能和响应速度。
数据备份和恢复:
从节点可以用于实时数据备份,即通过复制主节点的数据,实现数据的实时备份。
当主节点发生故障时,可以将其中一个从节点提升为主节点,确保系统的高可用性。
横向扩展:
当系统负载逐渐增加时,可以通过添加从节点来横向扩展系统性能。
新增加的从节点可以帮助分担读取负载,而主节点则继续处理写入请求。
容灾和故障恢复:
主从模式提供了容灾机制。当主节点发生故障时,可以迅速将一个从节点升级为主节点,确保系统的持续可用性。
在主从模式下,即使主节点宕机,只要有足够的从节点,系统仍然可以继续提供读服务。
实时数据分析:
通过在从节点上进行实时数据分析,可以避免对主节点的影响。
从节点可以用于执行复杂查询、分析和报告生成,而主节点则专注于处理写入请求。
二、主从搭建
1、v7.2.3版本基础服务安装与配置;
略,见redis安装篇。
2、配置Redis中的Master节点、其他无需配置
#表示监听本机哪个网卡地址,因为我们要让slave能连接master,所以让redis监听在一个外部网卡而不仅仅是127.0.0.1
bind 192.168.1.137
#设置密码
requirepass 123456
3、Redis中多实例配置(作为slave节点)
至少修改以下参数:
port 6380
pidfile /var/run/redis_6380.pid
logfile /usr/local/redis7/logs/redis_6380.log
dir /usr/local/redis7/data6380
然后执行重启:redis-server 6380.conf
4、配置Redis中的slave节点
vim 6379.conf
replicaof 192.168.1.137 6379
#找到replicaof参数,这个是配置master IP和端口的,5.0之前的版本叫slaveof
masterauth 123456
#如果master设置了密码,还要配置master的密码,这样slave才能连的上master
replica-read-only yes
#slave只读,默认就是只读,保持默认即可,主从模式下master读写,slave只读
三、主从验证测试
1、登陆Master查看并插入测试数据
[root@DB-Node1 bin]# ./redis-cli -h 192.168.1.137 -p 6379
192.168.1.137:6379> auth 123456
OK
192.168.1.137:6379> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.138,port=6379,state=online,offset=3065,lag=0
slave1:ip=192.168.1.138,port=6380,state=online,offset=3065,lag=1
master_failover_state:no-failover
master_replid:cfdb7ce70d3946f3e0d51e71f4bc7b8e911b045f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3065
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3065
#master上插入测试数据
192.168.1.137:6379> set time "2023"
OK
192.168.1.137:6379> get time
"2023"
2、登陆Slave查看
[root@DB-Master bin]# ./redis-cli -h 192.168.1.138 -p 6380
192.168.1.138:6380> auth 123456
OK
192.168.1.138:6380> info Replication
# Replication
role:slave
master_host:192.168.1.137
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:3191
slave_repl_offset:3191
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:cfdb7ce70d3946f3e0d51e71f4bc7b8e911b045f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3191
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2730
repl_backlog_histlen:462
#查看哪些键值
192.168.1.138:6380> keys *
1) "time"
2) "name"
192.168.1.138:6380> get time
"2023"
#尝试写入,发现报错,因为slave是只读的
192.168.1.138:6380> set test "1"
(error) READONLY You can't write against a read only replica.
192.168.1.138:6380>
到此,证明Redis主从模式配置生效,可以成功运行。
四、主从模式故障模拟
1、模拟Master宕机
./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> shutdown save
not connected>
not connected> info Replication
Could not connect to Redis at 127.0.0.1:6379: Connection refused
2、Slave节点查看状态信息
[root@DB-Node1 bin]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> not connected> info Replication
(error) ERR unknown command 'not', with args beginning with: 'connected>' 'info' 'Replication'
127.0.0.1:6379> Could not connect to Redis at 127.0.0.1:6379: Connection refused
(error) ERR unknown command 'Could', with args beginning with: 'not' 'connect' 'to' 'Redis' 'at' '127.0.0.1:6379:' 'Connection' 'refused'
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.1.137
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:3807
slave_repl_offset:3807
master_link_down_since_seconds:95
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:cfdb7ce70d3946f3e0d51e71f4bc7b8e911b045f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3807
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:3793
127.0.0.1:6379>
3、临时手动指定slave为新的master角色继续提供服务
slaveof no one
说明:将一个 Redis 服务器从其当前的主服务器角色中解除,使其变成一个独立的(非复制的)服务器。这个命令的作用是告诉当前的从服务器停止复制任何主服务器。将slave手工指定为Master。
127.0.0.1:6379> slaveof no one
OK
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:3682825e29c328d1775fc9e854ba6951d048be3a
master_replid2:f53da0dbdd07f2af22f7c71bbd00e0176de98920
master_repl_offset:4003
second_repl_offset:4004
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:3989
3、当master恢复后,再次切回slave角色
SLAVEOF 192.168.1.137 6379
auth 123456
127.0.0.1:6379> SLAVEOF 192.168.1.137 6379
OK Already connected to specified master
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.1.137
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:4143
slave_repl_offset:4143
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1b58d039b7ec3b459e09dbbb488a98b7cb83078b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4143
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4116
repl_backlog_histlen:28
127.0.0.1:6379>
五、主从模式总结
主从模式中的主服务器仍然是单点故障的可能来源。如果主服务器发生故障,整个系统可能会受到影响。
在主服务器发生故障时,进行故障转移并使一个从服务器晋升为新的主服务器需要一些时间,且只能手动切换、一般不建议使用。
在某些情况下,可能需要考虑使用其他高可用性解决方案,如 Redis Sentinel 或 Redis Cluster。