转自:http://www.ibmsoftware.cn/forum.php?mod=viewthread&tid=19726
1) Cloudant
概述
IBM Cloudant是IBM在2014年收购的NoSQL的解决方案,收购后Cloudant成为IBM大数据领域的一个重要解决方案。Cloudant为用户提供了一个快速开发部署的NoSQL平台,同时用户可以通过Cloudant提供的共有云服务而省却在数据库管理、维护和调优方面的工作,这使得互联网应用和移动应用开发人员可以更加专注于应用,而不需要考虑数据库管理以及后续随着数据量增长带来的扩展性问题。
Cloudant是构建在开源产品CouchDB上的一个解决方案,麻省理工的三位物理学家在寻找上帝粒子的科学实验中将CouchDB进行了大量定制和改进,从而形成了Cloudant。
作为Cloudant的基础,CouchDB是基于JSON与REST的面向文档的数据库,CouchDB诞生于2005年,是NoSQL领域的经典产品之一。CouchDB产品设计时非常注重健壮性,因此产品命名couch意为“沙发”,而产品LOGO为”Relaxed“,即放松。CouchDB的设计目标是其数据库管理员可以在沙发上放松,而无需担心数据库无法正常运行。
相对于只注重大规模集群设施,CouchDB可以支持各种场景的部署,大到数据中心,小到智能手机。用户可以在安卓手机或者MacBook上运行CouchDB,也可以在数据中心中使用。CouchDB由Erlang语言编写,Erlang是由爱立信发明的用于支持交换机软件多版本实时更新的并行处理语言。
Cloudant
在利用CouchDB JSON
存储技术之外,吸取了大量开源技术进行了产品的增强,这包括:
l Dynamo的技术和理论用于设计Cloudant的集群技术
l Apache Lucene的全文检索技术
l GeoJSON的地理信息索引和查询技术
l HAProxy的基于动态DNS的负载均衡技术
l Jenkins的版本持续性技术
l Chef的产品配置管理技术
l Graphite&Riemann的服务器图形化监控技术
l rsyslog的日志记录和管理技术
l CollectD的系统运行指标收集技术
2) Cloudant
的集群技术
Cloudant
采用基于Amazon Dynamo
的集群技术,实现了数据分片与高可用性的结合。
l 环状的集群
在Cloudant集群中,数据通过Hash进行分片存储在集群的各个节点中,每个节点负责存储完整数据的一部分。数据分区在Dynamo的原型中也被称为虚拟节点(Virtual Node,或VNode),被分布存储在不同的物理节点上。数据按照Key(Doc_ID)值进行分区,Cloudant采用CRC32的算法,Hash值的范围是0-2^32。在创建数据库时,用户可以通过指定Q值,来决定数据库被分为多少个分区。
$ curl -X PUT
http://username.cloudant.com/dbname?q=10
如上述命令,会将数据库按照10个分区存储,每个分区存储2^32/10个Hash值的数据。
l 每个节点均可处理请求
Cloudant中的每个节点均可以接受请求,然后根据请求的Key值计算其Hash值,并且与数据库的HashMap对比,判断数据(或数据副本)存储在哪个物理节点,然后改请求通过分布式Erlang的消息被传递到数据所在节点进行处理。
l Quorum的设置(N,R,W)
在CAP理论中,分布式数据库环境下,用户需要在CAP象限中进行取舍。Cloudant为用户提供了可配置的三个参数供用户进行调节。参数N:代表数据在Cloudant集群中冗余的份数。例如N=3,则代表每个数据在Cloudant集群中会存储3分拷贝。W=2,代表Cloudant在写入数据时,发出的3个异步写操作,只要有2个返回成功,Cloudant就会认为写操作成功。同样,R=2,代表Cloudant在读数据时,发出的3个异步读操作中只要2个返回一致的结果,Cloudant就认为读成功。用户可以设置N,W,R在一致性(C)和可用性(A)之间取舍。N可以在数据库创建时指定。R和W可以在每个独立的请求时指定。将W设置更高,则可以获得更好的写一致性,但是会降低性能。将R设置更高,则可以获得更好的读一致性,但同样会降低读性能。无论如何设置,根据CAP理论,一般要求是W+R>N。
l 集群的可用性
Cloudant集群采用Masterless(无主节点)的架构,每个节点均可以处理请求,集群不存在单点故障(SPOF)。任何节点发生宕机时,Load Balance不会继续将请求发给该节点,而是通过数据副本所在的其它节点读写数据。在N=3,W=2,R=2的配置中,一个节点宕机不会影响读写操作的正常进行(因为还有两个副本所在节点可以正常返回)。故障节点一旦恢复正常,系统会自动触发后台的同步过程,将节点宕机期间丢失的数据同步给该节点。
l 集群的扩展性
当由于数据量增加或性能达到瓶颈而需要为Cloudant集群增加节点时,系统会进行重新Hash和数据分布调整,数据库的PartitionMap会进行调整,原有节点上的数据分区会搬迁到新的节点上来。这个过程对集群的整体性能会产生影响,因此用户可以灵活控制数据重分布是在整个数据库级别或者是部分数据分区。Cloudant在编码时,将数据重分布设计为后台的过程,因此重分布过程不影响数据库的可用性。同理,Cloudant也支持节点的减少,整个过程整个集群同样会进行Re-Hash和数据重分布过程。
l 应用透明性
上述Cloudant集群的全部特性:分布式、横向扩展、可用性、一致性对应用开发是透明的。用户在单节点CouchDB或者多节点Cloudant集群上进行开发并没有区别。当然,在Quorum的设置方面,Cloudant为用户提供了可选的参数设置,但除此之外,Cloudant的集群技术还是为用户提供了应用开发的透明性。
3) Cloudant
的数据访问
Cloudant
提供了丰富的数据访问接口用于数据的访问,除了基本的REST API
用于数据的增删改查之外,Cloudant
提供了Primary Index
,基于Map-Reduce
算法的Secondary Index
,基于Lucene
的全文检索索引,以及基于地理数据的GeoJSON
。
JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式,因其具有语言无关性和自描述性,目前已经被大量应用在Web
应用中。JSON
的灵活数据格式可以用更自然的方式描述和存储数据,而无需拆解成关系型数据表。JSON
数据也可以避免稀疏数据在关系型数据库中产生NULL
值的情况。实际上,Cloudant
中的JSON
并非“无数据格式“,而是可以看成一种“灵活数据结构“,即每个文档数据可以用不同的数据格式存储,而应用又可以一次性的处理各种不同格式的数据。
通过Curl
工具进行Cloudant
基本的CRUD
操作示例如下:
l 创建数据库
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/162716g9i5nbsbbcbicssk.png)
l 插入一个JSON数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/162754hju780djddyjjuuj.png)
l 读取全部JSON数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/162831ivg39eq9k33gj323.png)
l 删除一个JSON数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/162907kvz2ffxu02f8aga4.png)
l
更新一个JSON
数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/162940trpwgarwvahrc3er.png)
除了基本的数据CRUD
操作,Cloudant
通过以下始终索引技术来访问数据:
a) 主索引(Primary Index)
Cloudant的索引是用于唯一标识数据的键值。通过键值可以快速定位到所需一个或者一批数据。
l
查找key
值为zebra
的数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163021rbowdrotyvcy22az.png)
l
通过startkey
和endkey
查找范围内的数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163101oxbprbegbp7xpres.png)
a) 次索引(Secondary Index)
当我们需要根据文档内容查找数据,或者对文档内的字段进行聚合计算(Aggregration)时,需要通过Cloudant的Sceonday Index实现,例如:
l
在博客类应用,如果需要通过用户名和发帖事件(timetaken)
来查找数据,需要先建立如下索引(
例如索引名为feed_by_user)
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163130ekk1bllgbc1xllin.png)
l
然后根据feed_by_user
索引进行查询
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163204qac9wa1pz9fqiqip.png)
l
以下索引可用于生成每个salesperson
的sum(amount)
值
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163234crd543va19avza40.png)
a) 全文检索索引(Search Index)
全文索引适用于按照多个字段检索数据,而且字段组合可能不确定,并且可能进行模糊查找的场景
l
以下示例对name,age,passion
三个字段建立检索索引
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163307fgwyy9ze5fjcfeyb.png)
l
然后可通过以下条件进行数据查询
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163337y1llhl98cclwlcj6.png)
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163357abzr5wso64l9b015.png)
a) 地理信息索引(GeoJSON Index)
Cloudant提供了基于GeoJSON的索引技术,建立地理信息索引后,可以使用基于地理位置的计算条件来检索数据:
l
以下示例对经纬度建立地理信息索引
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163428gg8q4t4mz4d4x4dw.png)
l
以下查询查找经纬度范围内的数据
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163455lzavzrcaskppt6vk.png)
l
以下查询查找经纬度范围内的数据,并且按照到波士顿的距离排序
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163524ck994tese4vwt2v9.png)
Cloudant支持以下基于地理位置的计算:
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163555nn0lv11cizy8vcvc.png)
4) Cloudant
的地理信息技术
Cloudant
提供了强大的地理信息技术,使得开发人员能够基于此技术开发出更新更有趣的应用,这也是大量用户选择Cloudant
的重要原因之一。Cloudant
的地理信息技术包括:
l 支持按照GeoJSON格式存储地理信息数据
l 按照增强R-Tree的索引技术对地理信息数据索引
l 可以按照圆、椭圆、多边形、指定边界来查询数据
l 临时索引
l 根据数据的地理位置属性将数据分片(Sharding)
以下详细介绍Cloudant
的地理信息技术:
a) 地理信息索引
Cloudant
的地理信息索引是居于地理区域将数据分类组合以便于快速查找某个区域的数据的过程。Cloudant
的地理信息索引是基于增强R*-Tree
的技术。R*-Tree
技术的优势在于在地理信息数据存储时即通过大量计算生成索引,从而保证查询时可获得优秀的性能。Cloudant
支持增量的R*-Tree
索引,因此少量数据的插入几乎不会产生索引维护的成本。
基于R*-Tree
的查询是矩形(Box)
查询,即查询条件始终是{MinX,MinY,MaxX,MaxY}
。地理数据按照通用的空间参照系统(Spatial Reference System)
进行索引。数据的查询通过包含地理信息查询运算符的Post
请求进行查询。该语法遵循OGC SFSQL
和SQL/MM
规范。
以下是在Cloudant中构建地理信息索引的例子,通过st_index函数对地理信息数据字段geometry进行索引。此外,也可以通过CommonJS在查询的时候才建立索引。
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163626fg5eoev7aupph3oh.png)
b) 地理信息查询
Cloudant
的地理信息技术支持复合SQL/MM
和OGC SFSQL
标准的查询运算符:
Disjoint
:返回True
如果两个区域的数据没有交集
Equeals
:返回True
如果两个区域是否相同
DWithin
:返回True
如果该区域与另一个区域在指定距离内
Byond
:返回True
如果该区域与另一个区域在指定距离外
Intersect
:返回True
如果两个区域的数据有交集
Touches
:返回True
如果两个区域只在边界相交
Crosses
:返回True
如果A
区域穿过B
区域
Within
:返回True
如果A
区域在B
区域范围内
Contains
:返回True
如果B
区域在A
区域范围内
Overlaps
:返回True
如果两个区域有重叠
BBOX
:返回True
如果某区域在指定的经纬度区域内
此外,Cloudant
地理信息技术支持椭圆查询,也支持基于TPR-tree
的临时索引。也可以通过标准的Cloudant
查询语法支持Like,Between
等简单查询。
Cloudant Geo
地理信息技术的主要查询语法是OpenSearch Rest API
。
c) 地理信息数据分片
对地理信息数据分片的需求有两个,第一个是将数据分片以保证数据库的高可用和一致性;数据分片后地理信息索引可以将读写操作根据数据分片所在节点实现负载均衡;第二个需求是将数据根据其地理位置存放在Cloudant
对应的数据中心,这样可以使得用户就近访问数据。
GeoHash
是常用的将地理位置经纬度先Hash
为一个数值,然后再映射为一个字符串的算法。该方法与Morton Code
原理类似
(
莫顿码,实现二维(或多维)数据到一维的转换
)
。下图实现了将区域的
GeoHash
码映射为某种颜色进行现实。
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163657ho8q53aq6q0cuqc5.png)
Cloudant
采用统一的Hash
算法来将数据映射到数据节点。该Hash
算法是根据文档数据CRC32
位编码实现的,然而该算法如有需要是可配置的,也可采用超过32
位值进行Hash
。一旦选用了GeoHash
作为该数据库的数据分片算法,则要求该库内所有数据都具有地理信息属性。
采用Geohash
算法的优势是:
由于不符合条件的节点直接返回空而无需扫描数据,因此Seondary
索引(
如R*-Tree)
的检索效率高;
由于
d) WKB
WKB
是Well Known Binary Format
的简写,是OGC SFQL
的规范之一。WKB
是将复杂地理信息数据用二进制保存的业界标准。GeoJSON
地理信息数据在Cloudant
中通过WKB
进行存储和索引,这样索引数据可以用通用的工具如GDAL
或Python
进行编辑,使得管理和开发人员可以容易的对数据进行操作。
e) 地理信息路由(GeospatialRouting, GeoIP)
Cloudant
数据库服务使用HAProxy
将客户端请求发到相关节点。HAProxy
支持使用GeoIP
数据库来判断路由,该技术带来的好处是:
l 自动选择合适的语言
l 将用户请求发到最近的数据中心
l 可以控制只有一个国家能够查看该数据库的数据(满足合规性)
l 阻塞某些国家的访问(如防止黑客攻击等)
Cloudant中已包含提供了GeoIP模块能够支持上述功能,而且提供免费的GeoLite数据库,但用户如果需要完整功能和数据可能需要购买GeoIP的数据使用权。
f) WatchBox
g) 与Esri ArcGis的集成
5)
共有云Cloudant
服务
Cloudant提供基于共有云的数据库托管服务,可以保证数据库的可用性、性能和扩展性。Cloudant的共有云服务团队可以根据客户需求在数据库从小到大快速增长的过程中提供上述服务,应用开发人员则可以完全关注于应用和业务本身。Cloudant提供的共有云数据库服务可以帮助用户解决下述问题:
l 不确定的数据库性能要求(互联网应用的公共特征,应用一旦成功用户量和访问量激增可能导致数据库规模快速增长),Cloudant在多机集群、多数据中心多集群的扩展方案可应对上述问题;
l 不可靠的网络带来的数据访问问题,Cloudant提供离线数据访问功能,可以解决这个问题;
l 数据结构多变,互联网应用的快速版本变化需要灵活的数据结构。Cloudant基于JSON的文档存储提供了数据结构的灵活性,数据库中可以存储任意格式的数据。
l 没有专职的DBA,互联网企业专注于业务价值,对于初始创业的互联网企业来说,将数据库托管在共有云上是更具性价比的选择。Cloudant提供的共有云托管服务可以满足互联网企业的这个需求。
在Cloudant
共有云解决方案中,开发人员可以将其数据库托管在例如IBM Softlayer, Rackspace, Microsoft Azure
和Amazon WebServices
的云平台上。目前,Cloudant
在全球35
个数据中心上提供数据库托管服务,无论在哪个云平台,Cloudant
均可以提供数据库管理服务,确保数据库的可用性、性能和扩展性。Cloudant
可支持移动设备与云平台的数据同步,支持在全球多个数据中心之间同步数据,使得全球各个地区的互联网用户均可就近获取数据,以确保用户体验,同时,Cloudant
也支持用户之间的数据隔离,以确保数据的安全性。
6)
私有云部署Cloudant
Cloudant Local
本地版提供了基于企业级自有数据中心或云平台部署Cloudant
的解决方案。Cloudant Local
除了提供Cloudant
共有云的全部技术之外,还提供了供企业本地DBA
进行Cloudant
管理维护的界面
l
用于配置Cloudant
的扩展、监控、安全性配置、客户连接管理的管理工具
l Dynamo的技术和理论用于设计Cloudant的集群技术
l Apache Lucene的全文检索技术
l GeoJSON的地理信息索引和查询技术
l HAProxy的基于动态DNS的负载均衡技术
l Jenkins的版本持续性技术
l Chef的产品配置管理技术
l Graphite&Riemann的服务器图形化监控技术
l rsyslog的日志记录和管理技术
l CollectD的系统运行指标收集技术
7)
混合云部署Cloudant
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/163850oj89vvh5zkvv3a2f.png)
Cloudant也支持企业首先混合云上的部署模式,并且可以通过Cloudant的复制技术实现企业数据中心与共有云Cloudant的数据同步。用户可通过此项功能实现将私有云的Cloudant迁移到共有云,或者反之。也可以通过混合云的服务为不同地区的用户提供不同SLA的数据服务。
8)
部署模式的选择
在选择Cloudant
的部署模式时,以下是几种模式的对比:
l 共有云Cloudant:
简单、快速、成本低
l 私有云Cloudant:
满足数据安全和可控性,合规性
l 混合云:
同时需要满足成本、合规性、性能的要求
在私有云向共有云转换或反之
9)
案例介绍-三星电子
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/164036ie6tjqnyghsd221j.png)
l 项目需求:
三星电子在寻找NoSQL
的数据库平台,以支持其手机用户对于手机上应用数据的云存储、备份和多设备(
手机、Pad
、电脑)
的同步。未来有可能支持对于上述数据的智能语音查找和检索。数据平台需要满足设计目标:
n 10亿手机用户应用数据的存储和备份
n 支持SoftLayer ,AWS等多个全球共有云平台
n 支持对多种数据格式,包括文本、视频、音频等。
l 解决方案:
三星选择了Cloudant
平台构建其数据库云平台,因为Cloudant
能够满足以下要求:
l 海量的并发用户数据访问
l 全球各地区用户接入当地共有云数据中心,以保证用户体验
l 海量的数据读写
l 全球数据中心的数据同步
l 支持JSON格式的数据存储
l 支持RESTful API的访问接口
l 部署架构:
采用混合云的Cloudant
部署模式,其中共有云平台采用独享服务器(Dedicated)
模式,最初使用3
台服务器,目前已经扩展到69
台服务器集群。
10)
案例介绍-FidSafe
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/164127oyfy4bi7iqy557ff.png)
FidSafe
是由全球知名的资产管理机构Fidelity
(富达)投资的互联网企业,fidsafe.com
主要提供客户重要文档(遗嘱、法律文档等)的在线安全存储和分享,对文档安全存储可靠性要求很高,并且是提供文档协作式服务。
FidSafe
在考虑数据库平台时,在关系型数据库MySQL(
水平扩展的成本太高)
,Amazon DynamoDB(
管理难度高)
,Couchbase(
不兼容CouchDB)
和Cloudant
中进行了对比和选择,最终选择了Cloudant
,主要原因是Cloudant
采用结构灵活的JSON
存储,管理简单性、扩展能力和服务水平。
11)
案例介绍-GainFitness
![](http://www.ibmsoftware.cn/data/attachment/forum/201505/04/164209hzybo5sjg6z55cbb.png)
“用户体验是我们成功的关键,而Cloudant提供的移动终端离线服务和同步的功能帮了我们大忙.”
DavidHoffman, CTO, GAIN Fitness
GainFitness
为全球的用户提供度身定制的健身计划,他们的应用会收集用户的身体状况和训练目标、生活方式包括工作地点,可用装备等信息,并且综合出用户具体的健身计划,并且会对健身计划的进度进行最终和报告。
在选择数据库平台时,Gain Fitness
的要求是:
l 数据库具有高度扩展能力以保证性能
l 必须提供手机没有网络情况下数据离线存储和网络恢复后的数据同步功能
在进行评估和对比后,GainFitness
选择了Cloudant
,原因是:
l Cloudant具有高度水平扩展的架构
l Cloudant具有高度容错的能力,数据可以在多个数据中心同步保存
l Cloudant 提供RESTful JSON API和结构灵活的数据存储
l Cloudant具有很好的健壮性,支持手机离线数据存储和数据同步
l Cloudant提供增量的MR算法构建索引,可以加速数据的统计分析能力
l Cloudant提供共有云的数据库管理服务,可降低数据库管理成本
使用效果:
GainFitness
应用2011
年上线拥有10
万用户,并且以每周10%
的速度增长。GainFitness
是APP Store
排名前5
的健身应用。