主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。
主从复制的作用
1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
怎么玩:
1、配从(库)不配主(库):slave 主库ip 主库端口号。
2、常用的招数
一主二仆:
1.主机不配置,从机使用slaveof声明所属主机。
2.主机如果宕机,重启后自动恢复到之前的转态,不需要再做其他任何修改,再新增加数据,从机可以读到数据。
3.从机如果宕机,再次重启后,再次读数据,读不到。需要使用slaveof再次声明所属主机,声明之后可以再次读取数据。
4.主机可写可读,从机只可以读,不可以写。
5.从机使用slaveof声明所属主机是,会发送sync到主机,获取主机的rdb文件,执行,实现数据同步,以后再增数据,使用增量复制完成同步。如果是宕机后再次声明所属主机,则使用全量复制完成同步。
薪火相传:
1.主机一,主机二,主机三启动。
2.查看各个主机信息。
3.主机二使用slaveof声明所属主机为主机一,主机三使用slaveof声明所属主机为主机二。
4.三者附属关系为主机三附属主机二,主机二附属主机一。
5.薪火相传模式可以实现主从复制。
6.主机一存活时,主机二,主机三都不可以写数据,只能读数据。
7.主机一宕机后,主机二,主机三仍然都不可以写数据,主机二使用slaveof no one命令之后,主机二可以写数据,主机三可以读取主机二写的数据。
8.主机一复活后,需要使用slaveof声明所属主机为主机二,主机一获取主机二的rdb文件,实现全量复制,完成数据同步。
反客为主:
反客为主指一个master服务器同时挂2个salve服务器。当master宕机后,在2个slave服务器的哪一台服务器中执行slaveof no one 命令,哪一台服务器就会升级为master服务器。
----------------------------------------------------------------------------------------------------
复制原理:Slave启动成功连接到master胡发送一条sync命令。
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令。再后台进程执行完毕之后,master将传送整个数据文件到slave,已完成一次完全同步。
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令一次传给slave,完成同步。
但是只要是重新连接master,一次完全同步(全量恢复)将被自动执行。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
哨兵模式(反客为主自动版):
1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个PING命令。
2)如果一个实例(instance)距离最后一次有效回复PING命令的时间超过 own-after-milliseconds 选项所指定的值,则这个实例会被Sentinel标记为主观下线。
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4)当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
5)在一般情况下,每个Sentinel 会以每10秒一次的频率向它已知的所有Master,Slave发送 INFO 命令。
6)当Master被Sentinel标记为客观下线时,Sentinel 向下线的 Master 的所有Slave发送 INFO命令的频率会从10秒一次改为每秒一次。
7)若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。 若 Master重新向Sentinel 的PING命令返回有效回复,Master的主观下线状态就会被移除。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
这里的哨兵有两个作用
-
通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
-
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
- ---------------------------------------------------------- 主观下线以及客观下线解释:
-
主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。
客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。
从主观下线状态切换到客观下线状态并没有使用严格的法定人数算法(strong quorum algorithm), 而是使用了流言协议: 如果 Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了足够数量的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线。 如果之后其他 Sentinel 不再报告主服务器已下线, 那么客观下线状态就会被移除。
客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。