Weed-FS之Volume数据迁移

发布时间 2023-09-17 11:41:16作者: 风语者的祝福

很多刚开始接触 Weed-FS 但是又不熟悉它的用户经常会使用以下的方式启动 weed 集群。

weed master -mdir="/tmp/mdata" -defaultReplication="001" -ip="localhost" -port=9334
weed volume -dir=/tmp/vol1/ -mserver="localhost:9334" -ip="localhost" -port=8081
weed volume -dir=/tmp/vol2/ -mserver="localhost:9334" -ip="localhost" -port=8082
weed volume -dir=/tmp/vol3/ -mserver="localhost:9334" -ip="localhost" -port=8083
一个 MasterServer 对应三个 VolumeServer ,设置复制模式为 "001" , 也就是在相同 Rack 下复制副本为一份,也就是总共有两份。

经过一段时间的上传之后磁盘的文件如下:(其实只要上传一份文件之后就可以看到)

ls vol1 vol2 vol3
vol1:
1.dat 1.idx 2.dat 2.idx 3.dat 3.idx 5.dat 5.idx
vol2:
2.dat 2.idx 3.dat 3.idx 4.dat 4.idx 6.dat 6.idx
vol3:
1.dat 1.idx 4.dat 4.idx 5.dat 5.idx 6.dat 6.idx
也就是总共有6个Volume,分布在三个目录,这三个目录分别属于 VolumeServer1,VolumeServer2,VolumeServer3 。 此时如果想要缩减VolumeServer,比如去掉VolumeServer3。 不熟悉 Weed-FS 的人会很纠结是否可以直接将VolumeServer3的数据挪给 VolumeServer1 和 VolumeServer2 ?

其实这个完全是可以的,由 md5 就可以看出来:

md5 vol1/1.dat vol2/1.dat
MD5 (vol1/1.dat) = c1a49a0ee550b44fef9f8ae9e55215c7
MD5 (vol2/1.dat) = c1a49a0ee550b44fef9f8ae9e55215c7
md5 vol1/1.idx vol2/1.idx
MD5 (vol1/1.idx) = b9edc95795dfb3b0f9063c9cc9ba8095
MD5 (vol2/1.idx) = b9edc95795dfb3b0f9063c9cc9ba8095
只要名字相同,也就是 VolumeId 相同, 即使是属于不同 VolumeServer 的 Volume 其实也是一模一样的(不一样就说明数据损坏),因为 Volume 里面并没有含有任何它所属于的 VolumeServer 的相关信息。 也有人怀疑是否会一模一样,担心备份的时候是采用最终一致性的异步备份方案。 这个也不用担心,在 分布式存储Weed-FS源码分析 里面就说过, Weed-FS 是采用的强一致性的方式进行备份。 每次都是写完所有备份才完成一次上传操作。 客户端才会收到上传成功的返回值。

所以可以放心的将 VolumeServer3 的 Volume 挪到其他两个 VolumeServer, 如下,当然迁移数据之前需要将这四个服务都停止。

ls vol1 vol2 vol3
vol1:
1.dat 1.idx 2.dat 2.idx 3.dat 3.idx 4.dat 4.idx 5.dat 5.idx 6.dat 6.idx
vol2:
1.dat 1.idx 2.dat 2.idx 3.dat 3.idx 4.dat 4.idx 5.dat 5.idx 6.dat 6.idx
vol3:
然后再启动 MasterServer, VolumeServer1, VolumeServer2 即可,如下:

weed master -mdir="/tmp/mdata" -defaultReplication="001" -ip="localhost" -port=9334
weed volume -dir=/tmp/vol1/ -mserver="localhost:9334" -ip="localhost" -port=8081
weed volume -dir=/tmp/vol2/ -mserver="localhost:9334" -ip="localhost" -port=8082