一、基础介绍
Redis 主从模式是一种在分布式系统中用于提高性能、可靠性和可扩展性的架构。在这种模式中,一个 Redis 服务器(主节点)可以有多个从节点,从而形成主从复制。
基础概念:
主节点(Master):
主节点是负责写入和读取的节点。
所有写入操作都在主节点上进行。
主节点将写入的数据同步到所有从节点。
从节点(Slave):
从节点复制主节点的数据,起到备份的作用。
从节点可以接收读请求,分担主节点的读负载。
从节点可以提供故障转移(failover)支持,即当主节点宕机时,其中一个从节点可以被提升为新的主节点。
复制方式:
主从复制是通过异步传播数据的方式进行的,即主节点将数据变更写入到本地 RDB 快照文件,并将快照文件和增量数据发送给从节点。
主从模式应用场景:
读写分离:
主从模式允许将读请求分发到从节点,从而减轻主节点的读取压力。
这对于读多写少的应用场景非常有用,提高了整体性能和响应速度。
数据备份和恢复:
从节点可以用于实时数据备份,即通过复制主节点的数据,实现数据的实时备份。
当主节点发生故障时,可以将其中一个从节点提升为主节点,确保系统的高可用性。
横向扩展:
当系统负载逐渐增加时,可以通过添加从节点来横向扩展系统性能。
新增加的从节点可以帮助分担读取负载,而主节点则继续处理写入请求。
容灾和故障恢复:
主从模式提供了容灾机制。当主节点发生故障时,可以迅速将一个从节点升级为主节点,确保系统的持续可用性。
在主从模式下,即使主节点宕机,只要有足够的从节点,系统仍然可以继续提供读服务。
实时数据分析:
通过在从节点上进行实时数据分析,可以避免对主节点的影响。
从节点可以用于执行复杂查询、分析和报告生成,而主节点则专注于处理写入请求。
二、主从搭建
1、v7.2.3版本基础服务安装与配置;
略,见redis安装篇。
2、配置Redis中的Master节点、其他无需配置
#表示监听本机哪个网卡地址,因为我们要让slave能连接master,所以让redis监听在一个外部网卡而不仅仅是127.0.0.1bind 192.168.1.137#设置密码requirepass 123456
3、Redis中多实例配置(作为slave节点)
至少修改以下参数:
port 6380pidfile /var/run/redis_6380.pidlogfile /usr/local/redis7/logs/redis_6380.logdir /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之前的版本叫slaveofmasterauth 123456#如果master设置了密码,还要配置master的密码,这样slave才能连的上masterreplica-read-only yes#slave只读,默认就是只读,保持默认即可,主从模式下master读写,slave只读
三、主从验证测试
1、登陆Master查看并插入测试数据
[root@DB-Node1 bin]# ./redis-cli -h 192.168.1.137 -p 6379192.168.1.137:6379> auth 123456OK192.168.1.137:6379> info Replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.1.138,port=6379,state=online,offset=3065,lag=0slave1:ip=192.168.1.138,port=6380,state=online,offset=3065,lag=1master_failover_state:no-failovermaster_replid:cfdb7ce70d3946f3e0d51e71f4bc7b8e911b045fmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:3065second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:3065#master上插入测试数据192.168.1.137:6379> set time "2023"OK192.168.1.137:6379> get time"2023"

2、登陆Slave查看
[root@DB-Master bin]# ./redis-cli -h 192.168.1.138 -p 6380192.168.1.138:6380> auth 123456OK192.168.1.138:6380> info Replication# Replicationrole:slavemaster_host:192.168.1.137master_port:6379master_link_status:upmaster_last_io_seconds_ago:9master_sync_in_progress:0slave_read_repl_offset:3191slave_repl_offset:3191slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:cfdb7ce70d3946f3e0d51e71f4bc7b8e911b045fmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:3191second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2730repl_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 6379127.0.0.1:6379> auth 123456OK127.0.0.1:6379> shutdown savenot connected>not connected> info ReplicationCould not connect to Redis at 127.0.0.1:6379: Connection refused
2、Slave节点查看状态信息
[root@DB-Node1 bin]# redis-cli127.0.0.1:6379> auth 123456OK127.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# Replicationrole:slavemaster_host:192.168.1.137master_port:6379master_link_status:downmaster_last_io_seconds_ago:-1master_sync_in_progress:0slave_read_repl_offset:3807slave_repl_offset:3807master_link_down_since_seconds:95slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:cfdb7ce70d3946f3e0d51e71f4bc7b8e911b045fmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:3807second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:15repl_backlog_histlen:3793127.0.0.1:6379>

3、临时手动指定slave为新的master角色继续提供服务
slaveof no one
说明:将一个 Redis 服务器从其当前的主服务器角色中解除,使其变成一个独立的(非复制的)服务器。这个命令的作用是告诉当前的从服务器停止复制任何主服务器。将slave手工指定为Master。
127.0.0.1:6379> slaveof no oneOK127.0.0.1:6379> info Replication# Replicationrole:masterconnected_slaves:0master_failover_state:no-failovermaster_replid:3682825e29c328d1775fc9e854ba6951d048be3amaster_replid2:f53da0dbdd07f2af22f7c71bbd00e0176de98920master_repl_offset:4003second_repl_offset:4004repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:15repl_backlog_histlen:3989
3、当master恢复后,再次切回slave角色
SLAVEOF 192.168.1.137 6379
auth 123456
127.0.0.1:6379> SLAVEOF 192.168.1.137 6379OK Already connected to specified master127.0.0.1:6379> auth 123456OK127.0.0.1:6379> info Replication# Replicationrole:slavemaster_host:192.168.1.137master_port:6379master_link_status:upmaster_last_io_seconds_ago:3master_sync_in_progress:0slave_read_repl_offset:4143slave_repl_offset:4143slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:1b58d039b7ec3b459e09dbbb488a98b7cb83078bmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:4143second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:4116repl_backlog_histlen:28127.0.0.1:6379>
五、主从模式总结
主从模式中的主服务器仍然是单点故障的可能来源。如果主服务器发生故障,整个系统可能会受到影响。
在主服务器发生故障时,进行故障转移并使一个从服务器晋升为新的主服务器需要一些时间,且只能手动切换、一般不建议使用。
在某些情况下,可能需要考虑使用其他高可用性解决方案,如 Redis Sentinel 或 Redis Cluster。

