婉兮清扬

案上诗书杯中酒之快意人生

我的网络会变得更快吗?

发表时间:2013-01-16 09:16:26 评论:1

译者注:

最近Eucalyptus公司的联合创始人Graziano Obertelli连续写了几篇关于云服务的可维护性方面的博客文章。译者读后觉得很受启发,并决定花点时间将这几篇文章翻译成中文。这些博客文章的原始出处如下:

[1] http://gobertelli.blogspot.com/2012/12/its-maintainability-stupid.html
[2] http://gobertelli.blogspot.com/2013/01/maintainability-and-eucalyptus.html
[3] http://gobertelli.blogspot.com/2013/01/will-my-internet-be-faster.html

最近我写了篇关于云平台的可维护性的博客文章,又举了一个Eucalyptus的可维护性的例子。这回我要换一个角度,通过例子说明如何粗略地进行“负载-资源”映射。

我的网络会变得更快吗?(Will my Internet be Faster?)

在侏罗纪时代,我帮助一位用户安装一个古老版本的Eucalyptus(我想是Eucalyptus 1.4)。我们经历了一些麻烦(那时候还没有Faststart),不过他最终能够在两台服务器上创建虚拟机实例了。然后他问我:“现在我的网络变得更快了吗?”

我想,这个问题正确地表明了云计算这个流行语正在被越来越多的人等同于解决所有IT问题的万金油。另外,它也正确地指出了我们需要充分了解底层的硬件设施才能够获得理想的性能。一个私有云能够达到和底层网络设施一样的传输速度,能够具备和底层硬件资源同样的处理能力。云计算提供了很强的灵活性,但是也有性能损失的危险 - 如果我们没有根据负载来规划硬件设施的话。

案例讨论:云存储(Case In Point: Cloud Storage)

所有的云计算资源最终都要映射成物理资源,例如CPU、内存、网络、磁盘。在这里我要着重讨论一下云存储,一方面是因为它很重要(没有人不关心他的数据吧?),另一方面是因为历史上有很多与云存储相关的问题。值得一提的是,我们在Eucalyptus 3.1.2中解决了由于磁盘负载过高而导致的随机性失效问题。









back-envelope
这篇文章里要进行的一些估算

从我上面这幅涂鸦作品中,你可以看到临时性存储是存放在计算节点(Node Controller,NC)上的,而弹性块存储(Elastic Block Storage,EBS)是由存储控制器(Storage Controller,SC)来处理的。我们很快地看一下这两者是如何使用的:

  • 临时性存储:基于实例仓库(instance-store)的实例和从EBS启动(Boot from EBS,BfEBS)的实例都使用到临时性存储,不同之处在于基于实例仓库的实例还使用临时性存储来存放root分区和交换空间(swap);

  • 弹性块存储(EBS):任何挂载到实例上的卷都使用弹性块存储,从EBS启动的实例还使用弹性块存储来存放root分区和交换空间(swap)。


资源竞争的情形:

  • 临时性存储:在同一个计算节点上的实例会竞争同一个存储资源;

  • 弹性块存储:在同一个可用域(availability zone,在Eucalyptus中等同于一个集群)中使用弹性块存储的实例会并竞争同一个存储控制器。


在这个例子中,我用了一个简单的电子表格来帮我进行计算。你可以任意拷贝、修改、改进这个电子表格,不过你需要记住这只是一个学习工具而不是一个真正的资源计算器 - 为了简化计算,有太多的因素没有被包括在这个电子表格中。

在这个例子中,我使用IOPS来衡量底层存储的速度.









reference-values
不同设备的IOPS数据可能有很大的差异。如上数据只是粗略地表明IOPS性能的量级。

在接下来的例子中,我做了一个不太合理的假设 - 所有的实例都平等地访问存储资源(包括临时性存储和弹性块存储),以及它们可能在20%或者100%的时间里需要访问存储资源。需要说明的是,在20%的情况下,Oracle 会自动地对并行的磁盘访问请求进行优化(也就是说,如果同时运行少于五个实例的话,它们得到的是最快的存储性能,实例之间不存在资源竞争的情况)。

也就是说,20%代表了轻量级的应用场景,实例在大部分时间里都在发呆;而100%代表了重量级应用场景,实例可能正在进行压力测试。启动实例是一个磁盘IO密集型进程,一方面是因为Eucalyptus需要为启动实例准备磁盘映像(需要拷贝好几个个GB的文件),另一方面是因为操作系统在启动过程中需要读取磁盘。在这个电子表格中,我专门添加了一栏以显示在轻量级应用场景下启动实例的磁盘负载开销。

家庭级配置(Home setup)

一个家庭级的云试验环境通常使用基于本地存储的存储控制器。这里我们用一个IOPS计算器来进行性能估算。在存储控制器上,我使用了两块15000转的Seagate Cheetah硬盘,做了个RAID 0,估算得到的IOPS数据是343(为了简单起见,就算是350吧)。在节点控制器上,我使用了一块相对较快的硬盘(非SSD硬盘),假定其IOPS可以达到150。

对于一个家庭级的云试验环境来说,三个计算节点看起来是个不错的数字。我们假定每个计算节点都有足够的CPU核心以及内存,能够运行多于10个虚拟机实例(12~24个CPU核心,12~24 GB的内存应该足够了)。如果我在每个计算节点上运行一个基于实例仓库的实例、一个从EBS启动的实例、以及一个EBS卷。这个不太靠谱的计算器给出的数据如下:









small-light
家庭级的云试验环境,在虚拟机数量较少的情况下,在最坏情形下存储性能也相当于一块5400转硬盘。

这个家庭级的云试验环境看起来还不错嘛。就算是在各个实例中对所有的磁盘进行iozone测试(最坏情形),我们也能够得到相当于单块5400转硬盘的性能。 接下来我们增加一点负载,在每个计算节点上运行四个基于实例仓库的实例、四个从EBS启动的实例、以及两个EBS卷。这时候我们得到如下数据:









small-heavy
家庭级的云试验环境,在虚拟机数量较多的情况下,在最坏情形下存储性能可能跟软盘差不多。

这回就有点意思了。如果各个实例的磁盘负载不大的话(最优情形),我们可以得到类似于7200转硬盘的性能。但是,如果各个实例的磁盘负载很高的话,磁盘IO的性能就跟侏罗纪时代的软盘差不多了。哼哼!

企业级配置(A More Enterprisy setup)

根据上面的数据,在大型的云计算环境中,显然需要考虑使用基于SAN存储的存储控制器。在这个例子中,我使用了一套Dell Equallogic存储设备,将其存储性能配置为5000个IOPS。此外,我们将计算节点的数量增加到10个。

我们还是从较轻的负载开始。在每个计算节点上运行一个基于实例仓库的实例、一个从EBS启动的实例、以及一个EBS卷。(和家庭级云试验环境是一样的,但是现在我们一共有20个正在运行的虚拟机实例了。)









medium-light
配备了SAN存储设备的企业级云试验环境,在虚拟机数量较少情况下,所有的数据看起来都很好。

这个结果看起来非常好。EBS存储性能在最坏情形下还能够达到250 IOPS,在最优情形下甚至能够达到1250 IOPS。临时性存储的性能与家庭级云实验环境相比没有发生什么变化,在最坏情形下还能够达到75 IOPS,相当于一块5400转硬盘(也就是常见的3.5寸台式机所配备的硬盘)的性能。

接下来我们增加一点负载,在每个计算节点上运行四个基于实例仓库的实例、四个从EBS启动的实例、以及四个EBS卷。这时候我们得到如下数据:









medium-high
配备了SAN存储设备的企业级云试验环境,在虚拟机数量较多情况下,在最坏情形下EBS存储性能相当于一块5400转硬盘。

临时性存储的表现还是不够理想,就跟我们在家庭级云实验环境所看到的一样 - 现在每块本地硬盘上要承载8 个虚拟机实例(从EBS启动的实例也需要访问本地硬盘,在这个简化计算中所有的磁盘是使用情况是一样的)。EBS的性能有了大幅度的降低,在最坏的情形下与一块5400转硬盘相当。虽然所有的实例还有足够的IOPS来访问存储设备,但是这时候云管理员应该考虑增加一个可用域(集群)了。

快照(Snapshots)

上面的例子没有考虑到制作快照对存储性能的影响。快照使得我们可以对卷进行备份,并将数据从一个可用域转移到另一个可用域(在一个可用域中制作的快照,可以作为母本在任何可用域中创建新的卷)。快照被存储在Walrus上,也就是说每次我们创建快照的时候,我们从存储控制器(SC)上将一个卷的完整拷贝保存在Walrus上。如果在一个云上频繁地制作快照,可以想像存储控制器、Walrus、还有网络的性能都会受到很大的影响。

期望值(Expectations)

可以认为,上面例子中的数据反映的都是特定应用场景下的最佳性能。在这些分析中我们忽略了网络性能、来自其他进程的磁盘访问等等众多因素。譬如说,Eucalyptus缺省地使用实例仓库来提供交换空间(swap),而大部分Linux发行版都会在安装的时候创建一个swap分区(在Eucalyptus中,从EBS启动的实例可能大部分都需要swap)。因此,这些虚拟机实例在内存不够用的时候都会往相应的磁盘上写数据,从而造成额外的负载。

在这些模拟分析中,我们假定虚拟机实例的负载是相互独立的,并且假定它们之间有一个协作机制使得整个云试验环境的整体磁盘访问达到了最佳情形。在一个生产环境中,创建虚拟机、销毁虚拟机、创建EBS卷、创建快照的时间和顺序基本上是无法预测的,这些都会对存储(包括临时性存储和弹性块存储)造成额外的负载。

在我前段时间发表的关于可维护性的博客文章里面提到,对负载进行采样能够帮助你对云服务进行测试和性能调优,使其能够满足最终用户的要求。

让网络快起来(Making Internet Faster)

在上面的估算中,我们没有考虑任何来自软件因素的性能影响(例如Eucalyptus各个组件本身也是消耗资源的)。事实上,Eucalyptus各个组件对物理资源的需求是在不断降低的。譬如说,在Eucalyptus 3.0以前,计算节点直接地拷贝多个GB的磁盘影像文件,现在我们使用device mapper来减少磁盘访问请求。此外,配置有SAN存储插件的存储控制器增加了一个称为DASManager的模块(DAS是Direct Attached Storage的缩写,指的是直接挂载到宿主机上的存储资源,例如一块磁盘或者一个分区),使得我们能够绕过文件系统对卷进行操作。

speed

和以前的版本相比较,Eucalyptus 3有了很大的性能提升,但是我们还有很大的优化空间,譬如使用分布式文件系统和软件定义网络(Software Defined Network,SDN)。的确,目前Eucalyptus还不能够让网络快起来,但是我们正在往这个方向努力。

Eucalyptus的可维护性

发表时间:2013-01-16 03:43:15 评论:0

译者注:

最近Eucalyptus公司的联合创始人Graziano Obertelli连续写了几篇关于云服务的可维护性方面的博客文章。译者读后觉得很受启发,并决定花点时间将这几篇文章翻译成中文。这些博客文章的原始出处如下:

[1] http://gobertelli.blogspot.com/2012/12/its-maintainability-stupid.html
[2] http://gobertelli.blogspot.com/2013/01/maintainability-and-eucalyptus.html
[3] http://gobertelli.blogspot.com/2013/01/will-my-internet-be-faster.html

最近我写了一篇博客文章讨论私有云的可维护性为何重要。在这篇文章中,我列出了成功部署一朵私有云需要采取的一些措施,并在部署和维护阶段用Eucalyptus作为IaaS管理软件的例子进行了讨论。

部署(Deploy)


我已经提过我们做很多工作,使得Eucalyptus的安装更加容易,在这里我做一个简单的小结。Eucalyptus为主要的Linux发行版制作了安装包,只需要简单配置一下软件仓库,就可以用yum install或者apt-get install命令来完成软件安装。Eucalyptus的配置还是稍微有点复杂,需要将各个组件进行注册,但是这些步骤是可以自动化的(在FastStart里面各个组件就是自动注册的)。

显而易见,对完美的追求是永无止境的。不过我敢说,从分布式系统的角度来看,我们已经已经把安装过程做得尽可能简单。此外,优秀的系统管理员们都在用软件来管理基础设施。所以,我认为能够用脚本来定制化并管理安装过程是至关重要的(例如Eucalyptus可以用ansiblechefpuppet来定制化和管理安装过程)。

维护(Maintain)


如果你关注我们的最新进展的话,你可能已经知道我们最近发布了Eucalyptus 3.2版本。RichMarten通过博客对这个版本进行了一些描述,DavidAndrewKyo也通过博客对某些特性进行了详细说明。作为一个云管理员,我觉得他们的博客文章并没有详细说明我们在改善Eucalyptus的可维护性方面所做的努力。









Screenshot from 2012-12-30 14_23_32
在Eucalyptus 3.2中修复的缺陷

Eucalyptus 3.2修复了350个缺陷 - 这里我指的是那些被记录在案的缺陷,还有一些缺陷是我们在对代码进行重构的时候直接修复的。各位可能注意到大部分的缺陷是与新特性相关的,但是还有大量的缺陷是与Eucalyptus的健壮性(也就是可维护性)相关的。不相信吗?我可以举几个例子:

  • 重写了存储控制器(Storage Controller,SC)的部分代码,防止云管理员意外地配置了一个不希望被使用的后端存储;

  • 为高可用(HA)功能增加了安全机制,防止云控制器(Cloud Controller,CLC)精神分裂(译者注:也就是两个云控制器都以为自己才是老大);

  • 为孤儿实例(如果节点控制器由于某种意外不能够及时地将该节点上的实例信息更新给云控制器的话,该节点上的实例可能成为无人照看的孤儿实例)提供了更健壮的处理方法;

  • 修复了内存泄漏和数据库连接池泄漏的问题(在特定的应用场景下,这样的缺陷可能需要重启某些组件,估计大家都不会喜欢的)。


你可能会觉得我们新的用户界面很酷。我认为这也是一个强大的基础设施令人喜欢的特性之一。











euca-console-dashboard
用户界面的屏幕截图,借用自David的博客



改进的空间(Are we there yet?)


前面我已经说过,对完美的追求是永无止境的。我们在Eucalyptus 3.2版本中的主要工作在于扩大质量测试(QA)的范围、使得代码更加健壮,能够适应更多的应用场景。这些工作对于大部分人来说是不可见的,但也正是这些工作使得一个基础设施能够经受时间的考验。


这些不可见的工作完成之后,我们接下来的工作就更容易理解和分类了。在Eucalyptus 3.3版本的研发计划中,我看到了许多令人期待的特性,例如自动扩展(AutoScaling)、 云监控(CloudWatch),以及弹性负载均衡(ELB)。如果你特别需要某个特性,请你告诉我们,或者在我们的缺陷跟踪系统中给这个特性投上一票。我们不会因为不断地增加新的特性而忘记了一个基础设施的根本。譬如说,我们在维护模式(Maintenance Mode)以及网络方面的工作能够使得我们更好地管理云计算资源,例如VM类型(vmtypes)和标签(tagging)。


还有其他改进的空间吗?我在前一篇博客文章里面提到,除非是一个基础设施已经被废弃,不然的话总有事情要做。的确,我们还有很大的改进空间,不过我们现在已经挺好用的。

云平台的可维护性

发表时间:2013-01-15 17:20:25 评论:1

译者注:

最近Eucalyptus公司的联合创始人Graziano Obertelli连续写了几篇关于云服务的可维护性方面的博客文章。译者读后觉得很受启发,并决定花点时间将这几篇文章翻译成中文。这些博客文章的原始出处如下:

[1] http://gobertelli.blogspot.com/2012/12/its-maintainability-stupid.html
[2] http://gobertelli.blogspot.com/2013/01/maintainability-and-eucalyptus.html
[3] http://gobertelli.blogspot.com/2013/01/will-my-internet-be-faster.html

最近我一直在使用FastStartSilvereye,并参与开发了一个在单台服务器上安装云服务的脚本。我还写了一篇博客文章,介绍如何在一台笔记本上安装Eucalyptus。我甚至用发布推特消息的方法来计时,结果表明只要15分钟的时间就可以完成Eucalyptus的安装。这的确是个不错的成绩,但是我想我们可不能忘记了我们搭建私有云的最终目的。

私有云基础设施(On-Premise Cloud as Infrastructure)

我认为Eucalyptus(或者任何其他私有云管理软件)的安装仅仅是部署私有云过程中的一个环节。它既不是第一个环节,更不是最重要的环节。我所说的私有云,指的是基础设施服务(Infrastructure as a Service, IaaS),其重点在于基础设施而不是服务。当我说起基础设施这个词的时候,我会想起卫星、电网、渡槽、互联网等等。作为基础设施,它们具有一些共同的特征。这里我想要讨论的一个特征是可维护性。

可维护性(Why Maintainability?)

基础设施的作用是提供或者支持最基本的服务。当基础设施崩溃时,其结果通常是非常严重的(想象一下断电、断水、断路)。基础设施必须是可依赖的(你能够在不牢靠的地基上盖房子吗),必须具有很长的声明周期(只有演示原型才是临时性的),在其服役期间能够承受各种不同的负载(想象一下高速公路和互联网,它们现在所承担的负载和设计初衷是完全不同的)。因此,基础设施需要具备适应负载的能力(弹性,elasticity)以及分离或者限制失效范围的能力(可靠性,reliability),保持正常的功能并且能够被正常访问(可用性,availability),能够与多个具有类似设计的基础设施相互操作(互操作性,inter-operability),并且限制操作人员的介入(减少人为故障)。在我看来,如上所述种种都是可维护性的根本。在这里我同意Cloud Admin的观点,可维护性包含了可靠性和可用性,因为从管理的角度来看,一个不可靠也不可用的基础设施根本是不可维护的。

部署私有云(Deploying On-Premise Cloud)

那么,我们如何才能够成功地部署一朵私有云呢?我认为主要的困难集中在早期规划、前期准备、负载预测这些环节。其中最重要的部分是理解未来私有云的实施形式以及负载来源,以及设计一个逐步将硬件资源和软件应用转移到私有云上的迁移路线。这听起来似乎很简单,对吧?

1、理解你的负载(Learn your Workload)

在大多数情形下,一朵私有云是为一组特定应用、特定部门、特定用户、或者是特定场景提供服务的。也就是说,未来私有云上的负载情况基本上是可以预知的。我们需要将这些负载分解为计算、网络、存储几个部分,了解各种负载平行发生的可能性以及峰值范围。在可能的情况下,对未来的负载进行预测。

在这个环节,对真实的负载进行采样或者创建模拟负载 是非常有用的。这样做并不容易,在有些情况下甚至不可能。但是,有了一个负载模型之后,我们就能够对架构设计和部署实施进行验证。

2、“负载-资源”映射(Map Workload to Cloud Resources)

云计算资源有三个基本组成部分:计算(CPU和内存)、存储、网络(带宽、安全、隔离、IP地址)。将系统的负载转换成云计算资源的使用量,能够帮助我们规划私有云的规模和容量。

此外,云计算资源的使用情况与最终用户的成熟度也有很大的关系。刚刚接触云计算的用户,往往严重依赖于EBS(基于EBS的实例,使用EBS卷);但是当应用具备了云觉知(cloud-aware)能力之后,他们就习惯于使用实例仓库(instance-store)了。

3、准备物理设施(Prepare your Physical Infrastructure)

当我们用云计算资源使用量来定义负载时,我们就可以定位可能的性能瓶颈,并在此基础上准备必要的物理资源来承担这些负载。需要注意的是,某些类别的云计算资源可能同时对不同类别的物理资源都有需求。例如:基于EBS启动的实例可能同时对存储控制器(提供EBS服务)和网络(节点控制器需要调用远程的存储进行启动)都造成压力。

此外,我们还需要将进行某些操作所造成的负载考虑在内。例如,启动实例的时候节点控制器可能需要将虚拟机映像从Walrus服务拷贝到本地磁盘。这些操作可能会对网络(传输虚拟机映像的流量,虚拟机实例本身的流量)、Walrus服务(多个节点同时请求不同的虚拟机映像)、或者本地磁盘(实例的缓存、临时性存储)造成contention压力。

物理设施的准备工作对于私有云的可扩展性是至关重要的。如果不能够轻便地增加存储或者升级网络(或者重新配置网络),就无法根据负载需求对云服务进行动态扩容(除非是停止服务进行重新安装)。

4、部署实施(Deploy)

当物理设施准备停当之后,我们终于可以进行部署了。现在我们开始在对应的服务器上安装各个组件:云控制器(Cloud Controller,CLC)、Walrus、集群控制器(Cluster Controller,CC)、存储控制器(Storage Controller,SC)、节点控制器(Node Controller,NC)。通常来说,做这些事情花不了多少时间,半个小时总可以搞定了吧。当然,在一个配置有多个集群、高可用性、SAN存储的生产环境里面,部署时间还要更长些。

5、运营维护(Maintain)

当一朵云被部署完毕后,它就成了一个基础设施。因此我们需要保证它总是可用的,包括在升级(云管理软件、宿主机操作系统、路由器固件都需要在不关闭整体云服务的前提下进行升级)、失效(单台宿主机或者单个组件的失效不能够影响整体云服务,但是可以影响某些实例和某些请求)、扩容(增加节点、集群、存储、网络)、负载峰值(性能可以逐步恶化,但是不能崩溃)等等情况下。

如上所述各个步骤也可以在部署实施之后进行(你可能需要对有问题的负载进行采样,或者部署新的组件),但是它们依然属于维护的范畴。唯有如此,一个基础设施才能够有条不紊地提供服务,成为人们必不可少但又经常被忽视的一个部分。当一个基础设施存在的时间足够长之后,人们会认为这些服务是利索当然的,只有在出现问题或者是短缺的时候才会引起人们的注意(只有在断电的时候电网才会出现在新闻里)。也就是说,当你的云服务不再是可维护的时候,你就会出现在新闻里。

译者注:
翻译完这篇文章,突然想起最近关于AWS的新闻比较多呢。

使用AWS CLI操作Eucalyptus私有云

发表时间:2013-01-14 21:01:28 评论:0

翻看Eucalyptus网站上的博客聚合页面,看到Andy Grimm最近写的一篇如何使用AWS CLI操作Eucalyptus私有云的帖子。按照Andy Grimm提供的教程快速地做了一遍,觉得这是个不错的工具,就顺手记录下来。这个帖子参考了Andy Grimm原的原文,但是并不是原文的一个中文翻译版。

原文地址:http://agrimmsreality.blogspot.com/2013/01/using-aws-cli-with-eucalyptus.html

[快速安装]

AWS CLI的安装非常简单。在Ubuntu下都只需要运行如下命令:

sudo apt-get install python-setuptools

sudo easy_install awscli

如果你有幸生活在伟大的防火墙以外的话,你可能不会遇到类似于下面的彩蛋。如果你不幸遇到下面的彩蛋,建议你先花点时间找释迦牟尼、默罕默德、救主耶稣谈谈心,或者找个移民中介帮你办理一些简单的手续。

Downloading http://argparse.googlecode.com/files/argparse-1.2.1.tar.gz
error: Download error for http://argparse.googlecode.com/files/argparse-1.2.1.tar.gz: [Errno 54] Connection reset by peer

[配置AWS帐号]

首先你需要在AWS有一个帐号,然后通过浏览器登录到http://aws.amazon.com/,点击右上角的“我的帐户/控制台”链接,然后在Security Crendentials部分找到你的Access Key ID和Secret Access Key。

创建一个新的配置文件~/aws_config.conf,内容如下:

[default]
aws_access_key_id = AWS_Access_Key_ID
aws_secret_access_key = AWS_Secret_Access_Key
region = us-east-1

将如上文件的属性设置为仅有所有者可读,例如0600。然后设置一个名为AWS_CONFIG_FILE的环境变量,该环境变量的值是如上所述配置文件的全路径,例如:

export AWS_CONFIG_FILE = ~/aws_config.conf

完成如上简单配置之后,可以用如下命令测试一下配置是否成功:

aws help

aws ec2 help

aws ec2 describe-instances

[配置Eucalyptus帐号] 

找到你的botocore安装目录,在Ubuntu 12.04 Server操作系统上,这个目录是/usr/local/lib/python2.7/dist-packages/botocore-0.4.2-py2.7.egg/botocore。在Mac OS X 10.8.2操作系统上,这个目录是/Library/Python/2.7/site-packages/botocore-0.4.2-py2.7.egg/botocore。进入该目录下的data/aws子目录,修改两个文件:

首先修改_regions.json文件,在region的定义最后增加一个条目:

"ecc": {
"description": "Eucalyptus Community Cloud"
}

然后修改_services.json文件,在ec2的regions部分的末尾增加一个条目:

"ecc": "http://eucalyptus.ecc.eucalyptus.com:8773/services/Eucalyptus"

需要说明的是,上面这个设置中所提供的URL是针对桉树社区云服务的。如果您使用的是您自己的私有云,您需要根据您的私有云设置修改这个URL。

创建一个新的配置文件~/euca_config.conf,内容如下:

[default]
aws_access_key_id = EUCA_Access_Key_ID
aws_secret_access_key = EUCA_Secret_Access_Key
region = ecc

如上配置中的EUCA_Access_Key_ID和EUCA_Secret_Access_Key可以从您下载到的eucarc文件中获得。具体的方法可以参考使用桉树社区云服务(Eucalyptus Community Cloud)或者在Mac上安装euca2ools工具这两个链接。

重新设定AWS_CONFIG_FILE环境变量:

export AWS_CONFIG_FILE=~/euca_config.conf

完成如上简单配置之后,可以用如下命令测试一下配置是否成功:

aws ec2 describe-images

如果你需要在AWS和Eucalyptus之间进行切换,只需要重新设定AWS_CONFIG_FILE环境变量即可。(现在大家可以看出Eucalyptus与AWS相兼容的好处了吧。任何一个针对AWS开发的工具,经过简单的配置之后就可以用在Eucalyptus上。)

在Mac上安装euca2ools工具

发表时间:2013-01-12 14:33:22 评论:2

[安装git]

如果你的Mac还没有安装过git,你可以从https://code.google.com/p/git-osx-installer/下载最新的版本进行安装。按照缺省的安装设置,git会被安装到/usr/local/git目录下。修改你的~/.bash_profile,将git的可执行目录添加到您的PATH路径中:

export PATH="/usr/local/git/bin:$PATH"

在终端下运行git命令测试一下:

git

[ 安装euca2ools]

git clone https://github.com/eucalyptus/euca2ools.git

cd euca2ools

sudo easy_install boto

sudo easy_install m2crypto

sudo python setup.py install

[下载身份认证信息]

登录进入桉树云管理界面。在左上角Eucalyptus公司LOGO的右侧,点击您的帐号名称会激活一个弹出菜单,点击弹出菜单中的“Download new credentials”即可下载您的身份认证信息(euca2-admin-x509.zip)。将下载到的ZIP文件解压输到一个目录,例如~/euca2-admin-x509。

屏幕快照 2013-01-11 上午9.22.34

编辑~/euca2-admin-x509目录下的eucarc文件,将第一行中EUCA_KEY_DIR设置为的刚才存放解压缩文件的文件夹,例如:

EUCA_KEY_DIR=~/Downloads/euca2-admin-x509

保存该文件,通过source命令设定必要的环境变量:

cd ~/euca2-admin-x509
source eucarc

[开始使用]

经过这些简单的配置,就可以在Mac上使用euca2ools工具了。接下来执行euca2ools中的一些命令了,测试一下:

$euca-describe-availability-zones verbose
$euca-describe-images

使用桉树社区云服务(Eucalyptus Community Cloud)

发表时间:2013-01-11 20:39:19 评论:6

最近有一些做云计算的同行问:桉树有没有提供类似于TryStack或者StackLab之类的公共体验环境呢?实际上,桉树早在2010年就启动了桉树社区云服务(Eucalyptus Community Cloud,ECC)项目,向社区成员以及合作伙伴提供体验以及研发环境。任何对Eucalyptus感兴趣的公司或者个人只需要注册一个帐号,即可象使用其他公有云服务一样在桉树社区云上创建虚拟机映像、创建虚拟机以及进行其他管理操作。

在桉树社区云服务上注册一个帐号非常简单。你只需要通过浏览器访问下面这个链接,点击右上角的“Signup Account”,在随后出现的界面中输入帐号名称、邮件地址、登录密码等等信息并点击“OK”按钮提交。桉树社区云服务会自动地给你发送一份电子邮件,其中包含了激活您的帐号所需的一个链接。您点击该链接后您所申请的帐号就会被激活,这时您就可以使用您刚刚申请的帐号登录进入桉树社区云服务了。在登录的时候,account那里是您刚刚申请的帐号,user那里输入admin,password那里输入您刚刚设置的密码。

https://communitycloud.eucalyptus.com

屏幕快照 2013-01-11 上午9.13.29

登录进入桉树社区云服务之后,您看到的是类似于下图所示的桉树云管理界面。在左上角Eucalyptus公司LOGO的右侧,点击您的帐号名称会激活一个弹出菜单,点击弹出菜单中的“Download new credentials”即可下载您的身份认证信息(euca2-admin-x509.zip)。

屏幕快照 2013-01-11 上午9.22.34

接下来你需要安装euca2ools工具。使用Ubuntu的用户可以通过如下命令安装euca2ools:

sudo apt-get install euca2tools

使用CentOS或者RHEL的用户,可以通过如下命令安装euca2ools:

yum install http://downloads.eucalyptus.com/software/eucalyptus/3.1/centos/6/x86_64/epel-release-6.noarch.rpm
yum install http://downloads.eucalyptus.com/software/euca2ools/2.1/centos/6/x86_64/euca2ools-release-2.1.noarch.rpm
yum install euca2ools

将刚才下载到的身份认证信息解压缩:

unzip euca2-admin-x509.zip

source eucarc

接下来就可以执行euca2ools中的各种命令了,例如:

$euca-describe-availability-zones verbose
$euca-describe-images

Eucalyptus 3.2版本提供了一个用户门户,用户可以通过浏览器管理自己的虚拟机和块存储。桉树社区云服务的用户可以通过下面这个链接访问用户门户。显而易见,和基于命令行的用户界面相比较,这个基于浏览器的图形化用户界面要更加友好一点。

https://communitycloud.eucalyptus.com:8888/

屏幕快照 2013-01-17 上午8.55.47

 

总的来讲,对于暂时没有资源安装一个自有的Eucalyptus私有云但是又希望拥有云管理员权限的同行来说,桉树社区云服务提供了一个很好的起点。建议各位对Eucalyptus感兴趣的同行注册一个帐号,有空的时候看一看。

在CentOS 6.3上安装Eucalyptus 3.2

发表时间:2013-01-10 01:21:07 评论:7

12月底,Eucalyptus 3.2正式发布。最近终于有时间在一台服务器上快速安装了一遍。在这里做个简单的纪录,供有需要的同行参考。这个安装过程基本上是下面这个英文链接的翻版,主要的不同在于原作者安装的是3.1版,而我安装的是3.2版,并且增加了下载和注册虚拟机映像、管理门户、用户门户等等内容,使得这个入门级的教程更加完整了。

http://cptyesterday.wordpress.com/2012/09/20/single-system-test-cloud-take-2/

在安装过程中所进行的所有操作,都是以root用户的身份来进行的。

[系统配置]

单台双路服务器,配置两颗Intel Xeon E5420 @ 2.50 GHz的处理器,8 GB的内存, 全新安装的CentOS 6.3 x86_64操作系统。只有一个网卡接到一个1000 Mbps的交换机,配置IP为192.168.1.10,与局域网内的其他服务器位于同一C 类子网。由于所有的用户都要从192.168.1.0这个网段访问虚拟机,我们将这个网段看作是外网,并将192.168.1.20~40预留下来作为虚拟机的外网IP地址。

编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0,内容如下:

DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no

编辑文件/etc/sysconfig/network-scripts/ifcfg-br0,内容如下:

DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.1.10
NETMASK=255.255.255.0
NETWORK=192.168.1.0

编辑/etc/sysconfig/network,添加下列配置:

NOZEROCONF=true

重新启动网络服务,使得上述配置生效:

service network restart

接下来关闭系统防火墙。运行下面的命令,并在弹出的界面中取消已经启用的防火墙:

system-config-firewall-tui

编辑/etc/selinux/config,将SELINUX设置为permissive或者disabled:

SELINUX=permissive

运行下面的命令使如上配置生效:

setenforce 0

配置NTP服务:

yum -y install ntp
chkconfig ntpd on
service ntpd start
ntpdate -u pool.ntp.org
hwclock --systohc

[Eucalyptus安装]

首先安装Eucalyptus的软件源:

yum install http://downloads.eucalyptus.com/software/eucalyptus/3.2/centos/6/x86_64/eucalyptus-release-3.2.noarch.rpm
yum install http://downloads.eucalyptus.com/software/euca2ools/2.1/centos/6/x86_64/euca2ools-release-2.1.noarch.rpm
yum install http://downloads.eucalyptus.com/software/eucalyptus/3.2/centos/6/x86_64/epel-release-6.noarch.rpm
yum install http://downloads.eucalyptus.com/software/eucalyptus/3.2/centos/6/x86_64/elrepo-release-6.noarch.rpm

然后安装Eucalyptus云控制器(Cloud Controller,CLC):

yum groupinstall eucalyptus-cloud-controller

然后安装Eucalyptus的其他组件:

yum -y install eucalyptus-nc eucalyptus-cc eucalyptus-sc eucalyptus-walrus

到这里为止,Eucalyptus的安装就完成了。在此基础上,我们还需要针对我们的网络环境做一些配置。

首先编辑/etc/eucalyptus/eucalyptus.conf,修改配置如下:

CREATE_SC_LOOP_DEVICES=256
NODES="192.168.1.10"
USE_VIRTIO_NET="1"
VNET_MODE="MANAGED-NOVLAN"
VNET_PRIVINTERFACE="br0"
VNET_PUBINTERFACE="eth0"
VNET_BRIDGE="br0"
VNET_PUBLICIPS="192.168.1.20-192.168.1.40"
VNET_SUBNET=172.31.0.0
VNET_NETMASK=255.255.255.0
VNET_ADDRSPERNET="16"
VNET_DNS=8.8.8.8

当我们安装eucalyptus-nc服务的时候,我们顺带地安装了libvirtd,而libvirtd又顺带地安装了dnsmasq。但是dnsmasq跟Eucalyptus有一些不兼容的地方,因此我们把dnsmasq给禁用掉:

service dnsmasq stop
chkconfig dnsmasq off

接下来对Eucalyptus进行初始化:

euca_conf --initialize

接下来启动Eucalyptus的各个组件:

service eucalyptus-cloud start
service eucalyptus-cc start
service eucalyptus-nc start

注册各个组件:

/usr/sbin/euca_conf --register-walrus --partition walrus --host 192.168.1.10--component walrus-single
/usr/sbin/euca_conf --register-cluster --partition cluster01 --host 192.168.1.10 --component cc-single
/usr/sbin/euca_conf --register-sc --partition cluster01 --host 192.168.1.10 --component sc-single
/usr/sbin/euca_conf --register-nodes "192.168.1.10"

到这里为止,一个基于单台服务器的Eucalyptus云已经安装配置完毕,可以使用了。我们可以使用如下命令来获得管理员用户的授权资料:

euca_conf --get-credentials admin.zip

将admin.zip解压缩,设定必要的环境变量:

unzip admin.zip
source eucarc

执行如下命令,应该可以看到Eucalyptus云的概述:

$ euca-describe-availability-zones verbose
AVAILABILITYZONE cluster01 192.168.1.10 arn:euca:eucalyptus:cluster01:cluster:cc-single/
AVAILABILITYZONE |- vm types free / max cpu ram disk
AVAILABILITYZONE |- m1.small 0005 / 0008 1 512 5
AVAILABILITYZONE |- c1.medium 0002 / 0004 2 512 10
AVAILABILITYZONE |- m1.large 0002 / 0004 2 1024 15
AVAILABILITYZONE |- m1.xlarge 0002 / 0003 2 2048 20
AVAILABILITYZONE |- c1.xlarge 0001 / 0001 4 4096 20

[下载虚拟机镜像]

用eustore-describe-images命令查看EuStore上公开发布的虚拟机映像:

$ eustore-describe-images
0400376721 fedora x86_64 starter kvm Fedora 16 x86_64 - SELinux / iptables disabled. Root disk of 4.5G. Root user enabled.
2425352071 fedora x86_64 starter kvm Fedora 17 x86_64 - SELinux / iptables disabled. Root disk of 4.5G. Root user enabled.
1107385945 centos x86_64 starter xen, kvm, vmware CentOS 5 1.3GB root, Hypervisor-Specific Kernels
0696716400 centos x86_64 starter kvm Updated - CentOS 5 1.3GB root, Hypervisor-Specific Kernel; 2.6.18-308.11.1.el5 kernel version
3868652036 centos x86_64 starter kvm CentOS 6.3 x86_64 - SELinux / iptables disabled. Root disk of 4.5G. Root user enabled.
1347115203 opensuse x86_64 starter kvm OpenSUSE 12.2 x86_64 - KVM image. SUSE Firewall off. Root disk of 2.5G. Root user enabled. Working with kexec kernel and ramdisk. OpenSUSE minimal base package set..

用eustore-install-image命令下载一个EuStore上的虚拟机映像并注册到本地云,例如:

eustore-install-image -i 3868652036 -s "CentOS 6.3 x86_64" -b centos_6.3 -k kvm

在如上命令中,-i参数指定的是EuStore上公开发布的虚拟机映像的ID,-s参数指定的是该虚拟机映像被注册到本地云之后的名称,-b参数指定的是该虚拟机映像被存储到本地Walrus服务上的bucket名称,-k参数指定的是本地云的虚拟化技术类型(xen或者kvm)。需要说明的是,-s参数中的空格会被系统转换成'-'字符,所有的大写字母会被系统转换成小写字母。另外,-b参数所指定的bucket名称不能含有大写字母,不然的话在将虚拟机映像写入Walrus的时候会失败。(一个明显不合理的地方是,对-b参数的合法性检查是在指定的虚拟机映像下载完毕后才进行的。如果你的外网连接比较慢,花了一个小时的时间总算下载了一个虚拟机映像但是注册失败的时候,你一定会同意我的观点的。)

[管理门户]

通过浏览器访问管理门户,其URL地址为https://192.168.1.10:8443/。第一次登录时,使用的用户名和密码都是admin,系统会强制要求您在登录后立即更改admin用户的密码。下面是完成登录后的一个屏幕截图:

屏幕快照 2013-01-10 上午12.36.54

[用户门户]

Eucalyptus的用户门户是需要单独安装的,其安装过程倒也非常简单,只需要一个命令:

yum install eucalyptus-console

不需要进行任何配置,用户门户就可以使用了。如果你需要中文界面,编辑 /etc/eucalyptus-console/console.ini,修改language设置为zh_CN即可:

language: zh_CN

如果你修改了任何配置,需要重新启动eucalyptus-console服务:

service eucalyptus-console restart

通过浏览器访问用户门户,其URL地址为https://192.168.1.10:8888/。你可以使用管理员用户登录,也可以在管理门户中创建其他用户后用其他用户的身份登录。下面是完成登录后的一个屏幕截图:

屏幕快照 2013-01-10 上午1.07.04

[其他]

没有其他啦。总的来说,Eucalyptus 3.2的安装和配置还是比较简单的。如果硬件配置和网络状况还可以的话,用一个小时基本上可以完成从裸机到Eucalyptus云的全部安装与配置工作。

对于懒得一步一步地进行安装配置的同学,还有一个更加简单的方法,那就是使用Eucalyptus所提供的FastStart工具。简单地说,FastStart是一个定制过的CentOS 6.3安装光盘(ISO格式),其中包含了KVM和Eucalyptus 3.2的自动安装和配置工具。使用FastStart的安装过程实在是过于简单,这里我就不进行介绍了。

Eucalyptus FastStart的下载地址:

http://go.eucalyptus.com/Download-FastStart.html

OpenNebula 3.8相关教程

发表时间:2013-01-08 11:11:02 评论:0

最近连续写了一些与OpenNebula 3.8相关的入门级教程,做个合集吧。

2012-12-06, OpenNebula 3.8中文语言包

2012-12-06, 使用VirtualBox创建KVM磁盘镜像文件

2012-12-21, Ubuntu 12.04 Server安装配置OpenNebula 3.8

2012-12-24, VM性能的快速测试方法

2013-01-06, OpenNebula 3.8 — 本地存储

2013-01-07, OpenNebula 3.8 — 监控

2013-01-08, OpenNebula 3.8 — VLAN

接下来该写点与Eucalyptus相关的东西了,毕竟现在给Eucalyptus打工呢。(有人问我在给Eucalyptus打工的时候写OpenNebula相关的内容会不会有问题。其实Eucalyptus是一家非常开放的公司,在这个方面没有任何问题。)

OpenNebula 3.8 -- VLAN

发表时间:2013-01-08 10:28:47 评论:0

在前些时间发布的一篇教程中,我们介绍了如何在Ubuntu 12.04 Server上安装和配置OpenNebula 3.8。在本教程中,我们将讲述如何在OpenNebula中创建和使用VLAN。在进入本教程之前,我们假定您已经学习过如下内容:

Ubuntu 12.04 Server安装配置OpenNebula 3.8
OpenNebula 3.8中文语言包
使用VirtualBox创建KVM磁盘镜像文件
VM性能的快速测试方法

首先我们需要在计算节点上安装必要的软件:

sudo apt-get install vlan vconfig

在计算节点上的oneadmin用户需要能够以无密码的方式执行vconfig、brctl和ip等等命令。最简单的方式就是修改/etc/sudoers文件,在文件的末尾增加这么一行:

%sudo ALL=(ALL) NOPASSWD : ALL

需要说明的是,增加这么一行使得所有具有sudo权限的用户在通过sudo执行命令时都不需要输入密码,这样做是有潜在安全风险的。我们这里这样做只是为了通过最简单的配置迅速地让OpenNebula能够跑起来。

装载802.1Q内核模块:

sudo modprobe 8021q

你可能需要将8021q这个模块写入/etc/modules中,这样每次系统重启之后就会自动地装载这个模块:

在SunStone管理界面中添加新的计算节点,将“网络管理组件”设定为802.1Q。如果你使用命令行来添加新的计算节点,命令行的格式如下:

onehost create host01 -i im_kvm -v vmm_kvm -n 802.1Q

如下截图演示了如何在SunStone管理界面中添加新的虚拟网络。将虚拟网络模式设定为802.1Q,指定物理网卡名称(例如eth0),设定VLAN为“是”,网桥和VLAN ID可不填写。相关参数设定好之后,点击对话框下面的“创建”按钮,这个VLAN就定义好了。

屏幕快照 2013-01-08 上午10.06.57

在使用VLAN之前,我们还需要创建一个新的模板。在“设置网络”部分,我们需要选择一个预先定义好的VLAN。经过这些简单的配置,当我们基于这个模板创建虚拟机时,系统就将虚拟机放到指定的VLAN中。(前面我们在定义VLAN配置时,并没有指定网桥的名称,也没有指定VLAN ID。在这种情况下,OpenNebula会自动地在计算节点上创建必要的网桥,并且分配一个VLAN ID。如果系统管理员已经为我们的应用分配了VLAN ID的话,那么我们可以在定义VLAN配置时使用系统管理员所分配的VLAN ID。)

屏幕快照 2013-01-08 上午10.14.24

 

最后,需要说明的是,VLAN仅仅是提供了一种将网络进行隔离的方法,切勿将VLAN当作一种安全措施来使用(VLAN offers absolutely no security)。

OpenNebula 3.8 -- 监控

发表时间:2013-01-07 21:52:42 评论:0

在前些时间发布的一篇教程中,我们介绍了如何在Ubuntu 12.04 Server上安装和配置OpenNebula 3.8。在本教程中,我们将讲述如何在OpenNebula中如何利用ganglia来对计算节点和虚拟机进行监控。在进入本教程之前,我们假定您已经学习过如下内容:

Ubuntu 12.04 Server安装配置OpenNebula 3.8
OpenNebula 3.8中文语言包
使用VirtualBox创建KVM磁盘镜像文件
VM性能的快速测试方法

OpenNebula缺省地使用自带的监控组件来对计算节点和虚拟机进行监控。这个缺省的监控组件以固定的频率通过SSH登录到所有的计算节点,获取关于计算节点以及虚拟机的相关信息并保存在数据库中。在基础架构的规模比较大的情况下,同时创建大量SSH连接的开销也是很大的,因此这个缺省的监控组件存在潜在的性能问题。在OpenNebula中提供了一个通过ganglia对计算节点和虚拟机进行监控的方法,可以与用户当前的ganglia监控体系进行集成。

对于从来没有使用过ganglia监控工具的初学者来说,通过如下简单的步骤就可以快速设置一个ganglia监控环境。这里我们假定需要监控的两台服务器都在一个C 段子网中,运行的操作系统都是Ubuntu。在其中一台服务器上安装ganglia-monitor、gmetad和ganglia-webfrontend组件:

sudo apt-get install ganglia-monitor gmetad ganglia-webfrontend

sudo ln -s /usr/share/ganglia-webfrontend /var/www/ganglia

sudo service ganglia-monitor start

sudo service gmetad start

假设第一台服务器的IP地址为192.168.10.10。我们通过浏览器访问http://192.168.10.10/ganglia/就可以看到ganglia所提供的监控报表,在最右边的Hosts up栏目应该显示有一台活跃的主机。接下来我们在第二台服务器上安装ganglia-monitor:

sudo apt-get install ganglia-monitor

sudo service ganglia-monitor start

在缺省的情况下,ganglia-monitor组件通过multicast广播的方式发送监控信息,gmetad模块会自动发现同一广播域中所有安装有ganglia-monitor模块的节点。因此,我们刷新过浏览器之后,应该可以看到最右边的Hosts up栏目显示有两台活跃的主机。

对于一个规模不大的基础架构来说,将所有的物理主机和虚拟机都用ganglia监控起来也许是个不错的选择。为了达到这个目的,我们只需要在制作虚拟机操作系统映像的时候事先安装配置ganglia-monitor模块。经过这样处理之后,所有事先安装有ganglia-monitor模块的虚拟机启动之后都会自动地以multicast的方式广播自己的监控信息,而在同一广播域内安装有gmetad模块的节点会收集到这些活跃节点的监控信息,并在ganglia所提供的监控报表中体现出来。

在ganglia所提供的监控报表中,如果你看到有一些物理主机或者虚拟机被标示为localhost的话,可能是你的DNS服务器设置有问题。你可以使用nslookup命令(例如nslookup 192.168.1.1)来查看DNS解析是不是有问题。解决的方案是修改各个节点上的/etc/resolv.conf文件,提供一个正确的DNS服务器地址(例如8.8.8.8)。进行这些修改之后,需要重启各个节点上的ganglia-monitor和gmetad服务。

在服务器配置有双网卡的情况下,使用multicast广播的方式可能会遇到一些意想不到的困难,比如说在ganglia所提供的监控报表上根本找不到你的节点。在这种情况下,比较容易的解决方法是使用unicast单播方式发送数据,在配置参数中直接指定数据接收节点的IP地址。修改各个被监控节点上的/etc/ganglia/gmond.conf文件,修改udp_send_channel和udp_recv_channel两个参数,如下:

udp_send_channel {
#mcast_join = 239.2.11.71 #注释掉
host = 192.168.1.1 #这一行是新添加的,host是运行ganglia-webfrontend的节点名称,需要根据你的网络情况和ganglia部署情况来修改
port = 8649
ttl = 1
}

udp_recv_channel {
# mcast_join = 239.2.11.71 #注释掉
port = 8649
# bind = 239.2.11.71 #注释掉
}

进行如上修改之后,需要重新启动ganglia-monitor服务。这时候从ganglia的监控报表中应该可以看到你的节点了。

为了将ganglia监控体系与SunStone集成在一起,我们还需要做一些额外的配置。首先。编辑管理节点上的~/etc/oned.conf文件,删除如下配置前面的注释:

IM_MAD = [
name = "im_ganglia",
executable = "one_im_sh",
arguments = "ganglia" ]

并将vmm_kvm部分的配置修改为:

VM_MAD = [
name = "vmm_kvm",
executable = "one_vmm_ssh",
arguments = "-t 15 -r 0 kvm -l poll=poll_ganglia",
default = "vmm_ssh/vmm_ssh_kvm.conf",
type = "kvm" ]

重新启动OpenNebula使如上配置生效:

one stop
one start

将管理节点上oneadmin用户~目录下的文件~/var/remotes/vmm/kvm/poll拷贝到计算节点上oneadmin用户的~目录下。

在计算节点上,以oneadmin用户的身份设置设置一个定时运行的任务:

crontab -e

在crontab配置文件中加入这样一行:

* * * * * gmetric -n OPENNEBULA_VMS_INFORMATION -t string -v '$HOME/poll --kvm'

使用如下命令往OpenNebula中添加计算节点:

onehost create host_ip -i im_ganglia -v vmm_kvm -n dummy

经过这些简单的配置,从SunStone中看到的计算节点和虚拟机监控信息就是由ganglia采集的了。

使用ganglia进行监控的另外一个好处在于ganglia将各个节点的监控信息保存在RRD数据库中(缺省的数据目录为/var/lib/ganglia/rrds),我们还可以通过自定义的程序来对这些监控数据进行处理。
更晚内容 更早内容

云与清风常拥有,
冰雪知音世难求。
击节纵歌相对笑,
案上诗书杯中酒。

2020年12月31日
洛杉矶

最新评论


2026-07-23 11:37:04
qyjohn 评论了 《几句翻译》

2026-07-21 20:11:28
wells 评论了 《几句翻译》

2025-11-15 06:29:51
qyjohn 评论了 《青桔》

2025-11-14 01:55:04
wells 评论了 《青桔》

2025-10-24 18:04:06
Ted Wang 评论了 《关于作者(About Me)》

2025-03-27 08:28:09
Max 评论了 《父亲走了》

2025-03-08 04:13:52
W 评论了 《我不想颂扬普京大帝》

2024-07-22 16:02:03
云思 评论了 《无题》

2024-06-27 10:01:54
yiming 评论了 《致访客(Welcome)》

2024-05-06 08:50:06
qyjohn 评论了 《致访客(Welcome)》

2024-05-03 19:49:00
jimmie 评论了 《致访客(Welcome)》

2024-02-19 03:32:57
林小静 评论了 《埋剑渡》

2024-01-05 03:54:28
路过者 评论了 《2023年度盘点》

2024-01-04 10:22:05
qyjohn 评论了 《致访客(Welcome)》

2024-01-04 08:05:13
qyjohn 评论了 《2023年度盘点》