所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

Java分布式架构可以把所有项目部署到一台机器上吗?

发布时间:2020-04-15 16:14:35

资讯分类:分布式  java  架构  机器  常开  物理  阳泉
Java分布式架构可以把所有项目部署到一台机器上吗?

在讲原理之前,先分享一个发生在BAT的故事来回答这个问题吧。

上海-北京-阳泉的我们

我曾经参与开发过一个公司级别的平台,使用的是1台Nginx,4台Tomcat,主从MySQL以及1个Redis服务。

其中1台Nginx,2台Tomcat和1个Redis部署在了同一台虚拟物理机上。

当雪崩没有发生之前,大家都是岁月静好的模样,让人误以为这就是它原本温柔的本性。

直到某一天,突然这台物理机抽风了,具体表现为Redis无法请求,机器所在的域名地址无法访问,secureCRT直接无法登陆,想要重启都不行。

大家突然慌了。

这时候,还好我们有一台常开的机器上的secureCRT常连接了这个虚拟物理机。

我们先是通过这个常开机器,重启了Nginx与Redis,服务短暂的恢复了。

但是5min后,服务再次崩溃。

重复了3次“崩溃-重启”之后,常开机器上的secureCRT直接断开了与那台虚拟物理机的连接。

整个过程持续了超过半小时,用户群里炸开了锅,从他们的角度来看,我们的服务不是断断续续的工作,而是完全挂掉了,经理也直接介入,询问原因,并且确认这是一次先说最高级事故。

这期间,我们火速联系了虚拟资源管理员,管理员在排查后表示是该资源所在的物理机器出了问题。

在上海的我们询问在北京的管理员,可否重启那台物理机,管理员说可以,但是机器在山西阳泉,需要联系当地的运维人员。

欲哭无泪,大概就是我们当时的状态,随后就是,听天由命。

这次线上事故最后紧急处理方法是请求了阳泉运维人员的干预,物理机状态恢复后,我们的服务也恢复了。

与其亡羊补牢,不如未雨绸缪

虽然物理机恢复了,但是这次事故给我们所有同事都敲响了警钟。

虽然从技术上是没有问题的,但是鸡蛋不能放在同一个篮子里,没有人能承担鸡蛋都摔碎的风险。

我们在case study中重新分析了当前架构,对每个重要节点都重新进行了分析,并推演了所有场景,保证不会由于单个节点挂掉而影响全局服务。


分布式架构除了为了增加服务的吞吐量,保证服务可用性也是它的重点目标。

因此,基于我的个人经验,强烈建议不要将分布式服务部署在一个节点上。

不仅不要部署在一个节点上,每个模块都要做好备份。

比如多个Tomcat要部署在不同机器上,Redis的master-slave也要分散在不同机器上,要每天对MySQL进行重点数据和表结构的备份等等。

毕竟在安全面前,再多的冗余都不是多余。

以上就是我的回答,如果能够给你带来一点知识,希望能留个赞呀。

或者如果你也有类似的经历,欢迎给我留言交流。

我是苏苏思量,头像是本人,来自BAT的java开发工程师,经常分享科技类见闻,欢迎关注我,一起在这里徜徉。

Java分布式架构可以把所有项目部署到一台机器上吗?

您好,您可能没有理解什么叫分布式

分布式系统架构是建立在网络之上的软件系统。

内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统。

透明性是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。

在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。

简单来讲:在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。

分布式系统作为一个整体对用户提供服务,而整个系统的内部的协作用户来说是透明的,用户就像是在使用一个MySQL一样。

如分布式MySQL中间件-Mycat,来处理大并发大数据量的构架。

分布式架构的应用

有 分布式文件系统,分布式缓存系统,分布式数据库,分布式WebService,分布式计算

我们来举例说明:

分布式文件系统: 出名的有 Hadoop 的HDFS ,还有 google的 GFS , 淘宝的 TFS 等

分布式缓存系统:memcache , hbase , mongdb 等

分布式数据库 : MySQL , Mariadb, PostgreSQL 等

以分布式MySQL数据库中间件MyCat 为例子,

MySQL 在现在电商以及互联网公司的应用非常多,一个是因为他的免费开源,另外一个原因是因为分布式系统

的水平可扩展性,随着移动互联网用户的暴增,互联网公司,像淘宝,天猫,唯品会等电商都采用分布式系统应对

用户的高并发量以及大数据量的存储。

而在Mycat的商业案例中,有对中国移动的账单结算项目中,应用实时处理高峰期每天2亿的数据量,

在对物联网的项目中,实现处理高达26亿的数据量,并提供实时查询的接口。

通过对MyCat的学习,加深分布式系统架构的理解,

以及分布式相关的技术,分布式一致性ZooKeeper服务, 高可用HAProxy/keepalived等相关应用。

1> 集群 与 分布式

2> 负载均衡

3> 分布式相关的高可用、容灾等名词解释

4> Mycat 中间件学习










Java分布式架构可以把所有项目部署到一台机器上吗?

谢邀~

技术上可行,但是架构上不建议。

技术上可行

几种部署方式,第一个不太建议,后两种方案都还可以:

  • 直接部署,不同的软件、中间件占用不同的端口:例如数据库Mysql占用3306端口,多套不同的程序使用Tomcat部署,占用不同的端口,或者使用Spring Boot的话,启动时候指定不同的端口;相同的应用前面挂一个负载均衡,或者直接安装注册中心到这台机器上。其余用到的软件,也一窝蜂的安装在同一台机器上。

  • 虚拟化:使用虚拟化技术,将一台物理机,虚拟成多台虚拟机,然后分别在每个虚拟机中,安装不同的软件、中间件,最终完成部署,彼此相互隔离。

  • 容器技术:比如Docker;和虚拟化类似(详情参考我的另一个回答:《docker容器与虚拟机有什么区别?》),容器技术更轻量级、更容易部署和移植、并且可以弹性伸缩;相同配置的服务器,部署容器的数量会比虚拟机多很多。

架构上不建议

主要出于两方面的考虑:

  • 首先是资源方面的考虑,如果所有项目都部署在一台机器上,那么单机的资源配置可能会是瓶颈。

  • 第二,单机意味着单点,单点很危险,如果这台物理机器出现了故障,那么所有项目就都挂了;所以很多公司都会采用多机器、多机房、甚至多地多中心。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

Java分布式架构可以把所有项目部署到一台机器上吗?

可以,但是不推荐

分布式的目的是分工合作,提高系统的整体可用性

假设一个系统S,拆分为s1,s2,s3。如果s1挂了,那可能s1负责的功能无法使用,s2,s3负责的功能还是能使用的。比如2018年双11,淘宝的地址服务挂了,买家无法修改收货地址。但是并不影响下单。

假设s1,s2,s3部署在一台机器上,会降低整体可用性!如果只是单纯的s1,s2,s3挂了,只会影响部分功能,但是如果这台机器挂了,那整个系统就都挂了。

如果s1,s2,s3部署在不同的机器上,那么其中一台机器挂了,也不会导致系统整体不可用。

Java分布式架构可以把所有项目部署到一台机器上吗?

简单直接回答下: 可以部署到一台机器上。

分布式架构本质上是多子系统协作完成某一用户功能,往往是为了架构清晰,方便扩展和管理,自己提高服务能力。

部署到一台机器上,可用于在机器资源不足的情况下进行测试,没有问题。

生产环境中,建议部署到不同机器上,我们往往是分布式+集群部署,同时满足提高服务能力+高可用需求。

Java分布式架构可以把所有项目部署到一台机器上吗?

当然可以了,不然我的两个mysql服务主从复制,读写分离,nginx+两个SpringCloud微服务应用怎么部署?



废话不多说,先来看看我的mysql主从复制+读写分离怎么搭建在一台机器上的。。

1,windows下载boot2docker软件,安装注册之后,使用boot2docker ssh开启docker服务;

2,拉取mysql镜像,分别以端口3006,3008端口进行两个服务的启动,脚本类似这个:docker run --name mysql1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql,

3,使用下载boot2docker自带的oracle VM VirtualBox将3008,3006端口暴露,这样两个mysql服务就可以提供使用了;

4,配置主从复制+读写分离(自行百度)!

可以看到,我的windows下面的docker镜像有mysql,redis,nginx,zookeeper等等,我运行项目的时候,全部确实都可以运行在我的一台机器上,所有的服务确实是“分布”的;也就是说分布式架构的所有服务可以全部部署到一台服务器上;

我们可以这么做分布式架构,但是计算机不允许。。运行那么多的服务,基本每个服务都要卡成狗了!

分布式系统之所以需要就是因为单机系统成为了高性能,高稳定性,高持续性的瓶颈!

再来看下分布式的好处:

1,服务拆分 :分布式系统可以将服务拆分为多个独立模块,独自进行开发和部署,而对外作为一个整体来输出,单机服务的每次发布都会影响线上环境!

2,容灾: 一台机器很容易受到环境干扰出现宕机等情况,如果数据没有进行备份,那么极有可能造成极为严重的事故,所以使用分布式数据集群可以进行数据备份容灾!

3,持续稳定: 多个服务组成的集群可以在单点挂了之后还能持续对外提供服务,如果是单机系统则无法保证!

4,提高运算(吞吐)能力:现在的大数据通常都是使用分布式系统,将运算部署在多达几千台的机器上,进行并行运算,大大的提高了整体的运算性能!


综上,如果你的单机能保证超高的稳定性,永不宕机,运算能力比别人家几千台还厉害,那么就使用单机,否则还是接入分布式吧!

经常使用docker环境在本地模拟分布式环境,还是蛮好玩的,我也经常分享JAVA相关的技术,有需要的朋友,敬请关注。。

Java分布式架构可以把所有项目部署到一台机器上吗?

从这个问题本身来讲,将分布式架构部署在同一台机器上是可以的,具体怎么部署和原理大家已经说了很多。

但是,部署在一台机器上的分布式架构业界称它为伪(假的,模拟的)分布式。它在测试阶段有比较大的应用(比如手工停掉某些服务,看整体对外服务是否依然符合预期),因为单机结构依赖资源少,便于操作,可快速找出分布式架构中80%的问题,剩余20%就需要通过真正的分布式环境甚至是生产环境来找出了(二八理论)。

真正的分布式架构不只包括软件层面(软件分布,业务分布),更包括了硬件层面(机器分布,机器资源分布,地区分布…)。软硬件结合的分布式才是真正的分布式架构。这也是现代互联网企业打开的方式:业务分布、组件分布分布、机器分布、机架分布、机房分布、区域分布(城市、省、国家)。

光谈软件架构本身的分布只是分布式架构的一部分(可类比为它是理论,实际落地没有硬件的支持只能成为空中楼阁)。

什么是分布式架构?

从字面语义来讲,它是指采用分而治之思想构建的一种架子结构(架构一词起源于建筑)。建筑本身是不能脱离环境存在的。建筑抽象为软件,环境指的就是硬件了。

从解决问题的角度来说,分布式架构是指通过在软件层面和硬件层面进行分布式设计和部署的一种结构构建方式。它的提出是为解决例如如下的一些核心问题:

1、软件解耦:通过业务划分、服务划分、组件划分等方式,达成局部可灵活变更(替换、扩展、升级等),而整体对外服务能够保持正常(即外部使用者无感知或感知小)。比如现在支付宝、微信、华为等服务,他们在变更迭代的时候我们基本是无感的。

2、容灾:基于任何一个事物无法永远一直保持一种状态的认知(固定是临时的,变化是永恒的)。任何事物都有两面性,当事物处于对我们有利的一面时未正常态,当它处于对我们不利的一面为异常态(注意,事物无好坏,但人是有立场的,观察认知是有角度的)。因此,如何尽量确保从我们的角度尽量保持对外服务的稳定性、一致性,这是分布式架构需要面对的核心问题。分布式架构是降低灾难发生的一种有效的方式(局部问题可能是随时随地发生的,但整体崩溃性灾难的发生比率可以被大大降低)。当然,因为资源的有限性这个前提,所以任何方式都不能确保100%不会发生对我们不利的影响。只是时间、空间的局限不同而已。所以,云企业也只敢声称它们可做到多少个9的稳定度,努力去让稳定度趋近于100%。若有人拍着胸脯告诉你他能百分百保证,那他一定是忽悠,还请尽快远离吧哈哈?

3、服务能力:包括性能提升、容量动态扩展…等等。对于用户来讲:他能获得越来越好、越来越多的服务;对于服务者来说:有越来越多的能力,获得越来越大的竞争力;从而在某种程度上达到双赢或多赢等效果。

还有很多分布式架构需要解决的问题,就不一一列举了。

回头来看,若将分布式架构部署在单台机器上,那么它很难面对这些问题。单点面临的问题,通过分布的方式去解决是一种自然、符合惯性的想法;实践中分布式架构思维也已经过了无数检验,已证明是解决单点问题的极其有效的方式。

从数学上的概率论,我们可知当节点越多,分布越合理,灾难就越不容易同时发生:比如同时宕机、同时断掉、同时断网等情况的可能性就被大大降低,从而可以大大提高对外服务的可用性、稳定性和高效等。对于服务来讲,这些是核心评估指标。

分布是单点的一种反义词表述(单—多、分布),它是多的一种实现。分布式架构是建立在将多进行有机(有效)整合的一种结构和方法。它是结果导向思维下形成的、已经被证明行之有效的方法论。从历史与现状来看,它已经起到了巨大作用。

因此,将分布式架构部署到一台机器上可以,只是这就像将一个有巨大能力的人用层层绳索把它捆绑在一个狭窄的地方,它也就丧失了绝大部分能力了。

一家之言,与大家分享

Java分布式架构可以把所有项目部署到一台机器上吗?

只要CPU核够多,内存够大,磁盘够足,,完全可以。。。

但是,(肯定会有但是的),你肯定会被io不足搞死的。(网络io和磁盘io)

Java分布式架构可以把所有项目部署到一台机器上吗?

我想楼主是想在一台机子上模拟部署一下分布式架构,答案是可以的。

方案一: 开好多台虚拟机,这样就可以当好多台机部署

方案二: 用docket代替方案一的VM,这样资源占用可以少很多

方案三: 用minikube在单机模拟k8s集群进行分布式部署,操作和真正的k8s集群基本没区别

当然,单机的cpu和内存要尽量高点

Java分布式架构可以把所有项目部署到一台机器上吗?

如果只是自己学习分布式搭建,或开发环境自测简单的业务功能实现是完全可以的。

分布式环境中间的网络节点可以在公网,内网,本机,只要节点间能通信。

在一些业务量还不高的分布式系统线上环境也会有单机多节点的部署情况。

单机多节点部署:

1.不同节点端口不同,如dubbo_provider,tomcat,jeety,undertow等所有容器都可指定固定通信端口。

2.装虚拟机,每个虚拟机上一套应用,每台虚拟机一个ip通信

缺点:应用安装繁琐,管理不便,会分散很多精力在环境问题上。

3.这几年流行的做法:docker+k8s,

优点:应用镜像安装一个pull搞定,资源率比虚拟机高n倍,甚至能在别人的镜像仓库找到现有的分布式demo;强烈建议了解一下

Java分布式架构可以把所有项目部署到一台机器上吗?

完全可以,作为演示

Java分布式架构可以把所有项目部署到一台机器上吗?

那不叫分布式架构

留言与评论(共有 0 条评论)
   
验证码:
Top