概念:
主从复制是指,将一台redis服务器的数据,复制到其他的redis的服务器,前者被称为主节点(master/leader),后者称为从节点(slave/follower);数据的服务都是单向的,只能由主节点到从节点,Master以写为主,slave以读为主.
默认情况下,每台redis服务器都是主节点;且一个主节点可以有多个从节点或者没有,但一个从节点只能有一个主节点.
主从复制的作用主要包括:
1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.
2.故障恢复:当主节点出现问题时,从节点可以提供服务,实现快速的故障修复,实际上是一种服务冗余
3.负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写的服务,从节点提供读的服务,分担服务器压力,尤其是在读多写少的场景下,通过多个节点分担读的负载,可以提高并发量
4.高可用的基石:主从复制是哨兵和集群能够实施的基础,因此说主从复制是redis高可用的基础.
一般情况下,redis运用的工程中,redis都是多台,原因有几个:
1.从机构上看,单个redis容易出现单点故障,一台服务器处理所有的业务请求负载大,压力较大
2.从容量上看,单个redis服务器内存容量有限,就算是一台Redis服务器设置成256G,也不能将所有内存用作于redis存储内存,一般会将redis的内存设置不超过20G.
环境配置:
只配置主库,不配置从库
单机多服务,复制多个配置文件,分别启动.
port 6381
daemonize yes 开启后台运行
pidfile /var/run/redis6381.pid
logfile "6381.log"
dbfilename dump6381.rdb
命令配置:
只配从机,在从机中舒服,slaveof ip 端口号
输入命令 info replication
配置成功,此时在主机中输入 info replication
文件永久配置:
复制原理:
Slave 启动成功后,链接到master后会发送一个sync同步命令
master接到命令后,启动后台的存盘进程,同事手机所有的接收到的用于修改数据的命令,在后台执行完毕后,master将传送整个数据文件到slave,并完成一次完全同步.
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中.
增量复制:master 继续将新的所有收集到的修改命令一次传给slave,完成同步
只要从新链接,一定会执行一次全量复制.
哨兵模式:
在没有哨兵的情况下:
主机负责写,从机只能读,写的时候报错
如果主机宕机了,从机不发生变化,仍然能读,如果主机又回来了,从机可以获取主机写的信息
如果从机断了,如果没有配置到配置文件中,那么重启后不能自动链接到主机上.就不能获取主机的数据
如果主机断开链接可以使用 slaveof no one 命令,就可以变成主机,然后手动将其他从机的主机改成这个主机
有哨兵模式:
主从切换技术的方法是:当主服务宕机后,需要手动把一台从服务器切换为主服务器,就需要人工干预费事费力,还会造成一段时间内服务不可用.因此我们优先选择哨兵模式.redis从2.8开始提供了Sentinel(哨兵)架构来解决这个问题.
能够后台监控主机是否故障,如果故障可根据投票数自动将从库转为主库.
哨兵模式是一种特殊的模式,哨兵是一个独立的进程,独立运行.其原理是哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例.
多哨兵:
哨兵发送命令让redis服务器返回监控器运行状态,包括主服务器和从服务器.
当哨兵检测到master宕机,会自动将slave切换成master,然后通过发布订阅的模式通知其他服务器,修改配置文件切换主机.
然而一个哨兵可能会出问题,可以使用多个哨兵进行监控.各个哨兵之间还会进行监控,这样就形成了多哨兵模式.
假设主服务器宕机了,哨兵1先检测到这个结果,但是不会马上进行failover过程,仅仅是哨兵1主观认为主服务器不可用,这种现象呗称为主观下线.当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间进行一次投票.投票的结果由随机一个哨兵发起,进行faliover(故障转移)操作.切换成功后,就会通过发布订阅的模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线.
哨兵配置文件:
1.配置哨兵配置文件 sentinel.conf
sentinel monitor myredis 127.0.0.1 6379 1(代表主机挂了,slave投票看让谁接替主机,票数最多的成为主机)
哨兵的优点:
1.基于主从复制的配置的优点全有,
2.主从可以切换,故障可以转移,系统的可用性更好
3.哨兵模式就是主从复制的升级,
缺点:
1.redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分烦恼
2.实现哨兵模式的配置很麻烦的,里面有很多选择