1、为什么要搭建主从系统
这已经是业界很多应用的通用做法了,跟mysql一样搭建主从常见的就是可以实现读写分离,至于为什么要做读写分离从redis的本身来讲:redis的操作具有原子性,同时使用的是单线程(这样可以避免多线程之间切换消耗)操作,过多的写会阻塞线程影响redis的整体性能同时也会影响redis读性能。
此外当我们集群中或者单机的主节点宕机了或者无法跟集群的其它节点就行通讯的话,如果没有从节点则这部分缓存数据丢失,如果有从节点时我们可以用节点数据继续服务因为几乎所有的数据主节点都同步到从节点啦,可以正常使用。
2、主从特性
1、一个 master 可以拥有一个或者多个 slave。
2、slave 可以接收来自其他 slave 的连接。意思是不是就是说 slave 在接收其他的slave的连接之后成为 master ?等下我们来验证。
3、redis 复制在 master 这一端是非阻塞的,也就是说在和 slave 同步数据的时候,master 仍然可以执行客户端的操作命令而不受其影响。
4、redis 复制在 slave 这一端也是非阻塞的。在配置文件里面有 slave-serve-stale-data 这一项,如果它为 yes ,slave 在执行同步时,它可以使用老版本的数据来处理查询请求,如果是 no ,slave 将返回一个错误。在完成同步后,slave 需要删除老数据,加载新数据,在这个阶段,slave 会阻止连接进来。
5、使用复制可以避免 master 因为需要把全部的数据集写入磁盘而造成的开销,因此可以把 master 中 save 配置项全部注释掉,不让它进行保存,然后配置 slave ,让 slave 保存。虽然有这个特性,但是我们好像一般不这么做。
3、实现过程
我这边还是打算在同一台虚拟机上不同的3个端口上模拟3个实例:
1、分别在5000、5100、5200端口上启动3个redis实例
5000端口实例 5100端口实例 5200端口实例现在我们只是模拟启动了3个redis实例,我们把端口5000的实例做为主,端口5100、5200的作为从,具体应该怎么实现呢,如下:
其实主要是命令./redis-cli -p 5100在连接上以后 执行slaveof 127.0.0.1 5000 就可以啦,slaveof命令也很好理解意为什么的从。
从5100 从52005100、5200两个从的实例已经绑定完成了,下面让我们来测试一下吧:
5000端口机器操作
127.0.0.1:5000> set port 5000
OK
5100端口机器操作:
127.0.0.1:5100> get port
"5000"
5200端口机器操作:
127.0.0.1:5200> get port
"5000"
如上主的结果会同步到从的机器上面
主从实现原理剖析:
当你设置了主从关系后,slave 在第一次连接或者重新连接 master 时,slave 都会发送一条同步指令给 master ;master 接到指令后,开始启动后台保存进程保存数据,接着收集所有的数据修改指令。后台保存完了,master 就把这份数据发送给 slave,slave 先把数据保存到磁盘,然后把它加载到内存中,master 接着就把收集的数据修改指令一行一行的发给 slave,slave 接收到之后重新执行该指令,这样就实现了数据同步。slave 在与 master 失去联系后,自动的重新连接。如果 master 收到了多个 slave 的同步请求,它会执行单个后台保存来为所有的 slave 服务。
网友评论