1. 为什么将元数据存储从 Redis 迁移到 PGSQL
Redis 使用内存存储元数据,PGSQL 使用磁盘存储元数据,成本差异显而易见。
不同的 PGSQL 提供了不同的性能 IOPS。如果对性能没有持续高的要求,使用 PGSQL 是不错的选择。
如果按照元数据大小估算应该更准确,但我更喜欢用的公式是: 元数据的大小 * 2000 = 存储的大小
。也就是 200TB 的数据,需要一个 100GB 的 Redis 实例。而目前我们常用的云厂最大的主从 Redis 实例只有 96GB,无法满足存储需求。
使用 Redis 集群有一个坑是,Juicefs 只会使用一个 Redis 集群节点存储元数据,其他节点的资源无法使用。
而使用 PGSQL 的实例可以提供 TB 级别的存储,Juicefs 单实例可以容纳 PB 级别的数据。
2. 从 Redis 导出元数据
1
2
3
4
| export REDIS_PASSWORD=
#ip:port/database
export REDIS_ENDPOINT=
export META_SERVER=redis://:$REDIS_PASSWORD@$REDIS_ENDPOINT
|
1
2
3
4
| juicefs dump $META_SERVER meta-redis.json
Dumped entries: 25334296/25752607 [============================================================>-] 17909.7/s ETA: 23s
juicefs[3287398] <INFO>: Dump metadata into meta-redis.json succeed [dump.go:107]
|
等待导出完毕。
3. 将元数据导入到 PGSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| export ACCESS_KEY=
export SECRET_KEY=
export BUCKET=
export ENDPOINT=ks3-cn-beijing-internal.ksyun.com
export BUCKET_ENPOINT=$BUCKET.$ENDPOINT
export PROVIDER=ks3
export NAMESPACE=
export PVC_NAME=
export NODE_SELECTOR_KEY=
export NODE_SELECTOR_VALUE=
export JUICEFS_IMAGE=juicedata/juicefs-fuse
export DEMO_IMAGE=shaowenchen/demo-ubuntu
export POSTGRES_USER=admin
export POSTGRES_PASSWORD=
export POSTGRES_IP=
export POSTGRES_PORT=5432
export POSTGRES_DB=
export META_SERVER=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_IP:$POSTGRES_PORT/$POSTGRES_DB?sslmode=disable
|
1
| psql -U $POSTGRES_USER -h $POSTGRES_IP -p $POSTGRES_PORT -d postgres -c "CREATE DATABASE $POSTGRES_DB;"
|
1
2
3
4
| juicefs load $META_SERVER meta-redis.json
juicefs[3315492] <WARNING>: Secret key was removed; please correct it with `config` command [load.go:138]
juicefs[3315492] <INFO>: Load metadata from meta-redis.json succeed [load.go:143]
|
1
| juicefs config --secret-key $SECRET_KEY $META_SERVER
|
在集群配置 JuiceFS 的过程可以参考,在 Kubernetes 下创建后端为 JuiceFS 的 PVC
4. 性能测试
最后使用默认参数测试了下,看起来速度也还行,在可以接受的范围:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| juicefs bench .
+------------------+------------------+---------------+
| ITEM | VALUE | COST |
+------------------+------------------+---------------+
| Write big file | 408.04 MiB/s | 2.51 s/file |
| Read big file | 232.10 MiB/s | 4.41 s/file |
| Write small file | 11.0 files/s | 91.25 ms/file |
| Read small file | 21.9 files/s | 45.61 ms/file |
| Stat file | 144.2 files/s | 6.94 ms/file |
| FUSE operation | 17912 operations | 1.48 ms/op |
| Update meta | 1228 operations | 9.88 ms/op |
| Put object | 356 operations | 114.92 ms/op |
| Get object | 356 operations | 55.30 ms/op |
| Delete object | 0 operations | 0.00 ms/op |
| Write into cache | 0 operations | 0.00 ms/op |
| Read from cache | 0 operations | 0.00 ms/op |
+------------------+------------------+---------------+
|