Redis集群实战-主从分离

1.Redis主从复制

1.1 海量并发性能瓶颈处理,对读写能力进行扩展,采用读写分离方式解决性能瓶颈

Redis集群实战-主从分离

那读写分离是用什么方式实现呢?

运行一些额外的服务器,让它们与主服务器进行连接,然后将主服务器发送的数据副本并通过网络进行实时的更新到从服务器(具体的更新速度取决于网络宽带),通过将读请求分散到不同的服务器上面进行处理,用户可以从新添加的从服务器上获取额外的读查询处理能力。

1.2 Redis提供了实现读写分离的场景应用。

 我们只需要在redis的配置文件里加上一条,[slaveof host port]语句,在从节点加入主节点的信息,例如:slaveof 127.0.0.1 6379

 那下面就实操一下!

1.首先更改redis的从配置文件

Redis集群实战-主从分离

 2.将port改成6380

Redis集群实战-主从分离

3.找到 slaveof <masterip> <masterport> 更改为主Redis的ip和端口,此命令就是将6380改为6379的从节点

Redis集群实战-主从分离

4.更改完毕,启动主Redis的redis-server.exe

Redis集群实战-主从分离

5.启动从Redis,命令为redis-server.exe redis.windows.conf

Redis集群实战-主从分离

主节点控制台也展示主从成功!

Redis集群实战-主从分离

那咱们来验证一下,主Redis写数据,从Redis是否复制并且也能读取到同样信息呢,咱们来试试吧!

首先进入主Redis然后双击redis-cli.exe,进入客户端连接以后存储数据。

Redis集群实战-主从分离

然后我们进入从Redis,cmd命令输入redis-cli.exe -p 6380 连接6380从Redis了,获取存储的数据看看。

Redis集群实战-主从分离

到此为止,主从复制环境配置成功了,我们在主Redis写入数据,会复制到从Redis里。

思考一下:

Redis是怎么把master数据传到slave的,如果slave下线以后怎么保证数据同步呢?如果slave断线恢复以后能不能拿到断线期间的数据呢?

2.Redis是怎么做到主从同步的?

首先进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”。

2.1 Redis 2.8版本之前使用旧版本复制功能SYNC

     SYNC是一个非常耗费资源的操作。

     1.主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘读写资源。

     2.主服务器将RDB文件发送给从服务器,这个发送操作会耗费主服务器大量的网络宽带和流量,并对主服务器响应命令请求的势据产生影响。

     3.接收到RDB文件的从服务器在载入文件的过程重是阻塞的,无法处理命令请求。

2.2 Redis2.8之后使用PSYNC

    

Redis集群实战-主从分离

     PSYNC命令具有完整重同步(full resynchroniztion)和部分重同步(partial resynchroniztion)两种模式。

     部分重同步功能由以下三个部分构成:

     1.主服务器复制偏移量(replication offset) 和从服务器复制偏移量。(ps:从断线以后,主服务的写没获取到时,其实要记录那个点,重启以后从那个点加载)

     2.主服务器的复制积压缓冲区(replication backlog),默认大小为1M。(ps:记录存放堆积的消息)

     3.服务器的运行id( run id),用于存储服务器标识,如从服务器断线重新连接,取到主服务器的运行ID与重新运行ID进行对比,从而判断是执行部分重同步还是执行完整重同步。(ps:用运行id主要防止断线以后各个服务器连接的还是断线之前的服务器,这样才能进行偏移量复制,否则就把连接错的服务器进行全量复制了)

3.Redis读写分离同步步骤

Redis集群实战-主从分离

主服务器判断从服务器是不是第一次执行复制

  是第一次执行,那么进行全量复制

  不是第一次执行,会有一种情况,复制积压缓冲区断线时可能存储的数据超过1M,不能取出完整数据,只能进行全量复制,如果不大于1M,那就进行部分同  步。