Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] 设计一致性哈希 + 分布式的 Sqlite 方案替换掉 Mysql 服务 #232

Open
hyj1991 opened this issue Oct 24, 2023 · 14 comments
Assignees
Labels

Comments

@hyj1991
Copy link
Member

hyj1991 commented Oct 24, 2023

考虑如下

  • 单点 Mysql (或类似的兼容 Mysql 方案)一般是非自运维服务存,存在不可靠性
  • EZM 大量的数据是 log,原本就是按天切割为单表进行清洗,在 sqlite 模式下直接清理比较方便,对于没有 DDL 语句执行权限的数据库场景是一个体验的增强

尝试采用一致性哈希实现分布式 sqlite,彻底去除 Mysql 依赖

@hyj1991 hyj1991 self-assigned this Oct 24, 2023
@hyj1991 hyj1991 changed the title [WIP] 设计一致性哈希方案 + sqlite 替换掉 Mysql 服务 [WIP] 设计一致性哈希 + 分布式的 Sqlite 方案替换掉 Mysql 服务 Oct 24, 2023
@fengmk2
Copy link
Member

fengmk2 commented Oct 24, 2023

低成本部署么

@hyj1991
Copy link
Member Author

hyj1991 commented Oct 24, 2023

低成本部署么

对,减少依赖,单库大表清理数据在 sqlite 下也比较方便,直接删除 db 文件就行了

@hyj1991
Copy link
Member Author

hyj1991 commented Oct 24, 2023

一些前置调研:

sqlite 的多 db 文件拆分后的联表查询思路:

const sqlite3 = require('sqlite3').verbose();

// 创建数据库连接
const dbA = new sqlite3.Database('path/to/databaseA.sqlite');
const dbB = new sqlite3.Database('path/to/databaseB.sqlite');

// 执行关联查询
dbA.serialize(() => {
  dbA.run('ATTACH DATABASE ? AS B', ['path/to/databaseB.sqlite'], (err) => {
    if (err) {
      console.error(err);
      return;
    }
    
    dbA.all(`
      SELECT *
      FROM table1
      JOIN B.table2 ON table1.column_name = B.table2.column_name;
    `, (err, rows) => {
      if (err) {
        console.error(err);
        return;
      }
      
      // 处理查询结果
      console.log(rows);
      
      // 关闭数据库连接
      dbA.close();
      dbB.close();
    });
  });
});

@hyj1991
Copy link
Member Author

hyj1991 commented Oct 24, 2023

目前在分布式集群部署模式下的现存三方依赖有:

  • Mysql
  • Redis
  • 存储服务

sqlite 这个方案相当于精简为两个依赖:

  • Redis
  • 存储服务

@killagu
Copy link
Contributor

killagu commented Oct 24, 2023

可以来个 cloudflare 的 sqlite 分享了 😊

@hyj1991
Copy link
Member Author

hyj1991 commented Oct 24, 2023

可以来个 cloudflare 的 sqlite 分享了 😊

看看能不能搞定这个方案

@FishOrBear
Copy link

这个绝对是一个很大的进步.比如我的1G内存小鸡.就适合轻量级部署

@fengmk2
Copy link
Member

fengmk2 commented Nov 24, 2023

是不是直接考虑单机单进程部署就行了?

@hyj1991 hyj1991 changed the title [WIP] 设计一致性哈希 + 分布式的 Sqlite 方案替换掉 Mysql 服务 [RFC] 设计一致性哈希 + 分布式的 Sqlite 方案替换掉 Mysql 服务 Dec 31, 2023
@atian25
Copy link
Member

atian25 commented Apr 23, 2024

目前在分布式集群部署模式下的现存三方依赖有:

  • Mysql
  • Redis
  • 存储服务

sqlite 这个方案相当于精简为两个依赖:

  • Redis
  • 存储服务

redis 和 oss 感觉更容易精简,前者用个 kv,后者用了 file,只要 plugin 把对应的接口抽象下是不是就行了?

@fengmk2
Copy link
Member

fengmk2 commented Apr 23, 2024

oss 的文件也可以直接存 sqlite 了。
redis 单机缓存 io 还好,直接使用本地文件或者 sqlite 代替也行,这样完全只依赖 sqlite 了。

@hyj1991
Copy link
Member Author

hyj1991 commented Apr 24, 2024

目前在分布式集群部署模式下的现存三方依赖有:

  • Mysql
  • Redis
  • 存储服务

sqlite 这个方案相当于精简为两个依赖:

  • Redis
  • 存储服务

redis 和 oss 感觉更容易精简,前者用个 kv,后者用了 file,只要 plugin 把对应的接口抽象下是不是就行了?

这里的复杂点还要考虑下性能,sqlite 我在 LLM 这里尝试过读取超过 50G 的文件,加载速度会巨慢,所以得做一个去中心化的分布式节点

@fengmk2
Copy link
Member

fengmk2 commented Apr 24, 2024

不是定时删除历史数据么?应该不会这么大?

@hyj1991
Copy link
Member Author

hyj1991 commented Apr 25, 2024

不是定时删除历史数据么?应该不会这么大?

看实例数量的,一般公司不会这么大,比如我们自己 1d 数据都很大,你可以看看 xprofiler_logs 里面的 process_info 表长度

@atian25
Copy link
Member

atian25 commented Apr 25, 2024

这个是单机场景吧,应该不会很大

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants