65.9K
CodeProject 正在变化。 阅读更多。
Home

关系数据结构迁移到 Cassandra (No SQL) 数据结构

2011 年 11 月 9 日

CPOL

11分钟阅读

viewsIcon

86937

关系数据结构迁移到 Cassandra (No SQL) 数据结构

引言

自计算的原始时代以来,数据量不断增长,信息存储、支持和维护一直是最大的挑战。此外,云计算技术以高效利用计算机资源的方式,为信息存储带来了新的维度(“按需付费”模式)。即使是当前市场上成熟的关系数据库产品,也无法以传统成本根据传入流量进行应用扩展。对海量数据和弹性扩展以及所需性能的需求催生了 No SQL 数据库的概念。No SQL 毫无疑问是当今数据库技术中最热门的领域,将现有数据结构中的数据迁移到 No SQL 将成为客户感兴趣的潜在领域。

什么是 No SQL 数据库

No SQL 数据库是非关系型(没有固定模式和连接)、分布式、可水平扩展的数据存储,通常不遵守传统关系数据库的原则(ACID:原子性、一致性、隔离性、持久性)。

RDBMSToCassandra/NoSQL.jpg

根据数据存储类型,No SQL 数据库大致分为

  • 列族(宽列)存储
  • 图数据库
  • 键值/元组存储
  • 文档存储

目前市场上有超过 100 种 No SQL 数据库。下面列出了其中一些最流行的 No SQL 数据库的信息(有关 No SQL 数据库的详细信息,请参阅:http://nosql-databases.org):

产品

详细说明

Cassandra

最新版本:V 0.8.6

许可证:Apache

下载地址:https://cassandra.apache.ac.cn/download/

协议:自定义,二进制 (Thrift)

API:Java/任何写入器

HBase

最新版本:V 0.90.3

许可证:Apache

下载地址:https://apache.ac.cn/dyn/closer.cgi/hbase/

协议:HTTP/REST

API:Thrift

MongoDB

最新版本:V 2.0.0

许可证:Affero 通用公共许可证 (AGPL)

下载地址:https://mongodb.ac.cn/downloads

协议:自定义,二进制

API:BSON

CouchDB

最新版本:V 1.1.0

许可证:Apache

下载地址:https://couchdb.apache.ac.cn/downloads.html

协议:HTTP/REST

API:JSON

Neo4J

最新版本:V 1.5.M01

许可证:AGPL/商业

下载地址: http://neo4j.org/download/

协议:HTTP/REST

API:Java Embedded

Riak

最新版本:V 1.0.0

许可证:Apache

下载地址:http://downloads.basho.com/riak/current/

协议:HTTP/REST 或自定义二进制

API:JSON

Redis

最新版本:V 2.2.14

许可证:BSD (Berkeley Software Distribution)

下载地址:https://redis.ac.cn/download

协议:类似 Telnet

API:广泛使用的语言

Membase

最新版本:V 1.7

许可证:Apache

下载地址:http://www.couchbase.org/get/couchbase/current

协议:用于集群配置和管理的 Memcached REST 接口

API:JSON

什么是 JSON

JSON(JavaScript Object Notation 的缩写)是一种轻量级且高度可移植的数据交换格式。JSON 对 Web 和浏览器都很直观。使用 JSON 消息格式可以轻松实现与当前市场上任何/所有平台的互操作性。 

根据 JSON.org (www.json.org)

“JSON 基于两种结构

·         名称/值对的集合。在各种语言中,这被实现为对象、记录、字典、结构、键控列表、哈希表或关联数组。

·         有序的值列表。在大多数语言中,这被实现为数组、列表、向量或序列。  

这些是通用数据结构。几乎所有现代编程语言都以某种形式支持它们。因此,一种可与编程语言互换的数据格式也应基于这些结构。”

典型的 JSON 语法如下:

  • 数据以名称-值对的形式表示。
  • 名称-值对由双引号括起来的“成员名称”组成,后跟冒号“:”和双引号括起来的值
  • 每个数据成员(名称-值对)用逗号分隔
  • 对象用花括号(“{ }”)括起来。
  • 数组用方括号(“[ ]”)括起来。

JSON 示例

{"Author": 
      {
    "First Name": "Phani Krishna",
    "Last Name":  "Kollapur Gandla",
    "Contact": {
        "URL": “in.linkedin.com/in/phanikrishnakollapurgandla",
        "Mail ID": "phanikrishna_gandla@xyz.com"}
       }
}

JSON 和 XML  

JSON 与 XML 非常相似

• JSON 是纯文本数据格式
• JSON 易于人类阅读和自我描述
• JSON 是分类的(包含值中的值)
• JSON 可以通过 JavaScript 等脚本语言解析
• JSON 数据使用 AJAX 支持和传输

JSON 与 XML

尽管 JSON 和 XML 都是数据格式,但 JSON 由于以下原因优于 XML:

• JSON 比 XML 更轻量(JSON 中没有不必要/额外的标签)
• JSON 更易于人类阅读和理解。
• JSON 更易于机器解析和生成。
• 对于 AJAX 相关应用程序,JSON 比 XML 快得多

许多 No SQL 产品提供了内置功能/现成工具,用于从 JSON 文件格式加载数据。 下面列出了一些广泛使用的 No SQL 产品导入/导出工具 

产品

JSON 的导入/导出工具

Cassandra

json2sstable -> JSON 到 Cassandra 数据结构

sstable2JSON -> Cassandra 数据结构到 JSON

MongoDB

mongoimport -> JSON/CSV/TSV 到 MongoDB 数据结构

mongoexport -> MongoDB 数据结构到 JSON/CSV

CouchDB

tools/load.py-> JSON 到 CouchDB 数据结构

tools/dump.py -> CouchDB 数据结构到 JSON

Riak

bucket_importer:import_data-> JSON 到 Riak 数据结构

bucket_exporter:EXport_data -> Riak 数据结构到 JSON

Cassandra 数据模型

理解 Cassandra 数据模型

Cassandra 数据模型旨在实现高度分布式和大规模数据。它牺牲了传统的数据库准则(ACID 兼容性),以换取操作可管理性、性能和可用性方面的重要优势。

Cassandra 数据模型的示例如下:

RDBMSToCassandra/Cassandra.jpg

Cassandra 数据模型的基本元素如下:

• 列
• 超列
• 列族
• 键空间
• 集群

:一个是 Cassandra 数据模型的基本单位。一个列包含名称、值和时间戳(默认)。JSON 格式的列示例如下:

 

{ // Example of Column
  "name": "EmployeeID",
  "value": "01234",
  "timestamp": 123456789
}

超列:超列是无限数量列的字典,由列名标识。JSON 格式的超列示例如下:

 

{ // Example of Super Column
  "name": "designation",
  "value": {
"role" : {"name": "role", "value": "Architect", "timestamp": 123456789},
"band" : {"name": "band", "value": "6A", "timestamp": 123456789}
} 

列和超列的主要区别在于:

• 列的值是字符串,但超列的值是列的记录
• 超列不包含任何时间戳(只有名称和值)。

注意:Cassandra 不索引子列,因此当超列加载到内存中时;它的所有列也都会被加载。

列族(CF): 一个列族非常类似于 RDBMS 表,是行有序集合的集合,而行又是一个有序的列集合。 一个列族可以是“标准”列族或“超”列族。

标准列族中的一行包含名称/值对的集合,而超列族 (SCF) 中的一行包含超列(子列组)的集合。 下面描述了一个列族的示例(采用 JSON 格式):

Employee = { // Employee Column Family
   "01234" : {   // Row key  for Employee ID - 01234
        // Collection of name value pairs
        "EmpName" : "Jack",
        "mail" : "Jack@xyz.com",
        "phone" : "9999900000"
        //There can be N number of columns
          }, 
   "01235" : {   // Row key  for Employee ID - 01235
        // Collection of name value pairs
        "EmpName" : "Jill",
        "mail" : "Jill@xyz.com",
        "phone" : "9090909090"
        "VOIP" : "0404787829022",
        "OnsiteMail" : "jackandjill@abcdef.com"
    },
}

注意:每个列默认包含“时间戳”。为便于叙述,此处未包含时间戳。

常规列族中值的地址是指向列名再指向值的行键,而“超”类型列族中值的地址是指向列名再指向子列名再指向值的行键。JSON 格式的超列示例如下:

ProjectsExecuted = { // Super column family
    "01234" :  {    // Row key  for Employee ID - 01235
  //Projects executed by the employee with ID - 01234
       "project1" : {"projcode" : "proj1", "start": "01012011", "end": "03082011", "location": "hyderabad"},
       "project2" : {"projcode" : "proj2", "start": "01042010", "end": "12122010", "location": "chennai"},
       "project3" : {"projcode" : "proj3", "start": "06062009", "end": "01012010", "location": "singapore"}
 
      //There can be N number of super columns

     }, 
   "01235" :  {    // Row key  for Employee ID - 01235
    //Projects executed by the employee with ID - 01235
       "projXYZ" : {"projcode" : "Cod1", "start": "01012011", "end": "03082011", "location": "bangalore"},
       "proj123" : {"projcode" : "Cod2", "start": "01042010", "end": "12122010", "location": "mumbai"},
     }, 
 }

列总是根据其行内的列名进行组织。数据插入到数据模型后会立即排序。

键空间: 键空间是 Cassandra 中最外层的数据分组,与 RDBMS 数据库非常相似。与关系数据库类似,键空间具有描述键空间行为的标题和属性。键空间是一个或多个列族列表的容器(它们之间没有强制关联)。

集群:集群是 Cassandra 中最外层的结构(也称为环)。Cassandra 数据库专门设计用于分布在多台协同工作的机器上,这些机器对最终用户来说就像一个单一的实例。Cassandra 通过将数据排列成环状来将其分配给集群中的节点。

关系数据模型 vs. Cassandra 数据模型

关系数据模型

Cassandra 数据模型(标准)

Cassandra 数据模型(超级)

         服务器

集群

         数据库

键空间

         表

列族

         主键

列值

列名

超列名

列值

列名

列值

与传统的 RDBMS 不同,Cassandra 不支持

  • 像 SQL(T-SQL、PL/SQL 等)这样的查询语言。Cassandra 提供了一个名为 thrift 的 API,通过它可以访问数据。
  • 参照完整性(不支持级联删除等操作)

设计 Cassandra 数据结构

1. 实体 – 关注点

Cassandra 数据结构的最好建模方式是识别大多数查询将关注的实体,并围绕该实体创建整个结构。用户应用程序执行的活动(通常是用例)、数据如何检索和显示将是设计 Cassandra 列族的关注领域。

例如,一个简单的员工数据模型(在任何 RDMBS 中)将包含

·         员工

·         员工 联系方式

·         员工 财务信息

·         员工 角色信息

·         员工 考勤信息

·         员工 项目

….

等等……

这里,“员工”是关注点的实体,任何使用此设计的应用程序都将围绕员工构建查询。

RDBMSToCassandra/EmpDataModel.jpg

2. 反范式化

范式化是为帮助设计任何 RDBMS 中的表及其关系而建立的一组规则。范式化的好处是:

• 避免重复条目
• 减少所需的存储空间
• 防止未来需求导致模式重构。
• 提高 SQL 查询、连接、排序和搜索结果的速度和灵活性。

对于不断增长的数据量,在传统关系数据模型中实现类似性能是一个挑战,公司可能会在反范式化方面做出妥协以实现性能。Cassandra 不支持像关系数据库那样的外键关系,更好的方法是对数据模型进行反范式化。重要的是,对于 Cassandra,不是先建模数据再构建查询,而是先建模查询,然后围绕查询构建数据。

3. 规划并发写入

在 Cassandra 中,列族中的每一行都由唯一的行键(通常是无限长度的字符串)标识。与传统的 RDBMS 主键(强制唯一性)不同,Cassandra 不强制唯一性(插入重复行键可能会破坏现有的列结构)。因此,必须注意创建具有唯一行键的行。创建唯一行键的一些方法如下:

• 代理/UUID 类型的行键
• 自然行键

数据迁移方法(使用 ETL)

RDBMSToCassandra/MigrationApp.png

将数据从关系数据结构移植到 Cassandra 结构有多种方式,但涉及复杂转换和业务验证的迁移可能需要一个包含 ETL 工具的数据处理层。

在使用内置数据加载器的情况下,处理过的数据可以提取到平面文件(JSON 格式),然后使用这些加载器上传到 Cassandra 数据结构。如果需要额外的处理规则,可以定制加载器,它们可以处理来自已处理存储或 JSON 文件的数据。

整体迁移方法如下:

  1. 根据 JSON 文件格式准备数据。
  2. 根据 JSON 文件格式将数据提取到平面文件,或使用自定义数据加载器从已处理的数据存储中提取数据。
  3. 使用内置或自定义加载器将数据加载到 Cassandra 数据结构中。

迁移中所有不同阶段的各种活动将在下面的部分中进一步详细讨论。

数据准备和提取

  • ETL 是数据提取、转换和加载的标准过程。
  • 在 ETL 过程结束时,对账是重要组成部分。这包括根据业务流程验证数据。
  • ETL 过程还包括在加载到暂存表之前的数据验证和丰富。

RDBMSToCassandra/DataPreparation.png

数据准备活动

数据准备期间将执行以下活动: 

  1.  创建数据库对象
    • 根据要求创建必要的暂存表,这些表将类似于标准开放接口/基础表结构。
  2. 从给定来源(转储/平面文件)加载之前验证和转换数据。
    •  数据清洗
      • 根据 JSON 文件布局规范筛选不正确的数据。
      • 根据 JSON 文件布局规范筛选冗余数据。
      • 根据 JSON 文件布局规范消除过时数据。
  3. 将数据加载到暂存区
  4. 数据丰富
    • 默认不完整数据
    • 根据映射或查找推导缺失数据
    • 结构不同的数据(原样中的 1 条记录 = 待处理中的多条记录)

数据提取活动(到 JSON 文件)

以下活动将在数据提取到 JSON 文件格式期间执行

  1. 根据 JSON 文件布局选择数据
  2. 根据 JSON 文件布局创建 SQL 程序
    • 根据数据映射要求和 ETL 流程创建脚本或 PLSQL 程序。这些程序将用于各种目的,包括将数据加载到暂存表和标准开放接口表。
  3. 根据 JSON 文件布局规范和映射文档,在提取之前进行数据转换。
  4. 以 JSON 格式的平面文件用于数据加载

数据加载

Cassandra 数据结构可以使用不同的编程语言(如 .net、Java、Python、Ruby 等)访问。数据可以直接从关系数据库(如 Access、SQL Server、Oracle、MySQL、IBM DB2 等)使用这些编程语言加载。自定义加载器可根据执行规则、自定义级别和数据处理类型,用于将数据加载到 Cassandra 数据结构中。

参考文献

  1. No SQL 数据库 (http://nosql-database.org/ )
  2. 什么是 JSON (www.json.org )

© . All rights reserved.