为什么会有三种模式,分别适用什么场景? 主从,哨兵,集群。
redis2.8版本之前的模式,redis2.8及之后的模式,redis cluster模式(redis3.0版本之后)
Redis三种模式的区别标准:结点状态监视,故障自动转移,动态扩容。对着三个问题的解决状况。
1、为什么redis会使用主从模式?为了应对读压力特别大的情况。
2、主从结构:一主一从,一主多从或者级联结构。
3、主从复制数据同步:全量同步,增量同步。
4、全量同步和增量同步有什么区别?主从刚刚连接的时候,进行全量同步;全量同步结束后,进行增量同步。
Redis主从同步的过程: redis.conf
1)当设置好slave服务器后,slave会建立和master的连接;slave会发送sync命令到Master;
2)Master启动一个后台进程,将Redis中的数据快照保存到文件中;(启动后台进程,因为redis是单线程的; 数据快照;开始执行BGSAVE命令生成rdb文件)。
3)启动后台进程的同时,Master会将保存数据快照期间接收到的写命令缓存起来(保存在缓冲区);
4)Master完成写文件操作后(BGSAVE命令完成后),将该文件发送给slave;
5)slave将文件保存到磁盘上,然后加载文件到内存恢复数据快照到slave的Redis上;
6)当slave完成数据快照的恢复后,Master将这期间收集的写命令发送给slave端;
7)后续Master收集到的写命令都会通过之前建立的连接,增量发送给slave端;
同Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。
如果有需要,slave 在任何时候都可以发起全量同步。
只有写入操作才会触发增量同步。读操作数据无变化不会触发主从同步,
当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。
主从模式的优缺点
优点:1、解决数据备份问题。2、做到读写分离,提高服务器性能。
缺点:(无法动态修改连接地址;主节点故障,不能自动进行故障转移;无法动态扩容)
1、每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接;
2、主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作;
3、无法实现动态扩容;
哨兵模式
Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
Redis高可用解决方案;监视所有的主服务器以及所有的从服务器;自动进行故障转移。主结点的redis配置文件(三个配置文件都会发生变更),redis.conf,
优点:
1、Master状态监测(结点状态监视)
2、如果Master结点异常,则会进行Master-slave 转换,将其中一个Slave升级为Master,将之前的Master作为Slave 。
3、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
缺点:(从结点无法实现故障转移; 无法实现动态扩容)
1、如果是从节点下线了,sentinel是不会对其进行故障转移的,连接从节点的客户端也无法获取到新的可用从节点
2、无法实现动态扩容。
cluster模式(redis的投票机制 fail状态)
它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。
一般集群建议搭建三主三从架构,三主提供服务,三从提供备份功能。
每一个节点都存有这个集群所有主节点以及从节点的信息。
它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入发力了状态。这就是我们的redis的投票机制。
投票过程是集群中所有master参与,如果半数以上master节点与某个master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。
优点:
1、有效的解决了redis在分布式方面的需求;
2、遇到单机内存,并发和流量瓶颈等问题时,可采用Cluster方案达到负载均衡的目的(redis压力分摊到多台机器);
3、可实现动态扩容;
4、P2P模式,无中心化;通过Gossip协议同步节点信息;Redis Cluster使用Gossip协议同步结点信息,统一结点数据。
5、自动故障转移、Slot迁移中数据可用;
缺点:
1、架构比较新,最佳实践较少;
2、为了性能提升,客户端需要缓存路由表信息(所有结点的ip地址和端口号);
3、节点发现、reshard操作不够自动化;