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

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 <address_1>[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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java IO: 其他字符流(下)

转载自 Java IO: 其他字符流(下)作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) 本小节会简要概括Java IO中的PushbackReader&#xff0c;LineNumberReader&#xff0c;StreamTokenizer&#xff0c;PrintWriter&#xff0c;StringReader&#xff0c;StringWriter。P…

java 长字符串 比较_Java字符串比较(3种方法)

字符串比较是常见的操作&#xff0c;包括比较相等、比较大小、比较前缀和后缀串等。在 Java 中&#xff0c;比较字符串的常用方法有 3 个&#xff1a;equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。下面详细介绍这 3 个方法的使用。equals() 方法equals() 方法将…

IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决

IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决 windows 1.选中根目录文件夹 ctrl alt f6弹出如下框,取消勾选-->点击Show Selected就可以去掉了 mac 1.选中根目录文件夹 option fn command f6弹出如下框,取消勾选-->点击Show Select…

javaweb---简易邮件发送

邮件发送 2.jar包的支持 activation-1.1.1.jar mail-1.4.7.jar 3.授权码的获取 4.简易文本邮件发送的实现 由上图我们可以确定几个必须步骤 1.创建session对象 2.创建Transport对象 3.使用邮箱的用户名和授权码连上邮件服务器 4.创建一个Message对象&#xff08;需要传递…

Hibernate中使用Criteria查询及注解——(DeptTest.java)

DeptTest.java 测试类&#xff1a; 先创建Session&#xff1a; private Session session;private Transaction tx;Beforepublic void beforeMethod(){sessionnew Configuration().configure().buildSessionFactory().openSession();}关闭Session&#xff1a; Afterpublic void…

asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)

概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚拟机) 192.168.182.129 , 192.168.182.130 , 192.168.182.131 并将源码发布至三台服务器的 /root/aspnetcore/anuoapc 目录 …

Java IO教程

转载自 Java IO教程译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;Connor (cronnorcgmail.com) &#xff0c;李璟 校对&#xff1a;方腾飞 Java IO 是一套Java用来读写数据&#xff08;输入和输出&#xff09;的API。大部分程序都要处理一些输入&#xff0c;并由输…

Java web登录拦截器_SpringMVC拦截器(实现登录验证拦截器)

本例实现登陆时的验证拦截&#xff0c;采用SpringMVC拦截器来实现核心代码首先是index.jsp,显示链接String path request.getContextPath();String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/&quo…

Java Poi 向excel中插入图片

博客 package com.unicom.yangjiabin.utils;import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.po…

visual studio for mac的离线安装初体验

微软2016 Connect 大会发布了visuo studio for mac的pre版本&#xff0c;由于工作原因&#xff0c;现在工作环境是mac&#xff0c;虽然开发现在是在用python&#xff0c;但一直关注着.net的发展&#xff0c;于是自己很激动的体验了一把&#xff0c;在张善友老师的提醒下,把安装…

JAVAWEB(笔记)

简介 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态web html,sss提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站&#xff1b;提供给所有人看的数据始终会发生变化&#xff0c;每个人在不同的时…

Java IO: 其他字节流(上)

转载自 Java IO: 其他字节流(上)作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) 本小节会简要概括Java IO中的PushbackInputStream&#xff0c;SequenceInputStream和PrintStream。其中&#xff0c;最常用的是PrintStream&#xff0c;System.out和System.err都是Pri…

java中public private_java中public、private、protected区别

类中的数据成员和成员函数据具有的访问权限包括&#xff1a;public、private、protect、friendly(包访问权限)1、public&#xff1a;public表明该数据成员、成员函数是对所有用户开放的&#xff0c;所有用户都可以直接进行调用2、private&#xff1a;private表示私有&#xff0…

Excel转为图片

Java 将Excel转为图片、html、XPS、XML、CSV E_iceblue关注0人评论66人阅读2020-01-10 16:16:24 通过文档格式转换&#xff0c;可满足不同办公场合对文档操作的需求。本文将介绍转换Excel文档为其他常见文档格式的方法。通过文中的方法&#xff0c;可支持将Excel转换为包括PDF、…

Hibernate中使用Criteria查询及注解——( EmpCondition)

EmpCondition&#xff1a; 动态查询的条件类&#xff1a; package cn.bdqn.hibernate_Criteria.entity;import java.util.Date;/*** Criteria动态查询的条件类* author Administrator**/ public class EmpCondition {private String job;//职位private Double sal;//工资privat…

.NET Core 构建配置文件从 project.json 到 .csproj

从 .NET Core SDK 1.0 Preview 3 build 004056 开始&#xff0c;.NET Core 弃用 project.json&#xff0c;回归 .csproj&#xff0c;主要原因是为了兼容 MSBuild &#xff0c;详见 Announcing .NET Core Tools MSBuild “alpha” 。 如果你安装了 .NET Command Line Tools (1.0…

Java IO: 字符流的Piped和CharArray

转载自 Java IO: 字符流的Piped和CharArray作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer&#xff0c;主要涉及PipedReader、PipedWriter、CharArrayReader、CharArrayWriter。PipedReader 原文链接 PipedRead…

java正则表达式验证密码_最新密码验证正则表达式

正则表达式验证密码功能在项目中经常被使用到&#xff0c;但是很多朋友还是不大会使用密码正则表达式进行验证&#xff0c;本文小编为大家整理了php密码验证正则表达式、python密码强度正则&#xff0c;当然还有大家常用到的js正则表达式&#xff0c;希望大家喜欢。刚开始复习一…

2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)

第一章 1-1课程整体介绍.mp4 1-2核心技术列表.mp4 1-3课程要求与收益.mp4 1-4系统的整体演示.mp4 https://www.jianshu.com/writer#/notebooks/42211254/notes/59340149 第二章 2-1微服务项目的搭建-SpringBoot搭建多模块项目一.mp4 2-2微服务项目的搭建-SpringBoot搭建多模块…

mybatis解决 1 字节的 UTF-8 序列的字节 1 无效

Mybatis执行代码报错&#xff1a; Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。 具体报错&#xff1a; java.lang.ExceptionInInitializerError at com.zhang.dao.UserMapperTest.test(UserMappe…