2012年4 月月 发布的文章

云里雾里的云计算 【7】-转载自邓侃博士的博客

【8】云中说禅
云计算是一个大买卖,各大公司不会眼睁睁看着Google吃独食。IBM,Yahoo,Amazon,Microsoft等等相继跟进,都在宣传自己的云计算方案。
Google 致力于云计算研究与实践,已经有十年了,技术积累厚实,说话底气足。其它公司嚷嚷归嚷嚷,总得拿出点真材实料,否则靠什么争取客户?从头开始研究开发当然是来不及了,于是IBM也好,Yahoo也好,Amazon也好,纷纷借Open Source的Hadoop,作为自己切入云计算市场的基石。
看一看IBM的Blue Cloud方案,以及Amazon的EC2方案,除了Hadoop以外,它们还用到了另一个开源软件,Xen。Xen是Zen的异体词,Zen的意思是禅。
计算机技术和禅有什么关系?
看看Lucent公司的Logo。第一次见到这个logo的时候,不解。请教老美,老美很吃惊,说,“这是禅啊,你们东方的东西。”
这个用毛笔画出来的圆圈,英文名字叫Enso。这个符号来自日本,通常被当作禅的标记。凭心而论,日本在世界范围内弘扬东方文化,是做了很大贡献的。譬如西方人对禅的了解,主要来自于日本的推介。

云里雾里的云计算 <wbr>【7】
Lucent Logo Courtesy http://www.techshout.com/images/lucent-logo.jpg
1974年,美国出版了一本名字很古怪的书,“禅与摩托车维护的艺术:对价值的探求(Zen and the Art of Motorcycle Maintenance:An Inquiry into Value)”。这本书的主线是一伙人骑摩托,17天环游美国的游记,其中穿插了大量的哲学讨论。此书出版后,受到极大欢迎。

2003年,剑桥大学计算技术实验室的几个人在合写一篇论文,文章写得差不多了,但是还缺一个标题。其中一位开玩笑地建议到,“要么就叫Zen and the Art of CPU Cycle Maintenance吧”。众人大悦。
最后论文定名为“Xen and the Art of Virtualization”。同时,把整个项目定名为Xen。 Xen是做什么的?
用一句话来概括,Xen的目标,是如何在一台计算机的硬件上,同时运行多个OS。什么情况下需要在同一台计算机上同时运行多个OS?
举个例子,现在电脑病毒日益猖獗。纵然有卡巴斯基等等解药,但是道高一尺魔高一丈,病毒屡禁不止,而且毒性越来越烈,常常危及整个OS。
有人出了一个主意,在同一台电脑的硬件上,同时运行多个OS,把一些基本的应用放在一个OS上,其它的应用留在其它OS上。用户切换OS的方式,犹如切换窗口一样。如果一些应用染上了病毒,最多把该应用所在的OS重装,而不至于影响其它OS,尤其是不必担心硬盘上重要的文件遭到破坏。
为什么Xen与云计算有关?
在云计算平台上运行的程序,来自不同的客户。不能保证这些客户程序没有bugs,也不能杜绝恶意的破坏性程序。如何保证一个客户的程序,不至于破坏其它客户的程序运行,不至于损坏其它客户的文件?
最简单的办法是给不同的客户分配不同的机器,井水不犯河水。但是这样的做法不能高效率地使用资源。美国客户的高峰时段,恰巧是中国客户的夜间休息时段。如果分别给美国中国客户分配不同机器,美国高峰时段,美国客户的机器忙不过来,而中国客户的机器却在闲置。
所以最理想的做法,是让不同客户共享计算机硬件,但是各自拥有各自的OS。这样,既高效地使用硬件资源,又保证井水不犯河水。
Xen提供了实现这一目标的技术解决方案,所以借着云计算的东风,Xen大热。 云里雾里的云计算 <wbr>【7】
The structure of a machine running the Xen, hosting a number of different guest OSes. Courtesy http://www.freesoftwaremagazine.com/files/www.freesoftwaremagazine.com/nodes/1159/slide2.jpg
上图描述的是Xen的体系结构。最底层的是计算机硬件,包括CPU,RAM,硬盘接口,网卡,外设数据总线等等。
硬件层之上,是Xen hypervisor层,包括总控界面(Xen Control Interface),虚拟CPU,虚拟RAM,虚拟硬盘,虚拟网卡等等。
在 Xen层之上,是各个OS实例(OS instances)。其中最左边的OS实例很特别。在启动Xen的时候,最左边的OS实例,Domain0 on XenoLinux,自动被启动。Domain0里运行着Xen Control Software,这个软件控制着各个OS实例的启动,终止,以及监控其运行情况。
Domain0对于其它OS实例的控制,是通过Xen层中Xen Control Interface来实现的。而这个Xen Control Interface只对Domain0开放。其它OS实例只有被管理的义务,而没有管理其它实例的权力。
每个OS实例都被分配一套虚拟的CPU,RAM,硬盘和网卡。每个OS实例使用这些虚拟的设备,与通常的OS并无不同。
多 个OS实例共享CPU的实现,是通过两套机制来完成。当多个OS实例请求使用CPU,这些请求被放置在hypercall队列里。Xen hypervisor根据预先设定的优先级政策,在hypercall队列里挑选出下一个被执行的请求。请求被处理完了以后,Xen通过异步的事件响应机制(async event-callback handler),把结果反馈给相应的OS实例。所谓虚拟CPU,说白了就是这两套机制的interface APIs。
在启动一个新的 OS实例的时候,Domain0会给它分配一部份RAM。如果实际运行中,需要更多的RAM,Domain0会增加这个OS实例的配额,直至最高上限。各个OS实例都有自己的RAM区域,彼此不相互干扰。从每个OS实例的眼中看,似乎自己的RAM区域在物理上位于相邻区域。但是事实上不是这样。这种善意的欺骗归功于虚拟RAM。虚拟RAM不仅记录着物理RAM的分配和使用,而且负责地址的翻译等等工作。
至于Disk IO和Network IO的读写请求,被放置在一个环状队列中,通过Consumer-Producer锁机制进行异步操作。
每个OS实例配备着一个虚拟硬盘,这个虚拟硬盘记录着每个OS实例所占用的物理硬盘的空间。每个OS实例只能看到分配给自己的硬盘空间,而不能看到其它OS实例的硬盘里的文件。而Domain0是例外,它能够看到整个硬盘系统中所有文件。
Xen的详细描述和分析,可以读前面提到的那篇论文,“Xen and the Art of Virtualization”,http://www.cl.cam.ac.uk/netos/papers/2003-xensosp.pdf。
Xen开源软件的下载,可以去Xen网站寻找。http://www.xen.org/

云里雾里的云计算 <wbr>【7】

VMWare infrastructure Courtesy http://www.topgreat.com.tw/WebMaster/uploads/images/1_images/l_070508152747.jpg
Xen 并不是横空出世的新创意。计算机界往往出现工业界领先于学术界的局面,Virtualization技术就是这样一个例子。早在1998年,硅谷Palo Alto出现了一家公司,最早实现了多个OS共享一台计算机的设想。这家公司的名字叫VMWare,现在卖给了EMC。 http://www.vmware.com
Xen与VMWare在技术上有很大相似之处。从Xen的论文看,Xen的技术似乎比VMWare有更多优势。但是从产品系列的完整,以及多年来的实际运行经验来看,VMWare似乎能够提供用户更可靠的稳定性和售后服务。

云里雾里的云计算 【6】-转载自邓侃博士的博客

【7】天上究竟会有几朵云?
上一章长篇大论地讨论,云计算是否能够提供有效的加密措施,保障客户的内容以及程序,不被云计算平台的拥有者偷窥。
我们的结论是悲观的。
既然云计算平台无法提供有效的加密措施,那么云计算平台只能吸引那些对于自己的内容和程序的保密不那么敏感的企业。
但是大型企业,包括银行和电信,它们对云计算能够提供的超大规模存储能力,以及超大规模并行数据处理的能力,有天然的需求。
怎么办?
现实的解决办法是帮助大型企业建设属于它们自己的云计算平台。
换而言之,未来的天空中,将漂浮着Google和Microsoft几朵云,这是几朵大云。在大云的周围,散落着一些小云。
如何构建云计算平台?
说来也不很神秘。云计算平台的基本思想,可以简单概括为,设计一套操作系统,同时管理多台电脑,尤其是把多台电脑结合起来,当一台超级电脑使用。
想深入了解云计算技术,以下论文是不能不看的。
1. Google File System: http://research.google.com/archive/gfs-sosp2003.pdf
把多个电脑的硬盘组合起来,形成一个超大规模的硬盘,用来存储海量数据,同时保障万一有某些硬盘崩溃了,不至于遗祸整个系统。
2. MapReduce: http://labs.google.com/papers/mapreduce-osdi04.pdf
如何实现并行计算。道理很简单,但是用好却不容易。下面两篇论文,可以作为范例,指导如何正确使用MapReduce。
2.1. Large Language Models in Machine Translation http://acl.ldc.upenn.edu/D/D07/D07-1090.pdf
2.2. Parallelizing Support Vector Machines on Distributed Computers http://books.nips.cc/papers/files/nips20/NIPS2007_0435.pdf
3. Chubby lock service: http://research.google.com/archive/chubby-osdi06.pdf
电脑操作经常要用到锁机制,譬如用锁防止两个进程同时向同一个文件写数据。这篇论文谈的是,在由多台电脑组成的分布式系统中,集中管理锁的机制。
4. BigTable: http://research.google.com/archive/bigtable-osdi06.pdf
这篇文章既是讲如何实现分布式数据库,同时也可以把它看成范例,如何正确使用Chubby锁机制,和GFS文件系统。
5. The Google cluster architecture: http://www.computer.org/micro/mi2003/m2022.pdf
各个组成部分完成以后,如何组建一个计算中心。这是这篇文章的主题。
Google式云计算平台有两大特色,
1. 便宜。即使用几台穷人买得起的烂PC,也能构建一个麻雀虽小但是五脏俱全的Google式云计算平台。其实,Google自己就是这么起家的。
2. 稳定。便宜的机器经常死机。Google式云计算平台,能保证一部份机器死机不会造成整个系统的崩溃。

云里雾里的云计算 <wbr>【6】

A cluster consisting of many cheap PCs Courtesy http://www.inria.fr/actualites/inedit/images/inedit29_parta.fr.jpg
以前CMU有个教授,说过这么一段话,大意是:遇到一篇以前没有读过的论文,最好先蹲在厕所里翻翻。很多论文无病呻吟,或者装神弄鬼。对待这样的论文,处理的办法是立刻冲掉。不幸的是,大多数论文都可以这样处理。
后来,这段话被记者捅了出去。系主任不得以,不仅公开道歉,而且内部通报批评该教授,不该说这种politically incorrect的话。但是暗地里,很多师生都非常认同教授的看法。
前面几篇文章,不仅不能被冲掉,而且值得反复读,再三读。读完这些论文,你一定会对这两个人感到亲切,Jeffrey Dean和Sanjay Ghemawat。
如 果说Google的两位创始人Larry Page和Sergey Brin确定了Google搜索引擎的算法和数据结构,那么奠定了Google后台的集群系统,也就是我们今天耳熟能详的Google云计算平台,就是 Jeffrey Dean 和Sanjay Ghemawat这两位。

云里雾里的云计算 <wbr>【6】

Jeffrey Dean, Ph.D Courtesy http://research.google.com/people/jeff/jeff.jpg

云里雾里的云计算 <wbr>【6】

Sanjay Ghemawat, Ph.D Courtesy http://research.google.com/people/sanjay/sanjay.jpg
但是,只读这么几篇论文是不是就足够了呢?
No!
对比一下传统的单机的操作系统,如果把GFS理解为云计算版的文件系统,把MapReduce理解为云计算版的进程管理,把Chubby理解为云计算版的synchronization。
缺了什么?
1. Memory management。2. Scheduling。
为什么不列举这两个方面的论文,方便大家阅读?
因为Google没有发表。或许是Google把这两个方面的技术,视为Google云计算的核心机密,所以才没有发表论文公开介绍。
读完论文后,想构建一个云计算平台,是不是必须写程序,从头实现?
No!
Hadoop是一个开源项目,把前面提到的几个Google式云计算技术,用Java实现了。
我们不妨站在Hadoop台阶上,把未尽的事业推向前进。前进方向,
1. Memory management。2. Scheduling。
 

如何参与开源项目

如何参与开源项目
1、从Google Code svn上下载源代码
2、maven 导入项目
 
找到你感兴趣的点来入手,然后就来社区上混就可以了,否则只是看文档什么的其实是很无聊的。但是有一点要注意,在问问题的时候一定要经过思考,而不是一有问题就马上发问。我也经常会看见这样的问题,但是如果你有更好的建议,或者你能说出功能上哪些地方有问题,你就可以把想法写出来,甚至是把代码写出来,这样就会收到有效的反馈。甚至你的英文不太好,都不是什么问题。只要你肯持之以恒、足够勤奋就可以了。还有一点就是要积极地回答问题。只要掌握这三点,其实一个普通程度的人就可以启动了。知识改变命运,想通过开源项目获取知识,只要你愿意,地球上没有人能阻挡你。 在这里不拼爹,不拼公司背景,拼的是对技术追求的那颗心。

Linux查看硬件信息

硬盘大小
命令:fdisk -l
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf0b1ebb0
Device Boot Start End Blocks Id System
/dev/sda1 * 1 66 524288 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 66 3890 30720000 83 Linux
/dev/sda3 3890 4145 2048000 82 Linux swap / Solaris
/dev/sda4 4145 9730 44857432 5 Extended
/dev/sda5 4145 9730 44856320 83 Linux
 
内存大小:
[root@host23 ~]# free              total       used       free     shared    buffers     cached Mem:       1528256     485096    1043160          0     101580     240232 -/+ buffers/cache:     143284    1384972 Swap:      2047992          0    2047992
 
top能显示系统内存。我们常用的Linux下查看内容的专用工具是free命令。
下面是对内存查看free命令输出内容的解释:     total:总计物理内存的大小。     used:已使用多大。     free:可用有多少。     Shared:多个进程共享的内存总额。     Buffers/cached:磁盘缓存的大小。

KVM

KVM:Kernel-based Virtual Machine的简写,是rhel5.4推出的最新虚拟化技术,目前红帽只支持在64位的rhel5.4上运行kvm,同时硬件需要支持VT技术,使用kvm虚拟机的时候需要关闭SELinux;
Red Hat从2009年6月中旬开始在部分企业级用户那里开始了对Red Hat Enterprise Virtualization(RHRV)的beta测试。RHEV是Red Hat去年收购虚拟化厂商Qumranet获得的一项hypervisor技术。Citrix通过收购获得的Xen就是因为Linux hypervisor而被人们所熟知。不过Red Hat的KVM被认为是将成为未来Linux hypervisor的主流。 Red Hat产品和技术总裁Paul Cormier表示:“KVM最大的好处就在于它是与Linux内核集成的。未来几年人们的关注焦点仍然集中在hypervisor上。hypervisor是操作系统的一项功能,自然能够被用户所接受。微软和Red Hat操作系统的不同中间件和管理功能将起到重要的作用。”
从Linux 2.6.20开始内核中已经开始集成KVM。因此,由Fedora社区开发的Fedora也开始支持KVM。Linux 2.6.20之后的Linux发行版本的内核中也都将KVM作为基本的hypervisor。
Red Hat从进行beta测试的Red Hat Enterprise Linux(RHEL)5.4也开始装载了KVM。Red Hat日本营销本部部长中井雅也先生解释说:“为了确保企业用户的稳定性,我们进行了严格的beta测试。这对与开源社区合作的Red Hat来说是很不寻常的。由此看来,这表明Red Hat非常重视KVM基本的虚拟化性能。”
Xen和kvm一样,都是虚拟化开源软件,拥有同样出色的架构设计和性能。Xen和kvm都用于构建IaaS层。

物联网应用案例

物联网的应用其实不仅仅是一个概念而已,它已经在很多领域有运用,只是并没有形成大规模运用。常见的运用案例有:
一:物联网传感器产品已率先在上海浦东国际机场防入侵系统中得到应用。机场防入侵系统铺设了3万多个传感节点,覆盖了地面、栅栏和低空探测,可以防止人员的翻越、偷渡、恐怖袭击等攻击性入侵。而就在不久之前,上海世博会也与无锡传感网中心签下订单,购买防入侵微纳传感网1500万元产品。
二:ZigBee路灯控制系统点亮济南园博园。ZigBee无线路灯照明节能环保技术的应用是此次园博园中的一大亮点。园区所有的功能性照明都采用了ZigBee无线技术达成的无线路灯控制。
三:智能交通系统(ITS)是利用现代信息技术为核心,利用先进的通讯、计算机、自动控制、传感器技术,实现对交通的实时控制与指挥管理。交通信息采集被认为是ITS的关键子系统,是发展ITS的基础,成为交通智能化的前提。无论是交通控制还是交通违章管理系统,都涉及交通动态信息的采集,交通动态信息采集也就成为交通智能化的首要任务。

物联网概念

“物联网概念”是在“互联网概念”的基础上,将其用户端延伸和扩展到任何物品与物品之间,进行信息交换和通信的一种网络概念。其定义是:通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,以实现智能化识别、定位、跟踪、监控和管理的一种网络概念。
物联网(Internet of Things)这个词,国内外普遍公认的是MIT Auto-ID中心Ashton教授1999年在研究RFID时最早提出来的。在2005年国际电信联盟(ITU)发布的同名报告中,物联网的定义和范围已经发生了变化,覆盖范围有了较大的拓展,不再只是指基于RFID技术的物联网。
自2009年8月温家宝总理提出“感知中国”以来,物联网被正式列为国家五大新兴战略性产业之一,写入“政府工作报告”,物联网在中国受到了全社会极大的关注,其受关注程度是在美国、欧盟、以及其他各国不可比拟的。
物联网的概念与其说是一个外来概念,不如说它已经是一个“中国制造”的概念,他的覆盖范围与时俱进,已经超越了1999年Ashton教授和2005年ITU报告所指的范围,物联网已被贴上“中国式”标签。
“中国式”物联网定义
最简洁明了的定义:物联网(Internet of Things)是一个基于互联网、传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络。它具有普通对象设备化、自治终端互联化和普适服务智能化3个重要特征[1]。
其它的定义:物联网指的是将无处不在(Ubiquitous)的末端设备(Devices)和设施(Facilities),包括具备“内在智能”的传感器、移动终端、工业系统、楼控系统、家庭智能设施、视频监控系统等、和“外在使能”(Enabled)的,如贴上RFID的各种资产(Assets)、携带无线终端的个人与车辆等等“智能化物件或动物”或“智能尘埃”(Mote),通过各种无线和/或有线的长距离和/或短距离通讯网络实现互联互通(M2M)、应用大集成(Grand Integration)、以及基于云计算的SaaS营运等模式,在内网(Intranet)、专网(Extranet)、和/或互联网(Internet)环境下,采用适当的信息安全保障机制,提供安全可控乃至个性化的实时在线监测、定位追溯、报警联动、调度指挥、预案管理、远程控制、安全防范、远程维保、在线升级、统计报表、决策支持、领导桌面(集中展示的Cockpit Dashboard)等管理和服务功能,实现对“万物”的“高效、节能、安全、环保”的“管、控、营”一体化[2]。

物联网

物联网是新一代信息技术的重要组成部分。其英文名称是“The Internet of things”。由此,顾名思义,“物联网就是物物相连的互联网”。这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。因此,物联网的定义是通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,以实现对物品的智能化识别、定位、跟踪、监控和管理的一种网络。
物联网被视为互联网的应用扩展,应用创新是物联网的发展的核心,以用户体验为核心的创新是物联网发展的灵魂。
英文名: Internet of Things(IOT),也称为Web of Things。
物联网是指通过各种信息传感设备,如传感器、射频识别(RFID)技术、全球定位系统、红外感应器、激光扫描器、气体感应器等各种装置与技术,实时采集任何需要监控、连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,与互联网结合形成的一个巨大网络。其目的是实现物与物、物与人,所有的物品与网络的连接,方便识别、管理和控制。

云里雾里的云计算 【5】-转载自邓侃博士的博客

【6】安全性的难题,有解还是无解?
对于Google来说,如果希望AppEngine能够获得商业上的巨大成功,吸引更多用户,尤其是企业用户,最大的挑战在于,如何保障客户的数据和私有程序的安全。
举个例子,譬如Google想劝说某家银行,用不着银行自己建数据中心,把银行的数据存到Google的云计算平台,每月给Google一笔数据托管费即可。银行很可能会问两个问题,
1. 如何防范Google员工偷窥银行的数据?
2. 银行有投资业务,所以银行自己开发了一套软件,用于评估投资风险和收益。如何防范Google员工偷窥这些软件的代码?
Google当然会派律师去游说,指天画地地发毒誓,说如果出现Google偷窥数据及代码的情况,根据双方合同,Google必将受到法律严惩,等等。
但是银行还是不放心,作案取证本来就麻烦,如果Google再做点手脚遮掩,很可能查无实据。即便能找到实据,一个案子办下来,时间也得拖很长。
这个问题,困扰的不是Google一家,而是所有负责数据托管的公司面临的共同问题。所以,现在只有两类公司,敢把数据托管给他人。一种是中小企业,他们或许会觉得自己在竞争对手眼里不那么重要,对手不至于甘冒风险去刺探自己的机密。另一种是数据本身机密性不高的公司,譬如新浪网,天涯社区等等,他们的数据内容本来就是公开的。
所以,如果Google打算吸引重量级企业用户来使用云计算平台,最好的办法是从技术上想出路,保证做到,即便Google挖空心思想偷窥,也看不到。
1. 有人问,为何不用VPN技术呢?
VPN(Virtual Private Network)虚拟私网,解决的是在如何通过公共网络,远程访问企业内部私网的问题,譬如在家处理公司业务,需要把自家的电脑,通过公共网络,接入到公司内部网络中去。所以,VPN解决的问题主要在于,保证家里电脑和公司电脑传输数据时,数据通过公网时的安全。
经常在北京街头看到振远护卫的押运车,以及持枪的押运员,负责运输现钞,有人戏称他们是振远镖局。镖局的任务之一是,把现钞从银行押运到各个ATM自动取钱机,中途通过公共马路。现钞安全到达目的地,镖局的任务圆满完成。但是,如果有谁把ATM取钱机撬开了,镖局不负责任。
类似的道理,客户可以通过VPN把数据安全地传输到Google云计算平台,但是VPN不能阻止Google的内部员工偷窥存放在Google机器上的数据。

云里雾里的云计算 <wbr>【5】

振远护卫在奥运会期间负责押运运动员尿样 Courtesy http://i1.sinaimg.cn/qc/cr/2008/0828/4024560575.jpg
2. 还有人建议,可以给数据加密。
客 户在上传数据到Google云计算平台前,先用私钥(private key)给数据加密,这样存储在Google云计算平台的数据,是加了密的数据。Google员工即便打开了文件,看到的也不过是一堆乱码。当客户授权给他的同事看数据时,给同事一份公钥(public key)。同事用这个公钥解码,然后就能读到真实的内容了。
德国人的钥匙很有意思,办公室的钥匙,同时可以打开大楼的门,以及公司的门,但是不能打开隔壁办公室的门。隔壁办公室的钥匙,也可以打开大楼的门,以及公司的门。所以,德国人的钥匙和锁,是有层次的。
公钥也可以这么设计,一个部门的公钥,不仅可以解密本部门的文件,而且可以解密公司内部公开的文件,但是不能解密其它部门的文件。实现这样有层次的公钥并不难,一个简单的办法是把整个公钥分成几段,第一段负责公司内部公开的文件,第二段负责某特定部门的文件等等。
这个办法猛一听起来似乎可行,但是仔细想想却不然。它有四个缺陷,a. 不能给程序加密,b. 不能搜索加了密的数据,c. 不能给数据库文件加密,d. 公司员工离职后,有可能会造成私钥和公钥的外泄。
3. 程序如何加密。
按照前一段的思路,平时给程序加密,只有当运行程序前,才解密。程序运行结束后,再度加密,同时销毁解密了的程序。但是这个办法不可行。
解密和加密,是相当耗用CPU的,同时占用时间也比较长。如果实施平时加密,用时解密的措施,用户等待时间会相当长。更严重的是,通常一段程序不能解决所有问题,一段程序往往会调用其它程序,其它程序又调用另外程序。如果平时把所有程序加密,用时再逐个解密,整个流程将占用很长时间,这将严重影响用户的体验。
现实中通行的办法是给程序变形,学名叫Obfuscation。道理很简单,把程序中的变量名称转换掉,同时切割整个程序,并且重新排序,以便混淆耳目。变了型的程序依然可以运行。
正常的编译过程,是把人类可读的源代码(譬如用Java写的程序),翻译成机器代码(譬如Java bytecode)。而反编译是把机器代码,逆向翻译成人类可读的源代码。虽然Obfuscation不能从根本上阻止反编译,但是却增加了这个工作的难度。
虽然有难度,但是重赏之下必有勇夫。譬如,如果能盗窃银行密码,肯定会有人不辞劳苦地反编译。
4. 加密与搜索。
“Greatness is never a given, it must be earned”,这句话怎么翻译?在Google或者百度里搜一搜这句话,一定会发现这是奥巴马总统就职演说中的一句。有人翻译成,“伟大不是凭空而来的,而是赢得的”。意思当然不错,但是觉得不如原句有气势,不如翻译成,“坐等等不来伟大,伟大必定来自于努力”。
Google和百度是如何搜索到这话出自奥巴马的演讲呢?道理说穿了并不复杂。
首先,Google和百度建一个索引,学名叫倒排索引(inverted index)。倒排索引中记录了每个单词出现在哪些文章中,而且记录了在这些文章中的什么位置出现过。
其 次,当用户搜索“Greatness is never a given”,搜索引擎通过倒排索引,查找“greatness”在哪些文章中出现过,查找“never”在哪些文章中出现过,等等。然后把众多的搜索结果合并起来,看看哪些文章中不仅出现过“greatness”,还出现过“never”,“given”等等。
如果把奥巴马原文加了密,不仅每个词都变成了乱码,而且词与词之间的空格消失了,甚至连词序也可能被打乱。这样一来,就没有办法按照通常的做法构建倒排索引。
怎么办?思路有三条。
a. 把加密算法和构建倒排索引的算法通盘考虑,重新设计一套一体化的算法。
这个思路能够一揽子解决我们面临的所有问题,但是设计这套算法的难度很高。目前还没有人能够想出有效的算法。
b. 客户自己动手建倒排索引,然后把索引加密,上传到云计算平台。
但是构建倒排索引是一件计算量很大的工作,如果客户能够自己构建倒排索引,那么就没有必要使用云计算平台。理由是,云计算平台的卖点是方便客户处理繁重的数据计算。如果云计算平台不能帮助客户构建他们专用的倒排索引,那么云计算的卖点就大大失色。
更严重的问题是,在使用索引的时候,必须先解密。如果解密了的索引被Google员工偷看了,那么加密就失去意义了。原因是,索引中透露了正文中出现过那些词,以及这些词出现的位置。通过索引中的这些信息,可以复制原文的。即便不能一字不漏的全文复制,也能复制得八九不离十。
所以,这个思路不可行。
c. 在云计算平台中分离出一部份作为密室,专供企业用户存放保密级别很高的数据,以及运行保密级别很高的程序。
信息安全的法则是分离分离再分离。给每个企业用户分配一部份机器作为密室。这些机器的Root权限掌握在企业用户手里。Google的员工只能监控密室中的机器的CPU,RAM和IO的使用情况,但是他们没有权限进入机器,查看文件,运行程序。
这个办法虽然技术含量不高,但是比较容易实现。缺点是容易造成资源浪费。因为如果给每个客户单独开密室,即使密室里的机器空闲,别人也没法用。
5. 加密与数据库。
数据库最多只能对字段逐个加密,譬如“greatness”变成“@#¥%”。但是不能整句整段地加密,否则数据库的索引,B+ tree,就没法构建。
所以,对数据库的系统管理员,无法实施高级别的加密。
6. 私钥和公钥的外泄。
公司员工离职后,很可能复制一份公司的公钥和在职期间自己使用的私钥带走。如果沿用前面所述,用私钥加密,用公钥解密的办法,员工离开公司后,仍然能阅读公司的文件,甚至篡改当年自己在职期间起草的文件。
所以,最妥善的办法是不让员工直接接触公司密钥。从这个原则出发,作者也好,读者也好,都没有密钥。作者要加密,读者要解密,让他们把文件发给密钥中心,由密钥中心统一负责加密和解密。
另外,即便由密钥中心负责保管密钥,如果长期使用同一套密钥,还是不安全。所以,密钥中心定期更换密钥,分批给文件重新加密。
这个办法可行,但是比较笨拙,因为,a. 密钥中心成为瓶颈,b. 给旧文件重新加密是负担很重的工作。

云里雾里的云计算 <wbr>【5】 Durer’s grid Courtesy http://employees.oneonta.edu/farberas/arth/Images/ARTH_214images/Durer/durer_perspnude_large.jpg

前面花了相当长的篇幅讨论各种为托管的数据和程序加密的办法,结论是,现有技术无法保障被托管的数据和程序被偷窥。
为Google计,目前能做的,似乎是明确云计算的定位。
1. 锁定目标客户,这些客户有一个共性,就是对内容和程序的安全性不敏感。
比如各种门户网站,论坛,B2C网上商店,政务和各种公共事业的网站,以及中小型企业等等。这部分用户数量不少,市场相当广阔。
2. 提供特色服务,尤其是海量数据处理。
云计算平台类似于巨型计算机。客户利用云计算平台,处理自己的计算中心很难完成的海量数据处理。例如:电脑动画制作,天气预报等等。
3. 根据不同的保密等级,做分级处理。
实际上一个企业的重要秘密信息是不多的,机密文件存放在企业自己的机房里。其它不需要保密的文件,托管到云计算平台。这个市场也是很大的。

云里雾里的云计算 【4】-转载自邓侃博士的博客

【5】是云计算,还是云存储?
Gadgets的目标是方便大家建网站。但是单靠gadgets,建网站的工作还是不够方便。
通常网站有三个组成部分,1. 网页,2. 业务逻辑, 3. 数据存储。如果说网页相当于商店,那么业务逻辑相当于车间,而数据存储相当于仓库。商店,车间和仓库三者中,技术含量最高的,当属车间。
Manufacture in old time Courtesy http://www.atlantic-cable.com/Cables/1857-58Atlantic/Cable-Manufacture.jpg
车间管理可以大致概括为两件事,1. 工艺流程,2. 资源调度。工艺流程关心的是,先做什么,后做什么,才能生产一个完整的产品。资源调度的问题是,哪个工人,用哪台机器,在哪个时间,做什么。
网站的业务逻辑处理,大致来说也分业务流程和资源调度两部分。
流程的设计,每个网站不尽相同。譬如有两个网站,一个招聘人才,另一个销售图书,它们的业务流程非常不一样。但是销售图书的网站,与销售电器的网站,它们两者的业务流程相对比较接近。
流程设计千变万化,而资源调度却有章可循。所谓计算机资源,无非是这五种东西,1. CPU,2. RAM,3. Disk,4. RAM-Disk IO,5. Network。资源调度,无非是优化使用这五种资源,使之在最短的时间内,完成分配来的工作。
优化使用这五种资源,目标挺明确,实施起来却相当不容易。一日偶遇一仙人,谈到计算资源调度优化的问题,仙人说,他有一套五行八卦的优化办法,用中国古代智慧,解决当今科技难题。我把仙人的办法概括为以下几个要点,
1. 五行相生相克,系统优化不能偏执单一资源的优化。
2. 系统的总体效率需要一个测度,这个测度被称为“阴阳度”。
3. 阴阳度不是五种资源的简单加权和。阴阳度与五行的关系是非线性的,这种非线性关系可以参照河图洛书来确定,譬如规定五行中土的阴阳度为0,河图数零点的阴阳度为-5,洛书数零点的阴阳度为-10。
4. 时刻监控系统总体的阴阳度,阴阳度变化的正常模式可以分为太极,太虚以及太一三种。
5. 当阴阳度的变化偏离了正常的模式,就需要对系统进行调整。调整的办法参见“说卦”中的六种范式,即洛书逆式,先天八卦,后天八卦,神也者,洛书顺式,和乾坤六子。
仙人的办法听上去很有美感,但是操作起来却有难度。正在困惑之时,听到Google宣布,“我有办法解决资源调度问题,你们只须专注于业务流程”,确实为之感召。
Google的解决办法,是AppEngine。 Google AppEngine logo Courtesy http://img.genbeta.com/2008/04/google-app-engine.png
问题是,Google AppEngine真得能够优化任何业务流程的资源调度吗?
譬如有人想建一个人才招聘网站,招聘的业务流程如下图所示。Google打算劝说这个人把网站建在Google云计算平台上,做为技术支持,AppEngine应该提供哪些功能?
Recruiting process business logic Courtesy http://www.infoq.com/resource/articles/seven-fallacies-of-bpm/en/resources/job_application_process.jpg
猛一看,觉得很容易,流程清楚,算法简单。只需要把流程中诸多环节,归并成几个模块,即大功告成。
再看看,事情没那么简单。整个流程不是从头到尾一次走完,譬如interview会有好几次,然后过几天才会发offer。所以,应当把整个流程的每个模块独立出来,封装成服务,每个服务能够独立运行。召之即来,来之能战。平时不用,不占资源。
SOA(Service Oriented Architecture)还有一个好处,是便于重组业务流程。譬如系统上线以后,发现在面试(interview)以前,还需要添加一个电话约谈(phone screen)的环节。如果流程中每个服务都能独立运行,添加新的服务就很容易,不至于造成牵一发动全身的局面。
SOA的结构设计,有很多优点,但是仍然有遗留问题。如果同时有很多人使用这个招聘网,系统的吞吐量需要随之加大,怎么办?增加系统吞吐量的办法,有两条思路。
第一种办法是购置多台机器,每台机器上安装所有服务。当很多人同时使用招聘网的时候,把他们的需求均匀转发到各个机器上去,这样每台机器的负载都不大,但是整个系统的吞吐量增加。
第二种办法的效率更高,它可以用数量较少的机器,达到和第一种办法相同的吞吐量。或者,用相同数量的机器,在更短的时间内完成所有任务。这种办法首先分析每个服务耗费的资源,譬如CPU时间和RAM空间等等。然后给资源耗费量大的服务多分配几台机器,以免它们成为整个业务流程的瓶颈。
第二种办法虽然有很多好处,但是实现起来有些难处。首先是如何监控和分析每个服务的资源消耗,其次是如何自动把服务从一台机器转移到另一台机器去运行。
或许有人会问,为什么不提多线程的办法呢?所谓多线程是把多个任务交给多个线程去完成,这些线程交叉使用CPU,IO,Disk等等资源,减少使用这些资源前的排队时间。多线程的办法,关注的是每个服务的实现细节。而我们刚才讨论的,是服务与服务之间怎么整合的问题,所以,是不同层面的问题。
又有人问,为什么不提MapReduce之类并行处理的办法?与多线程一样,MapReduce关注的是每个服务的实现细节,是不同层面的问题。
回到前面的问题,如果Google打算劝说大家把网站建在Google云计算平台上,做为技术支持,AppEngine应该提供哪些功能?
1. 开放更底层的APIs,而不仅仅是Python的APIs。便于第三方开发人员,实现逻辑复杂,以及资源使用方式复杂的模块。
2. 提供IDE,方便第三方开发人员,把模块封装成符合Google云计算平台规范的服务。
3. 开发调度工具,用于监督各个服务资源消耗,分配合适的机器去负责各个服务运行等等。
4. 开发预警和修复工具。开放自己的平台,去运行第三方人员(外人)开发的服务。对于Google来讲,有理由提高戒备,预防云计算平台崩溃,万一崩溃了,能够迅速修复。
这四个功能,AppEngine目前都没有实现,所以云计算平台,对于第三方开发人员来说,暂时不是计算平台,而是存储平台。