Redis-11-Redis主从复制

本文详细介绍了Redis主从复制的原理、特点、配置方法,包括动态绑定与配置文件方式,并深入讲解了哨兵模式(sentinel)的原理和应用。通过实例演示如何搭建一主二从环境并确保高可用性和容灾恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

  • Redis-11-Redis主从复制
  • 包含Redis主从复制的特点、注意事项、主从复制的原理、主从复制的模式、哨兵模式(sentinel)
  • 官方文档:https://redis.io/documentation
  • Redis命令参考:http://redisdoc.com/

核心概念

》Redis主从复制的特点?

  • 读写分离
    • Redis主从复制都是一主多从,要多主就需要集群实现
  • 容灾快速恢复

》本案例搭建环境描述

  • 本案例简单搭建一主二从
  • 在同一台机器中使用3个不同的端口模拟三个Redis服务
  • 原本的6379端口不受影响也不在本案例操作范围内

》注意事项

  • 主从复制中的从服务器默认只有读权限,一般也都是这样的

》主从复制的原理

  • 从服务启动后,向主服务发送数据同步请求
  • 主服务收到从服务同步请求后,将数据持久化到rdb,然后将rdb文件发送给从服务(全量复制)
  • 从服务收到主服务发送过来的rdb后,以之进行数据初始化
  • 后续主服务所有写操作,主服务都会同步发送给从服务(增量复制)

》主从复制的模式

  • 一主多从
    • 基本模式,一个主服务剩下的全部作为从服务
  • 薪火相传
    • 一代一代往下继承,比如:A <- B <- C
  • 反客为主
    • 当主服务挂掉后,可以将从服务设置为主服务,但是只能通过动态命令实现,无法通过修改配置方式实现。要实现自动需要结合下面的哨兵模式
    • 命令:127.0.0.1:6382> slaveof no one

》哨兵模式(sentinel)

  • 什么是哨兵模式?
    • 反客为主的自动版
  • 哨兵模式的原理?
    • 启动一个服务专门用来监听Redis,该服务由Redis官方提供,与redis-server同级目录
    • 当监控到主机挂掉以后,会自动切换一台从服务为主服务,并把原先的主服务变为从服务,当原先的主服务启动后将会作为从服务
  • 选择从服务作为主服务的优先级判断条件
    • 根据从服务的配置文件:replica-priority 100,这个值越小优先级越高
    • 数据偏移量越大优先级越高(偏移量指数据同步最全的)
    • runid越小优先级越高
  • 哨兵模式结合代码使用?
    • 使用Redis连接池,连接哨兵模式配置文件中定义的IP、端口
    • 注意:连接的是哨兵服务,而不是Redis服务

操作步骤

》先正常开启三个Redis服务端

  • 新建目录:/root/redisSlave,并进入该目录
  • 在当前目录下创建数据存储目录:data
  • 将默认配置文件redis.conf复制一份到该目录
  • 新建三个配置文件:redis6381.conf、redis6382.conf、redis6383.conf
    [root@192 ~]# cd /root/redisSlave
    [root@192 redisSlave]# mkdir data
    [root@192 redisSlave]# ll
    total 76
    drwxr-xr-x 2 root root     6 Jan  9 17:55 data
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6381.conf
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6382.conf
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6383.conf
    -rw-r--r-- 1 root root 61813 Jan  9 17:21 redis.conf
    
    • 配置文件内容如下
      [root@192 redisSlave]# more redis6381.conf
      include ./redis.conf
      port 6381
      pidfile /var/run/redis6381.pid
      dbfilename dump6381.rdb
      dir ./data
      
      [root@192 redisSlave]# more redis6382.conf
      include ./redis.conf
      port 6382
      pidfile /var/run/redis6382.pid
      dbfilename dump6382.rdb
      dir ./data
      
      [root@192 redisSlave]# more redis6383.conf
      include ./redis.conf
      port 6383
      pidfile /var/run/redis6383.pid
      dbfilename dump6383.rdb
      dir ./data
      
  • 分别启动三个Redis服务
    # 启动6381
    [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6381.conf
    44407:C 09 Jan 2022 17:59:51.059 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    44407:C 09 Jan 2022 17:59:51.060 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44407, just started
    44407:C 09 Jan 2022 17:59:51.060 # Configuration loaded
    
    # 启动6382
    [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6382.conf
    44429:C 09 Jan 2022 18:00:11.818 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    44429:C 09 Jan 2022 18:00:11.818 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44429, just started
    44429:C 09 Jan 2022 18:00:11.818 # Configuration loaded
    
    # 启动6383
    [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6383.conf
    44437:C 09 Jan 2022 18:00:15.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    44437:C 09 Jan 2022 18:00:15.680 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44437, just started
    44437:C 09 Jan 2022 18:00:15.680 # Configuration loaded
    
    # 查看状态(6379是默认的,不用管)
    [root@192 redisSlave]# ps -ef |grep redis
    root       1845      1  0 Jan07 ?        00:05:39 /usr/local/redis/bin/redis-server *:6379
    root      44408      1  0 17:59 ?        00:00:00 /usr/local/redis/bin/redis-server *:6381
    root      44430      1  0 18:00 ?        00:00:00 /usr/local/redis/bin/redis-server *:6382
    root      44438      1  0 18:00 ?        00:00:00 /usr/local/redis/bin/redis-server *:6383
    root      44458   1803  0 18:00 pts/0    00:00:00 grep --color=auto redis
    
  • 使用客户端连接Redis服务进行测试,三个端口都能连接即可。
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6381
    127.0.0.1:6381>
    
  • 查看主从复制信息,命令:info replication
    127.0.0.1:6381> info replication
    # Replication
    role:master
    connected_slaves:0
    master_replid:6c47a5c58d4b536ab60c65539b04e562686dec4c
    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
    
    • role:master:表示本机作为主服务
    • connected_slaves:0:表示连接的从服务器数量

》绑定三个Redis服务,开启主从复制

》》实现方式一:动态命令(slaveof )绑定主从复制关系(适用于Redis没有密码的情况)
  • 分别在从服务器上执行以下命令进行绑定(以6382为例)
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6382
    127.0.0.1:6382> slaveof 192.168.3.241 6381
    OK
    
  • 注意:这种方式,如果重启从服务,那么原先配置的主从复制关系就失效了
  • 注意:重启主服务,原先的主从复制关系不变
》》实现方式二:修改配置文件绑定主从复制关系(适用于Redis有密码情况)
  • 分别修改从服务器配置文件(以6382为例)
    [root@192 redisSlave]# cat redis6382.conf
    include ./redis.conf
    
    port 6382
    pidfile /var/run/redis6382.pid
    dbfilename dump6382.rdb
    dir ./data
    
    # 主从复制关联主服务器IP和端口
    replicaof 192.168.3.241 6381
    # 主从复制关联主服务器Redis密码
    masterauth 123456
    
    
  • 修改完重启Redis服务,查看主从复制信息
    # 连接主服务器,并查看
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6381
    127.0.0.1:6381> auth 123456
    OK
    127.0.0.1:6381> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.3.241,port=6382,state=online,offset=56,lag=1
    slave1:ip=192.168.3.241,port=6383,state=online,offset=56,lag=1
    master_replid:be633cdf584be908844294ddf2a67cfbb2217db7
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:56
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:56
    
    # 连接从服务器,并查看(以6382为例)
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6382
    127.0.0.1:6382> auth 123456
    OK
    127.0.0.1:6382> info replication
    # Replication
    role:slave
    master_host:192.168.3.241
    master_port:6381
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:1134
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:be633cdf584be908844294ddf2a67cfbb2217db7
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:1134
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:1134
    
  • 注意:这种方式,重启从服务,依旧是原先的主从复制关系,因为配置文件是重新加载了
  • 注意:重启主服务,原先的主从复制关系不变

》开启哨兵模式

  • 新建哨兵配置文件:sentinel.conf

    [root@192 redisSlave]# ll
    total 80
    drwxr-xr-x 2 root root    66 Jan 10 12:47 data
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6381.conf
    -rw-r--r-- 1 root root   209 Jan 10 02:03 redis6382.conf
    -rw-r--r-- 1 root root   209 Jan 10 02:03 redis6383.conf
    -rw-r--r-- 1 root root 61813 Jan  9 17:21 redis.conf
    -rw-r--r-- 1 root root    45 Jan 10 16:07 sentinel.conf
    
    # 配置文件内容如下
    [root@192 redisSlave]# cat sentinel.conf
    # 哨兵监控主机信息
    sentinel monitor myMaster 192.168.3.241 6381 1
    # 哨兵监控主机的密码(如果没密码忽略这行)
    sentinel auth-pass myMaster 123456
    # 哨兵服务后台启动(配置稳定后可以开启后台)
    # daemonize yes
    
    
    • 配置文件说明:
      • sentinel monitor <主机别名> <端口> <至少几个哨兵同意迁移>
      • sentinel auth-pass <主机别名> <密码>
  • 启动一个哨兵服务

    [root@192 redisSlave]# /usr/local/redis/bin/redis-sentinel ./sentinel.conf
    79386:X 10 Jan 2022 16:48:13.552 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    79386:X 10 Jan 2022 16:48:13.552 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=79386, just started
    79386:X 10 Jan 2022 16:48:13.552 # Configuration loaded
    ......
    79386:X 10 Jan 2022 16:48:13.553 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    79386:X 10 Jan 2022 16:48:13.555 # Sentinel ID is 431ce25764c7cac5f9504729c89c3eff496ba4b3
    79386:X 10 Jan 2022 16:48:13.555 # +monitor master myMaster 192.168.3.241 6381 quorum 1
    79386:X 10 Jan 2022 16:48:13.556 * +slave slave 192.168.3.241:6383 192.168.3.241 6383 @ myMaster 192.168.3.241 6381
    79386:X 10 Jan 2022 16:48:13.557 * +slave slave 192.168.3.241:6382 192.168.3.241 6382 @ myMaster 192.168.3.241 6381
    
    • 通过哨兵服务的启动日志,你可以清晰的看到主从复制服务信息
  • 当你启动哨兵服务以后,哨兵服务会自动重写你的配置文件,就像下边这样:

    [root@192 redisSlave]# cat sentinel.conf
    sentinel myid b28d162eff8336dbd397caf6e4d5521ea5fcb925
    sentinel deny-scripts-reconfig yes
    daemonize yes
    
    # Generated by CONFIG REWRITE
    port 26379
    dir "/root/redisSlave"
    protected-mode no
    sentinel monitor myMaster 192.168.3.241 6381 1
    sentinel auth-pass myMaster 123456
    sentinel config-epoch myMaster 0
    sentinel leader-epoch myMaster 0
    sentinel known-replica myMaster 192.168.3.241 6382
    sentinel known-replica myMaster 192.168.3.241 6383
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值