修改juicefs 源码使用oceanbase做为元数据存储

以前有说明让juicefs 支持oceanbase 的方式,但是在测试之后发现并不是很好,所以直接基于源码进行修改是一种很不错的方法

代码修改

  • 主要是meta 中sql.go
    具体需要的地方
    Init 地方, 删除对于mysql的特殊处理,NewSession 部分也需要
 
 // if m.db.DriverName() == "mysql" {
    //  m.updateCollate()
    // }

还有就是NewSession 部分重新同步结构的问题, 这部分我也是禁用了

    func (m *dbMeta) NewSession() error {
    go m.refreshUsage()
    if m.conf.ReadOnly {
        return nil
    }
    if err := m.db.Sync2(new(session)); err != nil { // old client has no info field
        return err
    }
    // if m.db.DriverName() == "mysql" {
    //  m.updateCollate()
    // }
    // update the owner from uint64 to int64
    // if err := m.db.Sync2(new(flock), new(plock)); err != nil {
    //  logger.Fatalf("update table flock, plock: %s", err)
    // }

构建

  • 构建
make juicefs

使用

  • docker-compose
version: "3"
services:
    ocenbase:
      image: oceanbase/obce-mini
      environment:
      - "OB_ROOT_PASSWORD=dalongrong"
      ports:
      - "2881:2881"
    s3:
      image: minio/minio
      environment:
      - "MINIO_ACCESS_KEY=minio"
      - "MINIO_SECRET_KEY=minio123"
      command: server /data --console-address ":9001"
      ports:
      - "9000:9000"
      - "9001:9001"
  • format
./juicefs format --storage minio \
    --bucket http://127.0.0.1:9000/jfs2 \
    --access-key minio \
    --secret-key minio123 \
    "mysql://root:dalongrong@(127.0.0.1:2881)/juicefs" \
    pics
  • mount
sudo ./juicefs mount  "mysql://root:dalongrong@(127.0.0.1:2881)/juicefs"  apps

一个参考延迟对比

注意对比不能说明多大的问题,因为ob 面向的是分布式集群的,我部署的是mini 的性能上是不能直接和单机的mysql 比的

  • ob 的

  • mysql 的

说明

目前juicefs 对于mysql 处理部分是挺怪异的,后边看看官方的issue,找下为啥进行了那么多的处理,而且大家可能也会碰到


解决方法, 但是目前此特性官方是没有直接开启的,所以还是慎重处理

 
ALTER system set _ob_enable_prepared_statement =true; 

参考资料

https://juicefs.com/docs/zh/community/databases_for_metadata

原文地址:https://www.cnblogs.com/rongfengliang/p/15779969.html