Redis集群方式1-主从模式
主从模式
- redis提供了复制功能,可以实现当一台数据库中的数据更新了,自动同步到其他数据库中,主节点支持读写,从节点只能读,并且接收主节点同步过来的数据,主从是一对多的关系。从节点在启动的时候加参数 --slaveof ip port (ip port对应主节点),也可以在运行时执行slaveof no one把自己变成主。
- 复制原理:
- 当从节点启动的时候,会发送sync命令,当主数据库收到sync命令后会开始RDB,同时会将在RDB期间收到的命令缓存起来,RDB完成后将RDB文件和缓存的命令一起发送给从节点,此后每收到一个命令就同步给从节点,增量复制。
- 主从复制是乐观复制,当客户端发送写命令给主节点,主节点会执行完立刻返回成功给客户端,再异步将命令同步给从节点,从而不影响性能,也可以设置至少同步给多少从,主才可写。
- 无硬盘复制:如果硬盘效率低会影响复制性能,2.8版本后支持无硬盘复制,repl-diskless-sync yes。
哨兵模式(配置方式可以参考《redis设计与实现第二版》,属于主从模式的拓展)
- sentinel本身就是一个特殊的redis节点。
- 当主节点遇到异常中断服务后,开发者可以通过手动的方式,切换从节点为主节点,然而整个过程麻烦且需要人工介入,难以实现自动化,redis2.8之后提供sentinel来提供自动化系统监控和故障转移功能,哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。注:配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库这样哨兵就能监控主6379和从6380、6381,一旦6379挂掉,哨兵就会在2个从中选择一个作为主,根据优先级选,如果一样就选个id小的,当6379再起来就作为从存在。
- 配置命令:redis-sentinel /path/to/your/sentinel.conf或者redis-server /path/to/your/entinel.conf --sentinel
- sentinel和master节点的交互:sentinel通过向master节点发送info命令,然后分析返回值来判断master节点以及slave节点的属性,以及他们的运行状态,同时可以识别新的slave节点并将它更新到master节点的从节点列表中。
- sentinel和master交互的频道:用的是master节点上的_sentinel_:hello频道,sentinel不仅通过这个频道给master发送消息,同时也会订阅这个频道,通过这个频道分析INFO命令的返回值,在sentinel集群中所有监控相同master节点的sentinel都会接收到频道中的消息,同时任意一个sentinel发送的消息都会被其他sentinel获取到并同步,所以项目无需指向所有的sentinel节点,只要指向其中一个sentinel节点,其余的都会被自动发现。sentinel为master节点创建的sentinels字段同时也维护了其他所有sentinel的信息。
- 主观下线:通过PING命令判断返回值(PONG,LOADING,MASTERDOWN)在设置的down-after-milliseconds时间内都返回的异常回复(除上述三种回复)则主关判断下线。但每个sentinel的时间长度可以设置不一致。
- 客观下线:在启动命令中红框的值所描述的含义是当有两个sentinel节点判断主观下线之后才是客观下线。举例:当前sentinel判断主节点主动下线后会去询问其他sentinel是否主观下线,当其他通知他主观下线的sentinel以及它自己达到2之后就会判断这个节点客观下线了。但是不同的sentinel可能会有不同的值。(ps:此时以谁的为准?)
- 故障转移:多个sentinel会选举出一个leader对主节点进行故障转移。