学习基本的Amazon SimpleDB(SDB)概念,研究boto(一个用于与SDB交互的开放源码Python库)提供的一些功能。在这个“用Amazon Web Services进行云计算”系列中,学习如何使用Amazon Web Services进行云计算。了解这些服务如何为设计和构建可伸缩、可靠的应用程序提供一种可选方案。在本文中,学习一些基本概念和boto提供的一些功能。
Amazon SimpleDB
Amazon SDB是一个快速的可伸缩实时数据集索引和查询框架,基于Amazon Web Services的应用程序可以用它轻松地存储和获取结构化数据。它能够与其他Amazon Web Services很好地协作,比如Elastic Compute Cloud(EC2)和Simple Storage Service(S3)。可以使用SDB在Amazon Web Services环境中构建完整的应用程序组合。只需根据使用量为服务付费。还提供一定的免费使用量。
SDB提供的特性包括:
可靠性
SDB跨多个数据中心冗余地存储带索引的数据,保证它们随时可用。
速度
SDB能够快速地获取数据,尤其是在Amazon Web Services环境中从EC2实例发出请求时。
简单性
访问和使用SDB的编程模型非常简单,而且可以从多种编程语言使用SDB。
安全性
SDB提供很高的安全水平。只允许授权的用户访问数据。
灵活性
SDB支持动态地存储数据,不需要预先定义的模式。
低成本
SDB的费用非常低廉。只需根据实际使用量付费。
下面讨论支撑SDB的概念。
域
域是存储结构化数据和运行查询的容器。在域中存储的数据称为条目。从概念上说,域与电子表格中的工作单标签相似;条目与电子表格中的行相似。可以对域运行查询,但是当前的SDB版本还不支持跨域查询。
每个域与下面的元数据相关联:
·最后一次更新元数据的日期和时间
·域中条目的数量
·域中属性名-值对的数量
·域中独特属性名的数量
·域中所有条目名的总大小(字节数)
·域中所有属性值的总大小(字节数)
·域中所有独特属性名的总大小(字节数)
与Simple Queue Service(SQS)一样,SDB也采用“最终一致性”模型。SDB维护每个域的多个拷贝,从而提供容错能力。对域的每个修改都会传播到所有拷贝。
根据系统负载和网络延时不同,这个操作有时候要花费几秒时间,所以域的消费者可能无法立即看到修改。修改最终会传播到整个SDB,但是在设计基于SDB的应用程序时一定要考虑到传播延时的影响。
条目
条目代表域中的对象,它们包含属性和值。从概念上说,条目与电子表格中的行相似 — 属性是列,值是单元格。属性可以包含多个值。无论数据结构是什么样的,SDB都会自动地为域编制索引。
SDB还对针对域执行的查询有时间限制。如果查询花费的时间超过5秒,SDB就会停止查询并返回一个错误。
SDB中的域很灵活,没有任何固定的模式。域中的每个条目可以包含一组独特的属性(不超过256个)。属性甚至可以与域中其他条目的所有其他属性完全不同。
限制
当前的SDB版本有一些限制,在设计应用程序时应该考虑到这些限制。表1给出这些限制。
表1. 当前限制
SDB入门
要想开始使用SDB,首先需要注册一个Amazon Web Services账户。本系列的第2部分详细介绍了如何注册Amazon Web Services账户。创建Amazon Web Services账户之后,必须为账户启用Amazon SDB服务:
·登录Amazon Web Services账户。
·导航到SDB主页。
·单击页面右边的Sign Up For This Web Service。
·提供必需的信息并完成注册过程。
与任何Amazon Web Services的所有通信都要通过SOAP接口或查询接口。在本文中,通过一个第三方库使用查询接口与SDB通信。
需要获得自己的访问键,可以通过在Web Services帐户信息页面上选择View Access Key Identifiers获得访问键。现在设置了Amazon Web Services并为账户启用了SDB服务。
与SDB交互
这个示例使用第三方开放源码Python库boto,通过在Python shell中运行代码片段熟悉SDB。
安装boto并设置环境
下载boto。撰写本文时的最新版本是1.6b。把存档文件解压到您选择的目录中。进入此目录并运行setup.py把boto安装到本地Python环境中,见清单1。
清单1. 安装boto
$ cd directory_where_you_unzipped_boto
$ python setup.py install
设置一些环境变量,引用Amazon Web Services访问键。可以从Web Services帐户信息页面获得访问键。
清单2. 设置环境变量
# Export variables with your AWS access keys
$ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID
$ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key
启动Python shell并导入boto库,从而确认所有设置都是正确的,见清单3。
清单3. 检查设置
$ python
Python 2.4.5 (#1, Apr 12 2008, 02:18:19)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import boto
>>>
用boto体验SDB
使用SDBConnection类提供与SDB交互的主要接口。从Python控制台使用boto。示例调用SDBConnection对象上的不同方法,然后查看SDB返回的响应,这有助于熟悉API和体验SDB概念。
第一步是使用前面导出到环境中的Amazon Web Services访问键,创建一个连接到SDB的连接对象。boto库总是先检查是否设置了这些环境变量。如果设置了这些变量,boto在创建连接时自动地使用它们。
清单4. 创建到SDB的连接
>>> import boto
>>> sdb_conn = boto.connect_sdb()
>>>
然后,可以使用上面创建的sdb_conn对象与SDB交互。可以通过指定域名创建新的域。
清单5. 创建域
>>> d1 = sdb_conn.create_domain(‘devworks-dom-1’)
>>>
获取所有域的列表,这返回一个结果集对象,它实际上是一个Python列表,见清单6。可以循环遍历这个列表并访问每个域的所有相关信息。
清单6. 列出所有域
>>> all_domains = sdb_conn.get_all_domains()
>>>
>>> len(all_domains)
1
>>>
>>> for d in all_domains:
… print d.name
…
devworks-dom-1
还可以按名称获取单一域。
清单7. 列出单一域
>>> my_domain = sdb_conn.get_domain(‘devworks-dom-1’)
>>>
>>> print my_domain.name
devworks-dom-1
当然,在添加条目之前,刚创建的域是空的。在域中创建一个新条目,然后在其中添加属性。
清单8. 创建新条目
>>> my_domain = sdb_conn.get_domain(‘devworks-dom-1’)
>>>
>>> i1 = my_domain.new_item(‘test_item_1’)
>>>
>>> i1[‘cars’] = ‘BMW’
>>>
>>> i1[‘fruits’] = [‘apple’, ‘orange’, ‘mango’]
>>>
可以通过指定条目名从域中获取条目。条目名必须是惟一的,这与关系数据库中的主键概念相似。
清单9. 获取条目及其属性
>>> my_item = my_domain.get_item(‘test_item_1’)
>>>
>>> print my_item
{u’cars’: u’BMW’, u’fruits’: [u’apple’, u’mango’, u’orange’]}
>>>
返回的条目对象是一个动态的Item对象。在访问任何属性时,它会自动地从SDB获取条目的所有属性。对条目属性值的任何更新会自动保存到SDB中。
清单10. 更新属性
>>> my_item[‘cars’]
u’BMW’
>>>
>>> my_item[‘cars’] = ‘Honda’
>>>
>>> my_item[‘cars’]
‘Honda’
>>>
还可以通过使用SDBConnection类并指定域和条目名来获取条目和属性。
清单11. 使用SDBConnection获取条目
>>>
>>> sdb_conn.get_attributes(‘devworks-dom-1′,’test_item_1’)
{u’cars’: u’Honda’, u’fruits’: [u’apple’, u’mango’, u’orange’]}
>>>
如果一个条目没有任何属性,SDB就会自动删除它。还可以显式地删除条目及其属性。
清单12. 删除条目及其属性
>>> sdb_conn.get_attributes(‘devworks-dom-1′,’test_item_1’)
{u’cars’: u’Honda’, u’fruits’: [u’apple’, u’mango’, u’orange’]}
>>>
>>> sdb_conn.delete_attributes(‘devworks-dom-1′,’test_item_1’)
True
>>> sdb_conn.get_attributes(‘devworks-dom-1′,’test_item_1’)
{}
>>>
清单13. 删除域
>>> sdb_conn.delete_domain(‘devworks-dom-1’)
True
>>>
查询SDB域
SDB提供一种用于搜索结构化数据的定制查询语言,可以查询与条目相关联的属性名-值对。查询表达式的基本组成部分称为谓词。每个谓词由方括号限定,其中包含属性、比较操作符和要比较的值。例如,谓词[‘desc’ = ‘Hello Devworks’]定义针对desc属性的相等比较。每个谓词单独计算并产生一组条目名。可以使用union和intersection等集操作符组合多个谓词,从而构建复杂的查询。
在查询中使用谓词时,一定要考虑到SDB按照词典次序执行所有谓词比较。必须确保数据以适当的字符串形式存储在属性中。注意,如果查询花费的时间超过5秒,SDB就会自动终止它。
清单14. 创建一些测试数据
>>> d2 = sdb_conn.create_domain(‘devworks-dom-2’)
>>>
>>> i1 = d2.new_item(‘car1’)
>>>
>>> i1[‘make’]= ‘BMW’
>>> i1[‘color’]=’grey’
>>> i1[‘year’]=’2008′
>>> i1[‘desc’]=’Sedan’
>>> i1[‘model’]=’530i’
>>>
>>> i2 = d2.new_item(‘car2’)
>>>
>>> i2[‘make’]= ‘BMW’
>>> i2[‘color’]=’white’
>>> i2[‘year’]=’2007′
>>> i2[‘desc’]=’Sports Utility Vehicle’
>>> i2[‘model’]=’X5′
>>>
清单15. 包含一个谓词的查询
>>> rs = d2.query(“[‘make’ = ‘BMW’]”)
>>> for result in rs:
… print result.name
…
car1
car2
>>>
清单16. 包含多个谓词的查询
>>> rs = d2.query(“[‘make’ = ‘BMW’] intersection [‘year’ = ‘2007’]”)
>>> for result in rs:
… print result.name
…
car2
>>>
这种查询语言支持多种比较操作符。它允许执行范围查询和多值属性查询。强烈建议您阅读Amazon Web Services提供的介绍查询语言的文章,了解它提供的所有功能及创建和调整查询的最佳实践。
还可以获取域的元数据,从而了解域中的条目总数等信息。
清单17. 域的元数据
>>> my_domain = sdb_conn.get_domain(‘devworks-dom-2’)
>>>
>>> my_metadata = my_domain.get_metadata()
>>>
>>> print my_metadata.item_count
2
>>> print my_metadata.item_names_size
8
>>> print my_metadata.attr_value_count
10
>>> print my_metadata.attr_names_size
22
>>> print my_metadata.attr_values_size
56
>>> print my_metadata.timestamp
1231798889
>>>
结束语
本文介绍了Amazon的SDB服务。您学习了一些基本概念和boto(一个用于与SDB交互的开放源码Python库)提供的一些功能。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
谷歌云业务CEO描绘谷歌云计划 收购传言四起
行业观察人士猜测,新任谷歌云首席执行官Thomas Kurian将通过大规模收购来获取市场份额,并与竞争对手A […]
-
Workday公司继续在亚太地区大举投资
随着亚太地区(APAC)地区越来越多的企业转向云计算来拓展其数字业务,Workday公司跻身为全球发展最快的云 […]
-
华为“一云一湖一平台”架构助力客户加速智能化进程
在第十五届华为全球分析师大会上,秉承“智IT,慧未来”的理念,华为IT产品线分享了IT基础设施在数字化转型过程 […]
-
云计算可移植性的来龙去脉
目前云计算提供商都是按不同的方式构建其产品,这造成典型的“缺乏标准、以创新为导向以及供应商锁定”的局面。 但供 […]