单体架构
单体架构1、在系统建设初期,我们的业务量很小,所以将应用程序、数据库放置在一台服务器。在这个阶段我们的文件都可能是直接放在应用程序下,由一个虚拟目录来伺服。
2、随着系统用户访问量的增加,我们可能会慢慢增加使用本地缓存来避免多次访问数据库。
3、再随着系统用户访问量的增加,我们可能会把数据库服务器和应用服务器分离,再增加一台服务器专用于数据库服务。
4、如果是读多写少的场景,我们可能还会采用数据库读写分离技术、页面静态化技术等来进一步缓存服务器压力。
分布式集群架构
分布式集群架构1、随着系统用户访问量的增加,单台服务器实在撑不住了,这时会使用负载均衡技术增加多个应用服务器节点。此时最重要的是服务要保持无状态。如果使用了本地缓存,那么就要注意缓存一致性管理。或者直接使用集中式缓存技术,比如Redis, CouchBase等,这种情况也一般会使用集群模式(比如Redis Cluster)。
2、在这种情况下,数据库读写分离技术用的比较多,会存在一个读写不一致的问题,即一般使用同步链\复制机制,会有一定的延时,大概是2-5秒。我们曾经为了解决问题,在发生写之后,会将读链接字符串替换为写链接字符串,然后在10秒后恢复使用读字符串。
3、关于搜索,此时也会出现使用MySQL等数据库查询无法满足性能等要求。一般会使用Elasticsearch来满足近实时的查询需求。
4、为了近一步提升系统吞吐量,我们也会采用异步机制,比如先将消息放到MQ(RabbitMQ、RocketMQ)中,然后再由消费者逐个或逐批来处理。
5、此时对于文件的处理,我们也需要从应用程序服务器中分离出来,因为这种的架构下有多个应用程序节点了,需要将文件存在在单独的集群中,比如FastDFS、seaweedfs、Ceph、Gluster等。
6、在这种情况下,为了更好的运维、异常问题排查需要服务器监控(Zabbix)、应用监控(APM)、统一日志平台(Sentry\ELK)、系统统一发布平台(Jenkins、walle-web.io、syncd)
分布式微服务架构(SOA服务化)
当整个系统以及发展的足够大的时候,比如一个电商系统中存在有:
- 用户系统
- 订单系统
- 支付系统
- 物流系统
- 等等系统。
如果每次修改了其中一个系统就要重新发布上线的话那么耦合就太严重了。
所以需要将整个项目拆分成若干个独立的应用,可以进行独立的开发上线实现快速迭代。
而且随着多端(Web端、H5、移动端、TV、平板等)的发展,前端的需求越来越庞大,往往就需要移动端接入层网关、Spring Cloud技术体系、Dubbo服务化技术体系等。
大数据架构
1、随着物联网、移动互联网、人工智能的发展,系统数据量越来越大。比如考勤、扬尘在线监测等硬件设备数据上报,每天都要产生千万甚至是几个亿的数据量,对我们的数据存储、计算提出了新的技术挑战。随着Google 大数据论文的发布(MapReduce、BigTable、HDFS),带动开源大数据生态圈Hadoop的发展。市面上不断涌现相关批量、实时大数据处理框架,比如Storm、Spark、Flink等。还有OLAP及时序数据库的涌现,比如Apache Kylin™、InfluxDB、MongoDB、ClickHouse、Druid等。
其它思考
1、随着SOA、微服务架构思想的广泛采用,系统越来越复杂,依赖的中间件越来越多,假设每个子系统或中间件的稳定性是n(0<=n<=1), 那么系统的稳定性可以抽象成一个乘法公式:n1*n2*n3等,由此可见系统的稳定性可能会出现越乘越小的现象。那么如何在网络通信性能差或抖动、中间件多的情况下,保证系统的稳定性呢?
2、如何提高后端系统的可观测性?Skywalking等APM工具, 基于MDC的ELK等统一日志平台?
3、每个JVM应该分多少内存?程序是CPU密集型应用还是IO密集型应用?
4、如何做CPU、内存、磁盘甚至是网络规划?系统的容量是多少?
更多分享资料
- 携程用ClickHouse轻松玩转每天十亿级数据更新
- ClickHouse深度揭秘
- ClickHouse 架构概述
- seaweedfs文件存储服务器搭建
- 混沌工程实战 手把手教你实现系统稳定性 图灵程序设计丛书
写给混沌工程师的实践指南,拥抱故障,从中学习,真正实现反脆弱系统,保障系统稳定性,提供配套代码示例 -
混沌工程:NETFLIX系统稳定性之道 (美)罗森塔尔 电子工业
为什么使用MDC进行记录日志信息
MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能
网友评论