Redis主从复制和哨兵模式
目录
- 主从复制
- 环境配置
- 哨兵模式
主从复制
是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点,后者称为从节点,数据的复制是单向的,只能由主节点到从节点,Master以写为主,slave以读为主
默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点
主从复制,读写分离!80%的情况下都是在进行读操作!减缓服务器的压力,架构中经常使用!
作用:
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复
- 负载均衡:在主从复制基础上,配合读写分离,可以由主节点提供服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载,尤其是在读多写少场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
- 高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础
环境配置
单机多服务:复制三个配置文件,修改对应信息
主要是修改:
端口
pid名
log文件名
dump.rdb名
更改配置文件
redis79.conf
打开后台运行
修改日志文件
修改dump.rdb
redis80.conf
更改端口
修改pidfile
修改logfile
修改dump
redis81.conf
启动服务
查看进程
默认情况下,每台Redis服务器都是主节点,一般情况下,只用配置从机就可以了
这里把6379当作主机
6380和6381当作从机
使用slaveof
认主机
查看主机
真实的主从配置应该在配置文件中配置,这样的话是永久的,我们这里使用的是命令,暂时的!
修改下面的ip、port、密码即可
注意:
主机可以写,从机不能写只能读,主机中的所有信息和数据,都会自动被从机保存
主机中读写:
从机中读写:
主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息
如果从机断了,此时主机进行写数据,如果是使用命令行来配置的主从,那么这个从机会变回主机,使用slaveof
再变成从机,会立马拿到主机数据
复制原理:
slave启动成功连接到master后会发送一个sync同步命令,master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
增量复制:master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行,我们的数据一定可以在从机中看到
如果主机断开了连接,我们可以使用slaveof no one
让自己变成主机,其他的节点就可以手动连接到最新的这个主节点(手动)
哨兵模式
自动选举老大的模式
主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用,这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式,Redis从2.8开始正式提供了Sentinel
(哨兵)架构来解决这个问题
能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行,其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这样就形成了多哨兵模式
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为服务器不可用,这个现象称为主观下线,当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作,切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线
测试:
我们目前的状态是 一主二从
配置哨兵配置文件sentinel.conf
启动哨兵
关闭主机
根据哨兵日志,可以看到已经有了新的主机
此时,如果79端口重新连接,就会自动变成从机
哨兵模式的优缺点
优点:
- 基于主从复制,所有的主从配置优点,全有
- 主从可以切换,故障可以转移,系统的可用性更好
- 哨兵模式就是主从模式的升级,手动到自动,更加健壮
缺点:
Redis不好在线扩容,集群容量一旦到达上限,在线扩容就十分麻烦
实现哨兵模式的配置其实是很麻烦的,里面有很多选择