持久化保证了即使复述,服务重启也会丢失数据,因为复述,服务重启后会将硬盘上持久化的数据恢复到内存中,但是当复述,服务器的硬盘损坏了可能会导致数据丢失,如果通过复述的主从复制机制就可以避免这种单点故障,如下图:
,
说明:
-
<李>
主复述中的数据有两个副本(复制)即从redis1和从redis2,即使一台复述,服务器宕机其它两台复述,服务也可以继续提供服务。
李> <李>主复述中的数据和从复述上的数据保持实时同步,当主复述,写入数据时通过主从复制机制会复制到两个从复述,服务上。
李> <李>只有一个主复述,可以有多个从复述。
李> <李>主从复制不会阻塞的主人,在同步数据时,主人可以继续处理客户请求。
李> <李>一个复述,可以即是主又是从,如下图:
李>
,
-
<李>
,
李>
无需特殊配置。
修改从复述,服务器上的复述。参看文件,添加slaveof主redisip主复述,端口。
,
上边的配置说明当前该从复述,服务器所对应的主复述是192.168.101.3,端口是6379。
在redis2.8版本之前主从复制过程如下图:
,
复制过程说明:
-
<李>
奴隶服务启动,奴隶会建立和主人的连接,发送同步命令。
李> <李>主启动一个后台进程将数据库快照保存到RDB文件中
李>注意:此时如果生成RDB文件过程中存在写数据操作会导致RDB文件和当前主复述,数据不一致,所以此时主主进程会开始收集写命令并缓存起来。
引用><李>
主人就发送RDB文件给奴隶
李> <李>奴隶将文件保存到磁盘上,然后加载到内存恢复
李> <李>主人把缓存的命令转发给奴隶
李>注意:后续大师收到的写命令都会通过开始建立的连接发送给奴隶。
当主人和奴隶的连接断开时奴隶可以自动重新建立连接。如果大师同时收到多发个奴隶来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有奴隶。
引用>完整复制的问题:
在redis2.8之前从复述每次同步都会从主复述中复制全部的数据,如果从复述是新创建的从主复述中复制全部的数据这是没有问题的,但是,如果当从复述,停止运行,再启动时可能只有少部分数据和主复述,不同步,此时启动复述,仍然会从主复述,复制全部数据,这样的性能肯定没有只复制那一小部分不同步的数据高。
引用>
,
部分复制说明:
从机连接主机后,会主动发起PSYNC命令,从机会提供主人的runid(机器标识,随机生成的一个串)和抵消(数据偏移量,如果抵消主从不一致则说明数据不同步),主机验证runid和抵消是否有效,runid相当于主机身份验证码,用来验证从机上一次连接的主机,如果runid验证未通过则,则进行全同步,如果验证通过则说明曾经同步过,根据抵消同步部分数据。
复述,主从复制看这篇就够了