首页 文章 精选 留言 我的

精选列表

搜索[MSA技术],共10000篇文章
优秀的个人博客,低调大师

Openstack 之分布式存储技术比较

关于Openstack的分布式存储,我关注Ceph,swift,hdfs的功能实现和优缺点,适用场景。 1.存储文件大小 HDFS、HBase、Hive不太适合存文档、图片大小的文件,HDFS适用于存大文件。 SWIFT:处理几个G的大文件性能上可能会比HDFS差,因为没有条带化。但遇到很多几兆、几十兆的,这些文件的存储,HDFS就不如SWIFT。所以对于日常文件的单独处理用SWIFT,集中处理如果达到G级用HDFS。 2.存储类型:块存储和对象存储 如果你只需要用块存储,那当然是Ceph,如果只需要用对象存储,那当然是SWIFT。各自有各自擅长的地方,不过现在因为Ceph也支持对象存储,SWIFT和Ceph又是OpenStack社区非常频繁提到的两种存储形式,所以,有很多人会把SWIFT和Ceph在一起比较。 如果只要用对象存储,就选择SWIFT;如果只要用块存储,那就Ceph;即要用对象存储又要用块存储的场合,是用SWIFT还是Ceph呢?我们一般是这样推荐的: 1)如果节点数量很大,推荐用Ceph单独做块,用SWIFT做对象存储,因为在节点数量较大时,Ceph的维护成本比SWIFT要高得多,大多数场景实际应用的时候会发现,大部分数据都可以放到对象存储上(这一点如果有疑问,欢迎随时讨论); 2)如果节点数量少,那就用Ceph统一搞定,因为一般认为生产环境中最小的分布式存储应当有五个节点,所以,如果节点数量少于十个或者刚到十来个,那构建两个分布式存储显然是不理想的(考虑到空间划分问题); 3)如果团队里有牛人能轻松解决Ceph大规模部署问题,那就果断用Ceph; 4)如果希望对象存储能够和OpenStack其他项目无缝结合,如果希望实现多租户,果断用SWIFT来实现对象存储。 3.对象存储概念: RESTful接口和扁平的数据组织形式。 4.对象存储和文件系统存储区别: 所谓文件系统的本质是POSIX接口,“对象”这个名词是做对象存储的人为了把自己做的东西和文件系统区分开而用的术语,把存在对象存储里的文件叫做“对象”,所以选择文件系统还是对象存储,跟你把这堆数据称作对象还是文件并没有直接关系,而是要看你是需要POSIX还是RESTful HTTP接口,是需要目录结构还是适用扁平数据管理结构。 GlusterFS,它的优点在于如果你需要使用POSIX接口,那GlusterFS是一个很好的选择,但是Gluster在文件数量、目录数量太大的情况下会出现性能衰减,这是文件系统本身的特点决定的,不论是哪种POSIX兼容的文件系统,都存在类似的问题。 本文作者:hiyachen 来源:51CTO

优秀的个人博客,低调大师

Cloud Foundry技术全貌及核心组件分析

本文在从架构组成、核心模块功能、源代码分析等角度来全面剖析Cloud Foundry,同时会结合各行业的典型案例来讲解Cloud Foudry在具体应用场景中的表现。 架构设计及核心组件 从总体上看,Cloud Foundry的架构如图1所示。 图1 Cloud Foundry架构图 经过一年多的发展,Cloud Foundry的组件增加了很多。但核心组件并没有变化,增加的组件是原架构基础上的细化和专门化。Stager组件解决了打包(Stage)过程需要操作大量文件且操作时间长的问题,所以它作为独立进程,使打包工作异步进行,不阻塞作为核心组件的Cloud Controller。 下面是对Cloud Foundry核心组件的描述。 Router。顾名思义,Router组件在Cloud Foundry中是对所有进来的请求进行路由。进入Router的请求主要有两类。 第一类是来自VMC Client或者STS的,由Cloud Foundry使用者发出,叫做管理请求。这类请求会被路由到Cloud Controller组件处理。 第二类是对所部署的App的访问请求。这部分请求会被路由到App execution,即DEA组件中。简单地说,所有进入Cloud Foundry系统的请求都会经过Router组件。Router组件是可扩展的,由多个 Router共同处理进来的请求。但如何对Router做负载均衡不属于Cloud Foundry的实现范围。Cloud Foundry只须保证所有Router都可以处理任何请求,而管理员可用DNS实现负载均衡,也可部署专用硬件来实现,或者简单点,弄个Nginx做负载均衡。 在第一个版本中,Router工作由router.rb来做,所有请求都必须经过Ruby代码处理转发。这个设计简单直接,只是容易引起性能问题,新版中做了如下改进,如图2所示(左侧为第一版本,右侧为新版)。 图2 Router工作过程(新旧版对比) 使用Nginx的Lua扩展,在Lua中加入URL查询和统计的逻辑。 如果Lua不知道当前的URL应该路由给哪一个DEA,则会发一个查询请求到router_uls_server.rb(也就是图2中的“Upstream Locator SVC”)。 router_uls_server.rb是一个简单的Sinatra应用,它存储了所有URL与DEA IP:Port对应关系。另外,它也管理了请求的Session数据。 这样一来,大量的业务请求在Lua查询过并保存位置后,都由Nginx直接转发,不再经过Router,性能和稳定性都大幅提高。 Router的设计中有个难点:我们知道HTTP请求是有上下文的,那如何保证请求的上下文完整呢?简单来说,就是如何保证有上下文的请求每次都可以找到同一个DEA处理?Cloud Foundry是支持Session的,当Router发现用户请求中带了Cookie信息,它会在Cookie里暗藏一个应用实例的id。当有新请求时,Router通过解析Cookie得到上次的应用实例,然后转发到同一台DEA上。这信息与上面的查询类似,会先存在于Upstream Locator SVC中,当Lua知道后会保存在Nginx内部提高效率。 DEA (Droplet Execution Agency)。首先要解释下什么叫做Droplet。在 Cloud Foundry中,Droplet指把提交的源代码及Cloud Foundry配置好的运行环境(如Java Web就是一个Tomcat),再加一些控制脚本,如start/stop等,全部打包在一起的tar文件。Staging App是指制作Droplet,然后把它存储起来的过程。Cloud Foundry会保存这个Droplet,直到启动(start)一个App时,一台部署了DEA模块的服务器会来拿这个Droplet的副本去运行。因此,如果将App扩展到10个实例(instance),那么这个Droplet就会被复制10份,供10台DEA服务器运行。 图3是DEA模块的架构图(左侧为第一版本,右侧为新版)。 图3 DEA模块架构图(新旧版对比) Cloud Foundry刚推出时,用户部署的应用可以在内网畅通无阻,跑满CPU,占尽内存,写满磁盘。因此,Cloud Foundry开发出了Warden,用这个程序运行容器解决这一问题。这个容器提供了一个隔绝环境,Droplet只可以获得受限的CPU、内存、磁盘访问权限和网络权限。 Warden在Linux上的实现是将Linux 内核的资源分成若干个namespace加以区分,底层的机制是CGROUP。这样的设计比虚拟机性能好,启动更快,也能够获得足够的安全性。 DEA的运行原理没有发生根本改变:Cloud Controller模块会发送start/stop等基本的App管理请求给DEA,dea.rb接收这些请求,然后从blobstore下载合适的 Droplet。前面说到Droplet是一个带有运行脚本和运行环境的tar包,DEA只需要把它拿过来解压,并执行里面的start脚本,就可让应用运行起来,App也就可以被访问了。换句话说,就是这台服务器的某一个端口已经在待命,只要有request从这个端口进来,这个App就可以接收并返回正确的信息。 接着,dea.rb要做以下一些善后的工作。 把这个信息告诉Router模块(前面说到,所有进入Cloud Foundry的请求都是由Router模块处理并转发的,包括用户对App的访问请求。一个App运行起来后,需要告诉Router,让它根据负载均衡等原则把合适的请求转进来,使这个App的实例能够干活)。 一些统计性的工作。例如要把这个用户又新部署了一个App告诉Cloud Controller,以作quota控制等。 把运行信息告诉Health Manager模块,实时报告该App的实例运行情况。 另外,DEA还要负责部分对Droplet的查询工作。例如,如果用户想通过Cloud Controller查询一个App的log信息,那么DEA需要从该Droplet里取到log返回等。 Cloud Controller。Cloud Foundry的管理模块。简单来说,就是与VMC和STS交互的服务器端,它收到指令后发消息到各模快,管理整个云的运行,相当于Cloud Foundry的大脑。 以部署一个App到Cloud Foundry为例。在输入push命令后,VMC开始工作。在做完一轮用户鉴权、查看所部署的App数量是否超过预定数额、问了一堆相关App的问题后,需要发4个指令。 发一个POST到“apps”,创建一个App; 发一个PUT到“apps/:name/application”,上传App; 发一个GET到“apps/:name/”,取得App状态,查看是否已启动; 如果没有启动,发一个PUT到“apps/:name/”,使其启动。 第一版的Cloud Controller是基于Ruby on Rails的,新版的Cloud Controller用Sinatra进行了重写,并把部分工作独立成组件, 使Cloud Controller变得更轻。另一个重要的改进是,第一个版本的Droplet是通过NFS共享的,这样会带来安全、性能等方面的问题,新版中采用了自己开发的blobstore存放Droplet。 随着Cloud Foundry逐渐成熟,权限管理功能在新版本中逐渐完善。在原有的用户模型基础上,加入了组织和用户空间等概念,细化了管理模型。用户模型的认证是由 UAA模块实现的。在企业环境中,如果用Cloud Foundry的开源代码搭建私有云,那么它可以与企业已有的认证系统进行整合,例如LDAP、CAS等。权限控制是由ACM模块实现的。图4给出了用户访问Cloud Controller某个API的过程。 图4 用户访问Cloud Controller某个API的过程 Health Manager。它做的事情不复杂,简单地说,是从各个DEA获得运行信息,然后进行统计分析、报告、发出告警等。 Services。服务应属于PaaS的第三层。Cloud Foundry把Service模块设计成一个独立的、插件式的模块,便于第三方方便地把自己的服务整合成Cloud Foundry服务。在GitHub上有以下两个相关的子项目值得关注。 vcap-services-base:顾名思义,它包括Cloud Foundry服务的框架及核心类库。如果开发自定义服务,需要引用到里面的类。 vcap-services:目前Cloud Foundry支持的,包括官方及大部分第三方贡献的服务。这个项目的根文件目录是根据服务名称划分的,可以选择其中自己感兴趣的来研究。 由此可见,Service模块十分方便为第三方提供自定义服务。从架构来说, Cloud Foundry服务部分使用了模板方法设计模式,可通过重写钩子方法来实现自己的服务。如果不需要特别逻辑则可以使用默认方法。 现实情况中,种种原因使有些系统服务难以或不愿意迁移到云端,为此Cloud Foundry 引入了Service Broker模块。 Service Broker可以使部署在Cloud Foundry上的应用能访问本地服务。Service Broker的使用方法如下。 准备被访问的服务。以PostgreSQL为例,配置好程序和防火墙,让其可以通过类似 postgres://xyzhr:secret@db.xyzcorp.com:5432/xyz_hr_db的URI访问。 注册以上URI到Service Broker。 使用Service Broker暴露的服务与使用Cloud Foundry的系统服务无异,准备被访问的服务中的访问服务的URI通过环境变量传给App。App通过URI访问暴露出来的服务,这过程不必通过 Service Broker。这个过程如图5所示,与使用系统服务类似,此处不再赘述。 图5 使用Service Broker所暴露的服务的过程 NATS (Message bus)。 Cloud Foundry的架构是基于消息发布和订阅的。联系各模块的是一个叫NATS的组件。NATS是由Cloud Foundry开发的一个基于事件驱动的、轻量级的消息系统。它基于EventMachine实现。第一版本Cloud Foundry被人诟病的一个问题就是NATS服务器是单节点的,让人不大放心。新版NATS能支持多服务器节点,NATS服务器间通过THIN来做通信。NATS的GitHub开源地址是:https://github.com/derekcollison/nats。代码量不多但设计很精妙,推荐研究它的源代码。 Cloud Foundry各种优秀特性均源于消息通信架构。每台服务器上的各模块会根据当前的行为,向对应主题发布消息,同时也按照需要监听多个主题,彼此以消息进行通信。 可以说,Cloud Foundry的核心是一套消息系统,如果想了解Cloud Foundry的来龙去脉,跟踪它里面复杂的消息机制是非常好的方法。举个最简单的例子,一个装有DEA组件的服务器为加强云的计算能力,被加入到 Cloud Foundry集群中。它首先需要表明已准备好随时提供服务,Cloud Controller可将App部署到它这里,Router也可将相关的请求交给它处理;Health Manger可定时为它体检等,它会发布一条消息到主题“dea.start”: NATS.publish(‘dea.start’,@hello_message_json) @hello_message_json包括DEA的UUID、ip、 port、版本信息等内容。Cloud Controller、Router、Health Manger及其他模块会监听这个主题,得到通知,各自干活。 理解Cloud Foundry的最好方法其实是选定某一操作,如部署一个App、创建服务等,以消息为线索,跟踪到各模块,看其如何处理。这样就可以观察到整个 Cloud Foundry的工作流程。本专栏第2篇文章将专门介绍如何以NATS为主线理解Cloud Foundry原理,这里就不做过多叙述了。 总结 在过去的一年中,Cloud Foundry发生了很多改变,足可看出Cloud Foundry社区的活跃。非常希望本文已把Cloud Foundry的原理讲得足够明白,但请不要把本文作为参考手册使用,在VMware中国开发者关系团队的努力下,Cloud Foundry的文档相当完善,强烈推荐以其作为参考(网址:www.cloudfoundry.cn)。 本文作者:佚名 来源:51CTO

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册