NoSQL数据库:Redis哨兵和集群入门

231 阅读10分钟

目录

写在前面

一、数据库服务器高可用

二、 Sentinel (哨兵)是啥?

三、部署 Sentinel过程

1、初始化服务器

2、将普通的Redis服务器使用的代码替换成sentinel专用代码

3、初始化sentinel状态

4、创建连向主服务器的网络连接

5、哨兵监控实现原理

四、分布式数据库高并发

五、Redis集群是如何实现的?

1、【槽指派】

2、【重新分片】

3、【MOVED错误】

4、【ASK错误】

写在前面

最近博主学习数据库方面的知识,也算是小白入门,大家伙来一起学习交流,我边看书边记录总结,马上又开启新的一周,赶紧把过去一周零散学习的知识记录下来,以作备忘。

或许你了解高级开发运维知识,对高可用、高并发、分布式略知一二,或许你跟我一样刚刚入门,那就看完本篇,应该有所收获,其实这篇总结的知识点不难,是最基础的Redis多机数据库下的哨兵架构和集群架构。可能单纯的文字描述阅读起来有点枯燥,但内容算是干货总结,值得阅读,最后一键三连更好哈 :)

有趣的内容大家可以看看我的博客,例如这篇:我之前做的这个《口罩预约管理系统——数据库设计(前端+PHP+MySQL)》(有兴趣可以瞧瞧,完整项目源码和教程已上传CSDN)。

还有《Socket网络编程专栏》blog.csdn.net/charzous/ca… 里面有好玩的小程序(模拟QQ邮箱、实时聊天小程序、C/S架构的通信等)。

一、数据库服务器高可用

高可用性(High Availability)是系统开发中是经常提到的一个名词,现在来看看它具体指的是什么,顾名思义,就是保证某种事物可用性很高,不容易出现问题,对于服务器来讲,那它指的就是来描述一个系统经过专门的设计,从而增加正常运行时间,减少故障或者宕机停工时间,而保持其服务的高度可用性

二、 Sentinel (哨兵)是啥?

出现的问题是:Redis主从复制模式下,当主服务器由于故障不能提供服务,需要人工将从节点晋升为主节点,同时需要更新应用方的主节点地址。这种故障处理方法明显是低效且繁琐的。

由此,Redis服务器为了保证高可用性,Sentinel(哨兵)架构诞生了!

sentinel架构就是Redis高可用的解决方案。(图片来源:Redis开发与运维)

  • 它是由一个或多个sentinel实例组成的sentinel系统,可以监视任意多个主服务器,以及其下从服务器
  • 在被监视的主服务器进入下线状态时,自动将下属的某个服务器升级为新的主服务器,代替下线的主服务器继续处理命令请求。

三、部署 Sentinel过程

sentinel系统的部署大概有下面几个步骤:启动和初始化sentinel命令:

redis-sentinel sentinel.conf 

sentinel架构部署如图:

1、初始化服务器

Sentinel 执行的工作和普通 Redis 服务器执行的工作不同, 所以 Sentinel 的初始化过程和普通 Redis 服务器的初始化过程并不完全相同。

比如说, 普通服务器在初始化时会通过载入 RDB 文件或者 AOF 文件来还原数据库状态, 但是Sentinel 并不使用数据库, 所以初始化 Sentinel 时就不会载入 RDB 文件或者 AOF 文件。

2、将普通的Redis服务器使用的代码替换成sentinel专用代码

使用REDIS_SENTINEL_PORT端口26379。命令列表包括:ping、sentinel、subscribe、unsubscribe、psubscribe、punsubscribe、info。

Sentinel 则使用 sentinel.c/sentinelcmds 作为服务器的命令表,具体如下:

struct redisCommand sentinelcmds[] = {
    {"ping",pingCommand,1,"",0,NULL,0,0,0,0,0},
    {"sentinel",sentinelCommand,-2,"",0,NULL,0,0,0,0,0},
    {"subscribe",subscribeCommand,-2,"",0,NULL,0,0,0,0,0},
    {"unsubscribe",unsubscribeCommand,-1,"",0,NULL,0,0,0,0,0},
    {"psubscribe",psubscribeCommand,-2,"",0,NULL,0,0,0,0,0},
    {"punsubscribe",punsubscribeCommand,-1,"",0,NULL,0,0,0,0,0},
    {"info",sentinelInfoCommand,-1,"",0,NULL,0,0,0,0,0}
};

3、初始化sentinel状态

其中,master属性记录了所有被监视的主服务器的相关信息,数据结构是字典。

  • 字典的键是被监视主服务器的名字
  • 而字典的值是被监视主服务器对应的 sentinel.c/sentinelRedisInstance 结构

4、创建连向主服务器的网络连接

一个是命令连接,专门用于向主服务器发送的命令,并接受命令回复。
一个是订阅连接,专用用于订阅主服务器的__sentinel__:hello频道,保证频道信息不丢失。

为什么有订阅连接?

在 Redis 目前的发布与订阅功能中, 被发送的信息都不会保存在 Redis 服务器里面, 如果在信息发送时, 想要接收信息的客户端不在线或者断线, 那么这个客户端就会丢失这条信息。

因此, 为了不丢失 __sentinel__:hello 频道的任何信息, Sentinel 必须专门用一个订阅连接来接收该频道的信息。

因为 Sentinel 需要与多个实例创建多个网络连接, 所以 Sentinel 使用的是异步连接。

5、哨兵监控实现原理

Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控,是判定节点不可达的重要保证。

任务1:每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构,如图所示。

任务2:每隔2秒,定时任务可以完成以下两个工作:

  • 发现新的Sentinel节点:通过订阅主节点的__sentinel__:hello了解其他的Sentinel节点信息,如果是新加入的Sentinel节点,将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。
  • Sentinel节点之间交换主节点的状态,作为后面客观下线以及领导者选举的依据。

任务3:每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。

四、分布式数据库高并发

高并发(High Concurrency)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求

高并发相关常用的一些指标有响应时间,吞吐量,每秒查询率QPS(Query Per Second),并发用户数等。

五、Redis集群是如何实现的?

Redis集群就是提供的分布式数据库方案。集群通过分片来进行数据共享,并提供复制和故障转移的功能

Redis的一个集群由多个节点组成,一个节点就是一个运行在集群模式下的Redis服务器,配置选项cluster-enabled决定是否开启集群模式。

集群的建立通过向一个节点发送cluster meet 命令,握手成功则添加到node节点当前所在的集群

Redis集群的知识非常丰富,这里简单介绍其中的几个重要的点。

1、【槽指派】

Redis集群通过分片的方式来保存数据库中的键值对。集群的整个数据库被分为16384个槽slot,数据库中的每个键都属于这些槽中的一个,集群中的每个节点可以处理0个或16384个槽。

2、【重新分片】

可以将任意数量的已经指派给某个节点的槽改为指派给另一个节点,并且相关槽所属的键值对也会移动到目标节点。

3、【MOVED错误】

当节点发现键所在的槽并非由自己处理时候,节点就会向客户端返回一个MOVED错误,指引客户端转向正在负责槽的节点。

集群模式下的客户端并不会打印出MOVED错误,而是自动进行节点转向,打印转向信息,单机模式下就会打印出错误信息。

4、【ASK错误】

在重新分片期间,可能出现部分分片存在于不同节点的情况,客户端向源节点发送键值对请求命令,出现ASK错误。同样的,集群模式下ASK错误会自动转向目标节点。

可能单纯的文字描述阅读起来有点枯燥,但内容算是干货总结,值得阅读,最后一键三连更好哈 :)

有趣的内容大家可以看看我的博客,例如这篇:我之前做的这个《口罩预约管理系统——数据库设计(前端+PHP+MySQL)》(有兴趣可以瞧瞧,完整项目源码和教程已上传CSDN)。

还有《Socket网络编程专栏》blog.csdn.net/charzous/ca… 里面有好玩的小程序(模拟QQ邮箱、实时聊天小程序、C/S架构的通信等)。

如果觉得不错欢迎“一键三连”哦,点赞收藏关注,评论提问建议,欢迎交流学习!一起加油进步!

本篇内容首发我的CSDN博客【原力计划s3】:csdn-czh.blog.csdn.net/article/det…