구성 관리 : 푸시 대 풀 기반 토폴로지


22

Puppet 및 Chef와 같이보다 확립 된 구성 관리 (CM) 시스템은 풀 기반 접근 방식을 사용합니다. 클라이언트는 중앙 마스터를 정기적으로 폴링하여 업데이트합니다. 이들 중 일부는 마스터리스 방식 (푸시 기반)도 제공하지만 '생산 용이 아님'(Saltstack) 또는 '확장 불가능한'(Puppet)이라고 언급합니다. 내가 아는 유일한 시스템은 처음부터 푸시 기반입니다.

풀 기반 시스템의 특정 확장 성 이점은 무엇입니까? 푸시 에이전트보다 풀 마스터를 더 추가하는 것이 왜 더 쉬운가?

예를 들어 agiletesting.blogspot.nl 은 다음 과 같이 씁니다.

'풀'시스템에서 클라이언트는 서로 독립적으로 서버에 접속하므로 시스템은 '푸시'시스템보다 확장 성이 뛰어납니다.

반면 Rackspace 는 푸시 기반 모델로 15K 시스템처리 할 수 있음을 보여줍니다 .

infastructures.org의 글을 참고하세요 :

우리는 SUP, CVSup, rsync 서버 또는 cfengine과 같은 도구를 사용하여 인프라를 유지 관리하는 풀 방법론을 맹세합니다. 각 개별 클라이언트 시스템은 변경 사항을 클라이언트에 푸시하지 않고 부팅 할 때마다 골드 서버를 폴링하고 주기적으로 자체 개정 레벨을 유지해야합니다. 이 관점을 채택하기 전에 ssh, rsh, rcp 및 rdist를 기반으로 광범위한 푸시 기반 스크립트를 개발했습니다. r- 명령 (또는 ssh)에서 발견 한 문제는 다음과 같습니다. r- 명령 기반 스크립트를 실행하여 대상 시스템에 변경 사항을 적용 할 때 대상 호스트가 30 개를 초과하면 그 중 하나가 주어진 시간에 쓰러지십시오. 커미셔닝 된 시스템 목록을 유지 관리하는 것은 악몽이됩니다. 이 문제를 해결하기 위해 코드를 작성하는 과정에서 정교한 래퍼 코드가 생겨 다음을 처리하게됩니다. 죽은 호스트의 시간 초과; 죽은 호스트 로깅 및 재시도; 합리적인 시간에 많은 호스트를 공격하기 위해 병렬 작업을 forking 및 실행; 마지막으로 모든 아웃 바운드 rsh 세션과 함께 소스 시스템에서 사용 가능한 모든 TCP 소켓을 사용하는 경우를 감지하고 방지합니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 합리적인 시간에 많은 호스트를 공격하기 위해 병렬 작업을 forking 및 실행; 마지막으로 모든 아웃 바운드 rsh 세션과 함께 소스 시스템에서 사용 가능한 모든 TCP 소켓을 사용하는 경우를 감지하고 방지합니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 합리적인 시간에 많은 호스트를 공격하기 위해 병렬 작업을 포크하고 실행 마지막으로 모든 아웃 바운드 rsh 세션과 함께 소스 시스템에서 사용 가능한 모든 TCP 소켓을 사용하는 경우를 감지하고 방지합니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 마지막으로 모든 아웃 바운드 rsh 세션과 함께 소스 시스템에서 사용 가능한 모든 TCP 소켓을 사용하는 경우를 감지하고 방지합니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 마지막으로 모든 아웃 바운드 rsh 세션과 함께 소스 시스템에서 사용 가능한 모든 TCP 소켓을 사용하는 경우를 감지하고 방지합니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 그러면 앞으로 모든 새 호스트의 설치 이미지에서 방금 수행 한 모든 작업을 설치하고 죽어 내일 다시 빌드해야하는 호스트에 대해 반복하는 문제가 있습니다. r 명령 기반 복제를 구현하는 데 어려움을 겪은 후에는 가치가 없다는 것을 알았습니다. 우리는 r- 명령을 사용하여 인프라를 관리하거나 그 문제에 대한 다른 푸시 메커니즘을 사용하지 않을 계획입니다. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 또는 그 문제에 대한 다른 푸시 메커니즘과 함께. 풀 기반 방법뿐만 아니라 확장되지 않습니다. 또는 그 문제에 대한 다른 푸시 메커니즘과 함께. 풀 기반 방법뿐만 아니라 확장되지 않습니다.

아키텍처 문제가 아닌 구현 문제가 아닙니까? 스레드 풀 서버보다 스레드 푸시 클라이언트를 작성하기 어려운 이유는 무엇입니까?


4
참고로 Ansible은을 통해 가져올 수도 있습니다 ansible-pull.
ceejayoz

1
주요 장점 중 하나는 NAT와 방화벽을 통과한다는 것입니다. 이것은 종종 장애물이 아니지만 때로는 게임 체인저입니다.
Dan Garthwaite

SALT는 pub / sub ZeroMQ를 사용합니다. 어느 것이 다릅니다.
Dan Garthwaite

1
[devops-toolchain] [1] 메일 링리스트 의 애플리케이션 배포 및 시스템 구성 스레드에서 이에 대한 광범위한 토론이있었습니다 . [1] : code.google.com/p/devops-toolchain
sciurus

1
btw-HP 서버 자동화는 푸시 모델이며 수만 개의 장치를 관리 할 수 ​​있습니다. {공개-HP 파트너의 자동화 아키텍트입니다}
warren

답변:


8

푸시 기반 시스템의 문제점은 중앙 푸시 노드에 전체 아키텍처의 완전한 모델이 있어야한다는 것입니다. 모르는 기계는 밀 수 없습니다.

분명히 작동 할 수 있지만 동기화 상태를 유지하려면 많은 작업이 필요합니다.

Mcollective와 같은 것을 사용하여 Puppet 및 기타 CM을 푸시 기반 시스템으로 변환 할 수 있습니다. 일반적으로 풀 시스템을 푸시 기반 시스템으로 변환하는 것은 쉽지 않지만 항상 다른 방식으로 진행하는 것은 아닙니다.

조직 정치 문제도 있습니다. 푸시 기반 시스템은 중앙 관리자의 모든 제어 권한을 갖습니다. 그렇게 복잡성을 관리하는 것은 매우 어려울 수 있습니다. 스케일링 문제는 빨간 청어라고 생각합니다. 고객 수를 보면 접근 방식이 모두 확장됩니다. 여러면에서 푸시는 확장하기가 더 쉽습니다. 그러나 동적 구성은 최소한 풀 버전의 클라이언트 등록이 있음을 의미합니다.

궁극적으로 조직의 워크 플로 및 소유권과 일치하는 시스템에 관한 것입니다. 일반적으로 풀 시스템은 더 유연합니다.


2
감사! 그러나 동적 구성이 왜 풀릴까요? Ansible은 예를 들어 동적 푸시를 사용합니다. 따라서 Puppet이 동적 푸시를 수행 할 수 없다는 사실은 아키텍처의 제한이 아니라 구현의 제한입니다.
Willem

4
@Willem 진정한 "동적"환경은 새로운 시스템이 언제 어디서나 나타날 수 있으며 구성이 필요함을 의미합니다. 푸시 기반 시스템을 사용하려면 중앙 노드에서 해당 시스템을 구성해야합니다. 풀 기반 시스템은 환경 관리자가 구성 서버에 대한 작업을 수행 할 필요없이 (일반적인) 구성을 가져올 수 있습니다.
voretaq7

1
Zabbix는 호스트를 발견하고 Ansible은 동적 인벤토리를 사용하여 풀 구성을 새로 분별 된 호스트로 푸시 할 수 있습니다.
bbaassssiiee

그러나 ansible은 동적 인벤토리 (예 : ESX API)에 많은 소스를 사용할 수 있습니다. 이렇게하면 VM이 생성되는 즉시 VM에 대해 알 수 있으며 패턴 일치에서 재생을 실행할 수 있습니다.
JM Becker

11

누군가에게 관심이 있다면, 최소한 미션 크리티컬 시스템의 멀티 호스트 설정의 패치 관리와 관련하여 Ansible의 즉시 사용 가능한 푸시 기능을 처음으로 사용한 사용자 경험 보고서를 제공 할 수 있다고 생각합니다. 아마존 클라우드에서. 내 선입견이나 편견을 이해하려면 자동화 스크립팅 수준에서 Ruby를 선호하고 과거에 프로젝트 -Vpc 당 마스터 에이전트 퍼펫 구성을 사용하도록 프로젝트를 설정했다고 설명해야합니다. 그래서 나의 경험은 과거의 편견이 있었으면합니다.

최근의 경험은 확장 또는 축소, 종료 및 새로 고칠 수있는 수십 대에서 수백 대의 서버로 변화하는 부동산에 대한 동적 추진에 매우 유리했습니다. 내 상황에서 간단한 Ansible 1.7 ad hoc 명령이 패치를 만드는 데 필요한 전부였습니다. 그러나 Vpc 당 AnsibleController (t2.micro)를 설정하는 효과를 고려하여 향후 더 복잡한 요구 사항에 대한 기술을 확장하려고합니다.

이 글에서 다룬 질문으로 돌아가겠습니다 : 동적으로 변하는 부동산에 대한 장단점.

내가 목표로 한 서버 자산 종류의 가정은 다음과 같습니다.

  • IP 주소 또는 Amazon에서 생성 한 로컬 호스트 이름이 오래 지속될 것이라는 가정은 없습니다.
  • 모든 인스턴스는 단일 권한있는 관리 사용자가 ssh 액세스를 가능하게하는 시스템 이미지에서 작성되었습니다.
  • 기능별로 또는 개발 단계 (예 : 테스트 또는 생산 단계)에 따라 서버를 개별화하고 그룹으로 잠재적으로 그룹화하려면 합의 된 기존 이름의 특정 Amazon 태그를 실행하여 수행합니다.
  • 다른 ad hoc 명령을 사용하여 Linux 및 Windows 서버를 개별적으로 패치하므로 Windows 서버에 연결할 때 Linux 특정 로그인이 실패하도록 허용하는 것이 완벽했습니다.

이러한 조건을 염두에두고 AnsibleController의 머신 이미지를 생성하여 수많은 Vpcs에 드롭하고 기존 서버 계정 내에서 (자격 증명으로) 구성하는 것은 매우 간단합니다. 이미지에서 생성 된 각 인스턴스 내에서 자동화

  1. 필요한 자산이 일정한 간격으로 지속적으로 액세스되도록 정기적으로 패치를 실행중인 서버로 푸시하는 cron 작업
  2. 그러한 간격마다 Ansible 인벤토리를 계산하는 방법.

두 번째 아이템은 필요한 경우 (Ansible 인벤토리의 정보 구조를 통해) 비교적 정교하게 만들 수 있습니다. 그러나 정교함이 필요하지 않은 경우 다음은 각 cron 간격으로 모든 Amazon EC2 인스턴스를 계산하고 결과를 적절한 인벤토리 파일 (예 : / etc / ansible / hosts)로 보내는 스크립트의 간단한 예입니다.

#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute 
# path, to which the list is written

function list-of-ips {
    /usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk  '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
 }

if [ -n "$1" ]; then
   list-of-ips > "$1"
else
   list-of-ips
fi

유스 케이스의 유일한 경고는 patch 명령이 i 등원이어야한다는 것입니다. 패치가 의도 한 것과 정확히 일치하는지 확인하는 것의 일부로 이것이 만족되는지 완벽하게 사전 테스트하는 것이 바람직합니다.

요약하자면, 내가 설정 한 목표에 대해 동적 푸시가 효과적인 사용 사례를 설명했습니다. 반복 가능한 솔루션입니다 (여러 계정과 지역에서 롤아웃 될 수있는 이미지로 캡슐화되는 의미에서). 현재까지의 경험에 따르면 동적 푸시 기술은 현재 사용 가능한 도구 세트에서 제공하는 대안보다 훨씬 쉽게 제공하고 실행하는 것이 훨씬 쉽습니다.


2
//, @jonz, 이것은 숙련 된 개발자가 Stack Exchange 모델을 좋아하게 된 일종의 토론입니다. 나는 당신이 선택한 용어를 특히 좋아하며,이 답변은 가정을 먼저 나열합니다.
Nathan Basanese
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.