Redis主从复制详解。

Redis主从复制

      • 一. 主从复制过程
          • 1. 全量复制:
          • 2. 增量复制:
      • 二 . 主从复制特点:
      • 三. 主从复制的创建(在从节点操作)
      • 四. 主从复制的优缺点
        • 优点
        • 缺点

​ Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制。

​ 同时redis支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
Redis主从复制详解。_第1张图片

一. 主从复制过程

1. 全量复制:

Redis全量复制一般发生在Slave启动阶段,这时Slave需要将Master上的所有数据都复制一份:

  1. 从服务器连接主服务器,并向其发送SYNC命令。
  2. 主服务器接收到命令后,执行bgsave命令(RDB持久化)保存快照并使用缓冲区记录此后执行的所有写命令。
  3. 主服务器向从服务器发送生成的rdb文件和记录在缓冲区的命令。
  4. 从数据库收到文件后删除旧数据,将新数据载入。并执行缓冲区的命令

不了解redis持久化的可以先看:redis持久化RDB和AOF

Redis主从复制详解。_第2张图片

2. 增量复制:

​ 主服务器和从服务器正常工作后,将主服务器的写操作同步到从服务器上。

创建主从关系及数据复制过程:

  1. 保存主节点信息
  2. 从节点与主节点建立网络连接。从节点会建立一个socket套接字,专门用于接受主节点发送的复制命令。

如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行slaveof no one取消复制。

  1. 连接建立成功后从节点发送ping请求进行首次通信,其目的是:
  • 检测主从之间网络套接字是否可用
  • 检测主节点当前是否可接受处理命令

若ping不通或超时,从节点断开复制连接,下次定时任务会发起重连。

  1. 权限验证。

    若主节点设置密码,从节点必须配置masterauth参数保证与主节点相同的密码才能通过验证。若验证失败,从节点会重新发起复制流程。

  2. 同步数据。建立通讯后第一次是全量复制。

  3. 命令持续复制。
    Redis主从复制详解。_第3张图片

3. 主从同步策略:
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。slave 也可以在任何时候发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

注意:redis 2.8版本以前,不支持增量同步。2.8版本后,即使主从连接中途断掉,也不需要进行全量同步,可以通过增量同步继续完成同步。

二 . 主从复制特点:

  1. Redis使用异步复制,主服务器在复制期间不会阻塞。
  2. 默认情况下每台都是主服务器,一个主服务器可以有多个从服务器,一个从服务器只能连接一个主服务器,从服务器之间也可以相连。提高了redis服务器扩展性,减缓了服务器压力。
  3. 复制过程中从服务器也是非阻塞的,但客户在复制期间读取的数据是之前保存的旧数据。可以在配置文件中设置复制期间不可以向从服务器请求数据,不过这样从服务器就会发生阻塞。

注意事项:

在进行搭建主从复制时,主服务器应该开启持久化并且禁止自动重启。当主服务器没有持久化且可以自动重启时,redis遇到故障默认重新启动,此时数据清除因为没有持久化,同时从服务器同步了主服务器也清除了数据。

三. 主从复制的创建(在从节点操作)

  1. 启动命令 redis-server --slaveof host port:设置当前服务器为某个redis服务器的Slave。

实例:

  • 启动两个redis实例来实验,两个都基于主机ip,一个6380口,一个6381口
[root@redis ~]# ps -ef |grep redis
root      15874      1  0 16:33 ?        00:00:00 redis-server 127.0.0.1:6380
  • 将6381端口机器设置成6380的slave
[root@redis ~]# redis-server --port 6381 --slaveof 127.0.0.1 6380

Redis主从复制详解。_第4张图片

主从关系建立完成

  • 测试结果
[root@redis ~]# redis-cli -p 6380   #连接主服务  写入数据
127.0.0.1:6380> set name wang
OK
[root@redis ~]# redis-cli -p 6381  #连接从服务 查看数据
127.0.0.1:6381> get name
"wang"
  1. 客户端命令Slaveof host port:将当前服务器从Master修改为Slave
  • 同样启动两个redis实例,在6380上写入数据,在6381上查看数据。
[root@redis ~]# redis-server --port 6380 &
[root@redis ~]# redis-server --port 6381 &
[root@redis ~]# redis-cli -p 6380       #登录到6380
127.0.0.1:6380> set name shisan          #写入数据
OK
127.0.0.1:6380> get name                    #可以查看写入的数据
"shisan"
      
[root@redis ~]# redis-cli -p 6381             #登录到6381
127.0.0.1:6381> 
127.0.0.1:6381> get name           #此时6381不能查到数据
(nil)
  • 将6381变为6380的从节点
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380   #将本台服务器设置为127.0.0.1 6380 的Slave
OK
127.0.0.1:6381> get name
"shisan"
  • 结束主从关系:SLAVEOF no one
127.0.0.1:6381> SLAVEOF no one
OK
  1. 通过配置文件指定主服务器:redis.conf
# replicaof  
replicaof 192.168.126.162 6382    #将本机设置为192.168.126.162 6382 的slave

四. 主从复制的优缺点

优点

  1. 数据冗余:实现了数据热备份,是持久化之外的另一种数据冗余方式。
  2. 容灾能力:主节点故障时,可以有从节点暂时提供读服务。
  3. 负载均衡:主从复制加上可以读写分离,让主库提供写入服务,从库提供读取服务。分担主服务器读数据的负载压力,提高redis服务器并发量。

缺点

  1. Master故障,服务器无法执行写操作。
  2. 手动实现,如果需要自动实现剧需要sentinel哨兵模式,实现故障转移Failover操作。

不过主从复制是实现sentinel模式的基础。

sentinel传送门:redis高可用方案sentinel

你可能感兴趣的:(redis,redis,linux,centos,运维,负载均衡)