Cat unix命令多线程安全?在多台主机上寻找并行mysql恢复

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

我正在尝试将cat文件的输出通过管道传输到外部主机。计划对同一文件中的多个主机异步执行此操作。有人能洞察技术上的潜在问题吗

细节 正在传输的文件:3GB的mysql转储

转移到一台主机上所需的时间-9分钟

Python程序

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分钟内恢复复制。如果存在任何潜在限制,我需要积极地将它们批处理到最短可能的批处理中,以使任何主机上的复制中断时间最短

问题
  • Cat unix命令是线程安全的吗?多个子进程(在每个子shell中)可以从同一个文件中读取而没有任何问题吗?有其他选择吗

  • 我应该查看机器性能的任何潜在上限?这样我就可以批量处理一次必须运行的命令数

  • python asyncio是如何工作的?它会被分成多个线程吗?它自己的线程是哪个


  • 安全:是

    从本质上讲,阅读是不安全的。写作是线程可以互相攻击的地方

    据我所知,您有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