找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 20612|回复: 96

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

  [复制链接]
发表于 2021-4-2 22:48 | 显示全部楼层 |阅读模式
本帖最后由 w_anghe 于 2021-5-21 22:17 编辑

2021-5-21更新
不少坛友反映运行一段时间后,可能底层有不少文件应该删除,上层又有不少文件写入,为了充分利用磁盘空间,我给大家写一段合并脚本
运行脚本前请注意:
一定先卸载overlay目录
一定先卸载overlay目录
一定先卸载overlay目录
卸载命令
docker stop ttnode1
umount /mnt/usbdisk/ttnode1/mnts
有几个容器就重复上面的命令几次,目录根据自己情况修改
然后把我下面的代码存成一个shell脚本执行,其中脚本开头lower和upper目录根据自己情况修改,有几个目录就执行几次
注意做好数据备份工作,万一造成意料之外的结果本人概不负责
  1. #!/bin/bash

  2. lower="/mnt/usbdisk/static_cache/.yfnode/cache"
  3. upper="/mnt/usbdisk/ttnode/upper/.yfnode/cache"
  4. filelist="/tmp/cfile.txt"

  5. cd $upper
  6. find ./ -maxdepth 1 -type c > $filelist

  7. cd $lower
  8. xargs -I{} rm -rf {}<$filelist

  9. cd $upper
  10. xargs -I{} rm -rf {}<$filelist

  11. rsync -av $upper/* $lower

  12. rm -rf $upper
复制代码




目前甜糖多个容器共享缓存的方案大多数是把主机同一个目录映射到不同容器的 /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文件, 增加一行
overlay /mnt/usbdisk/ttnode1/mnts overlay defaults,lowerdir=/mnt/usbdisk/static_cache,upperdir=/mnt/usbdisk/ttnode1/upper,workdir=/mnt/usbdisk/ttnode1/work,index=off,nfs_export=off 0 0
修改完这个文件,重启之前,请仔细核对,不要写错任何目录,否则可能造成系统不能启动

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









单选投票, 共有 89 人参与投票
您所在的用户组没有投票权限

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 3恩山币 +3 收起 理由
栈桥*** + 1 2333
ghos*** + 1 强大的恩山!(以下重复1万次)
风在吹*** + 1 一看就是觉得高端、大气、上档次!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2021-4-9 12:09 | 显示全部楼层
lucktu 发表于 2021-4-9 09:52
没想到楼主这么快就出教程了,好东西就是要分享,多谢!!

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

感谢关注!
关于在开机启动中挂载Overlay要注意一下,开机启动服务和docker服务启动有先后顺序
不同的系统处理方法会有所不同,要确保在docker启动前挂载好Overlay文件系统
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-4-9 12:29 | 显示全部楼层
lucktu 发表于 2021-4-9 12:16
感谢楼主的经验,我已经用上了!

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

可以每两个月折腾一次,用最新的缓存替换底层,我有空再写一个说明吧,怕说不清楚小白折腾乱了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-4-13 09:06 | 显示全部楼层
ngwk1984 发表于 2021-4-13 02:21
不太懂多开,按照论坛的openwrt多开甜糖失败

如果openwrt是主路由(或者单臂路由), 不能使用macvlan模式, 只能使用桥接网络, 再配合端口转发(upnp不能用)
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-4-13 20:03 | 显示全部楼层
wxrgh 发表于 2021-4-13 15:40
这只是解决了挂载问题,怎么再开一个甜糖的进程求指导

https://github.com/ericwang2006/docker_ttnode
你参考一下我的教程吧,我这个不算是保姆级教程,但是我觉得关键点都说到了,如果还是不清楚,我建议你搜索一下论坛,有很多讲得非常详细的帖子。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-4-15 16:53 | 显示全部楼层
109753786 发表于 2021-4-15 14:51
中间有一句我没弄明白,
(用同样的方法我们可以继续创建/mnt/usbdisk/ttnode2, /mnt/usbdisk/ttnode3 你 ...

是的,没错
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-4-24 10:24 | 显示全部楼层
周卫国 发表于 2021-4-23 21:48
还想请教一下,防火墙添加iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE之后是不是不能使用macvla ...

可以用macvlan模式,没有影响
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-5-21 10:58 | 显示全部楼层
ruyinmicc 发表于 2021-5-21 10:09
楼主的方法虽然共享了lowdir,但是不是没办法共享upper新写入的文件,而且过期的cache在lowdir也没办法自动 ...

每隔一段时间重新整理一个新的lower层,不要尝试目录链接,我有空写个整理的脚本
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:55 | 显示全部楼层
ruyinmicc 发表于 2021-5-21 16:53
是否是因为可能出现写入同名cache而产生冲突

主要是.task扩展名的文件可能被不同的容器一起写
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-6-22 19:30 | 显示全部楼层
xinziwenqing 发表于 2021-6-22 17:25
想问下,想双开,比如按你教程配好目录挂载好,然后从新创建两个不同名不同MAC不同IP的容器,还需要用202 ...

那个脚本是你运行一段时间后,可能底层有些文件需要删除,上层可能有些文件新写入,用于合并的脚本。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-7-14 01:20 | 显示全部楼层
bwsnb 发表于 2021-7-13 14:27
你的shell脚本的第11行和第14行,分别删了lower和upper层里面的重复文件,不应该只删掉底层重复的文件,然 ...

没问题,那些就是应该被删除的文件,如果你认为有问题,可能是你还没完全理解overlay文件系统的运行机制。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-8-22 15:37 | 显示全部楼层
lucktu 发表于 2021-8-22 11:37
昨天官方出了一个可以多实例共享缓存的 docker 版本(在QQ群里),发现还不错
但是发现他们的针对我们ubun ...

是的,官方出了docker,我的那个估计已经完成历史使命了,谢谢大家支持

点评

遗憾,我还是觉得你的好用一些,收入高,收星、提醒方便!  详情 回复 发表于 2021-8-25 21:57
官方那个还是很多问题的,重启容器又要重新绑定一个新id。  详情 回复 发表于 2021-8-25 21:01
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-8-25 22:01 | 显示全部楼层
lucktu 发表于 2021-8-25 21:57
遗憾,我还是觉得你的好用一些,收入高,收星、提醒方便!

等我有空把收收星星提现功能独立成一个docker镜像

点评

现在的方糖好像不支持微信提醒,要他们的客户端,深觉不便;而电报又要跨栏运动,也不方便。 能不能搞一个其他的,例如:短信(不知有没有)、邮件通知?  详情 回复 发表于 2021-9-4 10:22
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-8-31 23:45 | 显示全部楼层
lyjhyjyes 发表于 2021-8-31 23:30
我的r2s openwrt里tf其余磁盘空间全分配给/dev/sdb,分区为/mnt/sdb,作为根目录挂载,并没有作为外部overl ...

修改/etc/docker/daemon.json这个配置文件可以修改存储路径,具体你搜索一下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2021-9-2 13:38 | 显示全部楼层
shikkoku 发表于 2021-9-2 11:00
@w_anghe 合并脚本是否需要放在指定目录运行?还是随便找个目录放在定期运行就可以了?

随便找个目录就可以, 我脚本中用的都是绝对路径
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-25 18:17

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

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