18. Redis的主从复制

本文详细介绍了Redis的主从复制机制,包括概念、应用场景、配置细节及常见场景演示,如一主多从、级联复制、故障转移和哨兵模式,并分析了复制原理及其潜在缺点。

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

1. 概念

    Redis的主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

2. 应用

    读写分离、容灾回复

3. 配置文件细节操作

    ①. 配从(库)不配主(库)

    ②. 从库配置:slaveof  主库ip  主库端口

                每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件

    ③. 修改配置文件

            copy三份配置文件:redis6379.conf       redis6380.conf     red6381.conf  

                    修改每个配置文件对应的属性:     

pidfile /var/run/redis6380.pid
port 6380
logfile "6380.log"
dbfilename dump6380.rdb

 

4. 常用场景

    ①. 一主二仆

        开启三个窗口,根据三个配置文件,启动三个redis服务

[root@CentOS-1 bin]# redis-server /myredis/redis6380.conf
[root@CentOS-1 bin]# redis-cli -p 6380

          此时会发现,在/usr/local/bin/ 下出现了三个对应的日志文件

           执行  info replication 发现此时三个redis的信息是一样的      

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> get k3
"v3"
​127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k4
"v4"
127.0.0.1:6380> get k2
"v2"
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=431,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=431,lag=0
master_repl_offset:431
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:430
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:445
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> set k5 v5
OK
127.0.0.1:6380> set k5 v55
(error) READONLY You can't write against a read only slave.

127.0.0.1:6381> set k5 v555
(error) READONLY You can't write against a read only slave.
127.0.0.1:6379> SHUTDOWN
not connected> exit


127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1034
master_link_down_since_seconds:36
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0


127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1034
master_link_down_since_seconds:45
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
[root@CentOS-1 bin]# redis-server /myredis/redis6379.conf 
[root@CentOS-1 bin]# redis-cli -p 6379
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "k5"
4) "k1"
5) "k3"
127.0.0.1:6379> set k6 v6
OK

127.0.0.1:6380> get k6
"v6"
127.0.0.1:6380> SHUTDOWN
not connected> exit

127.0.0.1:6379> set k7 v7
OK

127.0.0.1:6381> get k7
"v7"
[root@CentOS-1 bin]# redis-server /myredis/redis6380.conf
[root@CentOS-1 bin]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> get k7
(nil)

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=376,lag=1
master_repl_offset:376
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:375

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k7
"v7"

 

②. 薪火相传

        上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=118438,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=118438,lag=0
master_repl_offset:118438
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:118437

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:118466
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:118494
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:1
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
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=118578,lag=1
master_repl_offset:118578
repl_backlog_active:1
repl_backlog_size:1048576

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:118550
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=15,lag=0
master_repl_offset:15
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14

③. 反客为主

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=119082,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=119082,lag=0
master_repl_offset:119082
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:119081
127.0.0.1:6379> SHUTDOWN
not connected> exit


127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:687
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:686
127.0.0.1:6380> set k8 v8
OK


127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:119180
master_link_down_since_seconds:53
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> get k8
(nil)
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> get k8
"v8"

[root@CentOS-1 bin]# redis-server /myredis/redis6379.conf 
[root@CentOS-1 bin]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

④. 哨兵模式

  1. 反客为主的自动版,后台监控主机是否故障,如果故障了根据投piao数自动将从库转换为主库。
  2. 自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错
  3. 配置哨兵,填写内容 
  • sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
  • 上面最后一个数字1,表示主机挂掉后salve投piao看让谁接替成为主机,得piao数多少后成为主机

     4. 启动哨兵:redis-sentinel /myredis/sentinel.conf 

     5. 一组sentinel能同时监控多个Master

[root@CentOS-1 myredis]# touch sentinel.conf
[root@CentOS-1 myredis]# vim sentinel.conf 
sentinel monitor host6379 127.0.0.1 6379 1
[root@CentOS-1 myredis]# cd /usr/local/bin
[root@CentOS-1 bin]# redis-sentinel /myredis/sentinel.conf 
8520:X 09 Mar 09:07:38.350 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 8520
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

8520:X 09 Mar 09:07:38.358 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8520:X 09 Mar 09:07:38.372 # Sentinel ID is 6cd04cab09139e744089eb6747df1b3135cd96d7
8520:X 09 Mar 09:07:38.372 # +monitor master host6379 127.0.0.1 6379 quorum 1
8520:X 09 Mar 09:07:38.376 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:07:38.380 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
127.0.0.1:6379> SHUTDOWN
not connected> exit
8520:X 09 Mar 09:07:38.358 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8520:X 09 Mar 09:07:38.372 # Sentinel ID is 6cd04cab09139e744089eb6747df1b3135cd96d7
8520:X 09 Mar 09:07:38.372 # +monitor master host6379 127.0.0.1 6379 quorum 1
8520:X 09 Mar 09:07:38.376 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:07:38.380 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.213 # +sdown master host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.213 # +odown master host6379 127.0.0.1 6379 #quorum 1/1
8520:X 09 Mar 09:10:11.213 # +new-epoch 1
8520:X 09 Mar 09:10:11.213 # +try-failover master host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.215 # +vote-for-leader 6cd04cab09139e744089eb6747df1b3135cd96d7 1
8520:X 09 Mar 09:10:11.215 # +elected-leader master host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.215 # +failover-state-select-slave master host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.298 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.298 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.374 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.833 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.833 # +failover-state-reconf-slaves master host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:11.896 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:12.870 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:12.870 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:12.921 # +failover-end master host6379 127.0.0.1 6379
8520:X 09 Mar 09:10:12.921 # +switch-master host6379 127.0.0.1 6379 127.0.0.1 6381
8520:X 09 Mar 09:10:12.921 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6381
8520:X 09 Mar 09:10:12.921 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6381
8520:X 09 Mar 09:10:42.970 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=10608,lag=1
master_repl_offset:10622
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:10621
[root@CentOS-1 bin]# redis-server /myredis/redis6379.conf 
[root@CentOS-1 bin]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:17701
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

5. 复制原理

  • slave启动成功连接到master后会发送一个sync命令
  • Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

6. 复制的缺点

    复制缺点:由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

转载于:https://my.oschina.net/weigy/blog/854935

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值