Redis简介
Redis是一个开源、内存存储的数据结构服务器,可以用数据库了存储Key-Value数据,支持字符串、哈希表、列表、集合、位图、地理空间信息等数据类型,同时也可以作为高速缓存和消息列队代理。
Redis与其他NoSql相比,独特性在于支持复杂的数据结构,这些数据结构通常都与程序的数据机构一致,因此容易理解和使用。
Redis在内存中存储数据,因此原则上,存放在Redis中的数据不应该大于内存容量,否则会因为操作系统虚拟内存导致性能降低。
主从模式(master/slaver)
主从模式一个作用是备份数据,当一个节点损坏时,数据有备份可以方便恢复。
另一个作用是负载均衡,全部访问一个节点肯定会影响Redis工作效率,主从可以让查询操作就可以通过查询从节点来完成。
主从复制:
Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
优缺点:
1.支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
2.为了分载 Master 的读操作压力,Slave 服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。
3.Slave 同样可以接受其它 Slaves 的连接和同步请求,这样可以有效的分载 Master 的同步压力。
4.Master Server 是以非阻塞的方式为 Slaves 提供服务。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求。
缺点:
1.主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
2.如果多个 Slave 断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要 Slave 启动,就会发送sync 请求和主机全量同步,当多个 Slave 重启的时候,可能会导致 Master IO 剧增从而宕机。
3.Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
哨兵(sentinel)
哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个 Redis 实例。
作用:
通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器。
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主机。
然而一个哨兵进程对Redis服务器进行监控,也可能会出现问题,为此,我们可以使用多 个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
哨兵的工作方式:
1.如果一个 Master 主服务器被标记为主观下线(SDOWN),则正在监视这个 Master 主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认 Master 主服务器的确进入了主观下线状态
2.若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master 主服务器的客观下线状态就会被移除。若 Master 主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。
3.在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有 Master 主服务器、Slave 从服务器发送 INFO 命令。
哨兵的优缺点:
1.哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
2.主从可以自动切换,系统更健壮,可用性更高(可以看作自动版的主从复制)。
缺点:
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
集群(cluster)
在这个图中,每一个蓝色的圈都代表着一个 redis 的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。
集群的特点:
1.所有的 redis 节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2.节点的 fail 是通过集群中超过半数的节点检测失效时才生效。
3.客户端与 Redis 节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
优缺点:
1、有效的解决了redis在分布式方面的需求
2、遇到单机内存,并发和流量瓶颈等问题时,可采用Cluster方案达到负载均衡的目的
3、可实现动态扩容
4、P2P模式,无中心化
5、通过Gossip协议同步节点信息
6、自动故障转移、Slot迁移中数据可用
缺点:
1、架构比较新,最佳实践较少
2、为了性能提升,客户端需要缓存路由表信息
3、节点发现、reshard操作不够自动化