net core 实战之 redis 负载均衡和"高可用"实现

1.概述

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

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

2.负载均衡实现

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

  Haproxy配置文件如下:

global
log 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 #以守护进程方式运行haproxy
stats socket /var/lib/haproxy/stats
defaults
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log 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 http
bind *:2080
stats enable
stats refresh 30s
stats uri /hastats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend healthcheck
bind :1099 #定义外部检测机制
mode http #http 负载均衡
option httpclose
option forwardfor
default_backend AnuoApcNodes
frontend http-in
bind *:88 #监听的端口,处理请求的服务器集群为 default_backend 的配置值
mode http
log global
option httpclose
option logasap #不等待响应结束就记录日志,表示提前记录日志,一般日志会记录响应时长,此不记录响应时长
option dontlognull #不记录空信息
capture request header Host len 20 #记录请求首部的前20个字符
capture request header Referer len 60 #referer跳转引用,就是上一级
default_backend AnuoApcNodes #处理请求的服务器集群
backend AnuoApcNodes #处理请求的服务器集群
mode http
balance roundrobin
#check : 下面的check 表示ha 需要检查此节点的状态
server websrv1 192.168.2.108:9090 check maxconn 6000
server websrv2 192.168.1.112:88 check maxconn 6000 listen SQLServer :1433 #tcp 负载均衡
mode tcp
balance 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 2
server SQLServer2 192.168.2.203:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2
listen Redis :6377 #tcp 负载均衡
mode tcp
balance 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 2
server 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 还在运行, 只是慢了点而已.

net core 实战之 redis 负载均衡和"高可用"实现的更多相关文章

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

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

  2. Keepalived+LVS+Nginx负载均衡之高可用

    Keepalived+LVS+Nginx负载均衡之高可用 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常 ...

  3. HAProxy+keepalived+MySQL 实现MHA中slave集群负载均衡的高可用

    HAProxy+keepalived+MySQL实现MHA中slave集群的负载均衡的高可用 Ip地址划分: 240    mysql_b2 242    mysql_b1 247    haprox ...

  4. nginx负载均衡+keepalived高可用

    nginx负载均衡+keepalived高可用 环境准备 192.168.88.111:nginx + keepalived   MASTER 192.168.88.112:nginx + keepa ...

  5. dubbo服务层面上的负载均衡和高可用

    dubbo上的服务层可以做集群,来达到负载均衡和高可用,很简单,只需要在不同的服务器节点上向同一个zk(内网环境)注册相同的服务 注意就是,消费者不能在同一个zk做这种集群操作的 转载请注明博客出处: ...

  6. 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群,并部署客户端负载均衡和高可用

    本文作者系:视野金服工程师 | 吴海胜 首发于 Nebula Graph 论坛:https://discuss.nebula-graph.com.cn/t/topic/1388 一.前言 本文介绍如何 ...

  7. 15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  8. Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

    上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...

  9. Nginx的负载均衡和高可用

    一.Nginx的理解 Nginx是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理 ...

随机推荐

  1. Completely change MACE timestamps?

    Hi, One of my friends Sandy asked me about the possibility of completely change MACE timestamps. As ...

  2. .NET环境配置(二)

    打开IIS服务器   首先在设置程序池 应用程序池 设置  ASP.NET v4.0         ASP.NET v4.0 Classic CLassic.NET AppPool DefaultA ...

  3. s3c6410_中断

    参考: 1)<USER'S MANUAL-S3C6410X>Chapter 10 GPIO, Chapter 12 VECTORED INTERRUPT CONTROLLER 2)< ...

  4. 学习iOS的博客推荐

    1.取精华.去糟粕!适合iOS开发者的15大网站推荐 http://www.csdn.net/article/2015-03-04/2824108-ios-developers-sites

  5. PHP isset()与empty()的区别详解

    通过对PHP语言的学习,应该知道它是基于函数的一款HTML脚本语言. 庞大的函数库支持着PHP语言功能的实现. 有关PHP函数isset()与empty()的相关用法. PHP的isset()函数 一 ...

  6. php5.5新函数array_column

    php5.5新增了一个新的数组函数,感觉挺使用的,低版本的实现按照如下实现 if(!function_exists('array_column')){ function array_column($i ...

  7. Lua 练习中的Bug 以及日志

    使用 Lua 中的table.getn获得数组的table的长度:运行失败-- > t ={1,2,3 } > print(table.getn(t)) stdin:1: attempt ...

  8. phpmyadmin误删表后的恢复过程(心惊胆跳啊)

    话说今天不知道是抽风了还是失魂了,在用phpmyadmin删除测试数据时,竟然将整个表删除了: 等程序运行出错时,才出现整个表都没有了,而且之前也没有备份好!这下蛋疼了,这个可是production服 ...

  9. STM32F4_TIM输入波形捕获(脉冲频率)

    Ⅰ.概述 本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的.在引脚上刚好相反:一个输入.一个输出. 本文只使用 ...

  10. Python核心编程--学习笔记--9--文件和输入输出

    本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...