1.分布式系统的发展
在计算机发展的早期,一直都是集中式计算,计算能力依赖大型计算机。随着互联网的发展,繁重的业务需要巨大的计算能力才能完成,而集中式计算无法满足要求,大型计算机的价格也非常昂贵。分布式计算将任务分解成更小的部分,分配给多台计算机处理,这样可以节约整体计算时间,大大提高计算效率。
互联网大型网站往往面临高并发访问、海量数据处理等问题,必须保证系统高可用、易伸缩等等。分布式架构采用多台机器协同工作,动态伸缩容量,使用冗余节点来消除单点故障,提高系统可用性。
2.分布式系统的挑战
软件开发没有银弹,任何系统结构都有利有弊,分布式系统的挑战有三点:
- 1)网络资源受限:节点间采用网络通信,而网络存在带宽限制和延时,任何一个节点都无法做到瞬间响应和高吞吐量。
- 2)节点管理成本:分布式系统节点可能膨胀到成千上万个,运维节点的成本非常高。
- 3)缺乏全局时钟:网络上计算机时钟同步的准确性受到极大的限制,没有一致的全局时间。计算机在空间随意分布,很难定义不同机器上事件先后发生顺序。
3.分布式系统基本理论
3.1 CAP定理
分布式系统的三个特性Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),最多只能同时满足其中两个,三者不可兼得。
- Consistency (一致性):数据更新后,所有节点在同一时间的数据完全一致。客户端并发访问时,返回的数据是一致的。服务端尽快将数据复制到整个系统,以保证数据最终一致。
- Availability (可用性):系统能够一直为用户服务,不出现操作失败或者超时等情况。在单位时间内的可用性常用N个9来衡量,比如99.999%的可用性。
- Partition Tolerance (分区容错性):分布式系统内部由许多节点构成,外界看上去是一个整体。节点或网络分区遇到故障的时候,仍然能够对外提供满足一致性或可用性的服务。系统中少量机器宕掉,剩下的机器还能够正常运转,用户没有任何感知。
大型互联网应用的集群节点非常多,发生节点或者网络故障是常态。系统必须要满足分区容错性,最终只能在C和A之间取舍。
传统行业项目有所不同,以金融系统为例,涉及到金钱的操作,必须要满足数据一致性。出现网络故障宁可停止服务,也要保证C,最终只能在A和P之间取舍。
3.2 PACELC理论
CAP理论并不能很好的指导现实的系统架构。比如Availability (可用性),如果接口长时间才返回结果,固然可用,但是业务上不能接受。大部分情况下,系统分区都是平稳运行的,系统设计要权衡延迟与数据一致性的问题。为了保证数据一致性,读写的延迟必然升高。
在分区错误的情况下,在C和A中取舍,缩写为 PAC。分区正确的情况下,取 Latency(延迟)与 Consistency(一致性),缩写为LC。PACELC 中的 E 代表 Else,连起来就是PACELC。
很多存储软件实现了 PACELC 的策略,用户根据不同业务场景使用不同的配置。以MySQL主从复制为例,提供了三种模式:
- 异步模式:主库执行完客户端提交的事务,立即将结果返给客户端,不关心从库是否已经接收并处理。由于数据同步的延时,客户端在从库上可能读不到最新数据。这种模式对MySQL是性能最佳的,但是用户需要权衡,业务能否忍受这种延时。
- 全同步复制:主库执行完客户端提交的事务,所有的从库都执行了该事务才返回结果。这样保证强一致性,但是响应时间变长了。
- 半同步复制:主库在执行完客户端提交的事务后,等待至少一个从库接收到并写到 relay log 中,才返回给客户端。这样做延迟小了很多,相比于异步复制,数据更加不容易丢失。
3.3 BASE模型
BASE模型全称是Basically Available(基本可用)、Soft-state(软状态/柔性事务)、Eventually Consistent(最终一致性)。绝大部分分布式系统,实现分区容忍性是基本要求,因此要平衡一致性和可用性。BASE强调牺牲高一致性,获得可用性。允许数据在一段时间内不一致,只要保证最终一致就可以了。
3.4 一致性算法
分布式系统中的数据一致性问题,是系统设计中最关键、最有难度的领域,业界提出了很多成熟的一致性共识算法。
- Paxios算法
1998年,莱斯利·兰伯特(Leslie Lamport)在《The Part-Time Parliament》论文中首次公开Paxos协议。他使用希腊的小岛Paxos作为比喻,描述了Paxos小岛中通过决议的流程。2001年,Lamport重新发表了朴实的算法描述版本《Paxos Made Simple》。
- Raft算法
由于Paxos算法太难以理解和实现,斯坦福大学的 Diego Ongaro 和 John Ousterhout 提出了更容易理解的 Raft 算法。相比传统的 Paxos 算法,Raft 将大量的计算问题分解成简单的相对独立的子问题,并且和 Multi-Paxos 有同样的性能,
有兴趣的朋友,可以看看Raft算法的动画演示。
- ZAB协议
ZAB协议全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。分布式协调服务ZooKeeper设计了支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副本之间的数据一致性。从设计上看,ZAB 协议和 Raft 很相似。
4.分布式架构组件
4.1 主要组件
- 服务注册与发现:Spring Cloud Eureka、Apache Nacos、Apache Zookeeper、ETCD
- 服务调用:Spring Cloud Feign、Apache Dubbo、Motan、gRPC
- 微服务网关:Spring Cloud Zuul、Spring Cloud Gateway、Apache ShenYu、Kong
- 微服务熔断降级:Spring Cloud Hytrix、Alibaba Sentinel
- 负载均衡器:Spring Cloud Ribbon、Spring Cloud LoadBalancer
- 分布式监控:Spring Boot Admin、美团 CAT、Zabbix、Prometheus + Grafana + Alertmanager、Open-Falcon
- 配置管理:Spring Cloud Config、Alibaba Nacos、百度Disconf、携程Apollo
- 消息队列:RocketMQ、Kafka、RabbitMQ
- 任务调度:Apache Dolphinscheduler、Apache ElasticJob、XXL-JOB
- 分布式事务:Alibaba Seata
- 调用链跟踪:Spring Cloud Sleuth + ZipKin、Apache Skywalking
- 日志采集:Flume + Kafka + HDFS、Elasticsearch + Logstash + kafka + Kiabana
- 分库分表:Apache ShardingSphere、MyCat 、美团DBProxy
- 分布式锁:Redisson + Redis
- 权限控制:Spring Security、Shiro + JWT
- 文件系统:Fastdfs、Minio、HDFS
- 反向代理:Nginx
4.2 辅助工具
- Java应用诊断:Alibaba Arthas
4.3 常用架构
5.常用数据库
5.1 数据库的发展
数据库是一个悠久历史的行业,从诞生到现在也有接近五十年的历史了。数据库一直在技术、业务以及应用场景等方面不停地演进和发展。上世纪九十年代,针对个人办公、个人娱乐以及企业信息化的场景,基于X86服务器诞生了像MySQL、MS SQL Server这些著名的关系型数据库。
NoSQL数据库是由于互联网业务的诞生而产生的。2006年,谷歌引入了BigTable,后续出现了HBase、Cassandra、MongoDB和Redis,这些数据库都是由不同的底层数据组织形式去解决不同的问题。在2010年前后,谷歌又引入了以Spanner为代表的新产品,出现了F1、SequoiaDB、TiDB等NewSQL数据库,使用SQL解决应用性问题,也保留了NoSQL的可扩展性问题。
NoSQL数据库是为了解决传统关系型数据库的弊端,它有四个特点:
- 易扩展:NoSQL数据共同的特点是去掉关系数据库的关系型特性,数据之间无关系,这样就非常容易扩展,在架构的层面上带来了可扩展的能力。
- 高性能:NoSQL数据库都具有非常高的读写性能,尤其在大数据量下同样表现优秀。由于数据之间的无关系性,数据库的结构简单。
- 高可用:NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。
- 数据模型灵活:NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。
5.2 OLTP和OLAP
从业务场景来看,数据处理可以分为OLTP和OLAP。这两种场景采用何种数据库,取决于开发人员的技术水平和经验。通常来说,OLTP采用强一致性的关系型数据库,OLAP采用NoSQL或者列式数据库。
- OLTP(on-line transaction processing)
OLTP为联机事务处理,主要用来记录业务事件的发生。当行为产生后,系统记录事件是谁在什么时候什么地方做了什么事,在数据库中进行数据的增删改查,要求高实时性、强稳定性、数据一致性。
- OLAP(On-Line Analytical Processing)
OLAP为联机分析处理,侧重大数据量查询。当业务发展到一定程度,要利用离线数据做分析,为决策提供支持。
5.3 常用NoSQL数据库
- MongoDB
MongoDB是一个面向文档的数据库,以JSON格式存储数据。它主要用于网站的数据存储、内容管理与缓存应用。MongoDB支持全文检索,查询方式非常丰富,在数据处理与聚合等方面具有很强的灵活性,同时具备极高的扩展性和可用性。
- Cassandra
Cassandra是一套开源分布式数据库系统。最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。由于Cassandra良好的可扩展性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。
- CouchDB
CouchDB是一个面向文档的数据库,以JSON格式存储数据。CouchDB可以用于存储网站的数据与内容,以及提供缓存等。支持通过JavaScript在CouchDB上运行MapReduce查询。CouchDB还提供了一个非常方便的基于Web的管理控制台。
- Redis
Redis是一个内存中的键值数据库。Redis具备存储和操作高级数据类型的能力。这些数据类型是大多数开发人员熟悉的基本数据结构(列表、映射、集合)。Redis的读写数据的效率极高,远远超过常规数据库,常常用于大型项目的缓存层。
- HBase
HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。
- Elasticsearch
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
- ClickHouse
ClickHouse 是俄罗斯的Yandex(类似百度)开源的列式存储数据库,主要用于在线分析处理查询,能够使用SQL查询实时生成分析数据报告。使用场景与Elasticsearch类似,甚至有更高的性能。
5.4 常用关系型数据库
- Oracle
Oracle是全球最大的信息管理软件及服务供应商,总部位于美国加州Redwoodshore。Oracle数据库产品为财富排行榜上的前1000家公司采用,是最知名、使用最广泛的企业数据库。
- DB2
DB2是IBM公司开发的关系数据库管理系统,主要用于大型应用系统,具有较好的可伸缩性 。DB2是IBM推出的第二个关系型数据库,所以称为DB2。它提供了高层次的数据利用性、完整性、安全性、并行性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令运行环境。可以同时在不同操作系统使用,包括Linux、UNIX 和 Windows。
- Microsoft SQL Sever
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
- MySQL
MySQL是使用最广泛的开源关系型数据库,由瑞典MySQL AB公司开发,现在已被 Oracle收购。MySQL与常用的主流数据库Oracle、SQL Server相比,特点就是免费,并且在任何平台上都能使用,占用的资源较小,受个人用户以及中小企业青睐。对于大型项目来说,MySQL的承载能力和安全性就略逊于Oracle数据库。
- MariaDB
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB名称来自创始人Michael Widenius的女儿Maria的名字。
- PostgreSQL
PostgreSQL是一个强大的开源对象关系数据库系统,它使用并扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可以追溯到 1986 年作为加州大学伯克利分校POSTGRES项目的一部分。PostgreSQL的架构、可靠性、数据完整性、功能集、可扩展性得到充分的验证,开源社区也非常活跃。它是最接近工业标准SQL92的查询语言,至少实现了SQL:2011标准中要求的179项主要功能中的160项(注:目前没有哪个数据库管理系统能完全实现SQL:2011标准中的所有主要功能)。
- TiDB
TiDB是PingCAP公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing,HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和MySQL生态等重要特性,为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB适合高可用、强一致要求较高、数据规模较大等各种应用场景。
- TBase
TiDB是腾讯在Postgres-XC基础上开发的数据库。Postgres-XC(eXtensible Cluster)是一个提供写可扩展、同步、对称的和透明的PostgreSQL群集解决方案的开源项目。相较于Postgres-XC,TBase的稳定性得到了较大提高,通过在内核中引入GROUP概念,提出了双Key分布策略,有效地解决了数据倾斜的问题。它根据数据的时间戳,将数据分为冷数据和热数据,分别存储于不同的存储设备中,有效地解决了存储成本的问题。
- OceanBase
OceanBase是由蚂蚁集团自主研发的企业级分布式关系数据库,始创于2010年。OceanBase在TPC-C和TPC-H测试上都刷新了世界纪录的国产原生分布式数据库。OceanBase具有数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系数据库、低成本等特点。
- SequoiaDB
SequoiaDB巨杉数据库是一款金融级分布式关系型数据库,主要面对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,以满足上层不同应用程序各自的需求。SequoiaDB 巨杉数据库支持 MySQL、MariaDB、PostgreSQL 和 SparkSQL四种关系型数据库实例、JSON文档类数据库实例、以及 S3对象存储的非结构化数据实例。