什么是分布式系统
分布式系统:是分布式处理的软件系统,是由一组通过网络进行通信、为了完成共同的任务,而协调工作的计算机节点组成的系统。
为什么需要分布式系统
为什么需要分布式系统?原因很简单,因为单个节点服务器处理能力永远是有限,无法满足日益增长的需求。
1.性能扩展
举一个最简单例子:我都知道单台机器是无法支撑阿里的双11的场景的,因为单台的CPU、硬盘、内存等等都是有限的,为了支撑大访问量,都会使用多台机器来提高系统的负载能力。
所以,我们需要垂直,或是水平拆分业务系统,让其变成一个分布式系统架构。
2.加强系统可用
软件不是完美的,网络不是完美的,甚至机器本身也不可能是完美的,随时可能会出错,为了避免故障,需要将业务分散开保留一定的冗余度。
我们的业务越来越关键,就越要提高整个系统架构的可用性,这就意味着架构中不能存在单点故障,需要通过分布式架构来冗余系统以消除单点故障,从而提高系统的可用性。
所以,我们才需要考虑分布式系统,服务器也会从单节点分布到多节点集群部署,从而来应对业务的增长,也就出现了分布式系统。
分布式系统技术
分布式系统虽好,也带来了系统的复杂性,比如:分布式事务、分布式锁、分布式session、分布式数据一致性、分布式文件系统等都是现在分布式系统中需要解决的难题。
当你的系统一旦分布式了之后,其实会面临很多技术挑战的,包括分布式服务框架、分布式文件系统、分布式数据库系统、分布式锁等等,当然这些也是分布式的关键技术。
针对这些分布式系统的关键技术,下面我再一一详解@mikechen
分布式服务
一个系统业务量很小的时候,大部分Web工程的Java应用程序,打包为War包部署在一台服务器上,叫做单体架构,也叫巨石型应用。
随着业务访问量越来越大,单体应用就会出现巨大的瓶颈,随意后期就会出现,按照业务为单位进行拆分,出现的微服务架构。
比如大家现在熟知的:Spring Cloud和Spring Cloud Alibaba以及新一代Istio为代表的ServiceMesh都是典型代表。
分布式缓存
如果你原来就是个单块系统,那么你其实是可以在单个JVM里进行本地缓存就可以了,比如搞一个HashMap来缓存一些数据。
但是现在你有很多个子系统,他们如果要共享一个缓存,你应该怎么办?是不是需要引入Redis等缓存系统?
通过引入分布式缓存,这样可以极大的提升查询效率,也更容易扩展。
分布式文件系统
在这个数据爆炸的时代,产生的数据量不断地在攀升,从GB,TB,PB,ZB,这就会涉及到分布式文件系统。
比如:常见的GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等分布式文件系统。
分布式锁
毕竟大家不是在一个JVM里了,不可能用Synchronized来在多个子系统之间实现锁吧,是不是?
所以这个时候需要全局加锁获取某个资源,也就是分布式锁。
1. 数据库乐观锁;
2. 基于ZooKeeper的分布式锁;
3.基于Redis分布式锁;
这里推荐使用Redis分布式锁的方案。
分布式ID
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识,单机数据库的自增ID显然不能满足需求,此时一个能够生成全局唯一分布式ID的系统是非常必要的。
目前用的较多的是雪花算法实现的分布式ID。
分布式事务
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
一旦你的系统拆分为了多个子系统之后,之前的单机事务就不行了,需要TCC、最终一致性、2PC等分布式事务的实现方案,以及Seata分布式事务框架。
分布式消息系统
在单块系统内就一个JVM进程内部,你可以用类似LinkedList之类的数据结构作为一个本地内存里的队列。
但是多个子系统之间要进行消息队列的传递呢?那是不是要引入类似RabbitMQ、RocketMQ、Kafka类的分布式消息中间件。
1)Producer 消息生产者:负责产生和发送消息到 Broker;
2)Broker 消息处理中心:负责消息存储、确认、重试等,一般其中会包含多个 queue;
3)Consumer 消息消费者:负责从 Broker 中获取消息,并进行相应处理;
其它分布式系统技术
除此之外,还会涉及:分布式配置中心、分布式日志中心、分布式监控、分布式会话等等,都是分布式系统场景下你需要使用和了解的一些技术。
分布式系统总结
之前单体的通信、缓存、消息、事务、锁、配置、日志、监控等等很容易解决,一旦变成分布式的场景,都会变得很复杂。
所以分布式系统架构在解决了一些问题的同时,也增加了其他的问题,这就需要不断的再用各种各样的技术跟手段去解决这些新增的问题。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》