我们的云平台由 opennebula 提供支持。所以我们在“冷交换”中有两个前端实例。我们使用 lsyncd 守护进程试图保持数据存储中的实例同步,但有几点:我们不想同步 VM 的镜像,.bak
因为其他脚本会.bak
按计划将所有镜像移动到其他存储。find all the .bak in /var/lib/one/datastores/ then create exclude.lst and then start lsyncd.
在我们查看数据存储之前,同步脚本逻辑看起来还不错:
oneadmin@nola:~/cluster$ dir /var/lib/one/datastores/1/
006e099c57061d87d4b8f78ec7199221
008a10fa0764c9ac8d6fb9206c9b69bd
069299977f2fea243a837efed271182f
0a73a9adf74d92b4f175abcb578cabac
0b1cc002e370e1acd880cf781df0a6fb
0b470b182ac6d554774a3615ce87e292
0c0d98d1e0aabc23ef548ddb564c578d
0c3fad9c92a8efc7e13a73d8ae85caa3
..等等。
我们用这个可怕的函数解决了它:
function create_exclude {
oneimage list -x | \
xmlstarlet sel -t -m "IMAGE_POOL/IMAGE" -v "ID" -o ";" -v "NAME" -o ";" -v "SOURCE" -o ":" | \
sed s/:/'\n'/g | \
awk -F";" '/.bak;\/var\/lib/ {print $3}' | \
cut -d / -f8 > /var/lib/one/cluster/exclude.lst
}
结果是包含 VM ID 和.bak
内部图像的列表,因此我们可以将整个 VM 文件夹排除在同步之外。这不是我们想要的,因为原始图像保持不同步。但是可以通过在其他脚本将所有内容移动.bak
到其他存储时重新启动 lsyncd 脚本来解决。
现在我们进入问题的主题。
它一直有效,直到.bak
创建新的遗嘱。没有办法在 exclude.lst “on the go”中添加新字符串,而是停止 lsync 并重新启动重新创建 exclude.lst 的脚本。但是也没有可能检查创建新 .bak 的时刻,除非另一个脚本会在一段时间内对其进行监控。
我相信存在不太复杂的解决方案。当然,这取决于 opennebula,尤其是 /datastores/ 文件夹存储 VM 的方式。