Redis主从复制

25 阅读7分钟

十二、主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower) ; 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。默认情况下,每台Redis服务器都是主节点 ;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

img

主从复制的作用 读写分离:主节点写,从节点读,提高服务器的读写负载能力

数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复︰当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复 ; 实际上是一种服务的冗余。

负载均衡︰在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载 ; 尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

高可用(集群)基石︰除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

环境配置

只配置从库,不用配置主库。

127.0.0.1:6379> info replication #查看当前库的信息
# Replication
role:master #角色
connected_slaves:0 #连接的从机数量
master_failover_state:no-failover 
master_replid:24b0e8a8ed0189f29086fa10ea792ee49495cf41
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、端口号

2、pid

3、log文件名

4、dump.rdb文件名

修改完成后,启动三个服务,可以通过进程查看

1680330882126.png

一主二从

**默认情况下,每台Redis服务器都是主节点;**我们一般情况下只用配置从机就好了

主机

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 #从机的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=98,lag=1
master_failover_state:no-failover
master_replid:1daa0646071327bf1d9d0315a823a26dbf23d565
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98

从机

127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
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:5
master_sync_in_progress:0
slave_read_repl_offset:56
slave_repl_offset:56
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1daa0646071327bf1d9d0315a823a26dbf23d565
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:0

真实的主从配置应该在配置文件中配置,这样是永久的。命令的方式配置下一次启动会失效。

# replicaof <masterip> <masterport>

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
#
# masterauth <master-password>

细节

1、主机可以写,从机不能写只能读!主机中的所有信息和数据,都会被从机自动保存

主机写

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK

从机读

127.0.0.1:6380> keys *
(empty array)
127.0.0.1:6380> keys *
1) "k1"
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica. #从机不能写

测试

主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,如果主机回来了,从机依然可以获取主机写的信息.

如果是使用命令行的方式来配置主从,这个时候如果重启了,从机就会变成主机!只要变为原来的从机就会可以获取原来的值。

复制原理

1680332490004.png

层层链路 上一个M链接下一个S

1680334095798.png

这时候可以完成我们的主从复制

如果主机宕机了,能不能自动变成主机呢?

如果主机断开连接了,我们可以手动使用 slaveof on one 让自己变成主机!其他的节点就可以手动连接到最新的这个主节点!如果这个时候原来的主机恢复了,也没有用!

127.0.0.1:6381> slaveof no one #手动变为主机
OK
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:9a31a312396e4b67bcf625244d399fdb394d94fe
master_replid2:30aea419b13b69533e36b3e015048c31682b118a
master_repl_offset:4389
second_repl_offset:4390
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:4333

哨兵模式

1680335009424.png

1680335299536.png

测试

我们目前的状态是一主二从

1、配置哨兵配置文件 sentinel.conf

#sentinel monitor 被监控的名称 host port 1
sentinel monitor myredis 127.0.0.1 6379 1

后面的这个数字1,代表主机挂了,salve投票看让谁来接替成为主机,票数最多的成为主机

2、启动哨兵

[root@localhost myredis]# redis-sentinel sentinel.conf 
3115:X 01 Apr 2023 15:56:15.866 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3115:X 01 Apr 2023 15:56:15.866 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=3115, just started
3115:X 01 Apr 2023 15:56:15.866 # Configuration loaded
3115:X 01 Apr 2023 15:56:15.867 * Increased maximum number of open files to 10032 (it was originally set to 1024).
3115:X 01 Apr 2023 15:56:15.867 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 3115
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3115:X 01 Apr 2023 15:56:15.868 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3115:X 01 Apr 2023 15:56:15.870 * Sentinel new configuration saved on disk
3115:X 01 Apr 2023 15:56:15.870 # Sentinel ID is d668cb83f163724817fc63377579187d2e5f0cc3
3115:X 01 Apr 2023 15:56:15.870 # +monitor master myredis 127.0.0.1 6379 quorum 1
3115:X 01 Apr 2023 15:56:15.871 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
3115:X 01 Apr 2023 15:56:15.872 * Sentinel new configuration saved on disk
3115:X 01 Apr 2023 15:56:15.872 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 

如果主节点断开了,就会在从机中投票一个服务器

1680336124618.png

如果主机此时回来了,只能归并到新的主机下,当做从机,这就是哨兵模式规则!

优点

1、哨兵集群,基于主从复制模式,所有的主从配置优点,它全有

2、主从可以切换,故障可以转移,系统的可用性就会更好

3、哨兵模式就是主从复制的升级,手动到自动,更加健壮

缺点

1、Redis不好在线扩容,集群容量一旦达到上线,在线扩容就会十分麻烦

2、实现哨兵模式的配置其实十分麻烦,里面有很多的选择

哨兵模式的全配置

1680336555905.png

1680336628815.png

1680336679677.png

1680336710786.png