热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

asp.netcore实战之redis负载均衡和quot;高可用quot;实现

1.概述分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及redis的高可用实现,呵呵双引号的高可用并不是传统意义的高可用哈,而是r

1.概述

  分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是传统意义的高可用哈,而是 redis集群挂了,并不影响asp.net core 的运行, 欲知详情,请看下文.

注意: 本文主要阐述redis 的复制均衡和"高可用", 故redis 的主从复制搭建略, 请自行百度.

2.负载均衡实现

  目前在tcp 负载均衡这块, haproxy 是官方实现, nginx 是三方实现, 个人偏向haproxy的简单易用. 故redis的负载均衡采用haproxy实现.

  Haproxy配置文件如下:

globallog 127.0.0.1 local2 #log语法:log [max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1 上的syslog服务中的local0日志设备,记录日志等级为info的日志chroot /var/lib/haproxy           #当前工作目录pidfile /var/run/haproxy.pid     #当前进程id文件maxconn 6000      #最大并发连接数user haproxy     #所属用户group haproxy     #所属组daemon             #以守护进程方式运行haproxystats socket /var/lib/haproxy/stats
defaultsmode http     #默认的模式mode { tcp
|http|health },tcp是4层,http是7层,health只会返回OKlog global    #应用全局的日志配置option httplog    #启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志option dontlognull    # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来option http-server-close  #每次请求完毕后主动关闭http通道option forwardfor except 127.0.0.0/8 #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。 启用 X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。option redispatch   # 当使用了COOKIE时,haproxy将会将其请求的后端服务器的serverID插入到COOKIE中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的COOKIE是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。retries 3       # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用timeout http-request 10s     #http请求超时时间timeout queue 1m             #一个请求在队列里的超时时间timeout connect 10s            #连接超时timeout client 1m            #客户端超时timeout server 1m            #服务器端超时timeout http-keep-alive 10s #设置http-keep-alive的超时时间timeout check 10s            #检测超时maxconn 6000                #每个进程可用的最大连接数
listen stats     #统计界面mode httpbind
*:2080    stats enable stats refresh 30sstats uri /hastatsstats realm Haproxy\ Statistics  stats auth admin:adminstats admin if TRUE
frontend healthcheckbind :
1099     #定义外部检测机制mode http    #http 负载均衡option httpcloseoption forwardfordefault_backend AnuoApcNodes
frontend http
-inbind *:88 #监听的端口,处理请求的服务器集群为 default_backend 的配置值mode http log globaloption httpcloseoption logasap #不等待响应结束就记录日志,表示提前记录日志,一般日志会记录响应时长,此不记录响应时长option dontlognull #不记录空信息capture request header Host len 20 #记录请求首部的前20个字符capture request header Referer len 60 #referer跳转引用,就是上一级default_backend AnuoApcNodes #处理请求的服务器集群
backend AnuoApcNodes     #处理请求的服务器集群mode httpbalance roundrobin#check : 下面的check 表示ha 需要检查此节点的状态server websrv1
192.168.2.108:9090 check maxconn 6000server websrv2 192.168.1.112:88 check maxconn 6000listen SQLServer :1433  #tcp 负载均衡mode tcpbalance roundrobin#weight : 权重, 表示此节点的优先级,值越高(最高256) , 优先执行越高#check port : 检测是否存活的端口#inter : interval 检测是否存活的 时间间隔#rise : server 从离线状态转为正常状态后, 需要复查的次数(看是否正常)#fall : server 从正常状态转换为不可用状态需要检查的次数server SQLServer1 192.168.2.101:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2server SQLServer2 192.168.2.203:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2listen Redis :6377  #tcp 负载均衡mode tcpbalance roundrobin#weight : 权重, 表示此节点的优先级,值越高(最高256) , 优先执行越高#check port : 检测是否存活的端口#inter : interval 检测是否存活的 时间间隔#rise : server 从离线状态转为正常状态后, 需要复查的次数(看是否正常)#fall : server 从正常状态转换为不可用状态需要检查的次数server Redis1 192.168.2.101:6379 weight 1 maxconn 6000 check port 6379 inter 2000 rise 2 fall 2server Redis2 192.168.2.102:6379 weight 1 maxconn 6000 check port 6379 inter 2000 rise 2 fall 2

其中最后的配置:

为redis的负载均衡配置, 可以看到负载了两个redis IP, 101和102 .

在实际运行中, redis的主库一般用作写, 从库用作读, so , 一般针对redis的从库进行负载.

只需将上面的两个IP 替换为自己的ip 即可完成对 redis 从库的负载.

3. asp.net core 端针对 redis "高可用"实现

实现思路: 此处的实现不是传统意义的高可用实现,而是C#端检测到redis集群挂了, 自动将redis从系统中剔除, 保证asp.net core 能继续运行

业界问题: redis 的高可用有官方实现叫sentinel , 现在应用案例并不多, 也逮到官方文档看了哈, 看了半天没看到, 有sentinel实战教程推荐的,或其他高可用实现的, 望留言 ^_^

先下载完整源码: http://pan.baidu.com/s/1i52ViWP

源码配置运行步骤如下:

如下图

 

3.1.配置VIPPort的值为 haproxy 暴露的redis 集群端口,如下图值

3.2.配置ClusterVIPCom值为 haproxy 所在服务器 的 IP

3.3.配置ClusterMultiIPCom 值为 redis主从复制集群中的全部从库IP, 用分号分割IP

3.4. 代码运行起来, 调用 Sample 接口, 如下图

调用URL: Get方法  http://localhost:9526/api/RedisTest/Sample

运行逻辑如下:

第一次取数据, redis没得缓存, 制造缓存对象, 缓存到redis, 成功返回.

第二次取数据, redis 有缓存, 从缓存中取, 成功返回.

第三次取数据, 假如redis挂了, 制造缓存对象, 还是成功返回.

第四次取数据, redis恢复了, 重启 asp.net core ,  程序自动连接上redis, 从redis返回数据, 成功返回. 

至此达到了, redis 和 asp.net core 的完全解耦, 即redis挂了不影响 asp.net core 的继续运行 .

可以想象哈, 当你半夜收到一个警报说redis挂了的时候, 你可以不慌不忙的去公司慢慢改, 因为asp.net core 还在运行, 只是慢了点而已.

原文地址:http://www.cnblogs.com/anuo/p/6052029.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注



推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Ansibleplaybook roles安装redis实例(学习笔记二十九)
    1、相关redis参数:2、templatesredis.conf配置相关参数:daemonizeyespidfilevarrunredis_{{red ... [详细]
  • 缓存 分布式锁 Redis
    分布式锁现在Redis基本上没家公司都在使用,只是各自使用的场景不以,但Redis最出名的还是做为缓存服务器,提搞服务器的的吞吐量,下面我们来围绕这个作为缓存做一个总结今天的目标其 ... [详细]
  • 大数据环境下的存储系统构建:挑战、方法和趋势
    大数据环境下的存储系统构建:挑战、方法和趋势陈游旻,李飞,舒继武清华大学计算机科学与技术系,北京100084摘要:互联网规模的迅速扩展促使 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
jp85201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有