Redis主从复制与哨兵模式

Redis主从复制

1. 架构模型

主从复制模式至少要有3个redis服务器节点,每个redis服务器启动时,都默认是主机,所以只需要对从机进行配置所属主机。集群环境中,主机只做写入,从机只做读取。

在这里插入图片描述
在这里插入图片描述

2. 实现方式

由于服务器环境有限,测试将会在一个服务器启动多个redis节点模拟redis集群,实际工作环境中,redis服务端会运行在不同的服务器上。

  • 准备工作:(以下文件仅在同服务器多节点测试使用,实际工作场景,多个服务器不需要配置,只需要配置从机所属主机的ip地址和端口号)

    1. 找到redis.conf配置文件,默认启动端口是6379,在同一目录下,复制出两份redis.conf文件,分别命名为redis-s1.conf和redis-s2.conf文件;
      在这里插入图片描述

    2. 修改配置文件,以启动不同的的redis节点;

      • 修改启动端口号,redis-s1.conf中的端口号修改为port 6380; redis-s2.conf中的端口号修改为port 6381;
        在这里插入图片描述

        port 6379   #redis配置
        port 6380   #redis-s1.conf配置
        port 6381   #redis-s2.conf配置
        
      • 修改启动端口号文件,防止文件名重名–pidfile

    在这里插入图片描述

     ```bash
     pidfile /www/server/redis/redis.pid   #redis配置
     pidfile /www/server/redis/redis-s1.pid   #redis-s1.conf配置
     pidfile /www/server/redis/redis-s2.pid   #redis-s2.conf配置
     ```
    
    • 修改日志文件,防止文件名重名–logfile
      在这里插入图片描述

      logfile "/www/server/redis/redis.log"  #redis配置
      logfile "/www/server/redis/redis-s1.log"  #redis-s1配置
      logfile "/www/server/redis/redis-s2.log"  #redis-s2配置
      
    • 修改持久化文件,防止文件重名–dump.rdb
      在这里插入图片描述

      dbfilename dump.rdb   # redis配置
      dbfilename dump-s1.rdb   # redis-s1配置
      dbfilename dump-s2.rdb   # redis-s2配置
      
    1. 命令行以不同的配置文件启动redis服务 ,

      • redis-server czconfig/redis.conf

      • redis-server czconfig/redis-s1.conf

      • redis-server czconfig/redis-s2.conf

      • 启动redis服务端后,命令行连接服务端: redis-cli -p 端口号

      • info replication查询redis服务端信息

        127.0.0.1:6380> info replication    #查询服务端信息
        # Replication
        role:master							#当前角色,主机(如果没有在配置文件配置所属主机,redis启动默认就是主机)
        connected_slaves:0					#连接的从机数;
        master_failover_state:no-failover
        master_replid:54d5ad2b1611ff0fdd814619155d509c44ddabf9
        master_replid2:0000000000000000000000000000000000000000
        master_repl_offset:0
        second_repl_offset:-1
        repl_backlog_active:0
        repl_backlog_size:1048576
        repl_backlog_first_byte_offset:0
        repl_backlog_histlen:0
        
      1. 配置主从关系

        本次测试中,我们以redis作为主机,redis-s1,redis-s2作为两个从机;

        • 配置方式一,命令行配置:

          slaveof ip port,本例中,直接运行slaveof 127.0.0.1 6379;运行结束后,info replication查询当前服务端信息;

          127.0.0.1:6380> info replication
          # Replication
          role:slave				#角色已经变成从机
          master_host:127.0.0.1	#所属主机ip地址
          master_port:6379        #所属主机端口号
          master_link_status:up
          master_last_io_seconds_ago:5
          master_sync_in_progress:0
          slave_repl_offset:0
          slave_priority:100
          slave_read_only:1
          replica_announced:1
          connected_slaves:0
          master_failover_state:no-failover
          master_replid:c70771a25240f22cc83f5dbd018fb5cdcbb8d5a1
          master_replid2:0000000000000000000000000000000000000000
          master_repl_offset:0
          second_repl_offset:-1
          repl_backlog_active:1
          repl_backlog_size:1048576
          repl_backlog_first_byte_offset:1
          repl_backlog_histlen:0
          
          

          查看主机服务端信息:

          127.0.0.1:6379> info replication
          # Replication
          role:master			#角色依旧是主机
          connected_slaves:1	#有一个连接的从机
          slave0:ip=127.0.0.1,port=6380,state=online,offset=238,lag=1 #连接的从机信息
          master_failover_state:no-failover
          master_replid:c70771a25240f22cc83f5dbd018fb5cdcbb8d5a1
          master_replid2:0000000000000000000000000000000000000000
          master_repl_offset:238
          second_repl_offset:-1
          repl_backlog_active:1
          repl_backlog_size:1048576
          repl_backlog_first_byte_offset:1
          repl_backlog_histlen:238
          
        • 配置方式二,文件配置

          replicaof <masterip> <masterport>  # 注明主机的ip地址和端口号
          masterauth <master-password>       #如果主机需要密码,注明主机的密码
          

          二者配置区别:如果仅仅通过命令行配置,那么这个主从关系只是暂时性的,如果从机重启,那么又会自动默认变为主机,如果通过配置文件配置,redis服务端启动时,则会找到配置文件,将自身变为从机,从属于配置好的主机

          • 注意点:从机只能做数据读取,不能赋值:

            127.0.0.1:6380> set k1 v1  #从机赋值报错
            (error) READONLY You can't write against a read only replica
            

3. 主从复制原理

如果在集群过程中,从机发生故障,那么如果重启成功,连接到了主机之后,会向主机发送一个sync同步命令。主机master接收到了同步命令之后,会收集所有对数据进行修改操作命令,并在后台执行完成后,将文件传送到从机,完成一次数据同步。

  • 全量同步:发生在从机启动时,主机将现有的全部数据同步给从机;因此,从机只要重连,就已经包含了主机的全量数据;
  • 增量复制:主机每接收到一个数据修改命令,就传送给从机,进行增量同步;

4. 宕机后的手动处理方式

在架构模式图中的模式二中,81从属于80,80从属于79;如果主机79发生了宕机,为了不影响程序执行,需要手动设置下一个从机变成主机;命令行—slaveof no one;

127.0.0.1:6380> slaveof no one			#设置当前从机为主机
OK
127.0.0.1:6380> info replication
# Replication
role:master								#角色变为主机
connected_slaves:1				
slave0:ip=127.0.0.1,port=6381,state=online,offset=84,lag=1  #从机信息
master_failover_state:no-failover
master_replid:b86d8d1ee3a3de649b7c33b1182adc7996491dbb
master_replid2:bb7ba8ece44c021dccda424238fba406d6851b55
master_repl_offset:84
second_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84

这种手动配置在实际工作场景中实用性不高,主要为了了解主从配置间的关联关系。实际工作中,以哨兵模式为主!

哨兵模式

哨兵模式主要是为了解决传统模式中,redis主机宕机后需要手动配置主机的窘境,哨兵模式下,如果主机发生故障,会自动投票从从机中选举出一个作为主机,此时若主机恢复运行,那么也会变为当前主机的从机。
在这里插入图片描述

1. 配置测试

  • 创建redis-sentinel配置文件–redis-sentinel.conf

    #sentinel monitor + 主机名(自定义)+ ip地址 + 端口号 + 客观认为主机下线的哨兵数,一般配置成哨兵节点数的一半+1;
    sentinel monitor mymaster 127.0.0.1 6379 1 #1,代表着,只要有1个哨兵主观认为主机下线,则进行故障转移,重新选举主机;
    
  • 启动哨兵 redis-sentinel redis-sentinel.conf
    在这里插入图片描述

  • 此处,如果shutdown主机,模拟主机宕机,观察日志可以的出,哨兵自动选举出了一个新的主机;
    在这里插入图片描述

  • 观察80端口的redis,已经变成了主机。

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:69a92b3b1fc9652b1402c70595ad54f65fdcfc0f
master_replid2:bb7ba8ece44c021dccda424238fba406d6851b55
master_repl_offset:35053
second_repl_offset:32371
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:113
repl_backlog_histlen:34941

2.全部配置

port 26379   #端口号,后续可以模拟哨兵多集群

daemonize yes	#启动保护模式
protected-mode no

dir /www/server/redis #运行目录
logfile "26379.log"  #日志文件

#最重要的配置,监听主机端口号以及判断客观下线的数量
sentinel monitor mymaster 1127.0.0.1 6379 1  

# 判定节点不可达的时间,单位是毫秒。
sentinel down-after-milliseconds mymaster 5000  

# 主节点的密码配置,实际项目中,把主从节点的密码最好都设置成同一个
sentinel auth-pass mymaster 123456

# 故障转移后,每次向新的主节点发起复制的从节点的个数。
sentinel parallel-syncs mymaster 1  

# 故障转移的超时时间,默认是3分钟
sentinel failover-timeout mymaster 50000  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值