分布式系统的架构思路

见:http://www.cnblogs.com/chulung/p/5653135.html


一、前言

在计算机领域,当单机性能达到瓶颈时,有两种方式可以解决性能问题,一是堆硬件,进一步提升配置,二是分布式,水平扩展。当然,两者都是一样的烧钱。
今天聊聊我所理解的分布式系统的架构思路。


二、分布式系统的两种方式

平时接触到的分布式系统有很多种,比如分布式文件系统,分布式数据库,分布式WebService,分布式计算等等,面向的情景不同,但分布式的思路是否是一样的呢?

1.简单的例子

假设我们有一台服务器,它可以承担1百万/秒的请求,这个请求可以的是通过http访问网页,通过tcp下载文件,jdbc执行sql,RPC调用接口…,现在我们有一条数据的请求是2百万/秒,很显然服务器hold不住了,会各种拒绝访问,甚至崩溃,宕机,怎么办呢。一台机器解决不了的问题,那就两台。所以我们加一台机器,每台承担1百万。如果请求继续增加呢,两台解决不了的问题,那就三台呗。这种方式我们称之为水平扩展。如何实现请求的平均分配便是负载均衡了。

另一个栗子,我们现在有两个数据请求,数据1 90万,数据2 80万,上面那台机器也hold不住,我们加一台机器来负载均衡一下,每台机器处理45万数据1和40万数据2,但是平分太麻烦,不如一台处理数据1,一台处理数据2,同样能解决问题,这种方式我们称之为垂直拆分

水平扩展垂直拆分是分布式架构的两种思路,但并不是一个二选一的问题,更多的是兼并合用。下面介绍一个实际的场景。这也是许多互联网的公司架构思路。

2.实际的例子

我此时所在的公司的计算机系统很庞大,自然是一个整的分布式系统,为了方便组织管理,公司将整个技术部按业务和平台拆分为部门,订单的,会员的,商家的等等,每个部门有自己的web服务器集群,数据库服务器集群,通过同一个网站访问的链接可能来自于不同的服务器和数据库,对网站及底层对数据库的访问被分配到了不同的服务器集群,这个便是典型的按业务做的垂直拆分,每个部门的服务器在hold不住时,会有弹性的扩展,这便是水平扩展

在数据库层,有些表非常大,数据量在亿级,如果只是纯粹的水平的扩展并不一定最好,如果对表进行拆分,比如可以按用户id进行水平拆表,通过对id取模的方式,将用户划分到多张表中,同时这些表也可以处在不同的服务器。按业务的垂直拆库和按用户水平拆表是分布式数据库中通用的解决方案。


三、负载均衡

前面我们谈到了分布式来解决性能问题,但其附带的问题是怎么分布,即如何负载均衡。这里要解决的问题是当客户端请求时,应该让它请求分布式系统中哪一台服务器,通常的做法是通过一台中间服务器来给客服端分配目标服务器。

这里同样拿两个不同的分布式系统做说明,下图左边是分布式文件系统FastDFS,右边是一个用于分布式的RPC中间件。

  • FastDFS的一次文件下载请求过程是这样的
    1.client询问tracker可以下载指定文件的storage;
    2.tracker返回一台可用的storage;
    3.client直接和storage通信完成文件下载。

其中tracker便是负载均衡服务器,storage是存储文件和处理上传下载请求的服务器。

  • 而另一个RPC中间件Hedwig也是类似的
    1.client询问zookeeper哪台server可以执行请求;
    2.zookeeper返回一台可用server;
    3.client直接与service完成一次RPC。

zookeeper是分布式系统中一个负载均衡框架,google的chubby的一个开源实现,是是Hadoop和Hbase的重要组件。

同样的在http中,常听说的nginx也是一个负载均衡服务器,它面向的是分布式web服务器。至于具体的负载均衡算法轮询,hash等这里就不深入了。


四、同步

分布式系统中,解决了负载均衡的问题后,另外一个问题就是数据的一致性了,这个就需要通过同步来保障。根据不同的场景和需求,同步的方式也是有选择的。

在分布式文件系统中,比如商品页面的图片,如果进行了修改,同步要求并不高,就算有数秒甚至数分钟的延迟都是可以接受的,因为一般不会产生损失性的影响,因此可以简单的通过文件修改的时间戳,隔一定时间扫描同步一次,可以牺牲一致性来提高效率。

但银行中的分布式数据库就不一样了,一丁点不同步就是无法接受的,甚至可以通过加锁等牺牲性能的方式来保障完全的一致。

在一致性算法中paxos算法是公认的最好的算法,chubby、zookeeper中paxos是它保证一致性的核心。


五、结语

接触过这么多分布式系统后发现,它们的设计思路是如此的相似,这或许就是万法归一吧。

扩展阅读

  • 1号店订单系统水平分库的实践之路以及关键步骤
  • 负载均衡调度算法大全
  • 分布式系统Paxos算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

狂赌智能手机 中国互联网巨头深陷零利润困局

编者按:智能手机正在中国普及,互联网企业趋之若鹜。然而,在苹果、三星共享智能手机市场99%利润的大背景下,中国互联网企业要从所剩无几的利润空间里分一杯羹,注定备受煎熬,前路迷茫。 互联网巨头纷纷进入智…

占用较多堆外内存的区域

(1)Director Memory 主要在nio中会使用,在内存不足时会抛出OOM或者OOM:Direct buffer memory。 (2)线程堆栈 为每个线程分配的栈空间,用于保存局部变量,执行程序代码。内存不足时可能抛出StackO…

Oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

在Oracle中select into from不可以使用,用create table select代替该功能!!!在Sql Server中可以正常使用。1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from…

帆软地址栏传参,实例

自动查询: http://help.finereport.com/finereport9.0/doc-view-409.html参数的种类与区别: http://help.finereport.com/doc-view-156基本参数传递(视频): http://bbs.fanruan.com/lesson-14.html超级链接-传递多个值…

RMI 说明

见:https://baike.baidu.com/item/RMI/1786244?fraladdin RMI远程方法调用 相关概述 RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说&…

李善友:为什么外企人不敢创业

摘要:20年前,人们最骄傲的是进外企,创业意味着找不到工作。而现在相反,你要说自己在外企工作,会被人笑话,令人激动的事儿是去创业。 李善友:中欧创业中心主任创业学兼任教授、酷6网创始人 孙陶然…

JVM对象占用内存计算

大家都知道,jvm中对象实例存储在堆中,对象的引用存储在栈中,而对象的元数据(类型数据)存储在方法区。在我们进行内存优化的过程中经常需要了解每个对象占用的内存大小。接下来我将介绍对象占用内存大小的计算方式。 Java的对象模型 java是面…

绘图基础语法与常用参数

1 # -*- coding: utf-8 -*-2 3 ###############################################################################4 ####################### 正文代码 #######################5 #################################################################…

MyEclipse 皮肤、主题、背景色

第一步:打开myeclipse--->help--->install from site--->Add将路径粘贴在这里。等待安装颜色主题。https://raw.github.com/guari/eclipse-ui-theme/master/com.github.eclipseuitheme.themes.updatesite 第二步:http://eclipsecolorthemes.org…

RPC 远程过程调用协议

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携…

周鸿祎:创业前的积累很重要

摘要:虽然公司上市,也投资了很多公司,日前,在中国人民大学的演讲中,周鸿祎却称自己“从来不是一个成功人士,曾经是一个最大的失败者”。 360特供机还没露面,已经被周鸿祎通过微博炒得火热&#…

BZOJ 4710 [Jsoi2011]分特产 解题报告

4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同。将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方案数。 先考虑两个简单的问题 给定\(m\)个相同元素和\…

java接口调试思想

对于接口调试的理解:最近多次参与接口调试工作,一般情况都是获取对方接口文档,文档中有加密验证方式,根据加密验证方式开发,调用对应的接口。可以不可以简化这个流程那,至少减少一方的工作量。1、减少调用方…

SOA (面向服务的架构)

见:https://baike.baidu.com/item/SOA/2140650?fraladdin UDDI 解说参见:UDDI是什么 SOAP解说参见: SOAP:简单对象访问协议 面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称…

mysql中count(*)和count(1)和count(column)区别

在日常的mysql使用中,我们经常会看到SELECT COUNT(*)、SELECT COUNT(1)等查询语句,他们到底有什么区别呢?今天我就来总结下。 我们先从函数的含义说起: count() 统计满足查询条件的结果集的总行数(包含null),其中count…

第一天笔记

编程语言分类: 1. 机器语言:用二进制指令编程,本质是直接操作硬件。 优点:执行效率高 缺点:开发效率低,学习难度高 2.汇编语言:用英文标签代替二进制指令,本质也是直接操作硬件。…

索尼MOTO等压榨国内代工厂:员工宿舍像监狱

摘要:据调查报告披露,伟易达血汗工厂的压榨情况比起富士康、苹果等有过之而无不及,包括强迫工人超负荷工作、暴露于有害化学物质、住宿环境差、虐待员工、超低的工资等。如前面保罗克鲁格曼发表了《表扬廉价劳动》一文,N.D.克里斯…

[cerc2012][Gym100624B]20181013

转载于:https://www.cnblogs.com/KonjakJuruo/p/9809637.html

Nginx服务器证书部署-亚洲诚信

Nginx服务器证书部署发布时间:2018-01-17 16:15:25依赖建议l SSL卸载驱动。建议:openssl版本1.1.0f。l nginx版本Stable version:最新稳定版,生产环境上建议使用的版本。获取证书MPKI方式:1. 登录https://mpki.tru…

java transient关键字

transient是用在序列化中的。当我们序列化的过程中,如果我们不想序列化某个字段,那么我们就可以使用这个关键字,jvm就会在序列化的时候自动忽略这个字段的数值。 transient主要有两个用途: 1.保证数据的安全。在进行序列化时&…