数据库集群系列(七):Redis数据库主从复制技术的实现【redis v7.2.3版本】

艺帆风顺 发布于 2025-04-02 18 次阅读


一、基础介绍

    Redis 主从模式是一种在分布式系统中用于提高性能、可靠性和可扩展性的架构。在这种模式中,一个 Redis 服务器(主节点)可以有多个从节点,从而形成主从复制。

基础概念:

  1. 主节点(Master):

  • 主节点是负责写入和读取的节点。

  • 所有写入操作都在主节点上进行。

  • 主节点将写入的数据同步到所有从节点。

  • 从节点(Slave):

    • 从节点复制主节点的数据,起到备份的作用。

    • 从节点可以接收读请求,分担主节点的读负载。

    • 从节点可以提供故障转移(failover)支持,即当主节点宕机时,其中一个从节点可以被提升为新的主节点。

  • 复制方式:

    • 主从复制是通过异步传播数据的方式进行的,即主节点将数据变更写入到本地 RDB 快照文件,并将快照文件和增量数据发送给从节点。

    主从模式应用场景:

    1. 读写分离:

    • 主从模式允许将读请求分发到从节点,从而减轻主节点的读取压力。

    • 这对于读多写少的应用场景非常有用,提高了整体性能和响应速度。

  • 数据备份和恢复:

    • 从节点可以用于实时数据备份,即通过复制主节点的数据,实现数据的实时备份。

    • 当主节点发生故障时,可以将其中一个从节点提升为主节点,确保系统的高可用性。

  • 横向扩展:

    • 当系统负载逐渐增加时,可以通过添加从节点来横向扩展系统性能。

    • 新增加的从节点可以帮助分担读取负载,而主节点则继续处理写入请求。

  • 容灾和故障恢复:

    • 主从模式提供了容灾机制。当主节点发生故障时,可以迅速将一个从节点升级为主节点,确保系统的持续可用性。

    • 在主从模式下,即使主节点宕机,只要有足够的从节点,系统仍然可以继续提供读服务。

  • 实时数据分析:

    • 通过在从节点上进行实时数据分析,可以避免对主节点的影响。

    • 从节点可以用于执行复杂查询、分析和报告生成,而主节点则专注于处理写入请求。

    二、主从搭建

    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-cli 127.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 6379 OK 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。