什么是主从复制
持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:
说明:
- 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
- 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
- 只有一个主redis,可以有多个从redis。
- 主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求
- 一个redis可以即是主又是从,如下图:
一主多从的结构下,不会出现单点故障,同时可用性也得到了保障。由于负责读取的从库相对较多,因此很适合读多写少(例如:电商)的场景。
主从配置
1. 主redis配置
无需特殊配置
2. 从机redis配置
2.1 复制出一个从机
2.2 修改从机的redis.conf配置slaveof为主机的ip地址和端口号
slaveof 主机ip 主机端口号
如:slaveof 192.168.20.66 6379
2.3 修改从机的port地址为6380( 在redis.conf中修改)
2.4 清除从机中的持久化文件
2.5 启动从机【一定要使用配置文件启动,否则还是使用默认的端口】
2.6 启动6380的客户端
注意:
主机一旦发生增删改操作,那么主机会将数据同步到从机中。从机不能执行写操作。会报如下错误:
使用redis主从复制功能比较简单,可以通过info replication来查看当前redis服务器在主从复制中的状态。
主从复制实现了读写分离,可以进行容灾恢复。
redis主从复制原理
1.从服务器初始化
当从服务器启动时,会向主服务器发送SYNC命令,请求同步数据。主服务器接收到消息之后,进行RDB持久化,并生成一个快照文件;与此同时,主服务器会将生成快照期间新执行的命令缓存起来。在快照文件生成完毕之后,主服务器将RDB快照文件和缓存下来的命令一并发送给从服务器,从服务器首先载入接收到的RDB快照文件,接着执行被缓存下来的新命令,完成主从数据的初始化同步操作。
2.从服务器保持同步
从服务器在同步完成之后,主服务器接收到的所有命令都会异步的发送给从服务器用来保持主从数据的一致性。
3.从服务器故障后处理
当从服务器崩溃之后,重启之后进行初始化,会自动的同步主服务器的数据。在redis的2.8版本之后,redis采用了"增量复制"的方式优化了从服务器的初始化同步数据的过程。
4.主服务器故障后处理
当主服务器崩溃之后,首先需要手动的选择一个从服务器升级为主服务器(需要手动调整所有相关的从服务器),然后启动之前已经崩溃的主服务器作为从服务器回到系统中。
复制的缺点
延时,由于所有的写操作都是在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使得这个问题更加严重。
可以看到,redis在主服务器崩溃之后需要繁琐的人工干预来恢复服务,特别是在主数据库禁止了持久化之后,上述步骤不能错乱,否则会导致主数据库重启后恢复了错误数据,进而导致从数据库也同步错误数据这一灾难性后果。为此,redis提供了哨兵机制,用于自动化的监控和维持分布式redis系统的良好运转。
redis主从复制总结
1.乐观复制策略
redis的主从复制采用的是乐观复制的策略,在一定的时间内允许主从服务器的数据不完全一致,但是保持主从数据库数据的最终一致性(按照CAP定理,放弃了C(强一致性))。
这意味着redis主从服务器之间的数据复制操作时异步的,主服务器不等待从服务器返回复制的结果,可以立即处理新的写入命令。这一策略使得主服务器的性能在复制时不会受到太大影响,但是从服务器会出现短时间内数据不一致的情况。redis允许用户配置主库的min-slaves-to-write(代表至少N台从服务器完成复制,才允许主服务器写入)和min-slaves-max-lag(允许从服务器断开连接的时间)这两个配置项来控制分区中数据不一致的影响。
2.和集群的区别
redis的主从复制特性为redis带来了很高的读取可用性,但是对于海量数据的持久化存储是力不从心的。因为主从复制结构下,任意的节点都保存了100%的存储数据,所以能够存储的数据规模还是受限于单例服务器存储容量的大小。
为此,在单主多从结构的基础上,redis还提供了集群特性。通过将存储数据合理的分片存储在不同的redis节点上,通过集群水平扩容之后的redis集群拥有了极高的读写可用性和分区容错性。理解redis的主从复制原理是理解更为复杂的集群特性的基础。
redis的哨兵机制参考下篇博客:https://blog.csdn.net/duan196_118/article/details/105137029
如有不足,欢迎留言指正。。。