例如: web-server希望对用户屏蔽高可用、屏蔽web-server扩展、web-server内网ip等细节,于是就找了一个proxy隔在中间,此时proxy代表web-server集群,用户以为 proxy的ip就是被访问web-server的ip(web-server是集群,具体访问了哪个web-server,用户不知道),由于web-server集群有多台,此时反向代理服务器要具备负载均衡的功能
如上图,假设用户包含登录信息的session都记录在第一台web-server上,反向代理如果将请求路由到另一台web-server上,可能就找不到相关信息,而导致用户需要重新登录。 Session一致性解决方案 1.session复制(同步)Tomcat自带该功能 思路:多个web-server 之间相互同步session,这样每个web-server之间都包含全部的session 优点:web-server 支持的功能,应用程序不需要修改代码 不足: session 的同步需要数据传输,占内网带宽,有时延 所有web-server 都包含所有session数据,数据量受内存限制 3.反向代理hash一致性 思路:web-server为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台web-server 上呢? 4.后端统一集中存储 思路:将session存储在web-server后端的存储层,数据库或者缓存 优点: 没有安全隐患 可以水平扩展,数据库/缓存水平切分即可 web-server重启或者扩容都不会有
一、web-server的负载均衡 互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡。 整个架构分三层: 上游调用层,一般是browser或者APP 中间反向代理层,nginx 下游真实接入集群,web-server,常见web-server的有tomcat,apache 整个访问过程为: 由于http短连接,以及web应用无状态的特性,理论上任何一个http请求落在任意一台web-server都应该得到正常处理(如果必须落在一台,说明架构不合理,不能水平扩展)。 高可用、负载均衡、扩展性等任务由get-tcp-ip的web-server专注来执行。 web-server如何实施负载均衡?
当只有一台web-server提供服务时,每次http短连接请求,都能够正确路由到存储session的对应web-server(废话,因为只有一台)。 此时的web-server是无法保证高可用的,采用“冗余+故障转移”的多台web-server来保证高可用时,每次http短连接请求就不一定能路由到正确的session了。 ? 如上图,假设用户包含登录信息的session都记录在第一台web-server上,反向代理如果将请求路由到另一台web-server上,可能就找不到相关信息,而导致用户需要重新登录。 思路:多个web-server之间相互同步session,这样每个web-server之间都包含全部的session 优点:web-server支持的功能,应用程序不需要修改代码 不足: session 三、反向代理hash一致性 思路:web-server为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台web-server上呢? ?
当只有一台web-server提供服务时,每次http短连接请求,都能够正确路由到存储session的对应web-server。 画外音:废话,因为只有一台。 此时的web-server是无法保证高可用的,采用“冗余+故障转移”的多台web-server来保证高可用时,每次http短连接请求就不一定能路由到正确的session了。 思路:多个web-server之间相互同步session,这样每个web-server之间都包含全部的session。 优点:web-server支持的功能,应用程序不需要修改代码。 优点: 只需要改nginx配置,不需要修改应用代码 负载均衡,只要hash属性是均匀的,多台web-server的负载是均衡的 可以支持web-server水平扩展 不足: 如果web-server重启 web-server上 反向代理七层hash一致性:保证一个用户的请求落在一台web-server上 后端统一存储:web-server重启和扩容,session也不会丢失(用得最多) 知其然,知其所以然
main.go FROM busybox COPY --from=build /web-server/web-server /web-server/web-server EXPOSE 8360 ENV ENV local WORKDIR /web-server/ ENTRYPOINT ["/web-server/web-server"] 2.问题分析 发现curl无法访问docker容器中的服务,telnet 1 root 0:00 /web-server/web-server 38 root 0:00 sh 94 root 0:00 sh 101 root :* LISTEN /web-server # 可以看到,在容器内部实际上8360端口已经被监听。 容器内部支持wget: /web-server # wget -q -O - http://127.0.0.1:8360/hello hello http server /web-server #
通用业务服务化之后,系统的典型后端结构如上: web-server通过RPC接口,从通用业务服务获取数据 biz-service通过RPC接口,从多个基础数据service获取数据 基础数据 service通过DAO,从独立db/cache获取数据 db/cache存储数据 随着时间的推移,系统架构并不会一成不变,业务越来越复杂,改版越来越多,此时web-server层虽然使用了MVC 端到web-server之间连接关系很清晰 web-server与service之间的连接关系变成了蜘蛛网 PC/H5/APP的web-server层大部分业务是相同的,只有少数的逻辑/展现/ 交互不一样: 一旦一个服务RPC接口有稍许变化,所有web-server系统都需要升级修改 web-server之间存在大量代码拷贝 一旦拷贝代码,出现一个bug,多个子系统都需要升级修改 通过前后端分离分层抽象: 站点展示层,node.js,负责数据的展现与交互,由FE维护 站点数据层,web-server,负责业务逻辑与json数据接口的提供,由Java工程师维护 这样的好处是
daojia.com请求dns-server (2)dns-server返回域名对应的外网ip(1.2.3.4) (3)客户端访问外网ip(1.2.3.4)向反向代理nginx (4)反向代理nginx配置了多个后端web-server 服务内网ip(192.168.0.1/192.168.0.2) (5)请求最终落到某一个web-server进行处理 其中,第一个步骤域名daojia.com到外网ip(1.2.3.4)的转换,发生在整个服务端外部 二、反向代理水平扩展 典型的互联网架构中,可以通过增加web-server来扩充web层的性能,但反向代理nginx仍是整个系统的唯一入口,如果系统吞吐超过nginx的性能极限,难以扩容,此时就需要dns-server 三、web-server负载均衡 既然“dns轮询”可以将同一个域名的流量均匀分配到不同的nginx,那么也可以利用它来做web-server的负载均衡: (1)架构中去掉nginx层 (2)将多个web-server 之间有保活探测机制,当web-server挂掉时,能够自动迁移流量 当web-server需要扩容时,通过dns扩容生效时间长,而nginx是服务端完全自己可控的部分,web-server扩容更实时更方便
例如,我们可以创建一个名为 web-server 的容器,并将其连接到 my-network 网络:docker run -d --name web-server --network my-network nginx这将创建一个名为 web-server 的容器,它将运行 Nginx Web 服务器,并连接到 my-network 网络。 -O- http://web-server这将创建一个名为 client 的容器,并使用 Busybox 镜像运行一个 wget 命令,以连接到 web-server 容器。 由于这两个容器都连接到 my-network 网络,因此 client 容器可以通过 web-server 容器的名称 web-server 进行访问。 例如,我们可以使用以下命令将 web-server 容器的端口 80 映射到主机的端口 8080:docker run -d --name web-server -p 8080:80 --network
如果升级的是web-server: ? 如上图,重启ip1上的tomcat时,tomcat上或许有1000个http请求正在处理,这些请求就会失败。 如果升级的是service: ? web-server升级能否不影响正在处理的请求? 答:可以,需要nginx和web-server配合。 (1)给nginx发指令,将ip1上的流量切走 ? (3)旧流量完成后,升级web-server ? 此时,ip1上的web-server处于没有流量的状况,可以随便玩: 停服务备份 升级(粉色代表升级后的节点) 服务重启 测试工程师直连ip1进行验证 验证完毕 (4)给nginx发指令,将流量切回ip1 为啥不能像web-server一样,直接给上游nginx发指令呢,因为service有太多的上游。 (4)旧流量逐步迁移完成,RPC-client会间歇性重连 ?
例如,如果升级的是web-server: ? 如上图,重启ip1上的tomcat时,tomcat上或许有1000个http请求正在处理,这些请求就会失败。 又例如,如果升级的是service: ? web-server升级能否不影响正在处理的请求? 可以,需要nginx和web-server配合。 (1)给nginx发指令,将ip1上的流量切走; ? (3)旧流量完成后,升级web-server; ? 为啥不能像web-server一样,直接给上游nginx发指令呢,因为service有太多的上游。 (4)旧流量逐步迁移完成,RPC-client会间歇性重连; ? (1)如果没有实现服务自动发现,服务治理,早期可以这么玩; (2)web-server无损升级,强烈建议脚本化; (3)service无损升级,需要服务框架支持; 希望大家有收获,帮转哈。
(1)网络慢,DNS解析的时间不能忽略; (2)一旦DNS被劫持,整个APP就挂了; APP能够把Web-server的ip-list内置,从而跳过DNS解析,跳过Nginx中转,直接通过IP访问后端的 Web-server么? 不行,Web-server的扩展性较差,增加IP时APP没办法得到通知。 画外音:Nginx可以保证Web-server的高可用,去掉Nginx后,需要APP重试,或者Web-server做高可用。 (2)未来访问时,客户端直接使用ip-list中的IP来访问server,不再需要DNS; 画外音:使用IP访问业务Web-server,所有业务请求。 跳过了Nginx,如何对Web-server怎么做负载均衡呢? APP随机访问ip-list中的IP。 跳过了Nginx,如何对Web-server做水平扩展呢?
; (2)dns-server返回域名对应的外网ip(1.2.3.4); (3)客户端通过外网ip(1.2.3.4),访问反向代理; (4)反向代理通过内网ip(192.168.x.x),将请求分发给web-server ; (5)web-server对请求进行处理; 其中,第一个步骤,将域名转化ip的过程,发生在应用系统的外部,是通过DNS实现的。 三、web-server负载均衡 ? 既然“dns轮询”可以将同一个域名的流量均匀分配到不同的nginx,那么也可以利用它来做web-server的负载均衡: (1)架构中去掉nginx层; (2)将多个web-server的内网ip直接改为外网 ,当web-server挂掉时,能够自动迁移流量; (2)当web-server需要扩容时,通过DNS扩容生效时间长,而nginx是服务端完全自己可控的部分,web-server扩容更实时更方便; 因为上面两个原因
作者:58沈剑,来源:架构师之路 一,典型后端架构 通用业务服务化之后,系统的典型后端结构如上: web-server通过RPC接口,从通用业务服务获取数据 biz-service通过RPC接口,从多个基础数据 获取数据 基础数据service通过DAO,从独立db/cache获取数据 db/cache存储数据 二,典型架构存在的问题 随着时间的推移,系统架构并不会一成不变,业务越来越复杂,改版越来越多,此时web-server 没错,把Mobile版本的工程拷贝一份,然后再做小量的修改: 把拼装html数据的代码,修改为拼装json数据 这么迭代,演化,发展,架构会变成这个样子: 端,是PC,Mobile,APP web-server 端到web-server之间连接关系很清晰 web-server与service之间的连接关系变成了蜘蛛网 PC/H5/APP的web-server层大部分业务是相同的,只有少数的逻辑/展现/交互不一样 : 一旦一个服务RPC接口有稍许变化,所有web-server系统都需要升级修改 web-server之间存在大量代码拷贝 一旦拷贝代码,出现一个bug,多个子系统都需要升级修改 三,前后端分离势在必行
通用业务服务化之后,系统的典型后端结构如上: web-server通过RPC接口,从通用业务服务获取数据 biz-service通过RPC接口,从多个基础数据service获取数据 基础数据service 通过DAO,从独立db/cache获取数据 db/cache存储数据 随着时间的推移,系统架构并不会一成不变,业务越来越复杂,改版越来越多,此时web-server层虽然使用了MVC架构,但以下诸多痛点是否似曾相识 没错,把Mobile版本的工程拷贝一份,然后再做小量的修改: 把拼装html数据的代码,修改为拼装json数据 这么迭代,演化,发展,架构会变成这个样子: 端,是PC,Mobile,APP web-server 端到web-server之间连接关系很清晰 web-server与service之间的连接关系变成了蜘蛛网 PC/H5/APP的web-server层大部分业务是相同的,只有少数的逻辑/展现/交互不一样 : 一旦一个服务RPC接口有稍许变化,所有web-server系统都需要升级修改 web-server之间存在大量代码拷贝 一旦拷贝代码,出现一个bug,多个子系统都需要升级修改 如何让数据的获取更加高效快捷
running virsh list --all 列出所有虚拟机 连接虚拟机 virsh console web-server 启停相关的命令 virsh start web-server # 虚拟机开启(启动): virsh reboot web-server # 虚拟机重新启动 virsh shutdown web-server # 虚拟机关机 virsh destroy web-server # 强制关机(强制断电) virsh suspend web-server # 暂停(挂起)KVM 虚拟机 virsh resume web-server # 恢复被挂起的 KVM 虚拟机 virsh undefine web-server # 该方法只删除配置文件,磁盘文件未删除 virsh autostart web-server # 随物理机启动而启动(开机启动) virsh autostart --disable web-server # 取消标记为自动开始(取消开机启动) 上面是简单的部署过程,后面会继续整理网络相关的配置过程
作者:58神剑,来源:架构师之路 一,典型后端架构 通用业务服务化之后,系统的典型后端结构如上: web-server通过RPC接口,从通用业务服务获取数据 biz-service通过RPC接口,从多个基础数据 获取数据 基础数据service通过DAO,从独立db/cache获取数据 db/cache存储数据 二,典型架构存在的问题 随着时间的推移,系统架构并不会一成不变,业务越来越复杂,改版越来越多,此时web-server 没错,把Mobile版本的工程拷贝一份,然后再做小量的修改: 把拼装html数据的代码,修改为拼装json数据 这么迭代,演化,发展,架构会变成这个样子: 端,是PC,Mobile,APP web-server 端到web-server之间连接关系很清晰 web-server与service之间的连接关系变成了蜘蛛网 PC/H5/APP的web-server层大部分业务是相同的,只有少数的逻辑/展现/交互不一样 : 一旦一个服务RPC接口有稍许变化,所有web-server系统都需要升级修改 web-server之间存在大量代码拷贝 一旦拷贝代码,出现一个bug,多个子系统都需要升级修改 三,前后端分离势在必行
DB-Server部署在IDC,可参考下图: 1.1 客户需求: image.png 客户之前由于同域名同端口下有不少业务,因此采用Nginx反向代理后端APP模式,HTTPS方式,将证书放在前端WEB-Server 侧APP-server部署的接口为HTTPS模式,Nginx采用http方式反代502证书不信任,无法反向代理成功,想到利用HTTPS方式反代,或者联系客户修改后端API接口为HTTP方式,但是金融云Web-Server 1.3 架构剖析: 此时修改IDC侧为HTTP方式无法进行,由于证书拿不到,金融云Web-Server侧利用HTTPS方式反向也无法进行,一度陷入僵局,继续沟通得知改接口正式环境已经在IDC侧部署完毕, 1.4 解决方案: 既然Nginx反代不行,SLB后端也无法直接添加IDC侧的APP服务器,那就利用WEB-server利用iptables进行端口转发,配置DNAT和SNAT直接将流量抛过去,想到这里开始着手测试实施 2.3 域名及SLB 由于是测试域名前端暂时未添加WAF/高防IP等防护设备,将域名解析A记录解析至SLB公网地址,SLB配置虚拟服务器组,组内添加Web-Server,此时监听端口为Dnat端口。
《架构师之路:架构设计中的100个知识点》 14.session sticky相关技术 《DNS在架构设计中的三大妙用》发布后,有个朋友反馈:虽然DNS轮询能随时扩展Nginx,NG后端也能随时扩展web-server 这是一种会话保持策略,它通过负载均衡器将来自同一个用户的请求始终分发到同一台web-server上。这样,session信息仅需要存储在该服务器上,而无需共享。 通常情况下,反向代理,web-server,service都要尽量做到无状态。任何请求落到任何节点均可处理,随时可以增减节点。 用户状态尽量存储在数据层,cache或者是db里,由所有无状态的上游web-server和service共享。 该设计原则与session sticky要求的,一个用户的请求必须落到一个web-server完全是相违背的。因此,session sticky的使用越来越少。
1) 安装CAS,HUB,MB角色时: Import-Module ServerManager Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server Restart 2) 安装CAS,HUB,MB,UM角色时: Import-Module ServerManager Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server RSAT-Web-Server -Restart 5) 安装CAS,MB角色时 Import-Module ServerManager Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server RPC-Over-HTTP-Proxy -Restart 6) 安装CAS角色时 Import-Module ServerManager Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server RSAT-Web-Server -Restart 8) 安装UM角色时 Import-Module ServerManager Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server