软件改变世界、开源改变软件、云吞噬开源
互联网架构核心问题
海量用户、产品迅速迭代、不间断服务、流量突增、业务组合复杂。
从集中式架构到分布式架构
传统的三层架构模型,DTO、VO、Entity
分布式架构、SOA和服务化。CAP理论,CP、AP。可以简单认为SOA约等于“模块化开发 + 分布式计算”。
自动化运维,监控(CPU、内存、磁盘IO、网络IO)自动化,使用Zabbix、Nagios;流程自动化,使用Puppet、Chef、Ansible。
分布式架构解决了互联网应用吞吐量的瓶颈。DevOps可以帮助开发工程师和运维工程师在实现各自目标的前提下,向最终用户交付价值最大化、质量最高的成果的一系列基本原则。DevOps是一种公司文化,代表了开发、运维和测试等环节之间的协作。
从分布式架构到云原生架构
- 新纪元的分水岭--容器技术
docker通过集装箱式的封装方法,将应用和依赖封装到可移植的容器中。让开发工程师和运维工程师都能够以“镜像+分发”的方式发布应用,使得异构语言之间交互? - 新纪元的编排和调度系统
k8s、mesos为云原生应用提供编排调度能力,它们是云平台上的分布式操作系统。解除资源与应用程序的耦合限制。
k8s是面向云原生的PaaS平台,mesos是面向大数据+编排调度平台。 - 架构设计的变革,微服务
微服务是一种架构风格,它将单体应用分解成多个独立部署的子服务,每个服务运行在隔离的进程中,服务间的通信采用轻量级通信机制,比如RESTful。
微服务的优势是通过清晰的模块边界构建易于理解的架构风格,它可以让每个服务具有独立部署、与开发语言无关的能力。
微服务相比集中式架构,需要额外处理的分布式开发和运维的工作:配置管理、服务发现、负载均衡、弹性扩缩容、分布式调用追踪、日志中心、自愈能力。
云原生
云一般指的是提供资源的平台,云计算的本质是按需分配资源和弹性计算。
让应用能够利用云平台实现资源的按需分配和弹性伸缩,是云原生应用被重点关注的地方。
从本质上来说,云原生是一种设计模式,它要求云原生应用具备可用性和伸缩性,以及自动化部署和管理的能力,可随处运行,并且能够通过持续集成、持续交付工具提升开发、测试和发布的效率。
云原生与十二要素
基准代码(git、svn)、依赖(显示声明第三方依赖,maven、gradle、ant)、配置、后端服务、构建发布运行、进程、端口绑定、并发、已处理(快速启动、优雅关停应用)、开发与生产环境等价、日志、管理进程。
优先考虑API设计、通过遥测感知系统状态(APM信息、健康状态、系统日志)、认证和授权。
云原生与CNCF
应用定义与开发层
- 数据库与数据分析
基于ACID事务模型的关系型数据库。
NoSQL,把redis作为缓存,neo4j当作关系分析数据库,mongodb当作存储schema易变型数据的数据库。
NewSQL,TiDB采用key-value存储引擎,可动态平衡的进行数据迁移,自动水平伸缩,在线修改schema,索引变更,是完整的数据存储方案。
大数据处理,以map/reduce闻名的hadoop,以RDD作为计算模型的spark。 - 流式处理
流式处理包括消息中间件以及流式实时计算框架。Kafka、Rabbit。流式计算框架包括storm、flink,适用于实时统计PV、UV。 - 软件配置管理,即SCM。github和gitlab。
- 应用定义,maven,maven使用项目对象模型声明和管理项目的生命周期和应用依赖。
- 持续集成、持续交付
持续集成,自动且持续不断的构建和测试软件项目并监控结果的正确性。
持续交付,频繁的将应用的新迭代版本交付给测试团队或最终用户以进行评审。
主要有jenkins等工具。
编排与治理层
将应用框架的分布式治理与云原生所需的调度、编排等功能抽象出来,形成独立的一层,即编排与治理层。
- 调度与编排
调度与编排提供了面向应用的容器集群部署和管理功能,目的是解耦CPU、GPU、内存、网络和存储等基础设施与应用程序间的依赖。调度与编排负责按照预定的策略将承载应用的容器调度到拥有运行资源的服务器中。
调度是将分布式系统中的闲置资源合理分配给需要运行的进程并采用容器进行封装的过程。
编排是对系统中的容器进行健康检查、自动扩缩容、自动重启、滚动发布等。
mesos采用两级调度架构,因此将调度和编排分离。由mesos自身负责资源的调度,由运行在mesos系统中的marathon进行容器的编排。 - 分布式协调与服务发现
分布式场景中由于网络的延迟以及不确定性,因此复杂度非常高。分布式系统一般是通过一个可靠性非常高的注册中心对分布式服务进行协调和发现。zk、eureka、consul,coredns,etcd。 - 服务管理
服务管理的产品主要集中在三个方面:远程通信、反向代理、服务治理。
远程通信,gRPC,thrift,avro等跨语言框架集序列化和通信功能于一身。
反向代理,F5、haproxy、nginx
服务治理,spring cloud、dubbo、k8s中的service和ingress、service mesh
运行时层
云原生应用不直接运行在物理服务器或传统的虚拟机上,通常为了运行云原生应用,会在这上面再构建一层,用于轻量灵活的运行更多实例。
与传统应用的文件系统、进程和网络环境相对应的是云原生存储、容器和云原生网络。
- 云原生存储
hdfs、ceph、clusterfs。主要用于存放日志、图片、文档等文件。目前不支持安装数据库。 - 容器,docker、rkt。
- 云原生网络
云原生网络是可以为每个容器分配独立IP地址。使用软件定义网络。产生了容器网络接口标准CNI(container network interface),主要实现有flannel、calico、weave。
供应保障层
这一层用于为宿主机和容器本身提供保障,更偏向于运维。
- 宿主机管理工具
ansible、puppet、checf。 - 基础设施自动化工具
docker的包管理工具infrakit。k8s的helm。 - 容器仓库
docker的harbor - 镜像安全
clair等可以检查容器中应用的漏洞。 - 密钥管理
云设施层
这一层主要包括用于提供物理服务器的云厂商。
公有云,aws、azure、阿里云。私有云,openstack、vmware。
观察与分析
观察和分析包括对系统指标的监控,对链路调用的追踪,分布式日志的收集。
- 监控
对物理服务器指标收集,zabbix等。
对容器指标收集,cadvisor等。 - 日志
elasticsearch、kibaner、flume、fluentd - 追踪
openTracing是调用链的标准协议,zipkin、jaeger。pinpoint未遵循。
平台
基于云的整合平台。围绕mesos打造的dc/os。整合mesos和k8s的rancher。
云原生的实现方式
应用程序 + 分布式中间件 + 自动化运维
应用程序 + 编排调度平台 + 容器 + 服务治理
参考
《未来架构--从服务化到云原生 - 张亮》
网友评论