MySQL迁移到Cassandra技巧:放弃SQL思想

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

本文主要介绍Apache Cassandra的入门级用法。学习NoSQL最重要的就是要忘记常规原理和关系型数据库的结构。关系型数据库被设计为由常规数据组成,并且没有重复数据。因此,NoSQL数据库的一个主要改变是需要思考或设计查询,并按需创建一个不变的结构。

  许多网页、书籍与论文都在讨论什么是Cassandra、Hazelcast、Hadoop、MemcacheDB和MongoDB等等,但没有一个讨论如何将关系型数据库中的数据转换为这些NoSQL数据中的一种。

  本文对Turmeric SOA Monitoring与Turmeric SOA Rate Limiting两个模块的数据进行转换,使用关系数据库MySQL,并且对一些NoSQL数据库进行了为期一周的阅读与分析后,决定使用Cassandra。

  从关系表到Keyspaces

  (注:keyspace是Cassandra 中最顶层的命名空间。)

  现在要考虑的问题是如何转换它们,可按以下方法进行:

  根据敏捷开发的相关经验,如果某事件很难或很复杂,最好将其分成多个部分,因为毕竟与MMF(Minimal Marketable Feature,最小市场化功能)之间还有一定的差距。步骤如下:

  步骤1:将关系数据库中的表转移到Cassandra列族(Column Families)中

  步骤2:创建新的列族使所有数据无需进行JOIN等操作。

  步骤3:根据搜索器与查询方法的需要扩展列族。通常情况下一个搜索器或一个查询方法使用一个列族。

  步骤4:根据之前的步骤修改Creators与Updater函数。不要担心保存重复数据,只要记住一点:只需考虑数据查询,忘记以前关系型数据库相关的法则。

  步骤5:判断,如果没有完成,继续做步骤3与步骤4。

  Cassandra DAO

  在上面步骤中,最难的是第一步。不过不用担心,本文为数据转移开发了一个通用的Cassandra DAO(实际上是使用的Java泛型)。由于本例来源于实际项目,你可能发现它是作为TurmericSOA的子模块,不过根据Apache许可,用户可以在自己Maven依赖文件中使用它们。

<dependency>
<groupId>org.ebayopensource.turmeric.utils</groupId>
<artifactId>turmeric-utils-cassandra</artifactId>
<version>1.2.0.0-SNAPSHOT</version>
<type>jar</type>
</dependency>
特性

  · 100%Java代码

  · 可以作为嵌入式Cassandra服务使用,也可以作为外部Cassandra服务使用

  · 使用Hector库作为Java Cassandra客户端

  · 动态创建列族(Column Family)

  · 关键字类型与数据类型在运行时使用泛型创建

  · 支持主要的CRUD方法:

boolean containsKey(KeyType key);

void delete(KeyType key);

T find(KeyType key);

Map> findItems(final List keys, final Long rangeFrom, final Long rangeTo);

Set findItems(final List keys, final String rangeFrom, final String rangeTo);

Set getKeys();

void save(KeyType key, T model);
主要的类

  该功能包包含以下包和类:

  1. org.ebayopensource.turmeric.utils.cassandra.service

  · CassandraManager: 根据yaml配置文件初始化静态EmbeddedCassandraService实例

  2. org.ebayopensource.turmeric.utils.cassandra.hector

  · HectorManager: 管理keyspace与列族的创建与读取,使用Hector API。

  · HectorHelper: 包含一些基于Java Reflection与Java Generics的实用方法。IE: 从在cassandra keyspaces中作为列名的POJO中检索字段名。

  3. org.ebayopensource.turmeric.utils.cassandra.dao

  · AbstractColumnFamilyDao: 如其名称,是每个dao都要扩展的基类,利用Dector Api定义并实现了基本的DAO操作。

 

  配置文件

  · log4j.properties: Log4j属性文件

  · cassandra.yaml: 存储配置文件。更多信息可参考storage configuration setup。

  以下为配置文件的目录结构:

META-INF/
         security/
                  config/
                         cassandra/
                                   cassandra.properties
属性文件的一个示例:

cassandra-cluster-name=TurmericCluster
cassandra-host-ip=127.0.0.1
cassandra-rpc-port=9160
cassandra-my-keyspace=My-keyspace

#column families
cassandra-foo-column-family=foo
cassandra-bar-column-family=bar
使用方法

  假定关系数据库MySQL中有一个名为Foo的表。则:

  1. 创建BaseDao接口

public interface BaseDao {
          public void delete(String key);
          public Set getKeys();
          public boolean  containsKey(String key);
          public void save(String key, FooPojoClass  fooPojo);
          public FooPojoClass find(String key);
}
2. 创建FooDao接口

public interface FooDao extends BaseDao  {
}
3. 创建FooDao implementation

  public class FooDaoImpl extends AbstractColumnFamilyDao

  implements FooDao {

  public FooDaoImpl(final String clusterName, final String host, final String keySpace, final String cf, final Class kTypeClass) {

  super(clusterName, host, keySpace, kTypeClass, FooPojo.class, cf);

  }

  }
自定义的代码

//initiates an embedded Cassandra Service
CassandraManager.initialize();

//creates our Foo Column Family
FooDao fooDao = new FooDaoImpl("myCluster", "127.0.0.1", "myKeyspace",
                "myColumnFamilyName", String.class);
至此,已经成功将一个关系表转换为一个Cassandra列族!

  用户可以参考UT类来查看它们具体是如何实现的。








本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/785375,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
2天前
|
SQL 存储 人工智能
化整为零:湖仓数据平台一站式迁移
本文介绍了湖仓平台迁移的概况、痛点及解决方案。首先概述了数据湖和数据仓库迁移的现状与背景,强调其重要性及挑战。接着分析了迁移过程中的主要痛点,如数据量大、业务变更频繁等。最后提出了一种化整为零的新范式,通过精细化设计和自动化工具提升迁移效率,并展示了一站式湖仓迁移中心的关键阶段和产品大图,旨在加速迁移过程并减少人工成本。
|
27天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
26天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
97 3
|
29天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
30天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
SQL 存储 关系型数据库
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
164 0
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉2
MySQl数据库第八课-------SQL命令查询-------主要命脉
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉 1
MySQl数据库第八课-------SQL命令查询-------主要命脉
122 0
|
SQL 存储 开发框架
MySQl数据库第六课-------SQl命令的延续------快来看看
MySQl数据库第六课-------SQl命令的延续------快来看看