阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ASP.NET Core实战之 Redis 负载均衡和“高可用”实现

162次阅读
没有评论

共计 4598 个字符,预计需要花费 12 分钟才能阅读完成。

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
其中最后的配置:

ASP.NET Core 实战之 Redis 负载均衡和“高可用”实现

为 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/1i5fU0w1

源码配置运行步骤如下:

如下图ASP.NET Core 实战之 Redis 负载均衡和“高可用”实现

 

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

ASP.NET Core 实战之 Redis 负载均衡和“高可用”实现

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

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

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

ASP.NET Core 实战之 Redis 负载均衡和“高可用”实现

调用 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 还在运行, 只是慢了点而已.

下面关于 Redis 的文章您也可能喜欢,不妨参考下:

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm

Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm

Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm

Redis 的详细介绍:请点这里
Redis 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/136996.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4598字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中