Cat unix命令多线程安全?在多台主机上寻找并行mysql恢复
我正在尝试将cat文件的输出通过管道传输到外部主机。计划对同一文件中的多个主机异步执行此操作。有人能洞察技术上的潜在问题吗 细节 正在传输的文件:3GB的mysql转储 转移到一台主机上所需的时间-9分钟 Python程序Cat unix命令多线程安全?在多台主机上寻找并行mysql恢复,mysql,bash,subprocess,python-asyncio,Mysql,Bash,Subprocess,Python Asyncio,我正在尝试将cat文件的输出通过管道传输到外部主机。计划对同一文件中的多个主机异步执行此操作。有人能洞察技术上的潜在问题吗 细节 正在传输的文件:3GB的mysql转储 转移到一台主机上所需的时间-9分钟 Python程序 async def run_command_shell(command): """Run command in subprocess (shell)."" # Create subprocess pro
async def run_command_shell(command):
"""Run command in subprocess (shell).""
# Create subprocess
process = await asyncio.create_subprocess_shell(
command, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
)
# Status
print("Started:", command, "(pid = " + str(process.pid) + ")", flush=True)
# Wait for the subprocess to finish
stdout, stderr = await process.communicate()
def main():
commands = ["cat mysqldump | mysql -u -p -h <hostA>", "cat mysqldump | mysql -u -p -h <hostB>"]
tasks = [
run_command_shell(c)
for c in commands
]
loop = asyncio.get_event_loop()
commands = asyncio.gather(*tasks)
results = loop.run_until_complete(commands)
print(results)
async def run_command_shell(命令):
“”“在子进程(shell)中运行命令。”
#创建子流程
进程=等待异步IO.create_subprocess_shell(
命令,stdout=asyncio.subprocess.PIPE,stderr=asyncio.subprocess.PIPE
)
#地位
打印(“已启动:”,命令“(pid=“+str(process.pid)+”),刷新=True)
#等待子流程完成
stdout,stderr=等待进程。通信()
def main():
命令=[“cat mysqldump | mysql-u-p-h”,“cat mysqldump | mysql-u-p-h”]
任务=[
运行命令外壳(c)
用于命令中的c
]
loop=asyncio.get\u event\u loop()
commands=asyncio.gather(*任务)
结果=循环。运行直到完成(命令)
打印(结果)
目标
我必须尽快恢复20台主机上的复制。理想情况下,我需要同时恢复20台主机上的mysqldump,这样我可以在大约10分钟内恢复复制。如果存在任何潜在限制,我需要积极地将它们批处理到最短可能的批处理中,以使任何主机上的复制中断时间最短
问题
安全:是 从本质上讲,阅读是不安全的。写作是线程可以互相攻击的地方 据我所知,您有20个线程“同时”读取一个文件并将内容写入网络,其他所有内容都在20台其他机器上 在读取一个转储文件时,这20个线程不会互相攻击;事实上,它们可能会互相帮助,因为文件块将被缓存19个线程 然而,20个客户端
mysqls
,所有对网络的冲击都可能在那里引起竞争。当然,他们大部分是“推”出去的东西,但也有一些小动作回来。同样,所有这些都是“安全的”
进步
最好是20个线程:
cat dump | ssh -h hostN ... "mysql -h localhost ..."
也就是说,远程运行20个mysql客户端。现在唯一的流量是通过网络传输文件的20个副本。这可能会使网络饱和,从而限制整体速度
可能更快
将转储文件压缩(gzip或其他)到一个新文件(一次)。然后选择其中的20个:
cat dump.gz | ssh -h histN ... "(gunzip | mysql -h localhost ...)"
这可能会将网络流量减少约3倍。但解压和原始压缩会减慢速度。我不知道它是否真的能更快完成任务
(不,20个gzip不太好——它会淹没您的CPU内核。)
(对不起,我不知道ssh等的详细信息。)这真的很有帮助,谢谢Rick