0%

redis主从复制

redis主从复制

注意:我使用的版本是6.0.10,不同版本可能略有差别

虽然redis有持久化的功能可以保证redis服务重启不会丢失数据,但是如果redis服务器的硬盘损坏就会导致数据丢失,,使用主从复制来避免这种单点故障。

主机数据更新后根据配置和策略自动同步到备机的master/slave机制,master以写为主,slave以读为主

原理

slave启动成功连接到master后会发送一个sync命令,master接到命令后会启动后台的存盘进程,收集所有的修改命令,完成后将命令发送给slave,之后master继续将新的数据命令发送给slave(首次是全量复制,后续是增量复制)

从2.8版本开始,slave启动成功连接到master后会发送一个psync命令,并带上复制偏移量

配置

配主不配从,配置slave即可,使得slave时刻盯住主机

在这里由于我只有一台电脑,所以只能用三个配置文件来启动三个redis服务了,带有配置文件的启动服务

1
redis-server redis79.conf

以及使用端口启动客户端

1
redis-cli -p 6379

启动之后就可以配置从机了

1
SLAVEOF 127.0.0.1 6379

一主两仆

graph TD
master79-->slave80
master79-->slave81

看一下执行命令之前的配置变化(使用info replication来查看)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#之前
# Replication
role:master
connected_slaves:0
master_replid:96519fc9dab0e66f4d1e8513f519b68622f4af9e
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

#之后
#主机
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=2646,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=2646,lag=1
master_replid:63b39507da5e42ce5e1b4d931f4e743c91bb92cd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2646
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2646


#从机
# 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:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:63b39507da5e42ce5e1b4d931f4e743c91bb92cd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:0

重点:

  • 从机会将主机的所有数据进行备份
  • 从机只能读,不能写(error) READONLY You can’t write against a read only replica.
  • 主机挂了之后,从机身份不变(master_link_status变成down),直到主机回来,主机回来之后还是主机
  • 从机挂了之后需要重新执行从属命令SLAVEOF 127.0.0.1 6379(如果是直接在配置文件中配置的从属关系则不需要)

可以使用命令来将从库变成主库

1
slaveof no one

薪火相传

由于一主两仆机制会导致主机挂掉之后整个redis就挂掉的问题,所以为了去中心化,有了薪火相传机制,上一个slave可能是下一个slave的master,slave同样可以接收其他的slave的连接和请求,可以有效地减轻master的写压力

graph LR
master79-->slave80-->slave81

这里slave80对于slave81是主机,对于master79是从机

该机制可能会存在延迟

哨兵模式

由于一主两从的主库挂掉之后,需要人工的去干预从库反客为主,再进行更改主从配置,而哨兵模式通过监听主库是否挂掉,从库根据投票来决定自动将从库切换为主库

配置redis-sentinel.conf配置文件

1
2
#烧哨兵监控 6379  当6379挂了之后从库进行投票,票数超过1即可成为主库,配置文件会自动修改为新选举的主库ip和port
sentinel monitor mymaster 127.0.0.1 6379 1

哨兵启动

1
redis-sentinel redis-sentinel.conf

当主库挂掉之后,从库进行重新选举出新的主库,原来的主库回来之后,只会成为从库,不会变成双主库

作用

  • 读写分离
  • 灾备