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 | #之前 |
重点:
- 从机会将主机的所有数据进行备份
- 从机只能读,不能写(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 | #烧哨兵监控 6379 当6379挂了之后从库进行投票,票数超过1即可成为主库,配置文件会自动修改为新选举的主库ip和port |
哨兵启动
1 | redis-sentinel redis-sentinel.conf |
当主库挂掉之后,从库进行重新选举出新的主库,原来的主库回来之后,只会成为从库,不会变成双主库
作用
- 读写分离
- 灾备