热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

每天进步一点点——Swift学习

于2012年3月份开始接触OpenStack项目,刚开始之处主要是与同事合作共同部署公司内部的云平台,使得公司内部服务器能更好的得到资源利用。在部署的过程中遇到各种从未遇到过的问题



 转载请说明出处:http://blog.csdn.net/cywosp/article/details/19917183

    于2012年3月份开始接触OpenStack项目,刚开始之处主要是与同事合作共同部署公司内部的云平台,使得公司内部服务器能更好的得到资源利用。在部署的过程中遇到各种从未遇到过的问题,即使是按照官方文档一步一步的操作,由于某些硬件的不同,也会产生一些莫名其妙的问题,不是数据库因为配置不妥导致无法连接,就是swift的认证无法通过,再者就是上传虚拟机镜像时各种的不可用,申请虚拟机经常无法自动分配外部访问IP,导致无法连接等等。解决这些问题真是让我们费力不少劲儿,那时候基本上都是天天加班,看程序运行的日志,各种网上搜索,再加上那时OpenStack在国内并没有太多的研究者(或许有很多我不知道),没有太多的中文资料,很多错误和问题只能到国外的网站上去搜索,去问。大多数时候我们直接就把错误的日志截取一些重要的内容放到Google上搜。那时天天加班倒也不觉得辛苦,不觉得累,每每问题得到解决,大家都十分的高兴,这也是进步最快的一段时间,自己得到了很大的提升。我们几个人从刚接触OpenStack,到成功搭建好公司内部的第一个可广泛使用的云平台大概花了一个半月的时间,看到其他同事用着我们部署的云平台虚拟机,心里还是蛮爽的。(哈哈哈)


    到了2012年四月末,这段时间里我们项目组基本上每天是大小会议不断,为什么呢?因为公司把做分布式文件系统的任务分到我们部门了(这个时候还不能叫部门,确切的说应该是小组。因为在五月底我们才独立出来,组建独立的部门,专门负责为公司研发大数据存储引擎),于是各种前期预研,知识分享,方案讨论,设计评审,任务分工的会议就冒了出来。由于公司先前已开发出了一套数据存储的文件系统(公司先前一直靠它来做产品挣钱),但不是分布式的,不能适应即将到来的大数据。我们新部门的任务就是在公司现有理论基础以及技术积淀下设计一新的分布式文件系统,以便现有项目能迅速的迁移过来。经过一段时间的研究(其实,我们的架构师在2012年年初就已经开始研究并着手设计了)最终的数据存储这一块我们选用了OpenStack中的Swift。因为Swift本身就是一个很好的分布式对象存储系统(“站在巨人的肩膀上,让我们省了很多事情,加速了我们项目原型诞生”),其无单点
故障,多副本,高性能的小文件存储,跨平台的RESTful对外接口设计,易于水平扩容等特点非常适合我们。在其基础上做二次开发,对于我们来说再好不过了。(现在回想,当时的选择也并非完全正确,因为Swift采用HTTP协议进行数据传输,上层把数据传输到proxy服务——Swift分布式核心服务,在由proxy服务通过计算出数据真正的所在节点位置,然后再通过HTTP协议将数据传输到指定的节点上,在这个过程中很耗时,同时也很耗CPU,所以对于大量数据的容灾备份,其并不是一个很好的选择——个人愚见。还有就是其若一致性的分布式存储系统,由于前期的预研做得不够充分,我们的系统设计在这一点上吃了大亏,为了使系统没有单点的问题,并且在前期版本中尽量不适用数据库(因为那时还没有设计数据库中间件模块),刚开始我们将元数据设计存储到了Swift中。在Demo实现完成之后,在大压力下,上层常常出现不一致的问题,这对上层的APP来说是不能容忍的,后来我将Swift代码的读取副本数改为最少要返回两个,并且再请最新的数据予以返回,这样一致性提高了,但是性能又太挫了,满足不了项目的需求。经过一段时间的折腾,Swift最好只用于存储静态数据,经常变更或者一致性要求比较高的数据应该使用强一致的系统——Swift适合存储静态数据,这一点在官方文档中有叙述,当时没好好领悟,害大家多花了两个月的时间才改过来,把元数据上提,提前使用分布式数据库。这是多么痛的领悟啊!!!!!)。


    有了之前的OpenStack云平台部署的经验,Swift的研究并设计对外的C++数据访问,数据传输以及Swift管理接口的任务就由我来做了。在管理方面,我们设计了Thrift接口,为集群管理中心提供统一的Thrift服务化管理入口。这些接口主要包括对Swift Ring文件的管理(对Swift存储节点的增删,对磁盘的增删等)。关于数据接口的设计这里多提一点:我们在OpenStack中使用的Swift是带有认证的,为什么要用认证呢?因为Swift的设计是可以对外访问的,使用认证是为了安全考虑。而在我们的项目里,Swift只做存储,其对终端用户是透明不可知的,安全性由集群的其他模块保证。在剔除认证模块之后,对外访问接口的设计就简单得多了(现在想起来到是蛮简单的,无外乎就是Account,Container,Object的创建,对Metadata的修改,删除,列取对应的数据,下载Object的内容等等)。可在那时就没那么简单了,官方提供了Java,Python,C#的客户端,就是没有C++的,况且官方所提供的也不太适合我们项目的需求,最后只能根据实际情况自己设计并实现一套。经过不断的读官方的API文档,不断的实现验证,一个星期左右第一个版本的API被设计出来了,于是召集大家一起讨论,一起Review。由于大家都刚刚接触Swift,所以对第一个版本的接口也没什么太大的意见,只要符合接口设计规范就可以了,同时大家也一直认为先开发出来,把整个项目的Demo做先做出来是头等任务,在开发过程中遇到问题再提新需求。从后来的开发过程来看,当时的决定是正确的,虽然,我们后来有些接口一直没有使用,同时还添加了一两个接口以用于提高性能,但是我们并没有花太多的时间在接口的设计和讨论上,没有过度的设计,把大多数时间用于开发和模块整合上了,这样做加速了整个项目的Demo开发。


    虽然Swift的对外API很快完成了设计,但是在开发过程中我却遇到了一些困难,同时也走了不少的弯路。刚开始我们选用了boost的asio作为写HTTP客户端的库,在开发过程中并没有发现不妥之处,等开发完成,测试人员对整个项目的数据模块进行压力测试时才发现,潜在很多的问题。性能有点挫先不说了,就是常报读到文件尾,断开的管道问题就让我头痛了好一段时间。关于为什么会出现这两个问题:主要是因为客户端采用了HTTP长连接,并且使用了连接池,话说这些对提高性能是非常有用的,可是也正是因为这些技术的采用在服务端突然停止的时候问题就暴露了,这时客户端及容易拿到一个已经断开的连接来进行数据传输,还有就是数据传输时,连接已断开,客户端并没有发现,还在继续读取数据。后来在连接池上加入了对服务器端的心跳,问题得到了缓解,但是并没有根本上的解决。后来仔细想想,如果肯花时间去完善客户端的HTTP处理的代码,问题是可以解决的,可是那样不太值得。首先时间上也不允许,出现新的问题也不太好解决。于是,毅然将asio抛弃了,采用了稳定且使用广泛的libcurl,将数据传输的逻辑交个libcurl来处理,把更多的时间用于对返回数据的处理上。经过一段时间的折腾,也经过了一年多的使用和测试,到现在Swift客户端已不再更改了,而且也能稳定的运行。


    接触Swift马上快有两年的时间了,可以说已基本上掌握了其的工作原理,遇到问题也能快速定位,期间也给公司的同事做过Swift培训。回想起来,这两年里在Swift上遇到很多问题,也解决了很多问题。刚开始没有人指导,也没有很好的资料(除了源码),遇到问题只能把代码和错误日志拿来分析,看得多了,遇到得多了,很多问题也能够快速解决了。随着很多大公司和大牛们的加入,OpenStack项目也已经越来越好,越来越稳定,同时Swift也得到了很快的发展,记得刚开始接触的时候是1.4.8版,到现在都1.12.0版了。功能也新增了很多,但是其核心架构,核心思想并没有改变,代码量也并没有很大的增加,不过随着几个版本的发布,其代码结构是越来越清晰,让人读起来很舒服了。


    虽然说Swift有很多优点,但是个人认为其还是有一些缺点的:在用了一年多之后,我们发现随着文件数量的不断增多,其副本修复进程非常的占用CPU,而且是长时间的占用,这样就导致了整个服务器的压力很大,Linux中top load 持续保持在20%以上,对于其他程序来说就变得响应迟钝了。与此同时,replicator进程对于已经被从Ring文件中删除的磁盘,只要磁盘还被挂载在/srv/node/下还会去扫描,这样就导致改磁盘一直会有文件被打开,无法将其从系统中umount掉。Swift的副本修复功能强烈依赖于xinetd服务中的rsync,这样在xinetd服务被关闭之后数据就无法同步了。Swift也没有对所使用的磁盘进行空间监控,由于XFS文件系统会在磁盘被写满的情况下,导致写数据的进程会被其的崩溃而附带杀死(对于这个问题,我们已经无解了,只能期待Linux内核能解决),所以在磁盘写满的情况下Object
Server和xinetd服务很容易被杀死。Object Server死了,对应用层直接返回503,这样很难辨别到底是什么原因导致的。同时,xinetd服务崩了,如果副本出错就很难得到及时的修复。以上问题一时半会儿我们是无法解决的,在集群中我们只能通过某些办法避免它们的发生。比如说xinetd和Object Server的崩溃,通过实时监控服务来确保,如果发现服务死了就重新启动。XFS磁盘满了就对外发出告警,让管理人员及时知晓等等。


 。。。未完,待续 。。。(后面将会有Swift的配置,memcached,leveldb,本地缓存设计,mongodb等)






推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
author-avatar
禎冬魔_784
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有