当前位置: 首页 > news >正文

小白科普:分布式和集群

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

1、分布式

 

小明的公司有3个系统: 系统A、系统B和系统C ,这三个系统所做的业务不同,被部署在3个独立的机器上运行, 他们之间互相调用(当然是跨域网络的), 通力合作完成公司的业务流程。

将不同的业务分布在不同的地方, 这就构成了一个分布式的系统,现在问题来了, 系统A是整个分布式系统的“脸面”, 用户直接访问,用户量访问大的时候要么是速度巨慢,要么直接挂掉, 怎么办? 

 

由于系统A只有一份, 所以会引起单点失败

 

2、集群(Cluster)

 

小明的公司不差钱,就多买几台机器吧, 小明把系统A一下子部署了好几份(例如下图的3个服务器),每一份都是系统A的一个实例, 对外提供同样的服务,这样能睡个安稳觉了,不怕其中一个坏掉了,我还有另外2个呢。  

 

这3个服务器上的系统就组成了一个集群

可是对用户来说,一下子出现这么系统A ,每个系统的IP地址都不一样,  到底访问哪一个? 

 

如果所有人都访问服务器1.1 ,那服务器1.1 会被累死, 剩下的三个闲死,成了浪费钱的摆设。

 

3、负载均衡(Load Balancer)

 

小明要尽可能的让3个机器上的系统A 工作均衡一些, 比如有3万个请求,那就让3个服务器各处理1万个(当然,这是理想状况), 这叫负载均衡。  

 

很明显,这个负载均衡的工作最好独立出来, 放到独立的服务器上 (例如Ngnix):

后来小明发现, 这个负载均衡的服务器虽然工作内容很简单,就是拿到请求,分发请求,但是它还是有可能挂掉啊, 单点失败还是会出现。

 

没办法,只好把负载均衡也搞成一个集群, 不过和系统A的集群有两点不同:

 

1.  这个新的集群中虽然有两个机器,但我们可以用某种办法,让这个集群对外只提供一个IP地址, 也就是说用户看到的好像只有一个机器

2. 同一时刻,我们只让一个负载均衡的机器工作, 另外一个原地待命。 如果工作的那个挂掉了,待命的那个就顶上去。

4、弹性

 

如果这3个系统A的实例还是满足不了大量的请求,那就再加服务器! 

 

双11来了,用户量是平时的10倍, 小明向领导申请费用又买了几十台服务器,一下子把系统A部署了几十份。  可是双11过后, 流量一下子降下来了,那几十个服务器用不上了,也变成了摆设!

 

被领导批评以后,小明决定尝试一下云计算,  在云端可以轻松的创建、删除虚拟的服务器, 那样就可以轻松地随着用户的请求动态的增减服务器了。  双11来了就创建虚拟服务器,等到双11过去了就把不用的关掉, 省得浪费钱。 

 

于是小明的系统具备了一定的弹性

 

5、失效转移

 

上面的系统看起来很美好,但是做了一个不切实际的假设: 所有的服务都是无状态的。 换句话说,假设用户的两次请求直接是没有关联的。

 

但是现实是,大部分服务都是有状态的, 例如购物车。

 

用户访问系统,在服务器1.1上创建了一个购物车,并向其中加入了几个商品, 然后 服务器1.1 挂掉了, 用户的后续访问就找不到服务器1.1了,这时候就要做失效转移,让另外几个服务器去接管、去处理用户的请求。

 

可是问题来了,在服务器1.2,1.3上有用户的购物车吗?  如果没有, 用户就会抱怨,我刚创建的购物车哪里去了?

 

还有更严重的,假设用户是在服务器1.1上登录的, 用户登录过的信息保存到了该服务器的session中, 现在这个服务器挂掉了, 用户的session自然也不见了,当用户被失效转移到其他服务器上的时候,其他服务器发现用户没有登录, 就把用户踢到了登录界面, 让用户再次登录!

 

状态, 状态,状态! 用户的登录信息,购物车等都是状态信息,  处理不好状态的问题,集群的威力就大打折扣,无法完成真正的失效转移, 甚至无法使用。

 

怎么办?  

 

一种办法是把状态信息在集群的各个服务器之间复制,让集群的各个服务器达成一致,  谁来干这个事情? 只能是像Websphere, Weblogic这样的应用服务器了。 

 

还有一种办法, 就是把状态信息集中存储在一个地方, 让集群的各个服务器都能访问到:

小明听说Redis 不错, 那就用Redis来保存吧 !

(完) Java架构交流群:860170416

 

转载于:https://my.oschina.net/u/3917490/blog/1934750

相关文章:

  • dubbo与springcloud初识
  • Android 5.1 预制输入法
  • Python游戏《外星人入侵》来了~
  • win10装双系统图文教程
  • 第10章神经网络基础
  • MpVue 致力打造H5与小程序的代码共用
  • 参加2018之江杯全球人工智能大赛 :视频识别问答(三)
  • 解决加载模型预测数据时报错的问题
  • java 颠倒整数
  • 【火炉炼AI】机器学习022-使用均值漂移聚类算法构建模型
  • Python从菜鸟到高手(5):数字
  • python中的None
  • eclipse 执行自带的maven命令无效
  • 【转载三】Grafana系列教程–Grafana的配置及运行
  • mysql 通过备份和binlog恢复数据
  • 【5+】跨webview多页面 触发事件(二)
  • AngularJS指令开发(1)——参数详解
  • js面向对象
  • laravel 用artisan创建自己的模板
  • leetcode46 Permutation 排列组合
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • PHP CLI应用的调试原理
  • Sublime text 3 3103 注册码
  • Vue.js 移动端适配之 vw 解决方案
  • vue:响应原理
  • vue的全局变量和全局拦截请求器
  • 给第三方使用接口的 URL 签名实现
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 嵌入式文件系统
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 源码安装memcached和php memcache扩展
  • 怎么把视频里的音乐提取出来
  • Java总结 - String - 这篇请使劲喷我
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 如何在招聘中考核.NET架构师
  • #{}和${}的区别是什么 -- java面试
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #在 README.md 中生成项目目录结构
  • (12)Linux 常见的三种进程状态
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (原)本想说脏话,奈何已放下
  • (转)程序员疫苗:代码注入
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .htaccess配置常用技巧
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET MVC第三章、三种传值方式
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @property @synthesize @dynamic 及相关属性作用探究
  • @Transaction注解失效的几种场景(附有示例代码)
  • @Validated和@Valid校验参数区别