热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习分布式架构感悟

2019独角兽企业重金招聘Python工程师标准随着公司业务规模的扩大,网站访问量日益剧增,最初的系统架构可能已经没办法满足业务发展的需求了。这时

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

随着公司业务规模的扩大,网站访问量日益剧增,最初的系统架构可能已经没办法满足业务发展的需求了。这时候就要考虑将系统架构改造成扩展性更强,能够承受更大访问量的分布式架构。

本文从大致三个方面谈谈分布式架构的概念、原理和相关的解决方案。为什么要做分布式?举个栗子,就好比原来城市的道路是双车道,同一时间只能容纳很小一部分车流量,但是改成多车道后,道路的容量就提升了几倍,网站也是相同的道理,用户的访问请求就是汽车,分布式架构就是在构建一个多车道的网站系统。接下来我们具体聊一聊各个层面的分布式技术解决方案。首先讲业务层的分布式,最简单的就是部署几台业务服务器,部署Apache或者Nginx,配置相同(vhost、域名解析、代码目录等),然后使用负载均衡技术将这几台服务器组成集群,达到对用户分流的效果。需要注意的是SESSION会话需要保存到数据库或者缓存系统中,保证SESSION的一致性,至于数据库,有统一的数据层,不需要担心数据不一致的问题。负载均衡有很多种解决方案,比较常见的是LVS(阿里巴巴章文嵩博士开发)、Nginx(阿里巴巴优化的Tengine)、HAProxy等。LVS是负责在4层网络实现负载均衡,有DR、隧道等方式,可以根据自身需求选择合适的方式。Nginx和HAProxy是负责7层网络的负载均衡,可以和LVS配合组成一套覆盖4层和7层网络的负载均衡解决方案。当然还可以配合Keepalived和Heartbeat等技术实现对后端业务服务器的健康检查,对出现故障的服务器,可以及时从集群中剔除,保证整个系统的高可用。如果还是不能满足流量的需求,还可以考虑在业务层的负载均衡之前再部署一套代理缓存服务器(Varnish、Squid等),代理缓存服务器也可以实现负载均衡,方法与业务服务器相同。

接下来谈谈服务层的分布式,与服务层相关的技术也有很多,比如SOA、Docker、Webservice、RPC、SOAP、消息队列(ActiveMQ、RabbitMQ、ZeroMQ、Kafka、Redis等)等,实现服务层的目的是降低系统的耦合度,便于扩展和维护,在必要时还可以降级提供服务,保证系统的高可用,提高系统的可靠性。目前比较流行的是Docker技术,许多互联网大厂,例如阿里巴巴、新浪云、网易云、灵雀云等都推出了基于Docker的云服务,没有推出Docker服务的也都在研发或者计划研发。网上关于Docker实现微服务的技术文章也有很多(Mesos、Kubernetes等),这里就不在赘述了。这些服务层技术都有各自内置的分布式解决方案可供选择,这里就不在详细展开论述了。

最后谈谈数据层的分布式,数据库可以简单地分为关系型数据库(SQL型)和非关系型数据库(NoSQL型)。最常用的关系型数据库是MySQL。MySQL的分布式技术有主从复制、分库分表等等。数据库的主从就是部署一台主数据库和若干台从数据库(具体数量可以根据业务需求决定),从数据库利用主数据库的bin日志同步数据,主数据库可以提供读写服务,从数据库只提供读的服务。但是,主从并不能缓解数据库的写入压力,可以采用分库分表的技术。分库指将数据库拆分几个小数据库(根据业务模块划分,比如订单模块、评论模块、购物车模块等),当然业务层也需要配合做调整才行。分表就更复杂一些,要对数据表做水平拆分,比如会员表member有id、name、age、mobile、sex等字段,比如可以拆分成member1(id、name、age)和member2(id、mobile、sex),当然拆分方式和数量也需要根据实际的业务需求决定。由于数据表的拆分,会使业务层的逻辑变得十分复杂,因此一般采用MySQL分布式代理中间件,来完成对查询语句的适配,降低业务层的复杂度。比如Corbar是阿里巴巴开源的兼容MySQL协议的分布式数据库中间件,但是遇到join、group等查询时不能实现跨表。除此以外,也可以采用同城双活、异地多活等技术实现容灾备份。除了MySQL,还有MongoDB、Redis、Memcache等非关系型数据库。MongoDB有内置的分布式解决方案,比如主从(不推荐)、sharding和副本集,主副本集挂了,会自动选举新的主福本集,可以通过设置W和J参数保证数据的一致性和完整性。Redis本身也有内置的主从方案,类似MySQL的主从,也有豌豆荚公司开源的Codis数据库中间件,可以根据需要选用。Memcache本身不支持分布式,但是可以通过一些中间件,比如PHP的Memcached扩展(与Memcache扩展不同),或者自己用一致性hash算法实现。

除了后端的分布式技术,还有与前端相关的单个CDN、对象存储、块存储、多CDN等等技术。涉及到大数据,还有Hadoop、HDFS、Spark、Storm等技术的分布式解决方案。

总结一下,没有最完美的分布式结构,架构设计必须从业务需求出发,逐步演进,不断调整。但是遵循一些经验规律,可以为今后的扩展打下坚实的基础。在必要时可以选用云服务来降低架构实现的难度,也可以省去一部分研发和运维成本,专注于自己的核心业务系统的研发。最后声明,本人水平有限,请勿吐槽,如有建议,欢迎交流,如有雷同,纯属巧合。


转:https://my.oschina.net/u/2307114/blog/650320



推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • Nginx不仅是一款轻量级的高性能Web服务器,还具备出色的负载均衡和反向代理功能。它支持复杂的正则匹配规则、动静内容分离以及灵活的URL重写功能,使得配置和管理更加便捷高效。此外,Nginx提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,以满足不同应用场景的需求。 ... [详细]
  • 本指南详细介绍了如何利用华为云对象存储服务构建视频点播(VoD)平台。通过结合开源技术如Ceph、WordPress、PHP和Nginx,用户可以高效地实现数据存储、内容管理和网站搭建。主要内容涵盖华为云对象存储系统的配置步骤、性能优化及安全设置,为开发者提供全面的技术支持。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 本文深入探讨了使用Puppet进行软件包分发与管理的方法。首先介绍了fpm这一跨平台的软件包制作工具,其简便的操作流程使得软件包的创建变得轻松快捷。fpm的项目地址为:https://github.com/jordansissel/fpm。通过结合Puppet和fpm,可以实现高效、可靠的软件包管理和部署。 ... [详细]
author-avatar
郝蕾雅老_206
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有