Redis主从同步:数据能够从主服务器向任意数量的从服务器上同步,从服务器能够是关联其余从服务器的主服务器。这使得Redis可执行单层树复制。存盘能够有意无心的对数据进行写操做。因为彻底实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布 记录。同步对读取操做的可扩展性和数据冗余颇有帮助。redis
持久化保证了即便 redis 服务重启也会丢失数据,由于 redis 服务重启后会将硬盘上持久化的数据恢复到内存中,可是当 redis 服务器的硬盘损坏了可能会致使数据丢失,若是经过 redis 的主从复制机制就能够避免这种单点故障,以下图:shell
工做原理:数据库
Redis的主从结构能够采用一主多从或者级联结构,Redis主从复制能够根据是不是全量分为全量同步和增量同步。vim
主 redis 中的数据有两个副本(replication)即从 redis1 和从 redis2,即便一台 redis 服务器宕机其它两台 redis 服务也能够继续提供服务。缓存
主 redis 中的数据和从 redis 上的数据保持实时同步,当主 redis 写入数据时经过主从复制机制会复制到两个从 redis 服务上。服务器
只有一个主 redis,能够有多个从 redis。性能
主从复制不会阻塞 master,在同步数据时,master 能够继续处理 client 请求。测试
一个 redis 能够便是主又是从,以下图:3d
2.8之后实现PSYNC的机制,实现断线重连code
在 redis2.8 版本以前主从复制过程以下图:
注意:此时若是生成 RDB 文件过程当中存在写数据操做会致使 RDB 文件和当前主 redis 数据不一致,因此此时 master 主进程会开始收集写命令并缓存起来。
注意:后续 master 收到的写命令都会经过开始创建的链接发送给 slave。
当 master 和 slave 的链接断开时 slave 能够自动从新创建链接。若是 master 同时收到多个 slave 发来的同步链接命令,只会启动一个进程来写数据库镜像,而后发送给全部 slave。
完整复制的问题:
在 redis2.8 以前从 redis 每次同步都会从主 redis 中复制所有的数据,若是从 redis 是新建立的从主 redis 中复制所有的数据这是没有问题的,可是,若是当从 redis 中止运行,再启动时可能只有少部分数据和主 redis 不一样步,此时启动 redis 仍然会从主 redis 复制所有数据,这样的性能确定没有只复制那一小部分不一样步的数据高。
从机链接主机后,会主动发起 PSYNC 命令,从机会提供 master 的 runid(机器标识,随机生成的一个串) 和 offset(数据偏移量,若是offset主从不一致则说明数据不一样步),主机验证 runid 和 offset 是否有效,runid 至关于主机身份验证码,用来验证从机上一次链接的主机,若是 runid 验证未经过则,则进行全同步,若是验证经过则说明曾经同步过,根据 offset 同步部分数据。
背景: 一主两从
cd /opt/redis_conf vim redis-6380.conf # 写入如下配置 port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no
sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf sed "s/6380/6382/g" redis-6380.conf > redis-6382.conf
[root@qishi666 redis_conf]# mkdir -p /data/6380 [root@qishi666 redis_conf]# mkdir -p /data/6381 [root@qishi666 redis_conf]# mkdir -p /data/6382
[root@qishi666 redis_conf]# redis-server redis-6380.conf [root@qishi666 redis_conf]# redis-server redis-6381.conf [root@qishi666 redis_conf]# redis-server redis-6382.conf
在6381和6382配置文件添加这一行配置,表示指定主服务器为6380 slaveof 127.0.0.1 6380
pkill redis redis-server /opt/redis_conf/redis-6380.conf redis-server /opt/redis_conf/redis-6381.conf redis-server /opt/redis_conf/redis-6382.conf
redis-cli -p 6380 info redis-cli -p 6380 info replication
redis-cli -p 6381 info replication slaveof no one
6382链接到6381: [root@db03 ~]# redis-cli -p 6382 127.0.0.1:6382> SLAVEOF no one 127.0.0.1:6382> SLAVEOF 127.0.0.1 6381