redis学习笔记--复制(Master/Slave)

复制

复制就是我们所说的主从复制,主服务器数据更新后根据配置和策略,自动同步到从服务器的master/slaver机制,Master以写为主,Slave以读为主,Redis使用默认的异步复制,其特点是低延迟和高性能。

配置从库(slave)

方式一:修改redis.conf配置文件

slaveof 主服务器IP 主库服务器port

方式二:使用slaveof 主服务器IP 主服务器port命令,但是每次主服务器断开都需要重新连接

查看复制信息

显示与复制相关的信息

info replication

master 和 slave 的复制状态以及它们的复制偏移量,连接的 slaves 列表

 role

常用3招

一主二仆

一个master两个slave

redis学习笔记--复制(Master/Slave)_第1张图片

问题演示

1.切入点问题?slave1、slave2是从头开始复制还是从切入点开始复制?比如从k4进来,那之前的k1,k2,k3是否也可以复制?

  • 主服务器(master) set k1、k2、k3
    redis学习笔记--复制(Master/Slave)_第2张图片
  • 从服务器(slave)配置复制功能
    在这里插入图片描述
  • 主服务器(master) set k4
    在这里插入图片描述
  • 从服务器(slave)复制了所有值

2.从机是否可以写?set可否?

  • 从服务器set

    结果:不可以,读写分离(主写从读)

3.主服务器shutdown后情况如何?从服务器是上位还是原地待命?

  • 主服务器shutdown后,从服务器复制信息
    redis学习笔记--复制(Master/Slave)_第3张图片
    结果:从服务器原地待命

4.主服务器又回来了后,主服务器新增记录,从服务器还能否顺利复制?

  • 主服务器启动后,set k5
  • 从服务器get k5

    结果:成功

5.其中一台从服务器down后在重启情况如何?

注意上面是使用slaveof命令连接的主服务器,所以从服务器down之后,再次启动后是master,需要重新连接,除非配置进redis.conf,连接后它从头开始复制

薪火相传

上一个Slave可以是下一个slave的Master,slave同样可以接收其他slave的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力。

主服务器172.17.0.2
redis学习笔记--复制(Master/Slave)_第4张图片
从服务器172.17.0.3,作为下一个slave的master
redis学习笔记--复制(Master/Slave)_第5张图片
从服务器172.17.0.4
redis学习笔记--复制(Master/Slave)_第6张图片
同样主服务器set k6,两台从从服务器都可以get k6。其次从服务器如果要写,将redis.conf中slave-read-only改为no。

反客为主

之前主服务器down掉,从服务器会一直等待主服务器,而在此期间如果从服务器执行slaveof no one命令会将此从服务器变为master,其他从服务器可以手动执行slaveof命令连上这个新的master。

哨兵模式(sentinel)

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

配置 Sentinel

自定义目录下新建sentinel.conf文件,名字不能错。内容如下:

sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

第一行配置指示 Sentinel 去监视一个名为 mymaster(名字自己起) 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379,最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机。

down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数

failover-timeout故障转移过期时间。当故障转移开始后,在此时间内仍然没有触发任何故障转移操作,当前sentinel将会认为此次故障转移失败。

parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

启动哨兵

对于 redis-sentinel 程序, 你可以用以下命令来启动 Sentinel 系统:

redis-sentinel /path/to/sentinel.conf 

对于 redis-server 程序, 你可以用以下命令来启动一个运行在 Sentinel 模式下的 Redis 服务器:

redis-server /path/to/sentinel.conf --sentinel

投票新选

当主服务器down掉之后,会在从服务器中投票选出新的master
redis学习笔记--复制(Master/Slave)_第7张图片
之前master启动之后成为了slave
redis学习笔记--复制(Master/Slave)_第8张图片
一组sentinel能同时监控多个Master

复制原理

全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

增量同步

  • Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
  • 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

复制缺点

复制延时
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

你可能感兴趣的:(Redis,java,redis)