恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2787|回复: 43
打印 上一主题 下一主题

甜糖多个容器共享缓存教程(基于Overlay文件系统的方案)

[复制链接]
跳转到指定楼层
1#
发表于 2021-4-2 22:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 w_anghe 于 2021-4-9 12:24 编辑

目前甜糖多个容器共享缓存的方案大多数是把主机同一个目录映射到不同容器的 /mnts/.yfnode/cache 目录上
这种方案虽然基本可用,但是楼主觉得并不完美,主要问题是可能造成不同容器同时对一个缓存目录进行写操作(.task文件),
这样可能发生一些意想不到的结果,楼主近日突发奇想,利用Overlay文件系统的的特性做了一个自认为比较合理的方案,
做个调查,如果有比较多的人有需求,我就写个详细教程
其实只要明白什么是Overlay文件系统,我相信你已经知道怎么做了。

教程正式开始

我觉得这个教程真正的意义是带大家了解一下Overlay文件系统,大家如果还想更深入的了解,也可以自己再找一下相关资料,
我这里只是带大家先入个门
至于甜糖说不定哪天就消失了
但是这些知识点你可以用在其它地方
希望这个帖子的生命周期比甜糖长
也希望我不要一语成谶


简单介绍一下Overlay文件系统
OverlayFS是一种联合文件系统(UnionFS),分为上下两个层,我们可以理解成有2个目录lower和upper,
但是经过Overlay文件系统挂载后,展现给用户的是一个叫做merged的目录,
在这个目录用户看到的内容就是lower和upper两个目录文件的合集,
如果用户把文件写入merged目录,实际文件是写入了upper目录,lower目录是一个只读层,
文件不会做任何修改。



大家可以参考一下上面这个图,Lower目录就是只读层,用户对Overlay的任何修改都写入了Upper层,
当然还会涉及到文件删除的情况,这里不展开说。这种联合文件系统有很多应用,
比如在docker中,每个容器的底层就是它对应的镜像,也就是无论你创建多少个镜像的容器,
底层的文件是只有一份,不会浪费多余的磁盘空间。
当然具体的实现还有很多特别的处理,但是基本思路就是我说的这样。

用Overlay文件系统实现甜糖缓存共享思路

可能聪明的你们已经想到了,我们是不是可以用类似docker处理镜像和容器的方法共享缓存文件文件呢?
假设我们有2个甜糖的镜像,我给每个甜糖镜像分配一个缓存目录
假设分别为
dir1
dir2
我们分别把2个Overlay文件系统挂载到这2个目录,这两个目录的底层(lower)都是同一份缓存目录,这样就达到共享缓存的目的,而且这两个目录互不影响,对文件的更改都会写入对应的upper层。


具体的实现方法

1.先准备一份缓存
假设这个缓存的目录是 /mnt/usbdisk/static_cache,这个缓存目录的结构如下
static_cache/
└── .yfnode
    └── cache
           ├── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0
           ├── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0.chr
           ├── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0.mem
           ├── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0.task
           ├── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0.tn
           ├── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0.torrent
           └── 00318F7338ACA0DDB4205ACA2B2C5A9CE11990F0.vdata_0.!mv
    └── config
注意一定要删除static_cache/.yfnode/config目录,一定要删除,一定要删除,只留static_cache/.yfnode/cache目录
/mnt/usbdisk/static_cache这个目录就是我们的lower层,是所有甜糖容器缓存目录的底层

2.在/mnt/usbdisk目录下新建ttnode1目录,并新建3个子目录mnts upper work
结构如下
/mnt/usbdisk/ttnode1
├── mnts
├── upper
└── work

下面我们开始 挂 载 缓存目录,我先用命令的方法,之后我会介绍如何修改fstab文件,做到启动的时候自动挂载
  1. cd /mnt/usbdisk/ttnode1
  2. mount -t overlay overlay -o lowerdir=/mnt/usbdisk/static_cache,upperdir=./upper,workdir=./work,index=off,nfs_export=off  ./mnts
复制代码
如果执行完以上两条语句,没有任何错误提示,那么恭喜你,我们的缓存目录已经挂载成功了
/mnt/usbdisk/ttnode1/mnts这个目录现在就被挂载到了一个Overlay文件系统,
这个文件系统的底层(lowerdir)/mnt/usbdisk/static_cache
上层upperdir)/mnt/usbdisk/ttnode1/upper
工作目录(workdir)/mnt/usbdisk/ttnode1/work
我们如果查看/mnt/usbdisk/ttnode1/mnts这个目录,里面会有/mnt/usbdisk/static_cache目录中的所有文件
我们以后对/mnt/usbdisk/ttnode1/mnts这个目录所做的全部修改都将被写入/mnt/usbdisk/ttnode1/upper
而/mnt/usbdisk/static_cache做为只读层(lowerdir)是不会被修改的

下面我们创建容器的时候把缓存目录指定为/mnt/usbdisk/ttnode1/mnts就可以了,
例如这样
  1. docker run -itd \
  2.   -v /mnt/usbdisk/ttnode1/mnts:/mnts \
  3.   --name ttnode \
  4.   --hostname ttnode1 \
  5.   --net=macnet --ip=192.168.2.2 --dns=114.114.114.114 --mac-address C2:F2:9C:C5:B2:94 \
  6.   --privileged=true \
  7.   --restart=always \
  8.   ericwang2006/ttnode
复制代码
当然这里用到了macvlan,如果不清楚可以看我的教程

用同样的方法我们可以继续创建/mnt/usbdisk/ttnode2, /mnt/usbdisk/ttnode3 你想开多少实例就开多少

3.如何开机自动挂载overlay文件系统
其实很简单,修改/etc/fstab文件, 增加一行
游客,如果您要查看本帖隐藏内容请回复

修改完这个文件,重启之前,请仔细核对,不要写错任何目录,否则可能造成系统不能启动

4.优点总结
这种方法做到了共享一份缓存,但是每个目录彼此独立,写入的操作不受任何影响。
5.补充一下
  • lower目录可以为任何linux支持的文件系统,可以是nfs、cifs这样的远程文件系统,也可以是另一个overlayfs
  • upperdir所在的文件系统不能是nfs、cifs、gfs2、vfat、ocfs2、fuse、isofs、jfs和另一个overlayfs等文件系统
  • workdir和upperdir必须在同一文件系统下,而lower不是必须的
  • 如果没有特殊需要,我建议这几个目录都用ext4文件格式


更多内容大家可以参考一下这里
https://www.cnblogs.com/liujunjun/p/12119513.html
https://www.cnblogs.com/liujunjun/p/12119673.html








单选投票, 共有 36 人参与投票

投票已经结束

94.44% (34)
0.00% (0)
5.56% (2)
您所在的用户组没有投票权限
我的恩山、我的无线 The best wifi forum is right here.
2#
发表于 2021-4-3 00:50 | 只看该作者
文件不是实时索引,假如一个容器恰好读取到,被别的容器删除了的缓存上是不是会假死
来自安卓客户端来自安卓客户端
我的恩山、我的无线 The best wifi forum is right here.
3#
发表于 2021-4-3 11:41 | 只看该作者
不太懂多开,按照论坛的openwrt多开甜糖失败
来自安卓客户端来自安卓客户端
我的恩山、我的无线 The best wifi forum is right here.
4#
发表于 2021-4-5 13:17 | 只看该作者
我非常赞成优化这方面的操作,之前我也是用过楼主说的别人的方法,但是那个方法有一些不好的地方,以至于我现在都不用它了,直接每一个tt使用一个缓存,但这样比较浪费空间。

以前的有这样的问题:
1、容易出现“存储异常”,以致于降低本tt的“节点评级”;
2、各个甜糖产生的新缓存不能被彼此识别,需要手动restart。

所以强烈建议优化,也许楼主的不一定是最终方法,但一切改进的方法,都是值得尝试的。
我的恩山、我的无线 The best wifi forum is right here.
5#
发表于 2021-4-9 03:09 | 只看该作者
太棒了...
我的恩山、我的无线 The best wifi forum is right here.
6#
发表于 2021-4-9 08:20 | 只看该作者
学习受教了,谢谢
我的恩山、我的无线 The best wifi forum is right here.
7#
发表于 2021-4-9 09:52 | 只看该作者
本帖最后由 lucktu 于 2021-4-9 10:09 编辑

没想到楼主这么快就出教程了,好东西就是要分享,多谢!!

是的,甜糖是个玩具,从中能让我们理解和学到很多东西,获得很多快乐。

给大家两个建议:

1、不要用 /etc/fstab 的方式挂载,这方法对老鸟适合,新手容易把机器搞崩,建议用 mount 加入开机启动里,大不了起不来,机器不会瘫痪。
2、建议定期检查顶层文件,但有新文件时,自动合并到底层来,并删除顶层文件,提高文件利用率,增大缓存空间(杀掉docker-->移动文件-->重启docker)。

点评

感谢关注! 关于在开机启动中挂载Overlay要注意一下,开机启动服务和docker服务启动有先后顺序 不同的系统处理方法会有所不同,要确保在docker启动前挂载好Overlay文件系统  详情 回复 发表于 2021-4-9 12:09
我的恩山、我的无线 The best wifi forum is right here.
8#
 楼主| 发表于 2021-4-9 12:09 | 只看该作者
lucktu 发表于 2021-4-9 09:52
没想到楼主这么快就出教程了,好东西就是要分享,多谢!!

是的,甜糖是个玩具,从中能让我们理解和学到 ...

感谢关注!
关于在开机启动中挂载Overlay要注意一下,开机启动服务和docker服务启动有先后顺序
不同的系统处理方法会有所不同,要确保在docker启动前挂载好Overlay文件系统
我的恩山、我的无线 The best wifi forum is right here.
9#
发表于 2021-4-9 12:16 | 只看该作者
感谢楼主的经验,我已经用上了!

另外,上面的建议补充一下,如果顶层都删除,那么底层在下一次重启甜糖时,也是需要删除的,不能只是添加。官方说过,两个月以上的缓存可以删除。

点评

可以每两个月折腾一次,用最新的缓存替换底层,我有空再写一个说明吧,怕说不清楚小白折腾乱了  详情 回复 发表于 2021-4-9 12:29
我的恩山、我的无线 The best wifi forum is right here.
10#
 楼主| 发表于 2021-4-9 12:29 | 只看该作者
lucktu 发表于 2021-4-9 12:16
感谢楼主的经验,我已经用上了!

另外,上面的建议补充一下,如果顶层都删除,那么底层在下一次重启甜糖 ...

可以每两个月折腾一次,用最新的缓存替换底层,我有空再写一个说明吧,怕说不清楚小白折腾乱了
我的恩山、我的无线 The best wifi forum is right here.
11#
发表于 2021-4-9 20:49 | 只看该作者
学习新的知识
我的恩山、我的无线 The best wifi forum is right here.
12#
发表于 2021-4-9 21:34 | 只看该作者
本帖最后由 lucktu 于 2021-4-9 22:13 编辑

奇怪,都一个多两个小时过去了,为什么共享的是 682 个任务,其中一个甜糖 upper 目录新增了70个目录(任务?),而他的统计上却显示只有 683 个任务呢?(另外一个甜糖 upper 目录新增了35个目录,它那里显示 682 个任务。都是用低版本的服务器 app 看到的)

貌似对新增加的目录(任务?)识别有问题?增加又猛,以前也没有这样观察到过,对 Overlay 还很陌生,。。。继续观察中

感觉 upper 目录里面增加的不是真正的任务,而仅仅是一些目录,是虚的东西,最终以本 docker 下的合并目录(mnts)为准,。。。

点评

现在看来不简单啊,对于某些任务,他会有修改,修改的部分保存在 upper 目录里,所以 upper 目录里有的目录与底层的是一样的(但比它少),只是它的修改版,所以 upper 目录会增加很多目录而任务增加很少就是这个道  详情 回复 发表于 2021-4-10 16:24
我的恩山、我的无线 The best wifi forum is right here.
13#
发表于 2021-4-9 21:50 | 只看该作者
mount: /mnt/sdc1/tt/1/mnts: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.               报错    apt-get install nfs-common apt-get install cifs-utils   未解决

点评

你没有完全按照楼主的目录进行测试,自己改了没有改对造成的,我也遇到过,仔细的把楼主的目录列个图表,自己对应修改吧,没有问题,也不需要你去安装那些所谓的缺失插件,一般不缺的。  详情 回复 发表于 2021-4-9 22:11
我的恩山、我的无线 The best wifi forum is right here.
14#
发表于 2021-4-9 22:11 | 只看该作者
long1983 发表于 2021-4-9 21:50
mount: /mnt/sdc1/tt/1/mnts: wrong fs type, bad option, bad superblock on overlay, missing codepage o ...

你没有完全按照楼主的目录进行测试,自己改了没有改对造成的,我也遇到过,仔细的把楼主的目录列个图表,自己对应修改吧,没有问题,也不需要你去安装那些所谓的缺失插件,一般不缺的。

点评

就是精简版的问题,现在安装了一个官方的原版是可以用的,没问题,  详情 回复 发表于 2021-4-10 15:19
测试的 目录结构一样 也是一样的错误 应该是我的Ubuntu是精简版的原因吧  详情 回复 发表于 2021-4-9 22:40
谢谢鼓励  详情 回复 发表于 2021-4-9 22:14
我的恩山、我的无线 The best wifi forum is right here.
15#
发表于 2021-4-9 22:14 | 只看该作者
lucktu 发表于 2021-4-9 22:11
你没有完全按照楼主的目录进行测试,自己改了没有改对造成的,我也遇到过,仔细的把楼主的目录列个图表, ...

  谢谢鼓励
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2021-4-17 22:23

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表