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

本文涉及的产品
RDS Agent Manager,2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS Agent(兼容Hermes Agent),2核4GB
简介:

本文主要介绍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/786460,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
10月前
|
SQL Oracle 关系型数据库
MySQL的sql_mode模式说明及设置
MySQL的sql_mode模式说明及设置
1427 112
|
11月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1528 152
|
9月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1079 156
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
1496 213
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
9月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
9月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。

推荐镜像

更多