Redis—主从同步

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 版本以前主从复制过程以下图:

  • slave 服务启动,slave 会创建和 master 的链接,发送 sync 命令。
  • master 启动一个后台进程将数据库快照保存到 RDB 文件中
注意:此时若是生成 RDB 文件过程当中存在写数据操做会致使 RDB 文件和当前主 redis 数据不一致,因此此时 master 主进程会开始收集写命令并缓存起来。
  • master 就发送 RDB 文件给 slave
  • slave 将文件保存到磁盘上,而后加载到内存恢复
  • master 把缓存的命令转发给 slave

注意:后续 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 同步部分数据。

主从复制实践

一、准备三个redis数据库配置文件

背景: 一主两从

  • 6380为主,6381和6382 为从
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
  • 再建立两个配置文件6381和6382
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

二、启动redis数据库

[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

三、确保这三个redis数据库是彻底独立的数据库

四、给两个从服务器配置文件再添加一行配置(很重要)

在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

七、添加数据进行测试

八、手动进行主从复制故障切换

  • 关闭6381的从库身份
redis-cli -p 6381
info replication
slaveof no one
  • 将6382设为6381的从库
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

相关文章
相关标签/搜索