SSH를 통해 2000개 이상의 노드에 연결하는 방법은 무엇입니까?

SSH를 통해 2000개 이상의 노드에 연결하는 방법은 무엇입니까?

우리가 가장 먼저 할 일은 ssh를 사용하여 2,000개가 넘는 서버에서 간단한 정보를 얻는 것인데, 이 작업이 30초 안에 완료되기를 원합니다.

GNU 병렬 및 Python paramiko+멀티프로세싱 사용

둘 다 속도를 늦추는 임의의 병목 현상이 있습니다. 이 문제를 고칠 수 있나요? 커널 튜닝이 완료되었나요? 사용된 운영체제는 CentOS 7(Core 24)입니다.

Python 코드 추가

        ssh=paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host,username=username,password=password)
        stdin, stdout, stderr = ssh.exec_command(command)
        outlines=stdout.readlines()
        resp=''.join(outlines)
        print(resp)
        stdin.close()
        ssh.close()

    except Exception as err:
 
        print(err)



if __name__ == '__main__':
    start = time.time()
    host = subprocess.check_output("echo 10.0.{{1..26},{51..146}}.{1..100}", shell="True", universal_newlines=True)
    list = host.strip().split(" ")
    print (list)
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
    pool.map(loadavg, list)
    pool.close()
    pool.join()
    print("time :", time.time() - start)

답변1

안시푸르수천 대의 서버와 데이터를 관리/교환하는 작업에 거의 적합합니다.

앤서블은스크립트, 각 호스트에 대해 실행할 명령을 나열합니다. 그리고전략 당신은 설정할 수 있습니다모든 호스트가 차례로 작동하고 있습니까, 아니면 동시에 호스트에 접속되고 있습니까?

그래도 30초의 창이 허용되지 않는 경우 Paul의 "트리" 접근 방식인 Ansible 지원과 쉽게 결합할 수 있습니다.대표단 정확히이 사용 사례의 경우.

Ansible은 또한 Python을 작성하는 수고를 덜어줍니다. 연결할 호스트 범위를 지정하는 간단한 구문이 있습니다.

답변2

20초 안에 4000개의 호스트를 처리하고 10초 안에 2000개의 호스트를 처리할 수 있습니다.

killall ssh-agent
sudo sysctl -w net.ipv4.neigh.default.gc_thresh3=30000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh2=20000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=10000

cat hosts |
  time parallel --lb --roundrobin --pipe -I dummy -N 50 parallel --timeout 4 --retries 10 -j50 --tag ssh  -o StrictHostKeyChecking=no root@{} echo {}

그렇지 gc_thresh않으면 arp 테이블이 오버플로됩니다. 이로 인해 ssh용지 걸림이 발생할 수 있습니다.

많은 경우 arp -n | grep incomplete다음을 시도해 보세요.

parallel 'echo 3600000 >' ::: /proc/sys/net/ipv4/neigh/*/base_reachable_time_ms

이렇게 하면 arp 항목이 새로 고쳐지기 전에 1시간 동안 유지됩니다.

편집하다

다음 조건이 충족되면 시간 초과를 재현할 수 있습니다.

  • LAN에 직접 연결된 호스트
  • arp 캐시가 워밍업되지 않았습니다.
  • 병렬 작업이 많이 있습니다.

답변3

다중 사이트 접근 방식을 고려할 수 있습니다.

두 가지 수준에서 초기 인스턴스가 40개의 서버에 연결하고 각각은 50개의 다른 서버에 연결하고 결과를 전달하도록 합니다. 각 수준은 15초 이내에 완료되어야 합니다. 초기 요청에는 각 보조 노드가 담당하는 노드가 나열됩니다.

세 가지 레벨을 처리할 수 있는 경우 팬아웃은 13 x 13 x 13으로 떨어지고 각 레벨에는 10초가 걸리므로 가능한 것처럼 보입니다.

관련 정보