我计划建立一个小型的 Hadoop 集群,其中从属节点从中央 PXE 服务器启动和运行,以简化部署和更新,并使从属节点上的所有磁盘(几乎)被 HDFS 垄断。
但是,我想我仍然需要在从属节点上为 /tmp 和 /var/log 保留一些空间,我不想将它们放在 ramdisk 中,因为我希望在崩溃后将它们放在那里进行调试(并且因为 RAM 比磁盘稀缺)。
因此,机器可能会从远程 PXE 服务器启动,从那里以只读方式挂载它们的 /,然后通过 sdd1 挂载 /dev/sda1 用于 HDFS 数据分区,/dev/sda2 用于 /tmp,/dev/sdb2 用于 /var/log。
我的问题是,还有其他目录需要可写吗?假设我们让 Hadoop 等登录到 /var/log。
(总体来说这是一个合理的架构吗?)
编辑:不要担心交换,我计划使它们无交换,OOM 杀手比抖动更可取。
答案1
您可以研究您的发行版的 livecd 布局,但您可能需要 /var 而不是 /var/log,并且在某些发行版中,/etc 中有一些文件必须可写。/home 也一样,除非您将主目录放在其他地方。
答案2
“(总的来说,这是一个合理的架构吗?)....”
我不会说你的想法是错误的,但看起来很有趣。简而言之,你设置了一个无盘架构,但仍在使用本地磁盘。对我来说,你添加了额外的循环。
“简化部署和更新..”
如果您的目标是使其更加集中和易于管理。我会使用某种自动分发引擎。就像我的情况一样,我使用 puppet。代码已经在 github 上可用。只需根据您的需求进行自定义即可。这应该可以解决您的简化和可管理性问题。我使用我的 puppet 清单很快就构建了几个集群。
答案3
这是一个针对 Slackware 14.2(BSD init,不是 systemd)通过 PXE 启动的简单解决方案,其中根文件系统通过 NFS 以只读方式提供。
我只是进行了修改/etc/rc.d/rc.S
,将需要可写的文件夹(/etc
和/var
)复制到 tmpfs 文件系统中,在原始文件夹中挂载临时文件系统,然后将副本移动到临时文件系统中:
# Copy /etc and /var as tmpfs prior to starting any processes.
echo "Creating volatile copies of /etc and /var in memory..."
mount -t tmpfs -o size=256m tmpfs /tmp
cp -a /etc /tmp/etc
mount -t tmpfs -o size=16m tmpfs /etc
mv /tmp/etc/* /etc/
rmdir /tmp/etc
cp -a /var /tmp/var
mount -t tmpfs -o size=16m tmpfs /var
mv /tmp/var/* /var/
rmdir /tmp/var
上述内容插入到 的顶部rc.S
,仅以设置变量的行开头PATH
。此操作在 init 一开始就运行,在安装任何其他分区或启动服务之前运行。
对这些内存副本的任何更改都会在重启时被丢弃。