注:我工作了几年,无论是身边遇到的,还是耳闻的,都积累了一些自己的经验和思考。当然,我没有接触过太多高层建筑上的分布式架构实践,所以总结的经验比较零碎。欢迎随时添加。
俗话说,冰冻三尺,非一日之寒,冰冻三尺,非一日之寒。对于开发者来说,一个好的架构不是一夜之间就能产生的。
初始安装
首先,各种框架被建立起来,然后被扔进Tomcat容器。此时,我们的文件、数据库和应用程序都在一台服务器上。
服务分离
随着系统上线,用户数量会逐渐增加,很快一台服务器就满足不了系统的负载。这时候就要在服务器过载之前提前做好准备。
由于我们是单一架构,短时间内优化架构不现实,加机器是个不错的选择。此时,如果条件允许,我们可能必须分别部署应用程序和数据库服务,或者分别部署文件服务器。
反向代理
为了提高服务处理能力,我们在Tomcat容器前面加了一个代理服务器,一般用Nginx。当然,如果你对Apache比较熟悉的话,你就能做到。
用户的请求被发送到反向代理,然后反向代理将请求转发到后端服务器。
严格来说,Nginx属于Web服务器,一般处理静态的HTML、CSS、JS请求;Tomcat是一个Web容器,它处理JSP请求。当然Tomcat也支持Html,但是效果不如Nginx。
反向代理的优势如下:
基于以上Nginx反向代理,我们还可以实现静态和动态的分离。HTML、CSS、JS等静态请求交给Nginx处理,动态请求分发到后端Tomcat处理。
Nginx升级到1.9.5+可以开启HTTP/2.0时代,加快网站访问速度。当然,如果公司不缺钱,CDN也是不错的选择。
服务拆分
在这个分布式微服务已经普及的时代,我们不用踩太多坑就可以轻松拆分。
市面上已经有比较成熟的技术,比如阿里巴巴开源的Dubbo(官方表示已经开始维护)和Springfamily的SpringCloud。当然,如何实现,无论从技术上还是商业上,都要控制好。
01、Dubbo
春天的云
服务拆分后,接下来是持续集成部署。你可以使用以下工具:Docker,Jenkins,Git,Maven。
基本拓扑如下:
整个持续集成平台的架构演变如下图所示:
服务集群Linux集群主要分为三类:
三种负载平衡方法:
众所周知,服务一般分为有状态和无状态,分布式会话是针对有状态服务的。
分布式会话的几种实现方式:
负载均衡策略的优劣和实现的难易程度是两个关键因素:负载均衡算法、网络系统状态的检测方式和能力。
rr轮询调度算法顾名思义,轮询分发请求。优点是实现简单,缺点是没有考虑每台服务器的处理能力。
wrr加权调度算法我们为每个服务器设置一个权重,负载平衡调度器根据权重来调度服务器。服务器被调用的次数和权重成正比。优点是考虑了服务器处理能力的差异。
sh原始地址哈希提取用户IP,根据哈希函数得到一个密钥,然后根据静态映射表找出对应的值,即目标服务器IP。如果单个目标机器过载,它将返回空。
dh目标地址哈希同上,但现在提取目标地址的IP进行哈希运算。优点是以上两种算法可以使同一个用户访问同一个服务器。
lc至少连接了优先将请求转发给连接较少的服务器。这样做的好处是集群中每台服务器的负载更加均匀。
wlc加权最小连接在lc的基础上,给每台服务器加上权重。算法为:(活动连接数*256+非活动连接数)÷权重,首先选择计算值较小的服务器。优点是可以根据服务器的容量来分配请求。
sed的最短预期延迟与sedwlc类似,不同之处在于不考虑非活动连接数。算法为:(活动连接数+1)*256÷权重,先选择计算值小的服务器。
nq从不排队为了改进sed算法,我们来考虑一下什么时候可以“永不排队”,也就是当服务器连接数为0时,那么如果有一个为0的服务器连接,均衡器会直接把请求转发给它,不需要sed计算。
基于位置的LBLC最小连接数根据请求的目的IP地址,均衡器找出其IP地址最近被使用过的服务器,并转发该请求。如果服务器过载,它采用最少连接数算法。
具有基于复制位置的最小连接的LBLCr根据请求的目的IP地址,均衡器找出最近使用的“服务器组”的IP地址。请注意,这不是一个特定的服务器,然后使用最少连接数算法从该组中挑选出一个特定的服务器并转发请求。
如果服务器过载,那么根据最小连接数算法,从集群中不在服务器组的服务器中找到一个服务器,加入服务器组,然后转发请求。
读写分离MySQL的主从配置,读写分离和中间件的引入,开源的MyCat,阿里的DRDS都是不错的选择。
如果对高可用性的要求比较高,但是没有相应的技术保障,建议使用阿里云的RDS或者Redis相关数据库,省工省钱。
全文检索如果有搜索业务需求,引入solr或者elasticsearch也是不错的选择。不要把所有东西都塞进关系数据库。
缓存优化引入缓存只是为了减轻后端数据库服务的压力,防止它们“罢工”。
常见的缓存服务包括Ehcache、OsCache、MemCache和Redis,它们都是主流缓存技术的成熟实现。特别是Redis在分布式集群服务中得到了广泛的应用,并证明了其优越的性能。
消息队列异步通知:如短信验证、邮件验证等非实时反馈逻辑 *** 作。
流量裁剪:应该是消息队列中常见的场景,一般广泛应用于秒杀或抢团活动中。
处理日志:系统中的日志必不可少,但是如何处理高并发的日志是个技术活,一不小心就可能碾压整个服务。
我们经常在工作中使用开源日志ELK。为什么我们要在中间加一个卡夫卡或者雷迪斯?就是这个原因(一群人涌进来和排队进去的区别)。
沟通方式:点对点沟通(人对人)或发布订阅模式(聊天室)。
日志服务消息队列中提到的ELK开源日志组件对于中小型创业公司来说是一个不错的选择。
安全优化以上所有,没有安全保障,一切都将是零:
Linux(必需),一些软件
02,负载平衡DNS、F5、LVS、Nginx、OpenResty、HAproxy、负载均衡SLB(阿里云)
03,分布式框架杜博、莫坦、春能
04,数据库中间件DRDS(阿里云)、Mycat、360Atlas、Cobar(未维护)
05,消息队列RabbitMQ、ZeroMQ、Redis、ActiveMQ、Kafka
06,注册中心动物园管理员、雷迪斯
07,缓存Redis、Oscache、Memcache、Ehcache
08,集成部署Docker、Jenkins、Git、Maven
09,存储OSS、NFS、FastDFS、MogileFS
10,数据库MySQL、Redis、MongoDB、PostgreSQL、Memcache、HBase
11、网络[/s2/]专用网VPC、灵活公网IP、CDN
作者:张志鹏
简介:资深Java爱好者,深耕在线教育领域。
资料来源:https://blog.52itstyle.com
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)