精华内容
下载资源
问答
  • SequoiaDB,即巨杉数据库,是目前国产数据库中还不错的一款数据库管理系统软件,数据库底层支持JSON的形式的数据结构存储,那么很自然大家就想到了MongoDB,根据我所了解的情况,目前很多使用了MongoDB数据库的银行...

    一、背景

    SequoiaDB,即巨杉数据库,是目前国产数据库中还不错的一款数据库管理系统软件,数据库底层支持JSON的形式的数据结构存储,那么很自然大家就想到了MongoDB,根据我所了解的情况,目前很多使用了MongoDB数据库的银行或政府机构都开始把国外的某些数据库逐渐替换为国内的数据库,而对于国内使用MongoDB的机构,则有意愿替换成国产的巨杉数据库,有些已经完成数据库的迁移,有些正在做,有些即将开始。

    说到这里,就出现了大家非常关注的问题:使用了MongoDB数据库的软件系统或应用平台,如何顺利的迁移到SequoiaDB数据库上?

    本文会做一个简单的说明与教程。

    根据官网上的解决方案(http://contrast.sequoiadb.com/cn/)介绍:有如下几个项目进行了巨杉数据库的改造与迁移:

    1、某政府电子政务中心的数据平台

    2、某银行对公知识图谱

    3、某企业营销平台中的标签管理

    4、某银行去中心化福费廷项目

    从技术方面来讲,对于MongoDB项目迁移到SequoiaDB数据库时,大概有如下3种处理逻辑:

    1、使用巨杉数据库的原生Java API,重写项目的数据库操作功能模块

    2、基于原生Java API封装出第三方框架,便于快速开发,例如自主开发一套Spring Data SequoiaDB

    3、使用某种中间层技术,完成数据库传输通信的自动兼容。

    本文主要介绍第3种实现方案,因为这种处理逻辑的优点为:使用了Spring Data MongoDB的Java项目无需改动开发代码,可以快速完成应用系统的平滑迁移与改造。

    二、环境准备

    目前官方的社区版不支持MongoDB的兼容方式(未来可能某一天会发布出来),企业版是可以的,也就是说用企业版的巨杉数据库,可以兼容MongoDB,这句话的意思就是说:我们可以像使用MongoDB的方式或直接使用MongoDB的方式来操作和访问巨杉数据库,即用MongoDB的Java API来操作和访问巨杉数据库,目前这种处理逻辑可以满足常见的CRUD操作。所以我们需要如下环境:
    (1)、企业版的巨杉数据库环境

    (2)、兼容MongoDB访问的巨杉Fap驱动文件

    本文不介绍巨杉数据库的安装操作,可以去看官网上的详细说明,目前官网上也开通了对于巨杉数据库SCDA、SCDP、SCDD相关的认证,感兴趣和有需要的同学可以去考一下。

    1、在安装了企业版的巨杉数据库环境后,我们在命令行输入如下命令查看巨杉数据库的版本是否为企业版:

    2、准备好mongodb兼容驱动文件:libfapmongo3.so文件,把这个文件放到巨杉安装目录下的bin目录,这里我的目录是/opt/sequoiadb/bin/fap目录下,然后找到巨杉数据库协调节点的配置文件,协调节点的配置文件的目录为:/opt/sequoiadb/conf/local/11810/,增加fap属性,并设置该驱动文件的位置,截图如下:

    3、然后我们输入命令重新启动数据库即可,重新启动数据库的命令如下:

    sdbstop -all
    sdbstart -t all

    是否启动成功,输入sdblist命令查看即可,如果存在启动失败的节点,则说明配置有误。启动成功后,默认会占用一个11817的端口,输入如下命令查看端口是否处于监听状态:

    netstat -an | grep 11817

    三、代码开发

    在企业版的巨杉数据库设置好MongoDB的fap方式兼容以后,代码中就可以Spring Data MongoDB来操作和访问巨杉数据库。

    1、首先我们在巨杉数据库中创建一个集合空间(即对应的MongoDB中数据库的概念)和一个集合,其中集合空间为:mongodb_test,

    集合名称为:c_test_log,在linux命令行中输入su - sdbadmin切换用户,然后再执行sdb命令进入到巨杉数据库的控制台,然后分别输入如下命令:连接SDB、创建集合空间、创建集合、查询集合

    var db = new Sdb("localhost",11810)
    db.createCS("mongodb_test")
    db.mongodb_test.createCL("c_test_log")
    db.mongodb_test.c_test_log.find()

    2、对于代码层面的开发,这里基于Spring Boot+Spring Data MongoDB框架进行操作,其中框架版本为:

    Spring Boot:2.1.7

    Spring Data MongoDB:2.1.10

    MongoDB Driver 3.8.2

    使用IDEA开发工具新创建一个Spring Boot项目,然后引入Spring Data MongoDB的开发包,本文的pom.xml配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.wxbz</groupId>
        <artifactId>sdb-mongodb-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>sdb-mongodb-test</name>
        <description>SpringBoot+Spring Data MongoDB(To Access SequoiaDB)</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!--spring data mongodb -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.1.7.RELEASE</version>
                </plugin>
            </plugins>
        </build>
        
    </project>

    3、在application.yml文件中,设置巨杉数据库服务器的IP、端口和数据库信息,这里需要写上fap的11817端口,非11810端口,这个文件设置好以后程序中会自动注入MongoTemplate实例:

    server:
      port: 9091  
    spring:
      data:
        mongodb:
          host: 192.168.4.108
          port: 11817
          database: mongodb_test

    4、在entity包下面创建和c_test_log匹配的实体类,代码如下:

    @Document(collection = "c_test_log")
    public class TestLog implements Serializable {
        
        private String logId;
        
        private String content;
        
        private String host;
        
        private List<String> steps;
        
        private int executeCount;
        
        private Date createDate;
    
        ...省略getter/setter等方法
    }

    5、创建操作数据库的接口:

    /**
     * 数据库操作接口
     * @param <T>
     */
    public interface ITestLogDao<T> {
    
        public void save(T testLog);
    
        public T getById(String id);
    
        public List<T> getAll(Class<T> tClass);
    
        public void deleteById(String id);
    
        public void update(T testLog);
    
    }

    6、编写操作巨杉数据库的Dao层的实现类

    /**
     * dao操作实现类
     */
    @Repository
    public class TestLogDaoImpl implements ITestLogDao<TestLog> {
    
        /**
         * 注入MongoTemplate实例,Spring Boot会自动处理
         */
        @Autowired
        private MongoTemplate mongoTemplate;
    
        public MongoTemplate getMongoTemplate(){
            return this.mongoTemplate;
        }
    
        @Override
        public void save(TestLog testLog) {
            this.getMongoTemplate().save(testLog);
        }
    
        @Override
        public TestLog getById(String id) {
            Criteria criteria = Criteria.where("logId").is(id);
            return this.getMongoTemplate().findOne(new Query(criteria),TestLog.class);
        }
    
        @Override
        public List<TestLog> getAll(Class<TestLog> testLogClass) {
            return this.getMongoTemplate().findAll(TestLog.class);
        }
    
        @Override
        public void deleteById(String id) {
            Criteria criteria = Criteria.where("logId").is(id);
            this.getMongoTemplate().remove(new Query(criteria),TestLog.class);
        }
    
        @Override
        public void update(TestLog testLog) {
            Criteria criteria =  Criteria.where("logId").is(testLog.getLogId());
            if(criteria != null){
                Update update = new Update();
                update.set("content", testLog.getContent());
                update.set("executeCount",testLog.getExecuteCount());
                this.getMongoTemplate().updateFirst( new Query(criteria), update,TestLog.class);
            }
        }
    }

    7、编写以下相关测试方法,编写测试保存方法代码如下:

    @Test
        public void saveTest(){
            TestLog testLog = new TestLog();
            testLog.setLogId(UUID.randomUUID().toString());
            testLog.setContent("测试日志1");
            testLog.setCreateDate(new Date());
            testLog.setExecuteCount(15);
            testLog.setSteps(Arrays.asList(new String[]{"第1个步骤","第2个步骤"}));
            testLogDao.save(testLog);
            System.out.println("*********保存成功************");
        }

    使用图形化测试工具MongoChef连接巨杉数据库服务器的11817端口,可以看到当前插入的数据,如下所示:

    8、编写如下测试查询代码:

     @Test
     public void queryTest(){
            List<TestLog> logList = testLogDao.getAll(TestLog.class);
            System.out.println("*********查询成功************" + logList.get(0).getContent());
     }

    9、编写如下代码测试修改:

     @Test
        public void updateTest(){
            TestLog testLog = new TestLog();
            testLog.setLogId("09aa8294-2d94-44d3-8f8e-a798ce46e022");
            testLog.setContent("测试日志1被修改");
            testLogDao.update(testLog);
            System.out.println("*********修改成功************");
        }

    使用图形化测试工具MongoChef连接巨杉数据库服务器的11817端口,可以看到当前被修改的测试数据

    10、编写如下代码测试删除:

     @Test
        public void deleteTest(){
            testLogDao.deleteById("09aa8294-2d94-44d3-8f8e-a798ce46e022");
            System.out.println("*********删除成功************");
        }

    这样基本的CURD操作代码都验证完成,可以完成一些常见的操作,目前对于某些MongoDB某些特性的代码,我暂时没有测试和使用。

    相信本篇文章的这些介绍,可以让大家知道本文的主题。

    目前基本实现了使用Spring Data MongoDB框架来操作和访问巨杉数据库,前提是企业版的巨杉3.4,同时配置了FAP驱动文件。

    相信在不久的将来,巨杉数据库完善了这个驱动文件后,应该会开放出来,毕竟中国使用MongoDB的机构也很多。

    本文只是简单的介绍了基本的操作,如果其他想要进行了解的可以进行留言或评论。如果想要学习巨杉数据库,可以去官网参加巨杉的SCDA、SCDP和SCDD的数据库认证,目前是免费的,感兴趣的可以学习一下。

    最后,希望本篇文章的介绍,可以让你从技术上了解下MongoDB的项目如何使用Spring Data MongoDB快速迁移到SequoiaDB上。

    对文章感兴趣的同学,可以关注我的公众号,最近也计划写写巨杉数据库的文章。

     

     

     

    展开全文
  • SequoiaDB 巨杉数据库是一款开源的金融级分布式关系型数据库,主要面对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。 用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,以...

    SequoiaDB 巨杉数据库是一款开源的金融级分布式关系型数据库,主要面对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。

    用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,以满足上层不同应用程序各自的需求。

    SequoiaDB 巨杉数据库支持 MySQL、PostgreSQL、SparkSQL 和 MariaDB 四种关系型数据库实例、类 MongoDB 的 JSON 文档类数据库实例、以及 S3 对象存储与 POSIX 文件系统的非结构化数据实例。

    SequoiaDB巨杉数据库可以为用户带来如下价值:

    • 完全兼容传统关系型数据,数据分片对应用程序完全透明
    • 高性能与无限水平弹性扩展能力
    • 分布式事务与 ACID 能力
    • 同时支持结构化、半结构化与非结构化数据
    • 金融级安全特性,多数据中心间容灾做到 RPO = 0
    • HTAP 混合负载,同时运行联机交易与批处理任务且互不干扰
    • 多租户能力,云环境下支持多种级别的物理与逻辑隔离

     

    相关阅读

    「SequoiaDB巨杉数据库」createCoord()概述1

    「SequoiaDB巨杉数据库」createCoord()概述2

    展开全文
  • SequoiaDB 数据库中的数据存放分为三个级别: 1)数据库 2)集合空间 3)集合 因此,在数据库操作中,可用3个类来分别表示数据库连接,集合空间,集合,1个类表示游标,1个类表示大对象: 类 名称 描述 ...

    概述

    C++ 客户端驱动提供了数据库操作和集群操作的接口。主要包括以下8个级别的操作:

    • 数据库
    • 集合空间
    • 集合
    • 游标
    • 副本组
    • 节点
    • 大对象

    C++ 类实例

    C++ 客户端驱动有两种类实例。一种用于数据库操作,另一种用于集群操作。

    • 数据库操作实例

      SequoiaDB 数据库中的数据存放分为三个级别:

      1)数据库

      2)集合空间

      3)集合

    因此,在数据库操作中,可用3个类来分别表示数据库连接,集合空间,集合,1个类表示游标,1个类表示大对象:

    名称描述
    sdb数据库类该类主要用于管理整个数据库,包括建立连接,创建集合空间等
    sdbCollectionSpace集合空间类该类主要用于管理集合
    sdbCollection集合类该类主要用于对数据进行增删改查等操作
    sdbCursor游标类该类主要用于遍历查询、快照返回的结果,游标实例代表一个查询产生的游标
    sdbLob大对象类该类主要用于对大对象进行读写等操作

    C++ 客户端需要使用不同的实例进行操作。譬如读取数据的操作需要游标实例,而创建集合空间则需要数据库实例。

    Note:
    (1)对于每一个连接,其产生的集合空间,集合,与游标句柄共用一个套接字。因此在多线程系统中,必须确保每个线程不会同时针对同一套接字,在同一时间发送或接收数据。
    (2)一般来说,不建议使用多个线程共同操作一个连接句柄与其产生的其它句柄。
    (3)如果每个线程使用自己的连接句柄以及其它产生的句柄,则可以保证线程安全。

    • 集群操作实例

      SequoiaDB 数据库中的集群操作分为三个级别:

      1)分区组

      2)数据节点

      3)域

      Note:
      分区组包括三种类型:编目分区组,协调分区组,数据分区组。

      分区组实例,数据节点实例,域实例可以用以下三种类的实例表示。

      名称描述
      sdbReplicaGroup分区组类分区组实例代表一个单独的分区组
      sdbNode数据节点类数据节点实例代表一个单独的数据节点
      sdbDomain域类域实例代表一个管理若干个分区组的域

      与集群相关的操作需要使用分区组及数据节点实例。

      • sdbReplicaGroup 的实例用于管理分区组。其操作包括启动、停止分区组,获取分区组中节点的状态、名称信息、数目信息。

      • sdbNode 的实例用于管理数据节点。其操作包括启动、停止指定的数据节点,获取数据节点地址信息。

      • sdbDomain 的实例用于管理域。其包括修改域,获取域信息等操作。

    错误信息

    每个函数都有返回值,返回值的定义如下:

    SDB_OK(数据值为0):表示执行成功;

    < 0 :表示数据库错误,具体的错误描述在 C++ 驱动开发包中 include/ossErr.h 文件中可以找到;

    > 0 :表示系统错误,请查阅相关系统的错误码信息。

    更多内容可点击巨杉数据库官网查看。

    展开全文
  • 在春节这段时间里,由于一直在家,所以花时间捣鼓了一下代码,自己做了 SequoiaDB 和 JanusGraph 的兼容扩展工作。 自己觉得这个项目还是挺有意思的,本着开源即是美德的想法,我把自己的代码开源出来了,欢迎 ...

    本文来自社区用户投稿,感谢小伙伴的技术分享

     

    项目背景

    大家好!在春节这段时间里,由于一直在家,所以花时间捣鼓了一下代码,自己做了 SequoiaDB 和 JanusGraph 的兼容扩展工作。

    自己觉得这个项目还是挺有意思的,本着开源即是美德的想法,我把自己的代码开源出来了,欢迎 JanusGraph 和 SDB 爱好者拍砖,也希望对这块比较感兴趣的朋友,可以和我一起来完善这个项目。

    我们团队在做一个项目时,引入了国产数据库 SequoiaDB,感觉效率啊,维护性啊,都比较友好。自己呢,年前也刚好在其他场景需要应用到一些图计算相关的技术,就想着是否可以为 SequoiaDB 加个 JanusGraph 的翅膀。因为根据我的理解,JanusGraph 对存储扩展极度的友好。

    (项目地址:https://github.com/ak918808/sequoiadb_for_janusgraph)

     

    JanusGraph 介绍

    实际上,在图数据领域里,Neo4j 才是真正处于统治地位的,但是无奈它的社区版本,性能“限(yan)制(ge)”得太过分了,功能也是各种被砍,难以使用在生产环境里。至于企业版,目前也没有专门的预算给到这块的需求。

    而看看图数据库里的老二 -- JanusGraph ,Apache 基金会顶级项目,顶着当年明星项目 Titan 的光环,继续忍辱负重地前行。“这个孩子肯定有出息”,我就是这么想的。

    如果大家好奇 JanusGraph 的前世今生,可以扒一扒 DataStax(Cassandra 母公司)对 Titan 干了啥。然后一群热爱开源,又相当牛叉的程序猿就独立单干了。反正这个故事听起来,和当年 MySQL 和 MariaDB 相爱相杀的故事差不多,只是 JanusGraph 的下场更加壮烈。

     

    我从 JanusGraph 的官网里找了一个整体的架构图,大家可以看到 JanusGraph 的模块还是挺丰富的,功能也是比较的全面。

    JanusGraph 在存储层中,分开了两个部分,一个专门存储数据(Storage Backend)的,另外一个是专门存储索引信息(Extemal Index Backend)的。存储层中这两个模块都设计得非常 open,逻辑比较清晰,简直就是希望大家踊跃尝试的意思。

    JanusGraph 的操作语言,使用 Gremlin 语法进行操作。Gremlin 应该算是图计算里面的事实标准,很多的图计算语法,都是基于 Gremlin 进行二次开发的。

    JanusGraph 还能够提供基于 Hadoop 啊,Spark 这些大数据的分析框架,为用户提供 OLAP 的服务。

    但是最令我感到震惊的是,JanusGraph 竟然还支持事务功能,虽然是非常有限的事务,但确实提供了这个功能,但是需要存储层的产品来支撑事务功能。

    JanusGraph 的存储模块,它本身就是按照插件式的形式组成,大家可以从它的源代码的结构就能够看出来。

    这种插件方式,在大数据平台里很多产品都是这种设计,Hadoop、Spark、Hive 等,另外,大家能够想到连著名的 MySQL 也是采用这种插件设计吗?这种插件的设计方法,优点就是容易集成,大家可以根据需要,随时扩展它的功能,这个是它社区繁荣的基础,也是它能够更快地衍生出更多场景的基础。

     

    另外一方面,大家是否发现了,JanusGraph 支持的存储产品里,基本都是列存储的,譬如:HBase、Cassandra,都是列簇型的数据库,BerkeleyDB 则是一款K/V 型的数据。

    以 HBase 数据库为例,因为它是列簇型的数据库,所以它把所有的内容都存放到了一张表里,通过不同的 Family 来保存,达到 I/O 分离的目的。而且 JanusGraph 向底下的数据库存储数据时,都是采用 Binary 格式进行保存,我看了一下代码,JanusGraph 除了需要保存一些常用的 Int、Boolean、String 类型外,还会保存一些 JanusGraph 自己特殊的类型数据。另外一个比较有意思的地方,可能是 HBase 或者是 Casssandra 数据库的API 特点,JanusGraph 将列的名字也是采用 Binary 格式存储,并且里面使用了 HBase 对 Key 排序的功能来读取数据。

     

    从这些细节来看,JanusGraph 的存储设计都是基于列存储或者是 K/V 型的数据库进行,不知道是由于 Titan 的历史包袱,还是一些其他的考虑。

     

    我自己在阅读 JanusGraph 的存储代码时,主要就是参考 HBase 和 BerkeleyDB 的代码,逻辑比较清晰。

    一开始时,为了简单对接 SequoiaDB,我是模仿着 BerkeleyDB 的代码来写的,但是写到后面发现 BerkeleyDB 由于是本地存储,不是 remote 方式,所以很多的参数都是围绕本地的。虽然自己也可以扩展参数,使得可以通过网络连接 SequoiaDB,但是总解决不伦不类,就又转向到 了 HBase 的代码研究上了。

    JanusGraph 如何分别出各个存储的呢?实际上,当用户在 Gremlin 中启动 JanusGraph 的服务时,需要指定一个 storage.backend 参数,然后在 JanusGraph 的 core 模块里的 StandardStoreManager 类,就有一个 enum 来区别各个存储产品,应该初始化哪个 manager 类。

    大家打开 StandardStoreManager.java 文件,就能够看到以下的 enum 描述。

    BDB_JE("org.janusgraph.diskstorage.berkeleyje.BerkeleyJEStoreManager", "berkeleyje"),CASSANDRA_THRIFT("org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager", "cassandrathrift"),CASSANDRA_ASTYANAX("org.janusgraph.diskstorage.cassandra.astyanax.AstyanaxStoreManager", ImmutableList.of("cassandra", "astyanax")),CASSANDRA_EMBEDDED("org.janusgraph.diskstorage.cassandra.embedded.CassandraEmbeddedStoreManager", "embeddedcassandra"),CQL("org.janusgraph.diskstorage.cql.CQLStoreManager", "cql"),HBASE("org.janusgraph.diskstorage.hbase.HBaseStoreManager", "hbase"),IN_MEMORY("org.janusgraph.diskstorage.keycolumnvalue.inmemory.InMemoryStoreManager", "inmemory");

     

    JanusGraph 就是通过不同的 storage.beckend 的名字,来判断应该初始化哪个 manager 类。

    JanusGraph 关于 HBase 的代码,有好几个文件夹,但是真正核心的类,其实就是  HBaseStoreManager 和 HBaseKeyColumnValueStore 两个类。

    HBaseStoreManager 类是这个存储插件的入口类,它初始化了 JanusGraph 和 HBase 之间的连接,并且根据不同的 family 保存不同的连接。每一个 family 连接都会对应一个 HBaseKeyColumnValueStore 实例。

    HBaseKeyColumnValueStore 类主要是对数据的存和取的操作,包括将 JanusGraph 的数据转换成 HBase 自身的格式,然后进行保存,或者是查询。

    由于 HBase 不支持事务功能,所以 JanusGraph 在 HBase 上直接是关闭了事务功能。这个事情未来可以重新参考 BerkeleyDB 的模式来实现基于 SequoiaDB 的事务功能。

     

    SequoiaDB for JanusGraph 技术设计

    说老实话,当我一开始知道项目是使用一款国产的分布式数据库时,我是拒绝的,我觉得不能够甲方爸爸叫我用什么就用什么,如果它说它很厉害,然后写的软文都是速度快,开发简单,我就非常的不相信。但是当我体验了一下,Duang,这个感觉还真的挺好,确实速度快,开发简单。我还给我很多的朋友推荐,让他们都来试试。

    所以说啥,前面自己说啥呢?最后还不是真香!

     

    言归正传,我从 SequoiaDB 的官网上找了一下它的架构图,大家可以看看。

    SequoiaDB 采用的是一种叫做“计算和存储分离”的架构,虽然听起来挺神奇的,但是却很好理解,上面的计算层就是一些协议的解析,它支持很多种协议,有 MySQL 的,有 JSON API 的,还有一些对象存储的协议;下面的存储层,看起来就像是一个封装好的盒子,里面可以支持数据的分布式存储。

     

    因为这种计算和存储分离的架构,使得应用的开发者,完全不需要关注底层的数据分布式实现,只要专心做好自己的应用逻辑就好了。

     

    当然,如果你是一名 DBA,那样你还是要学习如何配置 SequoiaDB 底层的分布式存储的。

     

    前面也讲到了,由于 JanusGraph 对底层存储的设计和接口,都是根据列存储来设计的,所以在为 SequoiaDB for JanusGraph 设计时,就需要做出一些调整。

     

    首先是列簇里的 family 设计,我把它拆开来了,将不同的 family 直接对应成 SequoiaDB 的一个 Collection。

     

    最开始时候,我是希望将一条记录的所有列都保存到 SequoiaDB 一个 BSON 里面,但是写到后面,由于 JanusGraph 会依赖 HBase 的列排序功能返回记录,所以这个在 SequoiaDB 里面无法对一条记录的不同列进行排序。所以在最后, JanusGraph 中的一条记录被我拆分成多个 BSON 记录,形式变成了以下的形式。记录以 RowKey 来维护其一条记录的完整性。

    {RowKey:"", Key:"", Value:""}{RowKey:"", Key:"", Value:""}{RowKey:"", Key:"", Value:""}{RowKey:"", Key:"", Value:""}

     

    在 BSON 中,RowKey、Key和Value 三个字段的数据类型都是 Binary 格式,这个也是 JanusGraph 自己所独有的解析方法。JanusGraph 保存于 SequoiaDB 中的记录如下面的例子:

    {  "_id": {    "$oid": "5e410c444f025855e5552b4c"  },  "Key": {    "$binary": "///+x38ABZ40DXrgsGMwYTgxZmZiMTc2ODYtY2hlbjE=",    "$type": "0"  },  "RowKey": {    "$binary": "AAAAAAAAAAM=",    "$type": "0"  },  "Value": {    "$binary": "",    "$type": "0"  }}

     

    02

    JanusGraph 代码改造

     

    在前面我向大家介绍 JanusGraph 如何识别不同的存储产品的,所以要增加 SequoiaDB 数据库这个存储选项,首先需要 为StandardStoreManager 类增加 SequoiaDB 的选项,修改的部分如下:

    ​​​​​​​

    BDB_JE("org.janusgraph.diskstorage.berkeleyje.BerkeleyJEStoreManager", "berkeleyje"),CASSANDRA_THRIFT("org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager", "cassandrathrift"),CASSANDRA_ASTYANAX("org.janusgraph.diskstorage.cassandra.astyanax.AstyanaxStoreManager", ImmutableList.of("cassandra", "astyanax")),CASSANDRA_EMBEDDED("org.janusgraph.diskstorage.cassandra.embedded.CassandraEmbeddedStoreManager", "embeddedcassandra"),CQL("org.janusgraph.diskstorage.cql.CQLStoreManager", "cql"),HBASE("org.janusgraph.diskstorage.hbase.HBaseStoreManager", "hbase"),IN_MEMORY("org.janusgraph.diskstorage.keycolumnvalue.inmemory.InMemoryStoreManager", "inmemory"),SEQUOIADB("org.janusgraph.diskstorage.sequoiadb.SequoiadbStoreManager", "sequoiadb");

     

    StandardStoreManager 类是属于 janusgraph-cord 的模块,所以后续编译后,应该将最新的 janusgraph-core jar 包替换旧的 jar 包。

     

    然后大家只要从 github 上下载 SequoiaDB for JanusGraph 的项目,将其放到 JanusGraph 源码的根目录,修改 maven 的pom.xml 编译脚本,增加 SequoiaDB 的驱动版本说明和添加编译 SequoiaDB for JanusGraph 的项目编译。​​​​​​​

    <titan.compatible-versions>1.0.0,1.1.0-SNAPSHOT</titan.compatible-versions>        <httpcomponents.version>4.4.1</httpcomponents.version>        <hadoop2.version>2.7.7</hadoop2.version>        <hbase1.version>1.4.10</hbase1.version>        <hbase2.version>2.1.5</hbase2.version>        <hbase.server.version>1.4.10</hbase.server.version>        <sequoiadb.version>3.2.1</sequoiadb.version>        ...    <modules>        <module>janusgraph-doc</module>        <module>janusgraph-solr</module>        <module>janusgraph-examples</module>        <module>janusgraph-sequoiadb</module>    </modules>

     

    对 JanusGraph 重新编译:

    mvn -Dlicense.skip=true -DskipTests=true clean install

     

    最后将编译好的 janusgraph-sequoiadb-0.4.0.jar 和 SequoiaDB 的 API 驱动 jar 包保存至 ${JANUSGRAPH_BINARY_HOME}/lib 目录中,就完成了 JanusGraph 扩展 SequoiaDB 存储的操作了。

     

    03

    JanusGraph 配置 SequoiaDB 作为存储

     

    大家将 janusgraph-sequoiadb 的模块编译出来的 jar 包和 SequoiaDB 的 JSON API jar 包一起放到 JunasGraph 的 lib 目录里,同时更新 janusgraph-core 的 jar 包后,就完成了 JanusGraph 扩展 SequoiaDB 存储的操作了。

     

    为了让 JanusGraph 能够认识 SequoiaDB 的连接信息,大家还需要准备一个 config 文件。大家在 JunasGraph 的conf 目录里增加一个 janusgraph-sequoiadb.properties的文件,内容大致如下:​​​​​​​

    gremlin.graph=org.janusgraph.core.JanusGraphFactorystorage.backend=sequoiadbstorage.hostname=10.211.55.7storage.port=11810#storage.username=sdbadmin#storage.password=sdbadminstorage.meta.visibility = truecache.db-cache = falsecache.db-cache-clean-wait = 20cache.db-cache-time = 180000cache.db-cache-size = 0.5

     

    我给大家介绍几个重要的参数

    • storage.hostname,SequoiaDB coord 节点的 IP 地址,或者是 hostname

    • storage.port,SequoiaDB coord 节点的端口号

    • storage.username,如果 SequoiaDB 配置了鉴权,那样就需要配置鉴权的用户名

    • storage.password,如果 SequoiaDB 配置了鉴权,那样就需要配置鉴权的密码

     

    当我们已经将 SequoiaDB 的配置信息写到了 config 文件里面了,那么 JanusGraph 对接 SequoiaDB 也是顺利成章的事情。

     

    大家可以直接打开 Gremlin 控制界面,然后就像平时使用 JanusGraph 那样操作即可。

     

    这里,我给大家准备了一下小 demo。

    ​​​​​​​

    graph = JanusGraphFactory.open('conf/janusgraph-sequoiadb.properties');graph.addVertex("name", "aaa", "num", 123)g = graph.traversal()g.V().values('name')

     

    So easy!

     

    展望未来

     

    现在这个项目还是处于孵化阶段(事实是:一堆的坑,仅仅是 demo 跑通),未来还有很多工作要做,例如:

    • 完善程序,不要那么多的 bug

    • 应该要支持事务功能,毕竟人家 SequoiaDB 支持事务功能呢

    • 对接 JanusGraph 的 Index 模块,也将这块内容让 SequoiaDB 接管

     

    所以啊,未来路还很长,如果有谁看了这篇文章,被我成功感化了,欢迎来找我,也欢迎大家上Git点亮我的小心心,毕竟Star 数量多,会显得我很厉害的样子。

    谢谢大家。

     

    项目地址:

    https://github.com/ak918808/sequoiadb_for_janusgraph

     

    感谢社区同学的分享,也欢迎大家多多给我们投稿

    未来我们也会多和大家分享巨杉数据库社区用户的使用心得体会

    敬请期待

     

     

     

    展开全文
  • SequoiaDB简介和初识

    2020-05-06 17:06:29
    解决方法(1):还是存放在一个大的集中式的关系型数据库里面 优点:方便开发人员理解 缺点:没法解决弹性扩张 解决方法(2):每个微服务下面独立使用一个数据库 优点:如果添加微服务的话数据库也会相应添加 缺点...
  • SPARK_CLASSPATH="/opt/sequoiadb/sequoiadb-driver-SNAPSHOT.jar:/opt/sequoiadb/spark-sequoiadb-SNAPSHOT.jar" 当大数据产品和SequoiaDB完成了对接,那么后续的使用和开发流程与使用原生的HDFS或者本地文件...
  • 由于SequoiaDB对比其他的NoSQL有更多的方式将数据分布到多台服务器上,所以下面笔者为阅读者一一介绍每种分布式方式适合于哪种场景。 1.1Hash方式分布数据 在Hash分布方式中,由于是对集合中某个字段的Hash值进行...
  • SequoiaDB简介 SequoiaDB是一款分布式关系型数据库,是国内为数不多拥有自主知识产权的开源数据库。目前SequoiaDB已经在GitHub上开源。 SequoiaDB主要的功能特点是支持分布式事务、2003标准SQL、同时提供文档存储...
  • 背景 随着互联网的飞速发展,互联网的业务...sequoiadb作为是一款优秀的分布式文档型数据库,其底层基于分布式,高可用,高性能与动态数据类型设计的,能够应对海量数据的存储,及提供高效检索。 传统数据库可以利用...
  • 分布式存储(数据被均匀分布在集群中,每一个数据库实例作为独立的IP地址和端口): 微服务对应独立实例,物理分散管理,逻辑集中管理 分布式存储的优点: (1)完全符合mysql协议,完全和mysql兼容 (2)在整个集群...
  • SequoiaDB 笔记

    2014-12-29 13:55:00
    优点 代码还不错,设计也算简洁。 EDU和CB的使用让整个系统变得简单很多,让代码更关注逻辑。 从设计上应该就是一个分布式系统,麻雀虽小五脏俱全。 没用什么乱七八糟的东西改,基本是自己的代码(虽然支持...
  • 随着互联网的飞速发展,互联网的...sequoiadb作为是一款优秀的分布式文档型数据库,其底层基于分布式,高可用,高性能与动态数据类型设计的,能够应对海量数据的存储,及提供高效检索。 传统数据库可以利用分布式...
  • 优点:合理利用从数据库服务器的空闲资源。 缺点:本来第二台数据库服务器,是用来做热备的,它就应该在一个压力非常小的环境下,保证运行的稳定性。而读写分离,却增加了它的压力,也就增加了不稳定性。因此,...
  • [转]SequoiaDB 笔记

    2015-01-12 19:20:25
    这几天翻了翻SequoiaDB的代码,记了点笔记。不保证下面内容的正确性(肯定有错的地方) 个人观感优点 1.代码还不错,设计也算简洁。 2.EDU和CB的使用让整个系统变得简单很多,让代码更关注逻辑。 3.从设计上应该...
  • 由于SequoiaDB对比其他的NoSQL有更多的方式将数据分布到多台服务器上,所以下面笔者为阅读者一一介绍每种分布式方式适合于哪种场景。
  • 优点:合理利用从数据库服务器的空闲资源。 缺点:本来第二台数据库服务器,是用来做热备的,它就应该在一个压力非常小的环境下,保证运行的稳定性。而读写分离,却增加了它的压力,也就增加了不稳定性。因此,...
  • 混合持久化一个显著的优点就是单一流程的性能提升,但缺点也同样的显而易见:以增加复杂性和学习成本为代价,在部署、使用及维护上带来了挑战。 多模Multi-Model Multi-model多模数据库则是另一种解决思路,在同...
  • 该方式通过结合了Hash分布方式和Partition分布方式的优点,让集合中的数据以更小的颗粒度分布到数据库多个数据分区组上,使得数据库的性能得到极大提升。 1) 对抽取出来的数据进行转码 利用Linux自带的转码...
  • 数据迁移分为全量迁移和增量迁移,本文主要对mysql到sequoiadb的增量数据迁移过程进行分析。
  • 巨杉数据库,核心产品是SequoiaDB巨杉数据库。是我们的团队完全从零开始研发的。巨杉数据库是商业数据库,同时我们本身也将产品开源,我们是中国第一款商业开源数据库产品。 我们连续两年,获得美国硅谷的商业杂志...
  • Sequoiadb作为一个文档型NoSQL数据既可以存储结构化数据也可以存储非结构化数据,对于非结构化数据只能使用原生的API进行查询,对结构化数据我们可以选择使用原生的API和开源SQL引擎,目前PostgresSQL,Hive,SparkSQL...
  • 在如今跨行业竞争如火如荼的今天,互联网与传统行业都应该学习彼此的优点,从而改进自身的问题。” SequoiaDB将一个开发多年、拥有稳定行业客户的商业产品开源,表示出了SequoiaDB对互联网行业的重视。SequoiaDB...
  • 数据库索引

    2020-07-08 16:17:43
    创建索引的优点: 使用字典前面的索引可以快速的查到我们所需要的汉字信息, 数据库也一样,创建索引就是为了提高查询效率。在进行查询时,先查索引,根据索引快速查找到所需要的数据。 创建索引的缺点: 1.有了前面...
  • 软件架构-Nosql之redis

    2021-07-19 09:43:44
    NOSQL的集中数据库 分类 Examples举例 典型应用场景 数据模型 优点 缺点 键值(key-value) Key 指向 Value 的键值对,通常用hash table来实现 列存储数据库 Cassandra, HBase, Riak 分布式的文件系统 以列簇式存储...
  • Redis使用

    2020-04-04 15:24:38
    优点: 丰富的数据结构 2.高速读写,redis使用自己实现的分离器,代码量很短,没有使用lock(MySQL),因此效率非常高。 缺点: 持久化。Redis直接将数据存储到内存中,要将数据保存到磁盘上,Redis可以使用两种...
  • hadoop+spark+mongodb+mysql+c#

    千次阅读 2016-11-30 15:14:24
    它主要具有以下优点:  1高可靠性。Hadoop系统中数据默认有三个备份,并且Hadoop有系统的数据检查维护机制,因而提供了高可靠性的数据存储。  2扩展性强。Hadoop在普通PC服务器集群上分配数据,通过并行运算完成...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 345
精华内容 138
关键字:

sequoiadb优点