这是本人学习的总结,主要学习资料如下
主从复制是指将一台服务器的数据复制到其它服务器。前者称为主机,后者称为从机。只能从主机写到从机,不能反过来。主机以写为主,从机以读为主。
一般主从的最低配置是『一主二从』。其实『一主一从』也可以,但是后面会涉及到哨兵模式,至少需要两台从机。
dump.rdb
文件,重启主机,从机的数据也没了。redis.conf
文件,这两份文件分别是两个从机的启动配置文件。改写这两个文件的端口号,我是改成了6380和6381。logfile "6379.log"
dbfilename "dump6379.rdb"
redis.conf
文件,原文件我当做主机,后两个文件我当成从机。之后cd到redis安装目录下,使用命令```redis-server /*/redis.conf````指定指定配置文件开启redis服务即可。slaveof ip port
,指定本机是谁的从机,或者启动前在配置文件中修改。另外我们可以使用info replication
查看主从配置信息。配置好之后,主机写的数据从机就能立刻读到,同时从机的任何写操作都是禁止的,主机可以随意读写。现在有这样一个场景,如果主机挂掉了,而且短时间内有无法恢复,那就让redis服务只有读没有写吗?听起来有些浪费资源,也不太实际。事实上,当我们发现主机挂掉以后,可以指定一个新的节点为主机,继续维持redis的服务。
找到一个从机,执行指令slaveof no one
,这时候该从机就可以变成主机,可以提供写服务,同时其他从机的主从关系维持不变。
这样的解决方式也带来一个问题,如果原本的主机抢救回来了,那也是一个光杆司令。系统就会变成有两个主机,各自有自己的端口号。要想回到最初的状态又要使用指令slaveof ip port
,比较麻烦。所幸的是,redis提供了哨兵模式帮助我们自动完成这些事,服务更及时,更有效。
首先,哨兵是指一个独立进程,他会监控指定的redis服务。当发现主机挂了以后,哨兵会通过一些条件选取一个从机,并将这个从机变成新的主机。
上图是一个简单的模型,实际上一个哨兵还不够,因为这个哨兵也有挂掉的风险,所以我们还会增加监控哨兵的哨兵,保证系统的运行。一般情况下一个最简单的哨兵模型也应该有三哨兵三机子。
三个哨兵各自监控所有的redis服务,同时也互相监控。
当哨兵1发现主机挂了,系统不会立刻处理。因为这个过程只是哨兵1的主观下线。等到其他的哨兵都发现主机挂了,当认为主机挂了的哨兵的数量足够多时,那系统才会开始处理。
首先,哨兵们开始投票,选出他们认为应该接替主机的从机,得票数最多的从机就会变成主机。之后通过订阅发布模式,哨兵们将监控的从机的主机对象切换成新的主机。这个过程叫客观下线。
文件名必须是sentinel.conf
,放在安装目录下,或者等会启动的时候用指定配置文件的方式启动。
# sentinel monitor 主机名(自定义) ip port n; n表示至少要有n个哨兵认为这个监视对象失效,那这台主机才失效。
sentinel monitor master 127.0.0.1 6379 1
# 监控的主机在60000毫秒内没有反馈,那哨兵就认为这台机子挂了
sentinel down-after-milliseconds master 60000
执行指令redis-sentinel /*/sentinel.conf
MacBook-Pro:etc fulanbin$ redis-sentinel sentinel.conf
63167:X 15 Oct 2020 15:12:26.492 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
63167:X 15 Oct 2020 15:12:26.492 # Redis version=5.0.6, bits=64, commit=00000000, modified=0, pid=63167, just started
63167:X 15 Oct 2020 15:12:26.492 # Configuration loaded
63167:X 15 Oct 2020 15:12:26.494 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 63167
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'