修改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