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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

本文主要介绍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,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
6月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1118 152
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
861 156
|
6月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
6月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
6月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
655 11
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
SQL 存储 关系型数据库
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
325 0
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉2
MySQl数据库第八课-------SQL命令查询-------主要命脉
249 0
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉 1
MySQl数据库第八课-------SQL命令查询-------主要命脉
294 0

推荐镜像

更多