高级开发运维从简单学:Redis哨兵和集群小贴士

目录

写在前面

一、数据库服务器高可用

二、 Sentinel (哨兵)是啥?

三、部署 Sentinel过程 

1、初始化服务器

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

3、初始化sentinel状态

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

5、哨兵监控实现原理

四、分布式数据库高并发

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

1、【槽指派】

2、【重新分片】

3、【MOVED错误】

4、【ASK错误】


写在前面

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

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

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

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

一、数据库服务器高可用

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

二、 Sentinel (哨兵)是啥?

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

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

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

高级开发运维从简单学:Redis哨兵和集群小贴士_第1张图片

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

三、部署 Sentinel过程 

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

redis-sentinel sentinel.conf 

sentinel架构部署如图: 

高级开发运维从简单学:Redis哨兵和集群小贴士_第2张图片

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、创建连向主服务器的网络连接

高级开发运维从简单学:Redis哨兵和集群小贴士_第3张图片

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

为什么有订阅连接?

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

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

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

5、哨兵监控实现原理

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

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

高级开发运维从简单学:Redis哨兵和集群小贴士_第4张图片

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

高级开发运维从简单学:Redis哨兵和集群小贴士_第5张图片

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

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

高级开发运维从简单学:Redis哨兵和集群小贴士_第6张图片

 

四、分布式数据库高并发

高并发(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网络编程专栏》:https://blog.csdn.net/charzous/category_10465473.html  里面有好玩的小程序(模拟QQ邮箱、实时聊天小程序、C/S架构的通信等)。

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

本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/116596657

你可能感兴趣的:(Redis,redis,分布式,数据库,高并发)