首页 > 数据库 >超高性能数据库 OpenM(ysq)LDB:无缝兼容 MySQL 协议 和多语言 MySQL 客户端

超高性能数据库 OpenM(ysq)LDB:无缝兼容 MySQL 协议 和多语言 MySQL 客户端

时间:2024-03-22 13:22:05浏览次数:28  
标签:OpenM LDB err OpenMLDB 兼容 MySQL

OpenM(ysq)LDB 项目介绍

OpenM(ysq)LDB 是高性能时序数据库 OpenMLDB 的全新服务模块,OpenMLDB 中 “ML” 既是 Machine Learning 的缩写,也可以是 MySQL 的缩写,通过此模块用户可以直接使用 MySQL 命令行客户端或多种编程语言的 MySQL SDK,从而实现 OpenMLDB 数据库特有的在线离线特征计算功能。

OpenMLDB 是基于 C++ 和 LLVM 实现的分布式高性能内存时序数据库,在架构设计和实现逻辑上与专注于单机的关系型数据库 MySQL 有很大区别,并且 OpenMLDB 更加适用于金融风控、推荐系统等硬实时在线特征计算场景中。由于二者都提供标准的 ANSI SQL 接口,OpenMLDB 通过兼容 MySQL 协议,让客户直接使用熟悉的 MySQL 客户端,甚至在Java、Python 等 SDK 编程中也不需要修改业务代码,可直接用 MySQL 库来访问 OpenMLDB 数据以及执行特殊的 OpenMLDB SQL 特征抽取语法。

使用兼容的 MySQL 命令行

部署 OpenMLDB 分布式集群以后,开发者不需要额外安装 OpenMLDB 命令行工具,使用预安装好的 MySQL 命令行工具,可直接连接 OpenMLDB 集群进行测试(注意,以下 SQL 连接以及执行结果均在 OpenMLDB 集群中返回,并非 MySQL 服务)。

file

通过执行定制化的 OpenMLDB SQL,我们不仅可以查看 OpenMLDB 集群状态,还可以切换离线模式和在线模式,实现 MLOps 的离线和在线特征抽取功能。

file

使用兼容的 JDBC 驱动

Java 用户一般使用 MySQL JDBC 驱动来连接 MySQL,同样的代码不需要任何修改就可以直连 OpenMLDB 集群。

编写 Java 应用代码如下,注意根据实际集群情况修改IP、端口以及用户名密码信息。

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3307/db1";
        String user = "root";
        String password = "root";

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            connection = DriverManager.getConnection(url, user, password);
            statement = connection.createStatement();

            resultSet = statement.executeQuery("SELECT * FROM db1.t1");

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // Close the result set, statement, and connection
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

然后编译执行即可,可以在命令行输出中看到查询的 OpenMLDB 数据库数据。

file

使用兼容的 SQLAlchemy 驱动

Python 用户常使用 SQLAlchemy 和 MySQL 驱动,同样的代码也可以直接用于查询 OpenMLDB 的在线数据。

编写 Python 应用代码如下:

from sqlalchemy import create_engine, text

def main():
    engine = create_engine("mysql+pymysql://root:[email protected]:3307/db1", echo=True)
    with engine.connect() as conn:
        result = conn.execute(text("SELECT * FROM db1.t1"))
        for row in result:
            print(row)

if __name__ == "__main__":
  main()

然后直接执行,在命令行也可以看到对应的 OpenMLDB 数据库输出。

file

使用兼容的 Go MySQL 驱动

Golang 用户一般官方推荐的 github.com/go-sql-driver/mysql 驱动来访问 MySQL,同样不需要修改应用代码就可以直接访问 OpenMLDB 集群。

编写 Golang 应用代码如下:

package main

import (
        "database/sql"
        "fmt"
        "log"

        _ "github.com/go-sql-driver/mysql"
)

func main() {
        // MySQL database connection parameters
        dbUser := "root"         // Replace with your MySQL username
        dbPass := "root"         // Replace with your MySQL password
        dbName := "db1"    // Replace with your MySQL database name
        dbHost := "localhost:3307"        // Replace with your MySQL host address
        dbCharset := "utf8mb4"            // Replace with your MySQL charset

        // Create a database connection
        db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s", dbUser, dbPass, dbHost, dbName, dbCharset))
        if err != nil {
                log.Fatalf("Error connecting to the database: %v", err)
        }
        defer db.Close()

        // Perform a simple query
        rows, err := db.Query("SELECT id, name FROM db1.t1")
        if err != nil {
                log.Fatalf("Error executing query: %v", err)
        }
        defer rows.Close()

        // Iterate over the result set
        for rows.Next() {
                var id int
                var name string
                if err := rows.Scan(&id, &name); err != nil {
                        log.Fatalf("Error scanning row: %v", err)
                }
                fmt.Printf("ID: %d, Name: %s\n", id, name)
        }
        if err := rows.Err(); err != nil {
                log.Fatalf("Error iterating over result set: %v", err)
        }
}

直接编译并运行,即可在命令行查看数据库输出的结果。

file

使用兼容的 Sequel Ace 客户端

MySQL 用户常用 GUI 应用来简化数据库的管理,用户如果想要连接 OpenMLDB 集群,也可以使用这类开源的 GUI 工具。

以 Sequel Ace 为例,用户不需要修改任何项目代码,只需要在连接数据库时,地址和端口填写 OpenM(ysq)LDB 服务的地址和端口,用户名和密码填写 OpenMLDB 服务的用户名和密码,即可按照 MySQL 的操作方法来访问 OpenMLDB 服务。

file

使用兼容的 Navicat 客户端

除了 Sequel Ace ,Navicat 也是比较受欢迎的MySQL客户端,用户不需要修改任何项目代码,只需要新建连接(MySQL) 时,地址和端口填写 OpenM(ysq)LDB 服务的地址和端口,用户名和密码填写 OpenMLDB 服务的用户名和密码,即可按照 MySQL 的操作方法来访问 OpenMLDB 服务。

file

MySQL 协议兼容原理

MySQL(包括后续 MariaDB 版本)的协议都是公开可读的,OpenM(ysq)LDB 在服务端完全实现并兼容了 MySQL 的协议,并且通过 OpenMLDB 的 SDK 来管理后端访问分布式 OpenMLDB 集群的连接,从而实现与各种 MySQL 客户端的兼容访问。

file

目前 OpenM(ysql)LDB 通过长连接的维护客户端与 OpenMLDB 的交互,保证每个连接都有唯一的客户端对象访问 OpenMLDB 集群,相同连接的所有 SQL 查询都不需要额外初始化,并且在连接关闭后自动释放资源,服务本身占用的开销几乎可以忽略不计,性能与直连 OpenMLDB 也可以保持一致。

更多使用文档可参考官方文档 https://openmldb.ai/docs/zh/main/app_ecosystem/open_mysql_db/index.html

总结

OpenM(ysql)LDB 是 OpenMLDB 项目的一次大胆的尝试,在 0.1.5 到 0.8.5 一共39个版本发布后,在不断的功能完善和 SQL 语法兼容以后,终于实现了完全兼容 MySQL 协议的功能,在保证了基本的 SQL 查询功能外还提供了比 MySQL 更高性能的底层存储实现和 AI 能力拓展。从此以后,MySQL / MariaDB 用户可以无缝地切换他们的数据库存储引擎,不同编程语言的开发者也可以直接使用已有成熟的 MySQL SDK,使用 OpenMLDB 服务的门槛极度降低,为所有 DBA 或数据开发者提供向 AI 转型的“捷径”。

注意,目前测试 MySQL Workbench 暂无法使用 OpenM(ysql)LDB,相关测试工作仍在进行中,感兴趣的开发者可以在 Github 上持续关注此项目的开发进展。

相关阅读

标签:OpenM,LDB,err,OpenMLDB,兼容,MySQL
From: https://www.cnblogs.com/4paradigm-opensource/p/18089252

相关文章

  • Mysql索引
    目录一、索引1、索引的概念二、索引的作用1、索引的作用2、索引的副作用三、创建索引的原则依据1、索引创建的原则2、MySQL的优化哪些字段/场景适合创建索引,哪些不适合?①小字段②唯一性强的字段③更新不频繁,但查询率很高的字段④表记录超过300+行⑤主键,外键,唯一......
  • AHI对MySQL性能的影响
    MySQL中出现很多latch锁,而这个很大程度上和MySQL自适应hash索引有关。AHI概述MySQLInnoDB存储引擎的自适应哈希(AdaptiveHashIndex,下简称AHI)功能若用户的访问模式基本都是类似KV操作的点查询(pointselect),则InnoDB存储引擎会自动创建哈希索引。在有了哈希索引后,查询无......
  • mysql for update是锁表还是锁行
    转载至我的博客https://www.infrastack.cn,公众号:架构成长指南在并发一致性控制场景中,我们常常用forupdate悲观锁来进行一致性的保证,但是如果不了解它的机制,就进行使用,很容易出现事故,比如forupdate进行了锁表导致其他请求只能等待,从而拖垮系统,因此了解它的原理是非常必要的......
  • 良心干货,常见的MySQL索引类型枚举!!!
    在MySQL中,索引是一种用于快速查询和检索数据的数据结构。它们类似于书籍的目录,可以帮助数据库系统更快地定位到特定的数据行,而不需要扫描整个数据表。索引可以显著提高查询性能,特别是在处理大量数据时。MySQL支持多种类型的索引,每种索引都有其特定的使用场景和优势。以下是......
  • 【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作
    目录1 MySQL分组查询与子查询1.1数据分组查询1.2过滤分组1.3分组结果排序1.4select语句中子句的执行顺序1.5子查询2 MySQL表的联结操作2.1关系表2.2表联结2.3笛卡尔积2.4内部联结2.5外联结2.6自联结2.7组合查询1 MySQL分组查询与子查询1.1......
  • 浅谈MySQL中的外键、索引和性能优化
    当我们讨论MySQL中的外键、索引和优化时,我们通常指的是为了提高数据库查询效率、数据完整性和整体性能而采取的一系列措施。1.外键(ForeignKeys)定义:外键是一个字段,它在一个表中引用另一个表的主键。外键用于确保数据引用完整性和在两个表之间建立关系。举例:假设......
  • 【测试开发学习历程】MySQL增删改操作 + 备份与还原 + 索引、视图、存储过程
    前言:SQL内容的连载,到这里就是最后一期啦!如果有小伙伴要其他内容的话,我会追加内容的。(前提是我有学过,或者能学会)接下来,我们就要开始python内容的学习了~~ 目录1 MySQL增删改操作1.1数据添加操作1.1.1插入完整的行1.1.2插入多行1.2数据更新操作1.3数据删除操......
  • PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教
    当前,城市生活的节奏日益加快,人们对各类便民信息的需求也愈发迫切。无论是寻找家政服务、二手交易,还是发布租房、求职信息,一个高效、便捷的信息平台显得尤为重要。传统的信息发布方式往往存在信息更新不及时、查找困难等问题,无法满足现代都市人的需求。罗峰给大家分享一款智慧同......
  • MySQL必知必会
    #Mysql##Mysql事务###原则1.只有使用了INNODB引擎的数据库或表才支持事务2.原子性:具备回滚机制,只有全部完成和全部不完成两种状态。3.一致性:事务开启前和结束后数据库完整性没有被破坏。4.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。防止事务同时执行......
  • 毕业设计课题:实验室课程管理系统,基于java+SSM+mysql
          一、前言介绍     如今互联网发展迅猛,大量的信息都是通过网络这一渠道来传播,所以利用网络渠道来传播知识是非常有前景的。线上管理系统的主要目的是对实验室课程信息进行更有效的管理,光靠现有的管理方式是远远不够的,因此开发实验室课程管理系统是有必要的......