ASP.NET Core分布式缓存Redis主从Sentinel哨兵模式实战演练

一、课程介绍

Redis是被广泛使用的基础软件之一。对于工程师和,架构师,运维人员来说,了解Redis的高可用方案和背后的原理,是必备的基础知识。

“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案之一,当用Redis做Master-Slave(主从复制)的高可用方案时,假如master宕机了,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Redis主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。

1.1、本次分享课程包含知识点如下:
★Redis的三种集群解决方案对比。
★Redis哨兵模式概述。
★如何使用Dcoker部署Redis主从切换哨兵模式(一主二从三哨兵)。

1.2、一句话总结今天我们学习达到的目标
在ASP.NET Core中如何使用分布式缓存Redis主从Sentinel哨兵模式实现故障转移。

 

二、Redis的三种集群解决方案对比

redis有三种集群方式:主从复制,哨兵模式和集群。

1)、Redis主从复制特点

Redis主从复制不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

2)、Redis主从切换哨兵模式特点

哨兵Sentinel基于主从复制模式,所以优缺点很多重合。最大的优点就是可以主从切换,进行故障转移。缺点就是扩容很难。

3)、Redis-Cluster 集群特点

redis-cluster 集群模式,也是大型企业中使用的模式,无中心架构,支持动态扩容,具备哨兵与主从的优点,客户端只需要连接集群中任意一个节点。

三、Redis哨兵模式概述

  有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制。顾名思义,哨兵的含义就是监控redis系统的运行状态。可以启动多个哨兵,去监控redis数据库的运行状态。其主要功能有两点:

    a、监控所有节点数据库是否在正常运行。

    b、master数据库出现故障时,可以自动通过投票机制,从slave节点中选举新的master,实现将从数据库转换为主数据库的自动切换。

一个一主多从的Redis系统中,可以使用多个哨兵进行监控任务以保证系统足够稳健。此时,不仅哨兵会同时监控主数据库和从数据库,哨兵之间也会相互监控。在这里,建议大家哨兵至少部署3个,并且使用奇数个哨兵。Redis Sentinel 的节点数量要满足 2n + 1 (n>=1)的奇数个,所以最小数量是3个!

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

这里的哨兵有两个作用

1)、通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。

2)、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

四、如何使用Dcoker部署Redis主从切换哨兵模式(一主二从三哨兵)

Redis主从结构搭建成功了,系统的可用性变高了,但是如果主发生故障,需要人工手动切换从机为主机。这种切换工作不仅浪费人力资源,更大的影响是主从切换期间这段时间redis是无法对外提供服务的。因此,哨兵系统被开发出来了,哨兵可以在主发生故障后,自动进行故障转移,从从机里选出一台升级为主机,并持续监听着原来的主机,当原来的主机恢复后,会将其作为新主的从机。

一主(master)二从(slave)三哨兵(sentinel)的配置目标, 如下

一主(master)二从(slave)三哨兵(sentinel)

 

五、ASP.NET Core中使用分布式缓存Redis主从Sentinel哨兵模式

一般实际工作中Redis都是由我们的运维DB工程师帮我们去搭建环境,但是在刚开始的学习过程中,可能需要我们自行去搭建环境哦,这里为了方便起见,阿笨强烈推荐大家采用Docker容器化的方式进行搭建环境。 具体的环境搭建过程请自行研究和攻克一下哦(刚开始需要做好一定心里准备,如果对概念理解不深刻的话,Redis哨兵环境搭建还是比较复杂和繁琐,由于Redis跟平台和开发语言没有任何的关系,所以建议大家还是事先参考一些博客后才自行采取行动噢)。

简单的主从复制架构在 master 故障后会不可用,Redis 官方提供了哨兵(sentinel)机制自动实现主备切换保证高可用。

哨兵机制通过一组哨兵节点监控主从节点的运行状态,并在主节点故障后选举新的主节点。

六、实现步骤

关于.NET Core如何使用Redis的哨兵模式,这里阿笨推荐大家使用CSRedisCore。以下步骤前提条件就是你已经配置到了Redis的哨兵模式,配置推荐大家可以采用Docker的方式相对简单一些,感兴趣的话大家自行百度攻克一下。阿笨这里就只介绍如何去使用功能。

1)、配置连接字符串SentinelConnectString

2、将csredis实例注册到管道中

3、使用redis功能,对调用方在功能上的使用完全透明化,无任何差异。

七、总结

redis通过主从复制来实现高可用,但是发生故障时需要人工进行主从切换,效率低下。哨兵机制实现了redis主从的自动切换,提高了redis集群的可用性,提高了redis集群的故障转移效率。

我们可以看到哨兵机制是有缺点的:

  1.主从服务器的数据要经常进行主从复制,这样造成性能下降。

  2.当主服务器宕机后,从服务器切换成主服务器的那段时间,服务是不能用的。

为了保证redis的真真的高可用官方推荐使用redis-cluster集群。

一般的项目我们采用redis的哨兵模式架构(推荐采用一主二从三哨兵)就可以满足业务要求了,阿笨水平也有限,关于redis的高可用cluster集群的运用大家就根据个人的项目架构要求去研究和探索了。

希望本次分享课程能够让大家有所收获!最后送大家一句话:希望大家在.NET Core的学习道路上一直跟着阿笨坚持下去。

七、源代码示例下载

扫码关注下方微信公众号,回复t5pq关键字获取源代码下载地址。

有问题微信公众号回复wx关键字,加阿笨的个人微信号。

 

原文地址:https://www.cnblogs.com/51net/p/14337118.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


数组的定义 Dim MyArray MyArray = Array(1‚5‚123‚12‚98) 可扩展数组 Dim MyArray() for i = 0 to 10
\'参数: \'code:要检测的代码 \'leixing:html或者ubb \'nopic:代码没有图片时默认值
演示效果: 代码下载: 点击下载
环境:winxp sp2 ,mysql5.0.18,mysql odbc 3.51 driver 表采用 myisam引擎。access 2003  不同的地方: 
其实说起AJAX的初级应用是非常简单的,通俗的说就是客户端(javascript)与服务端(asp或php等)脚本语言的数据交互。
<% ’判断文件名是否合法 Function isFilename(aFilename)  Dim sErrorStr,iNameLength,i  isFilename=TRUE
在调用的时候加入判断就行了. {aspcms:navlist type=0 } {if:[navlist:i]<6} < li><a href=\"[navlist:link]\" target=\"_top\">[navlist:name]</a> </li>
导航栏调用 {aspcms:navlist type=0}     <a href=\"[navlist:link]\">[navlist:name]</a>
1.引入外部文件: {aspcms:template src=infobar.html} 2.二级下拉菜单 <ul class=\"nav\">
downpic.asp页面:  <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端
很简单,在需要调用的地方用这种模式 {aspcms:content sort={aspcms:sortid} num=17 order=isrecommend}
网站系统使用ACCESS数据库时,查询时怎么比较日期和时间呢?为什么常常比较出来却是错误的呢?比如早的日期比迟的日期大?
str1=\"1235,12,23,34,123,21,56,74,1232\" str2=\"12\" 问题:如何判断str2是否存在str1中,要求准确找出12,不能找出str1中的1235、123、1232
实例为最新版本的kindeditor 4.1.5. 主要程序: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)
用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发
首先感谢ASPCMS官网注册用户xing0203的辛苦付出!一下为久忆YK网络转载原创作者xing0203的文章内容!为了让小白更加清楚的体验替换过程,久忆YK对原文稍作了修改!
数据库连接: <% set conn=server.createobject(\"adodb.connection\") conn.open \"driver={microsoft access driver (*.mdb)};dbq=\"&server.mappath(\"数据库名\")
第1步:修改plugins下的image/image.js 找到\'<input type=\"button\" class=\"ke-upload-button\" value=\"\' + lang.upload + \'\" />\',
asp函数: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)