目录
写在前面
一、数据库服务器高可用
二、 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)是系统开发中是经常提到的一个名词,现在来看看它具体指的是什么,顾名思义,就是保证某种事物可用性很高,不容易出现问题,对于服务器来讲,那它指的就是来描述一个系统经过专门的设计,从而增加正常运行时间,减少故障或者宕机停工时间,而保持其服务的高度可用性。
出现的问题是:Redis主从复制模式下,当主服务器由于故障不能提供服务,需要人工将从节点晋升为主节点,同时需要更新应用方的主节点地址。这种故障处理方法明显是低效且繁琐的。
由此,Redis服务器为了保证高可用性,Sentinel(哨兵)架构诞生了!
sentinel架构就是Redis高可用的解决方案。(图片来源:Redis开发与运维)
- 它是由一个或多个sentinel实例组成的sentinel系统,可以监视任意多个主服务器,以及其下从服务器。
- 在被监视的主服务器进入下线状态时,自动将下属的某个服务器升级为新的主服务器,代替下线的主服务器继续处理命令请求。
sentinel系统的部署大概有下面几个步骤:启动和初始化sentinel命令:
redis-sentinel sentinel.conf
sentinel架构部署如图:
Sentinel 执行的工作和普通 Redis 服务器执行的工作不同, 所以 Sentinel 的初始化过程和普通 Redis 服务器的初始化过程并不完全相同。
比如说, 普通服务器在初始化时会通过载入 RDB 文件或者 AOF 文件来还原数据库状态, 但是Sentinel 并不使用数据库, 所以初始化 Sentinel 时就不会载入 RDB 文件或者 AOF 文件。
使用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}
};
其中,master属性记录了所有被监视的主服务器的相关信息,数据结构是字典。
sentinel.c/sentinelRedisInstance
结构。一个是命令连接,专门用于向主服务器发送的命令,并接受命令回复。
一个是订阅连接,专用用于订阅主服务器的__sentinel__:hello频道,保证频道信息不丢失。
为什么有订阅连接?
在 Redis 目前的发布与订阅功能中, 被发送的信息都不会保存在 Redis 服务器里面, 如果在信息发送时, 想要接收信息的客户端不在线或者断线, 那么这个客户端就会丢失这条信息。
因此, 为了不丢失
__sentinel__:hello
频道的任何信息, Sentinel 必须专门用一个订阅连接来接收该频道的信息。因为 Sentinel 需要与多个实例创建多个网络连接, 所以 Sentinel 使用的是异步连接。
Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控,是判定节点不可达的重要保证。
任务1:每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构,如图所示。
任务2:每隔2秒,定时任务可以完成以下两个工作:
任务3:每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。
高并发(High Concurrency)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用的一些指标有响应时间,吞吐量,每秒查询率QPS(Query Per Second),并发用户数等。
Redis集群就是提供的分布式数据库方案。集群通过分片来进行数据共享,并提供复制和故障转移的功能。
Redis的一个集群由多个节点组成,一个节点就是一个运行在集群模式下的Redis服务器,配置选项cluster-enabled决定是否开启集群模式。
集群的建立通过向一个节点发送cluster meet
Redis集群的知识非常丰富,这里简单介绍其中的几个重要的点。
Redis集群通过分片的方式来保存数据库中的键值对。集群的整个数据库被分为16384个槽slot,数据库中的每个键都属于这些槽中的一个,集群中的每个节点可以处理0个或16384个槽。
可以将任意数量的已经指派给某个节点的槽改为指派给另一个节点,并且相关槽所属的键值对也会移动到目标节点。
当节点发现键所在的槽并非由自己处理时候,节点就会向客户端返回一个MOVED错误,指引客户端转向正在负责槽的节点。
集群模式下的客户端并不会打印出MOVED错误,而是自动进行节点转向,打印转向信息,单机模式下就会打印出错误信息。
在重新分片期间,可能出现部分分片存在于不同节点的情况,客户端向源节点发送键值对请求命令,出现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