redis集群
Redis集群是一个由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。
主从模式
主数据库可以进行读写操作。
数据会通过主从同步,由主服务器同步给从服务器。
主服务器将数据
从数据库一般是只读的。
引入主从复制机制的目的有两个:
- 一个是读写分离,分担 “master” 的读写压力
- 一个是方便做容灾恢复,避免单点故障。
主从同步的原理
全量复制
从数据库在第一次同步的时候会进行全量同步。
主库执行 bgsave 命令,生成 RDB 文件,接着将文件发给从库。
从库收到 RDB 文件后,清空自己的数据,载入 RDB文件。
增量复制
第一次全量同步之后,后续主存在数据变更的时候会将命令同步给**从,**从进行增量复制。
当全量复制完成之后,主和从之间会建立一个网络连接,从后续会将收到的写命令通过这个连接传给从。
主从复制优缺点
优点
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;
- 为了分载 Master 的读操作压力,Slave 服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成;
- Slave 同样可以接受其它 Slaves 的连接和同步请求,这样可以有效的分载 Master 的同步压力;
- Master Server 是以非阻塞的方式为 Slaves 提供服务。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求;
- Slave Server 同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据;
缺点
- 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性;
主从复制主要存在的问题就是,主从集群故障之后不能自动恢复。
哨兵模式
Redis 提供了哨兵机制来实现主从集群故障的自动恢复。
哨兵
哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个 Redis 实例。
哨兵的作用
- 运行状态监控:监测 Redis 服务器的运行状态,包括主服务器和从服务器。
- 自动故障恢复:当哨兵监测到 master 宕机,会自动将 slave 切换成 master ,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
- 通知:Sentinel充当 Redis客户端(RedisClient) 的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。
运行状态监控
主观下线
每个 Sentinel 以每秒一次的频率向它所知的主从服务器以及其它 Sentinel 实例发送一个 PING 命令,实例距离最后一次有效回复 PING 命令的时间超过指定的值, 那么这个实例会被 Sentinel 标记为主观下线。
客观下线
若超过指定数量(quorum)的 Sentinel 认为某个节点主观下线,则该实例客观下线。
客观下线后会重新选举 Master。
分片集群模式
Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在 redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。
集群的数据分片
Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
- 节点 A 包含 0 到 5460 号哈希槽
- 节点 B 包含 5461 到 10922 号哈希槽
- 节点 C 包含 10923 到 16383 号哈希槽
主从复制
- 当主节点挂了之后,启用从节点。
- 如果主节点和它的从节点都挂了,redis 不能提供服务。
- 当集群内半数主节点 PING 主节点不通的时候,认为主节点挂掉(fail 半数检查机制)。
特点
- 所有的 redis 节点彼此互联 (PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
- fail 半数检查机制才认为节点挂掉。
- 客户端连接集群中任意节点即可。客户端可以与节点直连。