分布式是大型网站的必经之路,也是架构师的必备技能,掌握好分布式非常重要,下面我就全面来详解分布式@mikechen
分布式方案
分布式解决方案是指通过多台计算机共同协作来完成任务,以提高系统的性能、可扩展性、和可靠性。
分布式服务
分布式解决方案是指通过多台计算机共同协作来完成任务,以提高系统的性能、可扩展性和可靠性。
比如:最经典的就是大家熟知的“微服务架构”,就是将单一应用程序划分为多个小的、独立的服务、这些服务就是分布式服务。
分布式微服务则是:将这些服务分布在多个节点、或服务器上,通过网络进行通信、和协作。
如下图所示:
将应用拆分为多个独立的微服务,每个微服务实现特定的业务功能,如:用户管理、订单处理、支付、物流、积分…等。
每个微服务都是独立的,可以单独开发、部署和升级,不影响其他服务。
而且,不同的微服务可以使用不同的技术栈,适应不同的业务需求。
通过这种分布式服务的方式,可以极大拓展整个应用架构的性能。
分布式存储
分布式存储是指将数据分散存储在多台计算机上,通过协调、和管理这些数据,实现高可用性、高可靠性、和高扩展性。
常见的分布式存储系统,包括:HDFS(Hadoop Distributed File System)、Ceph…….等等。
HDFS
HDFS是Hadoop生态系统的核心组件,用于分布式存储、和处理大规模数据集。
适用于大规模数据处理和分析,特别是与Hadoop生态系统集成的场景,如:批处理、数据存档、和备份…等。
特点:
- 架构:主从架构,由NameNode管理元数据,DataNode存储实际数据。
- 性能:其高吞吐量和数据冗余特点,使其在处理大文件和大数据量时表现优异。
- 数据分片:将文件划分为多个块(block),每个块存储在不同的DataNode上。
- 数据复制:每个块有多个副本,存储在不同的DataNode上,提高数据可靠性。
- 应用:广泛用于大数据处理和分析,如Hadoop MapReduce、Spark等。
Ceph
Ceph 是一个开源的分布式存储系统,旨在提供高性能、高可用性、和高可靠性的统一存储解决方案。
Ceph 支持对象存储、块存储、和文件存储,广泛应用于云计算平台、和大规模数据存储环境中。
特点:
- 架构:对等网络架构,由Monitor节点管理集群状态,OSD节点存储数据。
- 数据分片与复制:通过CRUSH算法进行数据分片和复制,确保数据分布和冗余。
- 一致性:使用Paxos算法保证元数据的一致性。
- 应用:适用于对象存储、块存储和文件存储。
分布式缓存
分布式缓存:是将数据分布存储在多个独立的缓存节点上,以实现高效的数据存取,它通过分散缓存负载来提高系统的可扩展性、和容错能力。
分布式缓存,典型的解决方案有:Redis、Memcached……等。
Memcached:
简单易用,轻量级。
基于内存存储,速度快。
采用一致性哈希算法实现分布式存储。
适用场景:适用于对速度要求高但数据不需要持久化的场景,如:会话管理、临时数据缓存等。
Redis:
支持多种数据结构(比如:字符串、列表、集合、有序集合、哈希…等)。
数据持久化(RDB快照和AOF日志)。
丰富的功能(事务、发布/订阅、Lua脚本等)。
支持主从复制和哨兵机制,实现高可用性。
适用场景:适用于需要丰富数据结构、高可用性和持久化的数据缓存场景,如实时统计、排行榜、消息队列等。
分布式雪崩场景
分布式缓存,除了上面提到的,很多也需要考虑到:雪崩、击穿…等场景。
分布式缓存雪崩是指缓存系统在短时间内大量缓存失效、或不可用,导致大量请求直接打到后端数据库、或存储系统。
如下图所示:
这个时候,很容易引发系统负载骤增,甚至可能导致系统崩溃。
具体策略,包含:
缓存失效时间随机化:在设置缓存失效时间时,添加一定的随机值,避免大量缓存同时失效。
缓存预热:在系统启动或重启时,提前加载热点数据到缓存中,避免缓存未命中导致的数据库请求激增。
请求限流:对数据库或后端服务进行限流,控制突发流量,避免瞬间的大量请求直接打到数据库。
多级缓存:使用本地缓存、和分布式缓存相结合的多级缓存架构,本地缓存可以使用,比如: Guava Cache …等库。
分布式锁
利用分布式缓存的特性,还可以实现分布式环境中的锁机制,保证并发操作的一致性。
在分布式环境中,由于多个节点可能同时请求锁,所以需要分布式锁来保证资源。
如下图所示:
由于节点间的通信可能存在延迟、和不可靠性,因此分布式锁的实现要解决如下关键问题:
1. 锁的唯一性
分布式锁需要确保同一时刻只有一个客户端能够获取到锁,以避免多个客户端同时修改共享资源而引发的并发问题。
2. 锁的有效性和过期处理
分布式锁需要考虑锁的有效期,避免锁长时间占用而不释放,导致资源无法被其他客户端访问。
3. 锁的释放
分布式锁的释放机制需要确保在锁不再需要时能够及时释放,以允许其他客户端获取锁。
4. 锁的高可用和故障处理
在分布式系统中,需要考虑锁服务的高可用性和故障处理能力,确保即使在节点故障或网络分区等情况下,锁仍能正常工作。
目前分布式锁的实现,Redis比较多,主要使用Redis的原子操作实现分布式锁,主要通过SETNX
(SET if Not eXists)命令、和EXPIRE
命令实现。
分布式事务
分布式事务也是分布式场景,经常遇到的一个问题。
比如:在分布式系统中,可能涉及多个独立的数据库、或服务,如下图所示:
当一个业务操作涉及多个数据存储、或服务时,需要保证这些操作的一致性,即要么所有操作都成功,要么所有操作都失败(原子性)。
分布式系统中,任何一个节点、或服务的故障,都可能导致某些事务只部分执行,或者出现数据丢失。
分布式事务管理可以确保即使在节点故障、或网络分区的情况下,也能够维持数据的一致性和系统的稳定性。
可以选择适当的分布式事务实现方式,比如:两阶段提交(2PC)、三阶段提交、基于补偿事务的模式..等。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!

后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》