分布式系统
文章平均质量分 79
Android路上的人
开源社区爱好者, Apache Hadoop PMC & Apache Ozone PMC, 专注于分布式存储领域, 大数据方面的研究
展开
-
分布式集群下的RPC限流方案
文章目录前言前言如今在大数据时代,面对如今规模数据体量快速增长的一个阶段,HDFS单集群模式已经无法支撑更加平稳高效的数据服务能力。多集群联合模式逐渐成为一种新的架构尝试,笔者所在公司亦是如此。我们内部目前采用了社区的RBF(Router-based Federation )方案来做统一的数据服务。最近我们在尝试解决一个棘手的问题:多用户的RPC隔离问题。这个问题其实在原始HDFS单集群模式本身也是存在的,但是在多集群模式下这个问题只会变得更为严重。多集群模式下,更多的用户数据被写入到集群,而这也意味原创 2022-01-03 21:33:54 · 1840 阅读 · 2 评论 -
Hadoop升级前需要考虑的一些事情
文章目录前言Hadoop升级的目标版本的选择Hadoop升级过程需要做的准备工作前言现今Hadoop版本已经release到了Hadoop 3.x版本了,社区迭代更新的速度还是很快的。新的版本相对旧版本来说,能够给我们带来很多益处,诸如新的功能feature,众多bug fix以及一些大的performance的改进。始终维护运行一个陈旧的系统,意味着后期可能会遇到许多许多社区已fix的bug,这个将会消耗掉系统管理员日常相当多的工作时间。尤其当我们维护的是一个具有庞大规模的分布式系统。所以对于复杂系原创 2021-02-27 18:07:50 · 1501 阅读 · 1 评论 -
Alluxio的Raft HA实现
文章目录前言基于Raft实现的要点Alluxio Raft HA实现的相关角色类前言Alluxio在HA的实现上,早期实现的方式是基于ZK(用来做领导选举)+shared journal storage(状态同步)的方式来达到其服务高可用性的。这种方式和HDFS目前的HA实现十分类似,不过后来Alluxio社区实现了基于Raft协议的新的HA实现方式,Raft实现库依赖了Raft Java实现库Apache Ratis。作为全新的HA实现,本文笔者结合Alluxio相关代码来简单聊聊里面的一些实现细节原创 2020-12-30 12:39:51 · 1683 阅读 · 1 评论 -
HDFS千万级别文件数/PB规模量级的数据迁移实战总结
文章目录前言HDFS元数据快速膨胀带来的性能瓶颈问题超大规模数据迁移所面临的挑战和困难DistCp的全面优化提升前言前面时间笔者曾写过一篇关于利用HDFS fastcopy功能来加速DistCp数据拷贝效率的文章(Distcp结合HDFS Fastcopy的性能改造提升),以及提到了现有DistCp在数据切分时候的一些问题(聊聊Hadoop DistCp的数据切分处理方式),会导致长尾任务的出现等等。其实在后续的测试过程中,我们还发现并解决了许多大大小小的坑,使得我们整体数据拷贝的耗时达到一个相对短的原创 2020-09-13 16:00:36 · 10516 阅读 · 4 评论 -
Distcp结合HDFS Fastcopy的性能改造提升
文章目录前言HDFS的fastcopyDistcp工具支持fastcopy的改造前言在HDFS中,我们经常会碰到跨集群数据拷贝的场景,例如某些任务数据结果计算生成,然后问你启动任务把结果数据导出到另外一个集群中以作后续的分析等这样的用途。Hadoop作为一套成熟完善的系统,也为我们提供了专门的拷贝工具,Distcp,全称Distributed copy,意为分布式的拷贝。说到Distcp工具本身,很多同学估计不会陌生,不过本文笔者来聊聊Distcp基于HDFS fastcopy原理下的性能提升改造。在原创 2020-08-19 23:57:23 · 1670 阅读 · 3 评论 -
Alluxio与底层存储系统之间的元数据同步机制
文章目录前言Alluxio内部的元数据同步行为基于给定时间,Path粒度的UFS Status Cache前言Alluxio作为一套构建于底层存储系统之上的中间层,它必不可少的会涉及到于底层系统之间metadata之间的同步问题。外部client请求访问Alluxio系统,然后Alluxio再从底层系统中(为称呼方便,后面都简称为Underlying FileSystem, UFS)查询真实的元数据信息,然后再返回给client。当然为了减少对于UFS的压力,我们当然不会每次都去查UFS。本文我们来聊原创 2020-08-11 23:44:42 · 2281 阅读 · 0 评论 -
关于小概率锁碰撞的细粒度锁方案
文章目录前言锁的细粒度级别基于小概率锁碰撞的lock pool实现方案前言在分布式系统中,我们常常使用锁来保证操作的一致性控制。但是锁的存在则意味着必然存在着锁竞争的情况。而且这种竞争会随着外部请求量的激增而变得更为的激烈。因此我们改进的一个方向是改变锁的粗细力度,从较为简单的粗粒度锁变为更细粒度的锁。细粒度锁相较于粗粒度锁来说,毫无疑问,它能减缓激烈的锁竞争的情情况,但是它在实现上会增加额外的复杂度。这个很好理解,在server端原先只需要维护一把锁就行了,现在则要可能维护一定规模量的小锁。本文笔者原创 2020-07-23 00:11:24 · 1162 阅读 · 1 评论 -
Alluxio基于冷热数据分离的元数据管理策略
文章目录前言Alluxio内部元数据管理架构Alluxio的支持异步写出功能的自定义Cache实现前言上篇文章末尾,笔者聊到了一种叫做分层元数据管理模式。它主张的思想是将元数据进行分级对待,比如Cache+Persist层2种,cache拿来用于热点数据的访问,而persist层即持久层则存储那些冷的访问不频繁的数据,以此达到元数据的强扩展性和一个较好的访问性能。当今存储系统Alluxio就是使用了这种分层级对待的元数据管理模式。本文我们就来简单聊聊Alluxio的tier layer的元数据管理。原创 2020-07-05 15:10:25 · 1987 阅读 · 1 评论 -
存储系统元数据管理演变升级
文章目录前言初代元数据管理内存式元数据管理分区元数据管理分层级元数据管理引用前言我们知道在一个存储系统中,不光光只有它所存储的数据文件重要,它的存储系统的元数据管理同样十分的重要。因为涉及到存储系统数据访问操作时,会经过存储系统元数据的查询或更新操作,如果元数据这边的操作出现性能瓶颈,同样会导致用户访问数据的行为出现缓慢的情况。本文我们来聊聊存储系统一般是如何做高效的元数据管理的,这里面会涉及到多种不同的元数据管理方式。初代元数据管理首先我们来看最简单原始的初代存储系统元数据管理方式,此时元数据原创 2020-07-02 23:48:25 · 949 阅读 · 1 评论 -
关于分布式系统升级,你需要了解的几点
文章目录前言分布式系统升级的状态转化关于Upgrade需要注意的点关于Downgrade需要注意的点引用前言对于一个系统来说,进行定期的升级维护是一件比较常见的事情。但是对于复杂分布式系统的升级,系统管理员系统考虑更多的因素来做升级这个事情。同时对于分布式系统开发者来说,他们也要考虑系统升级的前后兼容性,避免升级后部分老的功能无法使用或是升级回退后之前写出的数据无法使用等等类似的情况。本文笔者来简单聊聊关于分布式系统的升级,你需要了解和注意的那些事。分布式系统升级的状态转化在介绍本文主要内容前,原创 2020-06-13 11:04:49 · 1694 阅读 · 0 评论 -
提高RPC Server throughput的请求延时回复处理
文章目录前言前言在一套完整的分布式系统中,client端向server端发起一个请求,然后client等待此请求被server端处理完毕,然后接受到serve的返回结果。自此一个请求就算作是被处理完了。这种block等待处理结果的请求处理行为在我们日常的系统中十分的常见。但是这种处理方式的一个明显弊端是,未处理完成的请求势必会占住server端的处理资源。因此一般常见的改进做法是提高server端的Handler数量,来提高服务端的请求并发处理能力,这种做法是比较简单直接的。但其实这里还有另外一个方向原创 2020-05-24 23:40:18 · 960 阅读 · 0 评论 -
分布式系统内部RetryCache机制
前言在分布式系统的运行过程中,出现网络不稳定(例如网络超时)导致的client请求回复超时是时有发生的事。在这种低概率发生的情况下时,client端其实是无法感知它的请求是不是真正的被处理了,它只能是基于坏的情况(即请求没被server处理的情况),然后执行重试操作。问题就出现在这里,对于某些非幂的操作而言,操作重试是会返回不同的结果的。这个时候,其实server端不应该执行client端发起的第二次请求的,假设server已经成功处理了client的第一次请求。本文我们就来聊聊针对非幂等操作处理的Re原创 2020-05-17 10:28:15 · 961 阅读 · 2 评论 -
Apache Ratis中的multi-raft实现原理
文章目录前言Single-Raft模式Multi-raft改进引用前言在之前笔者写过一篇关于Ozone利用Apache Ratis multi-raft功能来提升其系统的throughput的文章(Ozone Multi-Raft机制对于更大throughput处理量的支持),不过那篇博文只是简单介绍了下在multi-raft的支持下,一个Ozone Datanode节点可以允许成为多个Pi...原创 2020-05-01 12:02:53 · 2999 阅读 · 0 评论 -
文件系统大目录下的操作性能效率提升
文章目录前言现有HDFS大目录文件操作效率基于哈希分区的多List目录存储结构HashedArrayList的element的索引查找HashedArrayList的代码实现HashedArrayList性能测试引用前言在文件系统的存储中,我们一般不建议是一个目录下存放过多的文件或子目录。因为这会造成后续在此目录下文件或子目录的操作效率。我们宁愿用分散存储的方式,也比用集中在一个目录下的方式...原创 2020-04-11 18:08:21 · 1949 阅读 · 0 评论 -
Ozone Insight工具的使用
文章目录前言Ozone的Insight视角Ozone的insight工具命令的使用引用前言分布式系统的运行过程比一般的企业级系统要复杂许多,里面会牵扯到很多服务的调用以及复杂的并行逻辑处理。因此对于分布式系统的问题研究分析,并不是一件简单的事情。但是如果我们有一些路径能够知道它里面运行的一些情况,比如关键metric指标等等,这会给我们带来很大的帮助。现有的许多系统提供的最多的可供外界使用的...原创 2019-12-14 16:56:14 · 1229 阅读 · 0 评论 -
Ozone Native ACL的应用
文章目录前言Ozone Native ACL的Access Type前言Ozone作为对象存储系统,它在权限访问这块用的是ACL的管控方式,而不是采用文件系统UGO(User-Group-Others)的方式。不过Ozone对传统ACL进行自定义的一些扩展,除了基本的READ, WRITE,访问权限外,还细分出了DELETE,LIST等等权限。本文笔者来简单聊聊Ozone的native AC...原创 2019-12-11 23:51:27 · 1233 阅读 · 0 评论 -
Ozone Audit Log解析工具的应用
文章目录前言Ozone的OM, SCM服务的audit log格式OM, SCM服务audit log的loadOM, SCM服务audit log的query和template query引用前言熟悉HDFS的同学可能经常会使用到audit log文件做问题的tracking。说起audit log,它的作用可不小,它按照时间顺序精确地记录了每次的请求操作。通过这些精确的记录,我们得以精确...原创 2019-12-08 11:57:47 · 1126 阅读 · 0 评论 -
Ozone数据探查服务Recon2.0设计
文章目录前言现今Ozone Recon的功能以及2.0版本的目标SCM Container的track实现方法一: 在SCM中新增实现API来获取丢失,损坏的Container数据前言在之前笔者写过一篇关于Ozone数据探查服务Recon的文章.Recon作为一个系统内部数据探查服务,它通过定期同步OM元数据,然后做内部的智能化分析(内部做数据聚合计算等等),可以帮助管理员方便了解系统内的数...原创 2019-12-03 23:55:32 · 1222 阅读 · 0 评论 -
聊聊关于YARN的全局调度
文章目录前言带有约束限制的调度全局调度的要求全局调度的流程前言在YARN调度的早期实现中,调度的方式是基于NM节点的心跳来的。简单来说,就是每当一次节点的心跳来的时候,YARN scheduler会进行一次container分配尝试,然后将最适合分配的应用container分配在此节点上。这种一个节点一次的调度方式在决策选择上确实比较高效,但在某些场景上并不显得最优,比如带有约束条件的cont...原创 2019-12-01 12:56:29 · 1356 阅读 · 0 评论 -
HDFS DeadNode Detection机制
文章目录前言HDFS DFSClient现有DeadNode监测DFSClient共享DeadNode的监测和恢复引用前言在大规模集群中,节点挂掉的现象是十分常见。当节点挂掉的时候,上面所跑的任务或者发送到这个节点的请求将会失败。按照分布式系统的正常处理方法,它会选择另外的节点进行重新的数据请求。这种重试机制在一定程度上可以解决因为节点意外挂掉导致的请求失败情况,但是这种方式并不是高效的。假...原创 2019-11-17 12:14:30 · 1432 阅读 · 0 评论 -
RocksDB部分优化设计
文章目录前言RocksDB部分功能设计Auto RateLimiterBulkloading by ingesting external SST fileBloom Filter前言RocksDB作为单例数据存储引擎,它能支持良好的数据吞吐量,同样可以很好地作为大型分布式系统元数据的持久化存储。RocksDB作为存储框架,其内部在设计实现中有着许多与分布式存储系统相似的地方,例如包括数据索引...原创 2019-11-09 09:33:23 · 1875 阅读 · 0 评论 -
HDFS Decommission改进设计
文章目录前言现有Decommission机制以及不足之处前言在大型HDFS集群中,每天个别节点由于硬件问题导致掉线是常用发生的事情。因此很多时候,我们会对集群中的故障节点做下线操作,就是我们常说的Decommission操作。简单地来说,DataNode节点的Decommission操作在大规模体量的集群下是日常维护行为。因此Decommission行为会涉及到上面数据拷贝的情况,因此下线操...原创 2019-11-02 14:04:37 · 1162 阅读 · 0 评论 -
高性能存储引擎RocksDB总体概览
文章目录前言RocksDB的整体模块RocksDB内部模块解读TerminologyBasic Operation前言笔者最近在学习一个第三方高效K-V存储系统RocksDB,相比较于其它类似成熟的存储系统而言,其中有很多共同之处,不过也有其独到设计之处。本文是笔者结合RocksDB GitHub上的wiki页进行的一个汇总整理,也顺当是帮助大家对RocksDB内部的整体模块设计有一个快速的...原创 2019-10-14 22:48:47 · 3084 阅读 · 0 评论 -
分布式系统阅读笔记(二十)-----分布式多媒体系统
介绍现在的分布式系统大有越来越往分布式多媒体系统的应用上走的趋势了。多媒体的应用本质上是对于持续数据流的一种消耗。包括音频以及视频,音频是由一个个audio Sample组成,而视频则是video frame组成。有时因为网络条件的原因,他是可以允许部分的延时的,延时造成的丢包率在一定比率上也是可以接受的。在多媒体应用中,很在意的quality of service服务质量的要求,因此他这里需原创 2015-01-26 15:25:59 · 2859 阅读 · 0 评论 -
分布式系统阅读笔记(一)-----分布式系统的特征
1)引言从今天开始,我将会开始学习分布式系统的一些理论知识,全方面的重新学习分布式的各个技术点,所以选用了原版本的英文教材>作为学习的资源。在期间,我会没读完一章,及时的做一些阅读的笔记,1个是怕自己忘了,还有一个是把知识分享给大家,这也是我首次阅读全英文的书籍,还是挺吃力的,希望能坚持把长达1000页的书籍学习完把。2)分布式系统的介绍分布式系统是通过网络连接各个计算机,通过消息通信原创 2014-12-18 13:18:17 · 5950 阅读 · 0 评论 -
分布式系统阅读笔记(十三)-----命名服务
介绍这篇笔记将要讲述的是命名服务,命名服务用一句话说就是帮助客户端进行资源的定位通过给定他们的名字的方式,与命名服务十分类似的,这里还会提到目录服务,具体的说是可以通过属性查找,后面将会以DNS,GNS等为例子。1、在这里说的名字是指与对应的对象进行了绑定的关系,而属性指的是对象与多个属性值进行了关联。在DNS中,IP地址与域名进行了绑定,在CORBA中,将对象的名字与对象的引用进行了映射原创 2015-01-08 16:50:46 · 5483 阅读 · 0 评论 -
分布式系统阅读笔记(二)----系统模型
1)引言这篇笔记将为你讲述在分布式系统中经常会提到的3种模型结构,而且也用在了很多的方面。2)介绍主要分为3个:1.物理模型,就是对于底层物理机子的一层包装。2.结构模型,由一系列的用于计算和通信的节点所组成3.基本模型,基本模型涵盖的方面是非常多的,具体细分可以有安全模型,用于沟通等的交互模型。3)物理模型简单的就一句话描述:由分布式系统中的底层的硬件设置组成的一原创 2014-12-19 15:44:35 · 3275 阅读 · 0 评论 -
分布式系统阅读笔记(三)-----计算机网络和网络互连技术
1)介绍当前网络在分布式系统中的主要问题有2个,1个是延时问题,还有一个数据传输速率的问题,后者可能受各方面的因素影响,比如网络总带宽的限制等。下面列表几个在分布式网络系统中的几个主要可能的讨论点:1.扩展性。2.可靠性。3.安全性。4.网络移动性。5.网络服务质量。6.多播传送。2)网络类型网络的类型有下面几种1.PAN,私人区域网络,是本地网络的一个子集原创 2014-12-21 16:06:50 · 2777 阅读 · 0 评论 -
分布式系统阅读笔记(二十一)-----分布式系统设计(Google Case Study)
介绍本篇笔记是分布式系统全书最后一部分的内容了,本身不会有新的知识点,主要还是给出一个具体的例子,去全面的了解一个完整的分布式系统的一些细节,包括设计个一些注意点,比如数据存储设计,协调服务,节点通信和分布式计算服务等等。首先设计一个全新的分布式系统的时候,重新回顾一下分布式系统存在的挑战:异构性,开放性,安全性,扩展性,并发控制等等,可见完成一个恶完整的分布式系统还是有很多的功课要做的。原创 2015-01-29 15:21:10 · 2489 阅读 · 0 评论 -
分布式系统阅读笔记(四)-----进程间通信
介绍)进程间通信的方式里包含了非常多的内容,比如用于实现进程间通信需要用到许多协议提供的API,在进程间的远程方法的调用上需要的约定一定的数据格式,这就衍生出了数据集中编组的一种方式。还有多播网络技术和对于特定应用的虚拟网络技术。协议的相关API)为了实现进程间通信中,根据不同类型的通信方式,系统有不同的API和类。进程间通信,离不开send process,和receive proc原创 2014-12-22 21:14:41 · 3648 阅读 · 0 评论 -
分布式系统阅读笔记(十四)-----时钟和全局状态
介绍在分布式系统中,时间是一个巨大的问题,因为在不同的电脑上会有他们自己的物理时间,如何做到状态事务的一致性往往比较难。缺少一个全局的物理时间使得很难去发现一段分布式程序的执行的状态是如何。时钟,事件,进程状态和时间同步算法小标题中提到的3个 名次在分布式的时间中出现最多频率的词。如何同步不同机器上的物理时间呢,下面简单的列举几个算法1、一个叫Cristian方法同步物理时间的办法原创 2015-01-12 11:22:26 · 5310 阅读 · 0 评论 -
分布式系统阅读笔记(十五)-----协调和一致性
介绍这里说的协调和一致性指的是在分布式系统的环境下,对于多进程访问共享资源的一个协调和数据状态的一致性的保证。其中的措施包括分布式的共有排除机理,在组通信中的协调和一致性的手段,还有这其中可能会出现的一些问题。在整个协调服务的过程中,有一个东西非常重要,就是失败的监听,这里需要一个失败监听器。可以用一个进程作为失败监听进程,都其他的进行进行监听,方式可以通过类似心跳机制,发送消息证明自己目前是原创 2015-01-14 14:17:00 · 3072 阅读 · 0 评论 -
分布式系统阅读笔记(六)-----间接通信
介绍)这次的内容其实与上篇学习的内容正好是相对的,之前的各种通讯方式其实说的都是直接通讯,而这次我学习的内容是间接通讯,二者的本质区别在于间接通讯把时间和空间进行了分离,直接通讯在这2点上都进行了耦合,有点事操作直接简单,但是缺点也是非常明显的,扩展性差,不能很好的面对变化。根据空间和时间2个维点,可以有4种不同的类型的通信方式,时间的分离是这样的形式:消息的本质在传送的过程中有一定的生存时间原创 2014-12-25 19:46:40 · 3541 阅读 · 0 评论 -
分布式系统阅读笔记(五)-----远程调用
介绍)这篇笔记主要讲的是远程调用的主要2种形式,RPC(远程过程调用),RMI(远程方法调用),这2种方法作为远程调用的实现形式,对于我们理解他们的过程非常有用。请求回复协议)在远程调用中,一个很重要的概念是啊请求回复协议,由客户端发送Request到服务端,服务端执行好操作之后,把结果在回传到客户端上,就完成了一个基本的调用过程。这里有几点比较重要的概念:1.消息标识别。这里指的原创 2014-12-24 09:31:04 · 2839 阅读 · 0 评论 -
分布式系统阅读笔记(七)-----操作系统的支持
介绍)前面主要介绍了一些直接通信和间接通信,包括一些中间件的一些技术,这次我学习的内容是层级再往下,用一句话形式就是:在分布式系统中的操作系统级别对于中间件的支持。在这篇中,主要关注与操作系统级别对于通信的一些支持,包括RPC这样的远程调用等。操作系统的层次)操作系统是一个凌驾于纯硬件资源上面的一个软件系统,封装了对于硬件的抽象,在上面有内存管理,I/O管理,CPU的管理等等。1.原创 2014-12-27 15:42:17 · 2151 阅读 · 0 评论 -
分布式系统阅读笔记(八)-----分布式对象和组件
一、介绍在分布式系统中,一个完整的中间件需要展现一定的对于上层程序语言的以及底层的物理设施的抽象性。而分布式对象和分布式组件恰恰是2种重要的实现方式。1、分布式对象包集成了面向对象的语言的特征和优点。能够使用户用类似面向对象的语言调用的层次上去实现远程的方法调用。2、分布式对象有下面的一些优点:1、包装性。2、他将一个对象的实现和对象本身分离了。3、具有动态性和扩展性。3、分布式组原创 2014-12-29 09:41:01 · 3606 阅读 · 0 评论 -
分布式系统阅读笔记(十六)-----事务和并发控制
介绍在分布式系统中,事务的运用和共享资源的并发控制是非常常见的。简单的说,事务就是一些原子的操作的集合。原子操作的意思就是要么操作成功要么操作失败,没有其他的选择。并发控制是出现在高并发场景的时候,本篇主要描述3种常见的手段,1、锁的措施。2、乐观并发控制手段。3、时间戳序列方式。在此之前,先回顾一下平时在写程序的时候,常见的用于同步的手段,比如说:1、用synchronize关键字,这个原创 2015-01-16 15:09:39 · 4206 阅读 · 0 评论 -
分布式系统阅读笔记(二十二)-----时钟和时钟同步
时钟的基本概念时钟时钟在一般意义上指的是一个计算机的物理时间,每个计算机都会包括他们自己的物理时钟,不同的计算机的物理可能会不同。时钟漂移经过在同个地方的计算机,他们的物理也有可能会不一样,如果他们从刚刚开始相同的时间计时开始,过了1过月,1年也可能会有快又慢,这在专业名词上讲叫做时间漂移。本质的原因是每秒的时间偏移,经过日记月累之后,就会有可能达到1秒钟的差距,解决的办法很简单,原创 2015-02-06 15:10:51 · 10625 阅读 · 1 评论 -
分布式系统阅读笔记(九)-----Web Service服务
一、介绍Web Service用一句话概括就是它提供了一个服务接口使客户端能够与服务端进行交互用非常多种的方式,超过普通的浏览器的模式。在Web Service中通常是以XML的格式方式进行传输和通信的。这其中还涉及了XML的Security安全方面的操作。1、Web Service服务是Web服务器的一个扩展形式。2、Web Service采用的XML的数据格式保证了可读性。3、原创 2014-12-30 15:57:03 · 2162 阅读 · 0 评论 -
分布式系统阅读笔记(十七)-----分布式事务
介绍分布式事务和上篇中说到的普通事务的差别在于他所涉及到的服务器超过1个。分布式事务可能是1层的也可能是嵌套多层的。为了协调分布式事务的,就出现了原子提交协议,比较著名的2pc协议就是其中的一个例子。之前的3种并发控制的方法锁控制,乐观并发控制,时间戳序列方法,经过一定的扩展也可以运用在分布式的事务上面。在分布式的事务上,还提供了恢复管理器用来进行对象,操作的恢复。之前已经讨论过在单一的服务器原创 2015-01-18 15:26:21 · 2654 阅读 · 0 评论