文档章节

学习分布式架构感悟

luoxiaojun1992
 luoxiaojun1992
发布于 2016/03/17 20:34
字数 1723
阅读 2216
收藏 173
点赞 8
评论 13

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

本文从大致三个方面谈谈分布式架构的概念、原理和相关的解决方案。为什么要做分布式?举个栗子,就好比原来城市的道路是双车道,同一时间只能容纳很小一部分车流量,但是改成多车道后,道路的容量就提升了几倍,网站也是相同的道理,用户的访问请求就是汽车,分布式架构就是在构建一个多车道的网站系统。接下来我们具体聊一聊各个层面的分布式技术解决方案。首先讲业务层的分布式,最简单的就是部署几台业务服务器,部署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分布式代理中间件,来完成对查询语句的适配,降低业务层的复杂度。比如Cobar是阿里巴巴开源的兼容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等技术的分布式解决方案。

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

 

© 著作权归作者所有

共有 人打赏支持
luoxiaojun1992
粉丝 9
博文 12
码字总数 7835
作品 0
后端工程师
加载中

评论(13)

luoxiaojun1992
luoxiaojun1992

引用来自“ivxivx1234”的评论

按列的拆分是垂直拆分
多谢,已更正!
i
ivxivx1234
按列的拆分是垂直拆分
ericsoul
ericsoul
多车道的距离不够贴切,加油站,收费站等都比多车道的举例要好
commonum
commonum
牛逼逼!
51pansou
51pansou
写的赞
小虫0302
小虫0302

引用来自“DavidWho”的评论

79说得很清晰,不涉及具体业务的架构思想,验证了很多自己的想法
haha
zcoder
zcoder
感谢分享 赞一个
tomener
tomener
写的深入点更好
baozhuni
baozhuni
空谈误国,实干兴邦
GuoYJ
GuoYJ
普及了很多知识79
学习分布式架构感悟

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

问题达人 ⋅ 2016/03/31 ⋅ 0

【Web 渗透】【机器学习】【知识付费】【接口设计】| Chat · 预告

1 Web 渗透测试入门 作者简介: Mr.time,从事信息安全相关工作多年,长期进行风险评估、等保测评、渗透测试等项目的实施,有丰富的实战经验。 专注于研究web安全、熟知常见Web安全漏洞;目前...

gitchat ⋅ 2017/11/30 ⋅ 0

干货系列1:Java互联网网站开发工程师 的技术提高与晋升路线(技术专精)

前几天写了自己对于Java软件开发工程师职业发展规划方面的一些感悟,陆续收到一些反馈,希望我能再就Java工程师不同的开发(职责)方向谈谈职业发展问题。(上一篇:Java软件开发工程师的自我...

半饱即好 ⋅ 2014/05/13 ⋅ 0

大型网站架构系列:20本技术书籍推荐

学习是技术人员成长的基础,本次分享20本技术方面的书籍,这些书不是每一本都是经典,但是每一本都有其特点。以下20本大部分本人都看过,因此推荐给大家。(本次推荐的20本只是一个参考,比如...

xumaojun ⋅ 05/03 ⋅ 0

【文末福利】2018年如何利用碎片化学习?

2017已经远去,也许,在忙碌中劳累了自己;也许,在追逐中迷失了自己;也许,在无聊中,打发了自己。但是,这一切都不要在意,2018年接着给力! 工欲善其事,必先利其器。作为软件开发、架构...

j3t9z7h ⋅ 01/06 ⋅ 0

架构编译器的感悟

这所谓的编译器就是将c语言代码编译为机器代码的,先将C编译为汇编代码,再由汇编器将汇编代码编译为机器代码,CPU执行的是机器代码 突然发觉好像很多书都这么说,很多人也这么说,于是很自然...

xyh12344 ⋅ 2015/12/12 ⋅ 0

学习Java和Spring Boot Cloud ,不妨看看这个

专注于编程、互联网动态。最终将总结的技术、心得、经验(数据结构与算法、源码分析等)分享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经。 1 java版web项目 java版web项目,...

b644rofp20z37485o35m ⋅ 05/04 ⋅ 0

市场是衡量一切的标准

“少年不知愁滋味,为赋新词强说愁,而今识愁滋味,却道天凉好个秋!”,这就是我对这些年我职业发展的比较贴近的比喻。 遥想当年,年少轻狂的我,凭借自己学习来的一些技术皮毛,一直标榜是...

边缘行者 ⋅ 2015/11/30 ⋅ 0

【转】构建可扩展的微博架构(qcon beijing 2010演讲) by Tim Yang

在使用Twitter几年的时间里面,经常思考微博如何更好的实现,恰好最近几个月也参与了相关工作,大部分都是工程实践,总结实践会促生更具实际价值的理论。因此在QCon Beijing 2010这次演讲参考...

wanghhao ⋅ 2015/09/07 ⋅ 0

什么是hadoop大数据?我又为什么要写这篇文章?

点击链接 https://my.oschina.net/ijj/blog 关注我的博客。学习更多hadoop知识。 这些天,有很多人咨询我大数据相关的一些信息,觉得大数据再未来会是一个朝阳行业,希望能尽早学会、入行,借...

隐姓埋名啊 ⋅ 2017/03/16 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部