(给DotNet加星标,提升.Net技能)

转自:陈珙cnblogs.com/skychen1218/p/13327965.html

系列文章

.Net微服务实战之技术选型篇

.Net微服务实战之技术架构分层篇

.Net微服务实战之DevOps篇

相关源码:https://github.com/SkyChenSky/Sikiro

PS:最近开始在找工作,如果在广州地区需要技术管理岗的(.Net架构师、技术经理)可以随时联系我,微信:SkyChen_Gong。

分布式?集群?负载均衡?

我曾经面试过一家企业,当时描述完我在老东家完成的微服务架构后,面试官问了我一个问题:

面试官:您有做过分布式系统吗?

我:有,刚刚我描述的微服务架构就是分布式的……

面试官:不不不,我意思是你有没有尝试过把一个站点部署到多台服务器上?

我:哦……你意思是我有没有用过类似nginx这些工具做负载均衡是吧?有,现在我们就这么做的。但是我对分布式理解是工作方式,但是你描述的更多具体称之为集群或者负载均衡。

面试官:对对,大家的站在的观点不一样所以理解的不一样(尴尬的笑了笑)

PS:首先我申明下我没有对该面试官有任何贬低嘲讽之意,也没刻意突出谁对谁错,面试完了后我回去回想了下我的回答并找到些资料做出以下总结。

分布式

分布式计算是指系统的工作方式,主要分为数据分布式和任务分布式:

数据分布式也称为数据并行,把数据拆分后,利用多台计算机并行执行多个相同任务。优点是缩短所有任务总体执行时间,缺点是无法减少单个任务的执行时间。

任务分布式也称为任务并行,单个串行的任务拆分成多个可并行子任务。优点是提高性能、可扩展性、可维护性,缺点是增加设计复杂性。

负载均衡

负载均衡(Load Balance),简称LB,就是将并发的用户请求通过规则后平衡、分摊到多台服务器上进行执行,以此达到压力分摊、数据并行的效果。

集群

集群是系统在负载均衡结果后的物理表现,系统(服务)通过部署到多台服务器以达到共同提供相同的功能,可以称这一组服务为某某集群,例如Redis集群,某Web站点集群。

负载均衡器

作用

负载均衡器的分类有很多,而他们的作用主要体现于架构要素的其中三个:可用性、性能、安全。

可用性,多台服务器的部署避免了单点故障。

性能,一台Web站点能提供每秒4000次的并发请求,5台服务器构成的一个集群就可以达到20000。

安全,通过反向代理到真实服务器,避免直接路由到高危Web服务,避免开放危险端口。

算法

常用的负载均衡算法主要以下4个:

  • 加权轮询

  • 随机

  • 最少链接数

  • 哈希

分类

  • 从制造上主要分为软件负载和硬件负载:

  • 软负载,包含了Nginx、LVS、HAProxy等。

  • 硬负载,包含了F5、Array等。

  • 从量级上主要分为:百万级、数十万级、万级:

  • 百万级,硬负载,例如F5、Array。

  • 数十万级,第四层负载,LVS、HAProxy。

  • 万级,第七层负载,Nginx。

当然从成本上,硬负载绝对是土豪公司的工具,便宜的十来万RMB,贵则上百万RMB。而软负载只需要一台Linux服务器的钱就足够了。此外LVS的部署复杂度相比于Nginx会高那么一点,但是Nginx的七层负载的灵活性是四层负载的无法比拟的。

在实际工作中大家更多会接触到上图的架构模型,从功能职责上又可以划分地域级、集群级和应用级的负载:

地域级的负载均衡使用的是DNS的智能解析来完成的,DNS全称Domain Name System,中文叫域名系统(服务)协议,一般都会采用云服务厂商的DNS系统,我们知道域名是需要花钱购买的,而厂商会附带一个免费的域名解析套餐,如果需要对域名进行域名智能解析,就需要付费给厂商获取相应的服务。

Nginx作为应用级负载也有自己的并发处理上限,如果超过上限了那么只能通过再上一层加一个更高处理性能的负载均衡器作为解决,而LVS可以很好担任集群级的负载重任。如果是土豪公司可以在自己选择使用硬负载来代替LVS,硬负载虽然贵也有自己的优势,例如防火墙、加密、高性能处理等。

Nginx

Nginx是一个高性能的反向代理服务器,也是稳定且高效的基于七层的负载均衡器。Nginx可以根据以随机、加权轮询,IP哈希、URL哈希等方式调度后端真是服务器,Nginx也支持对后端服务器的健康检查功能。

LVS

LVS即Linux Virtual Server,翻译中文为 Linux虚拟服务器,目前LVS是已经被集成到Linux内核模块中,LVS的工作模式分为NAT模式、TUN模式以及DR模式。那么在实战中,更多会Keepalived + LVS一起集成使用,Keepalived可以自动将LVS备用调度器升级为主调度器,最终实现整个集群系统的高负载、高可用。

本篇的重点主要讲解Keepalive + LVS + Nginx + .Net Core的搭建与使用。

效果图

PS:上图是我完成搭建后录制的视频转gif,因为中间有等待的一分钟,为了观看效果剪断了。

Web1与Web2是同一个Nginx,Web3和Web4是同为另外的一个Nginx。在图里可见需要过一段时间才能从一个Nginx切换到另外一个Nginx,原因主要是LVS会根据访问客户端的IP+端口在会话时间内重复的转发到同一个目标服务器。而控制这个会话时间的可以通过设置ipvsadm --persistent 与--set这两个参数决定。

LVS的三种工作模式

NAT(Network Address Translation)-网络地址转换模式

首先,外部请求会经过LVS的VIP(Virtual IP Address);接着,LVS会根据预设的调度算法选择一台真实的服务器进行数据请求包转发,转发前会把原数据包的目标地址与目标端口修改为真实服务器的地址与端口;最后,LVS在得到响应数据包后会把源地址与源端口改为VIP及调度器相应的端口。因为由于所有的请求与响应都会经过LVS调度器转发,因此容易成为集群的瓶颈。

TUN-隧道模式

因为NAT会的瓶颈问题,因此TUN模式采用用了请求与响应数据分离的思路,让调度器仅处理数据请求,让真实服务器响应数据包直接返回给客户端,需要注意的是该模式下的真实服务器需要与外部网络连接。另外TUN模式下需要在LVS调度器与真实服务器之间创建隧道连接,同样会增加服务器的负担。

DR(Direct Routing)-直接路由模式

DR模式也是采用请求与响应分离的思路,由真实服务器直接响应客户端,但是它的报文转发方法有所不同,在不修改数据报文的情况下,将数据帧的MAC地址修改为需要转发到的真实服务器MAC地址,免去了TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是LVS调度器与真实后端服务器必须在一个局域网内。

LVS的部署

接下来的部署操作将实现上图Keepalived + LVS +Nginx的多层负载均衡,LVS将是以DR模式实现。

两台LVS服务器(主从)

基础依赖安装

yum install gccyum -y install openssl-develyum -y install libnl libnl-develyum install -y libnfnetlink-develyum -y install net-toolsyum install vim -y

安装keepalived 和 ipvsadm

yum install -y keepalived ipvsadm

LVS-Master服务器

修改Keepalived配置:

vim /etc/keepalived/keepalived.conf

复制以下配置覆盖进去

注意:real_server填写的是Nginx服务器的IP地址

global_defs {  router_id LVS_MASTER # 设置lvs的id,在一个网络内应该是唯一的}vrrp_instance VI_1 {state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写  interface ens33 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看  virtual_router_id 51 #虚拟路由编号,主备要一致  priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR  advert_int 1 #检查间隔,默认为1s  authentication {    auth_type PASS    auth_pass 12345678  }  virtual_ipaddress {192.168.174.128/24 #定义虚拟IP(VIP)为192.168.174.128,可多设,每行一个  }}# 定义对外提供服务的LVS的VIP以及portvirtual_server 192.168.174.128 80 {  delay_loop 6 # 设置健康检查时间,单位是秒  lb_algo rr # 设置负载调度的算法为wlc  lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式  nat_mask 255.255.255.0  persistence_timeout 0  protocol TCP  real_server 192.168.88.137 80 {    weight 1    TCP_CHECK {      connect_timeout 10      nb_get_retry 3      delay_before_retry 3      connect_port 80    }  }  real_server 192.168.88.139 80 {    weight 1    TCP_CHECK {      connect_timeout 10      nb_get_retry 3      delay_before_retry 3      connect_port 80    }  }}

LVS-BackUp服务器

修改Keepalived配置:

vim /etc/keepalived/keepalived.conf

复制以下配置覆盖进去

注意:real_server填写的是Nginx服务器的IP地址,state改为BACKUP,priority改为比Master小。

global_defs {  router_id LVS_SLAVE # 设置lvs的id,在一个网络内应该是唯一的}vrrp_instance VI_1 {state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写  interface ens33 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看  virtual_router_id 51 #虚拟路由编号,主备要一致  priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR  advert_int 1 #检查间隔,默认为1s  authentication {    auth_type PASS    auth_pass 12345678  }  virtual_ipaddress {192.168.174.128/24 #定义虚拟IP(VIP)为192.168.174.128,可多设,每行一个  }}# 定义对外提供服务的LVS的VIP以及portvirtual_server 192.168.174.128 80 {  delay_loop 6 # 设置健康检查时间,单位是秒  lb_algo rr # 设置负载调度的算法为wlc  lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式  nat_mask 255.255.255.0  persistence_timeout 0  protocol TCP  real_server 192.168.88.137 80 {    weight 1    TCP_CHECK {      connect_timeout 10      nb_get_retry 3      delay_before_retry 3      connect_port 80    }  }  real_server 192.168.88.139 80 {    weight 1    TCP_CHECK {      connect_timeout 10      nb_get_retry 3      delay_before_retry 3      connect_port 80    }  }}

两台Nginx服务器

执行以下命令

vim /etc/sysconfig/network-scripts/ifcfg-lo:0

填写以下配置并保存

DEVICE=lo:0IPADDR=192.168.88.128NETMASK=255.255.255.255BROADCAST=192.168.88.128ONBOOT=yesNAME=lvs_vip

修改ARP

vim /etc/sysctl.conf

填写配置并保存

net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2

重启网卡

sysctl -psystemctl restart network

那么以上关于LVS部分就搭建好了。

Nginx的部署

在两台Nginx服务器都执行以下指令

添加源并安装

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmyum install -y nginx

填写Nginx配置

把http里【#开始】到【#结束】这段拷贝进去就可以了。

user  nginx;worker_processes  1;error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;

events {worker_connections  1024;}

http {#开始upstream 192.168.88.139{server localhost:5001 weight=1;server localhost:5002 weight=1;    }server {listen       80;server_name  192.168.88.139;charset utf8;client_max_body_size 50m;client_body_buffer_size 256k;location / {proxy_pass        http://192.168.88.139;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header Host $host;            }    }#结束}

设置开机启动

systemctl start nginx.servicesystemctl enable  nginx.service

重启防火墙

firewall-cmd --permanent --zone=public --add-port=80/tcpfirewall-cmd --reload

以上关于Nginx的部分就完成了搭建。可以通过以下指令查看LVS的调度与连接信息。

查看LVS调度信息

ipvsadm -Ln

查看LVS连接信息

.NET Core部署

添加下载源:

rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

下载安装:

sudo yum install aspnetcore-runtime-2.2

通过FTP把Web站点文件复制两份并上传到服务器,然后启动后台进程:

nohup dotnet Test1.dll --server.urls "http://*:5001" &nohup dotnet Test1.dll --server.urls "http://*:5002" &

FTP服务器的部署

安装FTP服务器:

yum install -y vsftpd

修改配置:

vim /etc/vsftpd/vsftpd.conf

把已有的三项配置修改了:

anonymous_enable=NOlisten=YES#listen_ipv6=YES

启动

systemctl start vsftpdsystemctl enable vsftpd

重启防火墙

firewall-cmd --permanent --zone=public --add-service=ftpfirewall-cmd --reload

允许root登录,把以下两个文件的root注释了

vim /etc/vsftpd/user_list#root

关掉selinux,会影响上传

setenforce 0vim /etc/selinux/config#将SELINUX=enforcing改为SELINUX=permissive

FTP客户端—FileZilla下载地址

https://filezilla-project.org/download.php?type=client

结束

以上为本篇的所有内容了,负载均衡在实际工作中涉及的地方挺多的,因此我将分为上下两篇,该篇为负载均衡的上篇主要从大方向DNS、LVS、Nginx进行了分享,下篇会从微服务架构里使用到的组件API网关和注册中心进行探讨,如果大家在实践上遇到任何问题,或者有更好的建议可以到评论反馈给我。

- EOF -

推荐阅读  点击标题可跳转

三角函数与缓入缓出动画及C#实现(图文讲解)

.NET Core+Nginx实现项目负载均衡C# 人脸识别库 0.2

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能

好文章,我在看❤️

.net core 微服务_.NET 微服务实战之负载均衡(上)相关推荐

  1. java微服务实战.pdf_Spring微服务实战 ([美]约翰·卡内尔) 中文完整pdf扫描版[172MB]...

    <Spring微服务实战>以一个名为EagleEye的项目为主线,介绍云.微服务等概念以及Spring Boot和Spring Cloud等诸多Spring项目,并介绍如何将EagleEy ...

  2. 微服务接入oauth2_SpringCloud微服务实战系列(十九)Ouath2在真实场景中的应用之客户端接入(第一种写法)...

    SpringCloud微服务实战系列(十九)Ouath2在真实场景中的应用之客户端接入(第一种写法) 一.概述 在<SpringCloud微服务实战系列(十七)Ouath2在真实场景中的应用之资 ...

  3. 【微服务架构】SpringCloud使用Ribbon实现负载均衡

    说在前面 软负载均衡的实现方式有两种,分别是服务端的负载均衡和客户端的负载均衡 服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求,反向代理服务器会根据客户端部署的ip:po ...

  4. .NET Core微服务系列基础文章索引(目录导航Final版)

    一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...

  5. .NET Core微服务之基于Ocelot实现API网关服务(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...

  6. .Net Core微服务入门——Ocelot和Consul集群高可用

    .Net Core微服务入门--Ocelot和Consul集群高可用 上一章 我们ocelot网关顺利的接入了consul集群,并且访问成功. 但是,我们也遇到了问题,把 192.168.8.25 上 ...

  7. 微服务实战(六):选择微服务部署策略

    http://dockone.io/article/1066 微服务实战(六):选择微服务部署策略 [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺 ...

  8. 微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)

    在现代系统中,特别是互联网软件,通常会涉及到大量用户的并发访问,我们的系统一定要在架构上支持高性能.大并发的访问.一个高性能的系统通常由很多的方面组成,包括数据库高性能.Web服务器高性能.负载均衡. ...

  9. 微服务实战(七):从单体式架构迁移到微服务架构

    http://dockone.io/article/1266 希望读者通过本系列文章对微服务优缺点有一个比较好的理解,以及何时使用这种架构.也许微服务架构比较适合你的应用.也许你正在开发一个大型.复杂 ...

最新文章

  1. 2进程之间的关系:进程组,会话,守护进程
  2. 使用Struts 2框架实现文件下载
  3. K-Dominant Character CodeForces - 888C 思维 构造
  4. 广东人大常委会党组会议强调:要加快人工智能等领域的相关立法工作。【Python】
  5. 直击奥运直播拆条背后的三大难点
  6. python自动接收邮件_Python自动发送和收取邮件的方法
  7. freeMarker fmpp 解析PowerDesign PDM探索
  8. Java NIO入门
  9. 几个分形的matlab实现1,基于MATLAB实现分形图形的绘制.doc
  10. CC2500模块移植说明
  11. Arduino智能小车直线控制-模糊PID控制
  12. wps页眉怎么设置不同页码_wps版word怎么从第二页设置页眉页脚
  13. VBA 获取最大行数和最大列数
  14. 《易经》里的28条法则与64个大智慧
  15. Android锁屏的实现与难点总结
  16. deepin-wine的安装
  17. 核心案例|中国民用航空飞行学院半实物飞行仿真平台
  18. VB中Byval与Byref的区别。
  19. 棋牌游戏开发会low吗 中国棋牌文化底蕴探究
  20. 如何判断自己是不是社恐?

热门文章

  1. 2.2 经典网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  2. 【DIY】200521近期在做的项目小结,DIY进展汇报
  3. 数字锁相环的matlab仿真
  4. java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC
  5. 在Spring项目中使用@Scheduled注解定义简单定时任务
  6. (NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵
  7. msdn library api调用问题
  8. Asp.Net_Mvc_IgnoreRoute
  9. pku 1185 炮兵阵地
  10. C语言标准库函数qsort排序的介绍与使用