분산 시스템에 대한 철저한 소개

분산 시스템이란 무엇이며 왜 그렇게 복잡합니까?

분산 시스템을 고려하는 곰

목차

소개

  1. 분산 시스템이란 무엇입니까?
  2. 왜 시스템을 배포합니까?
  3. 데이터베이스 스케일링 예제
  4. 분산 대 분산

분산 시스템 범주

  1. 분산 데이터 저장소
  2. 분산 컴퓨팅
  3. 분산 파일 시스템
  4. 분산 메시징
  5. 분산 애플리케이션
  6. 분산 원장

요약

소개

세계의 기술 확장이 계속됨에 따라 분산 시스템이 점점 더 널리 보급되고 있습니다. 그들은 컴퓨터 과학 분야에서 광범위하고 복잡한 연구 분야입니다.

이 기사는 기본적인 방식으로 분산 시스템을 소개하고 세부 사항에 대해 자세히 다루지 않고 해당 시스템의 여러 범주를 간략하게 보여줍니다.

분산 시스템이란 무엇입니까?

가장 간단한 정의의 분산 시스템은 최종 사용자에게 단일 컴퓨터로 표시되도록 함께 작동하는 컴퓨터 그룹입니다.

이 머신은 공유 상태를 가지고 있으며 동시에 작동하며 전체 시스템 가동 시간에 영향을주지 않고 독립적으로 작동하지 않을 수 있습니다.

시스템을보다 잘 이해할 수 있도록 시스템 배포의 예를 통해 점진적으로 작업 할 것을 제안합니다.

전통적인 스택

데이터베이스와 함께 가자! 기존 데이터베이스는 정보를 페치 / 삽입 할 때마다 단일 머신의 파일 시스템에 저장됩니다. 해당 머신과 직접 대화합니다.

이 데이터베이스 시스템을 배포하려면이 데이터베이스를 여러 컴퓨터에서 동시에 실행해야합니다. 사용자는 자신이 선택한 컴퓨터와 대화 할 수 있어야하며 단일 컴퓨터와 대화 중이 아니라고 말할 수 없어야합니다. 노드 # 1에 레코드를 삽입하면 노드 # 3은 해당 레코드를 반환 할 수 있어야합니다.

분산 된 것으로 간주 될 수있는 아키텍처

왜 시스템을 배포합니까?

시스템은 항상 필요에 따라 배포됩니다. 문제의 진실은 — 분산 시스템 관리는 함정과 지뢰로 가득 찬 복잡한 주제입니다. 분산 시스템을 배포, 유지 관리 및 디버깅하는 것이 골치 아픈 이유는 무엇입니까?

분산 시스템으로 할 수있는 것은 수평 확장입니다. 이전의 단일 데이터베이스 서버 예제로 돌아가서 더 많은 트래픽을 처리하는 유일한 방법은 데이터베이스가 실행중인 하드웨어를 업그레이드하는 것입니다. 이것을 수직 스케일링이라고합니다.

수직 확장은 가능한 한 훌륭하고 훌륭하지만 특정 시점이 지나면 최고의 하드웨어조차도 충분한 트래픽을 얻기에 충분하지 않으며 호스트하기에 비실용적이라고 말할 수 없습니다.

수평 적으로 확장한다는 것은 단일 컴퓨터의 하드웨어를 업그레이드하는 대신 컴퓨터를 추가하는 것을 의미합니다.

특정 임계 값 후에 수평 스케일링이 훨씬 저렴 해집니다

특정 임계 값 이후의 수직 스케일링보다 훨씬 저렴하지만 기본 설정이 아닙니다.

수직 확장은 성능을 최신 하드웨어 기능까지만 향상시킵니다. 이러한 기능은 중간 규모에서 큰 규모의 워크로드를 보유한 기술 회사에는 불충분합니다.

수평 스케일링의 가장 좋은 점은 성능이 저하 될 때마다 다른 머신을 추가하여 잠재적으로 무한대로 확장 할 수있는 양에 제한이 없다는 것입니다.

손쉬운 확장은 분산 시스템에서 얻는 유일한 이점이 아닙니다. 내결함성과 낮은 대기 시간도 마찬가지로 중요합니다.

내결함성 – 두 데이터 센터에 걸쳐 10 대의 컴퓨터 클러스터가 본질적으로 단일 컴퓨터보다 내결함성이 있습니다. 하나의 데이터 센터에 불이 붙더라도 애플리케이션은 여전히 ​​작동합니다.

낮은 지연 시간 — 네트워크 패킷이 세계를 여행하는 시간은 물리적으로 빛의 속도에 의해 제한됩니다. 예를 들어 뉴욕과 시드니 사이의 광섬유 케이블에서 요청의 왕복 시간 (즉, 앞뒤로)에 가능한 가장 짧은 시간은 160ms입니다. 분산 시스템을 사용하면 두 도시 모두에 노드가있어 트래픽이 가장 가까운 노드에 도달 할 수 있습니다.

그러나 분산 시스템이 작동하려면 해당 시스템에서 실행중인 소프트웨어가 여러 컴퓨터에서 동시에 실행되고 이와 함께 발생하는 문제점을 처리하도록 특별히 설계되어야합니다. 이것은 쉬운 일이 아닙니다.

데이터베이스 확장

우리 웹 애플리케이션이 대단한 인기를 얻었다 고 상상해보십시오. 또한 데이터베이스가 처리 할 수있는 것보다 초당 2 배 많은 쿼리를 받기 시작했다고 상상해보십시오. 응용 프로그램이 즉시 성능 저하를 시작하고 사용자에게이를 알 수 있습니다.

함께 일하고 데이터베이스를 확장하여 요구 사항을 충족 시키십시오.

일반적인 웹 응용 프로그램에서는 일반적으로 새 정보를 삽입하거나 기존 정보를 수정하는 것보다 훨씬 자주 정보를 읽습니다.

읽기 성능을 향상시킬 수있는 방법이 있으며 이는 소위 마스터-슬레이브 복제 전략입니다. 여기에서 기본 서버와 동기화되는 두 개의 새 데이터베이스 서버를 작성합니다. 중요한 것은 이러한 새 인스턴스에서만 읽을 수 있다는 것입니다.

정보를 삽입하거나 수정할 때마다 마스터 데이터베이스와 통신합니다. 결과적으로 슬레이브에게 변경 사항을 비동기 적으로 알리고 저장합니다.

축하합니다. 이제 3 배 많은 읽기 쿼리를 실행할 수 있습니다! 대단하지 않습니까?

함정

잡았다! 일관성을 나타내는 관계형 데이터베이스의 ACID 보증에서 C를 즉시 잃었습니다.

알다시피, 이제 데이터베이스에 새 레코드를 삽입 할 수 있으며, 그 후에는 즉시 읽기 쿼리를 실행하여 존재하지 않는 것처럼 아무것도 얻지 못할 가능성이 있습니다!

마스터에서 슬레이브로 새로운 정보를 전파하는 것은 즉시 일어나지 않습니다. 실제로 오래된 정보를 가져올 수있는 시간 창이 있습니다. 그렇지 않은 경우 데이터가 전파 될 때까지 동 기적으로 기다려야하므로 쓰기 성능이 저하됩니다.

분산 시스템에는 몇 가지 장단점이 있습니다. 이 특정 문제는 적절하게 확장하려면 살아야 할 문제입니다.

규모에 따라 계속

슬레이브 데이터베이스 접근 방식을 사용하여 읽기 트래픽을 어느 정도 수평 적으로 확장 할 수 있습니다. 훌륭하지만 쓰기 트래픽과 관련하여 벽에 부딪 혔습니다. 여전히 모든 서버에 있습니다!

여기에는 많은 옵션이 남아 있지 않습니다. 쓰기 트래픽을 처리 할 수 ​​없으므로 쓰기 트래픽을 여러 서버로 분할하면됩니다.

한 가지 방법은 다중 마스터 복제 전략을 사용하는 것입니다. 읽기만 할 수있는 슬레이브 대신 읽기 및 쓰기를 지원하는 여러 마스터 노드가 있습니다. 불행히도 이제는 충돌을 일으킬 수있는 기능 (예 : 동일한 ID를 가진 두 개의 레코드 삽입)이있어 매우 복잡해집니다.

샤딩 (파티셔닝이라고도 함)이라는 다른 기술을 사용해 봅시다.

샤딩을 사용하면 서버를 샤드라고하는 여러 개의 작은 서버로 분할 할 수 있습니다. 이 샤드는 모두 다른 레코드를 보유합니다. 어떤 샤드에 어떤 종류의 레코드가 들어가는 지에 대한 규칙을 만듭니다. 데이터가 균일하게 분산되도록 규칙을 작성하는 것이 매우 중요합니다.

이에 대한 가능한 접근 방식은 레코드에 대한 일부 정보 (예 : 이름이 A-D 인 사용자)에 따라 범위를 정의하는 것입니다.

하중이 항상 임의의 열을 기준으로 같지는 않기 때문에이 샤딩 키는 매우 신중하게 선택해야합니다. (예 : Z가 아닌 C로 시작하는 이름을 가진 사람이 더 많습니다). 다른 것보다 더 많은 요청을받는 단일 샤드를 핫스팟이라고하며 피해야합니다. 일단 분할되면 리 샤딩 데이터가 엄청나게 비싸고 FourSquare의 악명 높은 11 시간 정전의 경우와 마찬가지로 상당한 가동 중지 시간이 발생할 수 있습니다.

예제를 단순하게 유지하기 위해 클라이언트 (Rails 앱)가 각 레코드에 사용할 데이터베이스를 알고 있다고 가정합니다. 샤딩에 대한 많은 전략이 있으며 이는 개념을 설명하기위한 간단한 예입니다.

지금 당장 많이 이겼습니다. 쓰기 트래픽을 N 배 늘릴 수 있습니다. 여기서 N은 샤드 수입니다. 이것은 실질적으로 우리에게 거의 제한을 두지 않습니다.이 파티셔닝으로 얼마나 세밀하게 만들 수 있는지 상상해보십시오.

함정

소프트웨어 엔지니어링의 모든 것은 다소의 절충이며 예외는 아닙니다. 샤딩은 단순한 위업이 아니며 실제로 필요할 때까지 피하는 것이 가장 좋습니다.

이제 파티션 된 키 이외의 키를 사용하여 매우 비효율적 인 쿼리를 수행했습니다 (모든 샤드를 거쳐야 함). SQL JOIN 쿼리는 더욱 나 빠지고 복잡한 쿼리는 실제로 사용할 수 없게됩니다.

분산 대 분산

더 나아 가기 전에 두 용어를 구별하고 싶습니다.

단어는 비슷하게 들리고 논리적으로 동일한 의미를 갖는다 고 결론 지을 수 있지만, 그 차이는 기술적으로나 정치적으로 큰 영향을 미칩니다.

탈 중앙화는 여전히 기술적 인 의미로 분산되어 있지만 전체 탈 중앙화 시스템은 한 명의 행위자가 소유하지 않습니다. 어느 회사도 탈 중앙화 시스템을 소유 할 수 없으며, 그렇지 않으면 더 이상 탈 중앙화되지 않습니다.

이는 오늘날 우리가 진행할 대부분의 시스템이 분산 형 중앙 집중식 시스템으로 간주 될 수 있다는 것을 의미합니다.

당신이 그것에 대해 생각하면-분산 시스템을 만드는 것이 더 어렵습니다. 왜냐하면 일부 참가자가 악의적 인 경우를 처리해야하기 때문입니다. 모든 노드를 소유하고 있음을 알고 있으므로 일반 분산 시스템의 경우에는 해당되지 않습니다.

참고 :이 정의는 많이 논의되었으며 다른 사람 (피어 투 피어, 페더레이션)과 혼동 될 수 있습니다. 초기 문헌에서는 다르게 정의되어 있습니다. 어쨌든, 내가 정의로 준 것은 블록 체인과 암호 화폐가이 용어를 대중화 한 가장 널리 사용되는 것입니다.

분산 시스템 범주

이제 몇 가지 분산 시스템 범주를 살펴보고 가장 널리 알려진 프로덕션 사용량을 나열합니다. 표시된 대부분의 숫자는 구식이며이를 읽는 시점에서 아마도 상당히 클 수 있음을 명심하십시오.

분산 데이터 저장소

분산 데이터 저장소는 분산 데이터베이스로 가장 널리 사용되고 인식됩니다. 대부분의 분산 데이터베이스는 NoSQL 비 관계형 데이터베이스이며 키-값 시맨틱으로 제한됩니다. 일관성 또는 가용성 비용으로 놀라운 성능과 확장 성을 제공합니다.

알려진 규모 — Apple은 2015 년에 10 페타 바이트 이상의 데이터를 저장하는 75,000 개의 Apache Cassandra 노드를 사용하는 것으로 알려져 있습니다.

CAP 정리를 먼저 소개하지 않으면 분산 데이터 저장소에 대해 논의 할 수 없습니다.

CAP 정리

2002 년에 입증 된 CAP 정리는 분산 데이터 저장소가 동시에 일관성 있고 사용 가능하며 파티션을 견딜 수 없다고 말합니다.

3 개 중 2 개를 선택하십시오 (단, 일관성과 가용성은 아님)

몇 가지 빠른 정의 :

  • 일관성 — 순차적으로 읽고 쓰는 것은 예상되는 것입니다 (몇 단락 전에 데이터베이스 복제에 대한 문제를 기억하십니까?)
  • 가용성 (전체 시스템이 종료되지는 않음) – 모든 비 실패 노드는 항상 응답을 반환합니다.
  • Partition Tolerant — 네트워크 파티션에도 불구하고 시스템은 계속 작동하며 일관성 / 가용성 보장

실제로는 분산 데이터 저장소에 대해 파티션 허용 오차가 제공되어야합니다. 이 위대한 기사 중 하나 인 많은 곳에서 언급했듯이 파티션 허용 오차가 없으면 일관성과 가용성을 가질 수 없습니다.

정보와 연결 다이를 받아들이는 두 개의 노드가 있다면 어떻게 사용할 수 있고 동시에 일관성을 제공합니까? 그들은 다른 노드가 무엇을하고 있는지 알 수있는 방법이 없으므로 오프라인 (사용할 수 없음)이되거나 오래된 정보 (일관되지 않은)로 작업 할 수 있습니다.

우리는 무엇을해야합니까?

결국 네트워크 파티션 하에서 시스템을 강력하게 일관성있게 유지하거나 가용성을 높이려면 선택해야합니다.

실습에 따르면 대부분의 애플리케이션은 가용성을 더 중요하게 생각합니다. 항상 강력한 일관성이 필요한 것은 아닙니다. 그럼에도 불구하고 100 % 가용성 보장이 필요하기 때문에 이러한 절충이 반드시 필요한 것은 아니며, 강력한 일관성을 얻기 위해 시스템을 동기화해야 할 때 네트워크 대기 시간이 문제가 될 수 있기 때문입니다. 이러한 요소와 그 밖의 요인으로 인해 응용 프로그램은 일반적으로 고 가용성을 제공하는 솔루션을 선택합니다.

이러한 데이터베이스는 최하위 일관성 모델 (최종 일관성 (강력 vs. 최종 일관성 설명))로 해결됩니다. 이 모델은 지정된 항목에 대한 새로운 업데이트가없는 경우 해당 항목에 대한 모든 액세스가 최신 업데이트 된 값을 반환 함을 보장합니다.

이러한 시스템은 기존 데이터베이스의 ACID와 달리 BASE 속성을 제공합니다.

  • 기본적으로 사용 가능 — 시스템은 항상 응답을 반환
  • 소프트 상태 — 입력이없는 시간에도 시스템은 시간이 지남에 따라 변경 될 수 있습니다 (최종 일관성으로 인해).
  • 최종 일관성 — 입력이 없으면 데이터가 조만간 모든 노드로 확산되어 일관성이 유지됩니다.

사용 가능한 분산 데이터베이스의 예 — Cassandra, Riak, Voldemort

물론 HBase, Couchbase, Redis, Zookeeper와 같이 더 강력한 일관성을 선호하는 다른 데이터 저장소가 있습니다.

CAP 정리는 자체적으로 여러 기사를 사용할 수 있습니다. 일부는 클라이언트의 동작 방식에 따라 시스템의 CAP 속성을 조정하는 방법과 올바르게 이해되지 않는 방식에 따라 다른 것입니다.

카산드라

위에서 언급했듯이 Cassandra는 분산 된 No-SQL 데이터베이스로, CAP에서 AP 속성을 선호하여 최종 일관성을 유지합니다. Cassandra는 구성 가능성이 높으므로 약간 오해의 소지가 있음을 인정해야합니다. 가용성을 희생하면서도 강력한 일관성을 제공 할 수는 있지만 일반적인 사용 사례는 아닙니다.

Cassandra는 일관된 해싱을 사용하여 클러스터의 어느 노드에서 전달중인 데이터를 관리해야하는지 결정합니다. 기본적으로 데이터를 복제하려는 노드 수를 나타내는 복제 팩터를 설정합니다.

샘플 쓰기

읽을 때는 해당 노드에서만 읽습니다.

Cassandra는 확장 성이 뛰어나 쓰기 처리량이 엄청나게 높습니다.

초당 쓰기 벤치 마크를 표시하는 바이어스 된 다이어그램 일 수 있습니다. 여기에서 가져 왔습니다.

이 다이어그램은 편향적 일 수 있지만 Cassandra를 강력한 일관성을 제공하도록 설정된 데이터베이스와 비교하는 것처럼 보이지만 (그렇지 않으면 4 개에서 8 개 노드로 업그레이드 할 때 MongoDB가 성능을 저하시키는 이유를 알 수 없음) 여전히 올바른 설정을 보여줍니다 Cassandra 클러스터가 가능합니다.

그럼에도 불구하고 수평 확장 및 매우 높은 처리량을 가능하게하는 분산 시스템 트레이드 오프에서 Cassandra는 ACID 데이터베이스의 일부 기본 기능인 트랜잭션을 제공하지 않습니다.

일치

데이터베이스 트랜잭션은 분산 된 시스템에서 구현하기 까다 롭습니다. 각 노드는 올바른 조치 (취소 또는 커밋)에 동의해야하기 때문입니다. 이를 합의라고하며 분산 시스템의 근본적인 문제입니다.

참여 프로세스와 네트워크가 완전히 안정적인 경우 "거래 커밋"문제에 필요한 계약 유형에 도달하는 것이 간단합니다. 그러나 실제 시스템에는 프로세스 충돌, 네트워크 파티셔닝 및 손실, 왜곡 또는 복제 된 메시지와 같은 여러 가지 오류가 발생할 수 있습니다.

이는 문제가됩니다. 신뢰할 수없는 네트워크의 제한된 시간 내에 올바른 합의에 도달 할 수 없다는 것이 입증되었습니다.

그러나 실제로 신뢰할 수없는 네트워크에서 합의에 도달하는 알고리즘이 꽤 있습니다. Cassandra는 실제로 분산 합의에 Paxos 알고리즘을 사용하여 간단한 트랜잭션을 제공합니다.

분산 컴퓨팅

분산 컴퓨팅은 최근 몇 년 동안 우리가 본 빅 데이터 처리의 유입에 핵심입니다. 단일 컴퓨터가 실제로 자체적으로 실행할 수없는 거대한 작업 (예 : 총 1,000 억 개의 레코드)을 여러 개의 작은 작업으로 분할하는 기술입니다. 각 작업은 단일 상품 기계에 적합합니다. 거대한 작업을 여러 개의 작은 작업으로 나누고 여러 시스템에서 병렬로 실행하고 데이터를 적절하게 집계하면 초기 문제를 해결했습니다. 이 방법을 사용하면 작업을 더 많이 수행 할 때 계산에 더 많은 노드를 포함시키기 만하면 수평으로 확장 할 수 있습니다.

알려진 규모-폴딩 @ 홈은 2012 년에 160k 개의 활성 머신을 가졌습니다.

이 분야의 초기 혁신가는 Google이었습니다. 대량의 데이터가 필요하기 때문에 분산 계산을위한 새로운 패러다임 인 MapReduce가 개발되었습니다. 그들은 2004 년에 논문을 발표했으며 오픈 소스 커뮤니티는 나중에이를 기반으로 Apache Hadoop을 만들었습니다.

MapReduce

MapReduce는 단순히 데이터를 매핑하고 의미있는 것으로 줄이는 두 단계로 정의 할 수 있습니다.

다시 예를 들어 봅시다 :

우리가 중간이라고 가정하고 창고 정보를 얻기 위해 대량의 정보를 보조 분산 데이터베이스에 저장했다고 가정합니다. 2017 년 4 월 (1 년 전) 동안 매일 발행 된 박수 수를 나타내는 데이터를 가져오고 싶습니다.

이 예제는 가능한 한 짧고 명확하며 단순하게 유지되지만 수많은 데이터를 처리하고 있다고 가정합니다 (예 : 수십억 박수 분석). 우리는이 모든 정보를 하나의 컴퓨터에 분명히 저장하지는 않을 것이며 하나의 컴퓨터만으로이 모든 정보를 분석하지는 않을 것입니다. 또한 프로덕션 데이터베이스를 쿼리하지 않고 우선 순위가 낮은 오프라인 작업을 위해 특별히 구축 된 일부 "웨어 하우스"데이터베이스를 쿼리합니다.

각 맵 작업은 가능한 한 많은 데이터를 변환하는 별도의 노드입니다. 각 작업은 주어진 스토리지 노드의 모든 데이터를 통과하여 날짜와 숫자 1의 간단한 튜플에 매핑합니다. 그런 다음 누구도 이야기하지 않는 3 단계의 중간 단계 (셔플, 정렬 및 파티션)가 수행됩니다. 기본적으로 데이터를 추가로 정리하고 적절한 축소 작업으로 삭제합니다. 빅 데이터를 처리 할 때 각 작업 축소는 단일 날짜에만 작동하도록 분리되어 있습니다.

이것은 좋은 패러다임이며 놀랍게도 그것으로 많은 것을 할 수 있습니다. 예를 들어 여러 MapReduce 작업을 연결할 수 있습니다.

더 나은 기술

MapReduce는 오늘날 다소 레거시이며 문제가 있습니다. 배치 (작업)로 작동하기 때문에 작업이 실패 할 경우 문제가 발생합니다. 전체를 다시 시작해야합니다. 2 시간의 작업 실패로 인해 전체 데이터 처리 파이프 라인이 실제로 느려질 수 있으며, 특히 피크 시간에는이를 원하지 않습니다.

또 다른 문제는 결과를받을 때까지 기다리는 시간입니다. 실시간 분석 시스템 (모두 큰 데이터를 가지고 있고 분산 컴퓨팅을 사용하는)에서는 최신 크런치 데이터를 가능한 한 최신 상태로 유지하고 몇 시간 전에는 확실하지 않은 것이 중요합니다.

따라서 이러한 문제를 해결하는 다른 아키텍처가 등장했습니다. 즉, Lambda Architecture (배치 처리 및 스트림 처리의 혼합) 및 Kappa Architecture (스트림 처리 만)입니다. 이 분야의 발전으로 Kafka Streams, Apache Spark, Apache Storm, Apache Samza와 같은 새로운 도구가 등장했습니다.

분산 파일 시스템

분산 파일 시스템은 분산 데이터 저장소로 생각할 수 있습니다. 그것들은 개념과 동일합니다. 하나의 머신 클러스터 전체에 대량의 데이터를 저장하고 액세스합니다. 일반적으로 분산 컴퓨팅과 함께 사용됩니다.

알려진 규모 — Yahoo는 42,000 개 이상의 노드에서 HDFS를 실행하여 2011 년 600 페타 바이트의 데이터를 저장하는 것으로 알려져 있습니다.

위키 백과는 분산 파일 시스템이 CQL (Cassandra Query Language)과 같은 사용자 정의 API가 아닌 로컬 파일과 동일한 인터페이스 및 의미를 사용하여 파일에 액세스 할 수 있다는 차이점을 정의합니다.

HDFS

HDFS (Hadoop Distributed File System)는 Hadoop 프레임 워크를 통한 분산 컴퓨팅에 사용되는 분산 파일 시스템입니다. 널리 채택 된이 제품은 많은 컴퓨터에서 대용량 파일 (GB 또는 TB 크기)을 저장하고 복제하는 데 사용됩니다.

이 아키텍처는 주로 네임 노드와 데이터 노드로 구성됩니다. NameNode는 어떤 노드에 어떤 파일 블록이 포함되어 있는지와 같이 클러스터에 대한 메타 데이터를 유지합니다. 이들은 파일을 저장하고 복제 할 최적의 위치를 ​​파악하고 시스템 상태를 추적하여 네트워크의 조정자 역할을합니다. DataNode는 단순히 파일을 저장하고 파일 복제, 새 파일 작성 등의 명령을 실행합니다.

놀랍게도 HDFS는 계산 작업에 데이터 인식 기능을 제공하므로 Hadoop과 함께 사용하는 것이 가장 좋습니다. 그런 다음 해당 작업은 데이터를 저장하는 노드에서 실행됩니다. 이는 데이터 지역성을 활용하여 계산을 최적화하고 네트워크의 트래픽 양을 줄입니다.

IPFS

IPFS (Interplanetary File System)는 분산 파일 시스템을위한 새롭고 흥미로운 피어-투-피어 프로토콜 / 네트워크입니다. 블록 체인 기술을 활용하여 단일 소유자 나 장애 지점이없는 완전히 분산 된 아키텍처를 자랑합니다.

IPFS는 IPNS라는 이름 지정 시스템 (DNS와 유사)을 제공하며 사용자가 정보에 쉽게 액세스 할 수 있도록합니다. Git과 유사한 히스토리 버전 관리를 통해 파일을 저장합니다. 이를 통해 파일의 모든 이전 상태에 액세스 할 수 있습니다.

여전히 많은 개발이 진행되고 있지만 (작성 시점 v0.4) 이미 프로젝트를 빌드하는 데 관심이있는 프로젝트 (FileCoin)가 있습니다.

분산 메시징

메시징 시스템은 전체 시스템 내부에서 메시지 / 이벤트의 저장 및 전파를위한 중앙 위치를 제공합니다. 이를 통해 응용 프로그램 논리를 다른 시스템과 직접 통신하는 것을 분리 할 수 ​​있습니다.

알려진 규모 — LinkedIn의 Kafka 클러스터는 하루에 최대 1 조 5 천만 개의 메시지를 처리하여 1 조 개의 메시지를 처리했습니다.

간단히 말해서 메시징 플랫폼은 다음과 같은 방식으로 작동합니다.

메시지는 잠재적으로 메시지를 생성하는 응용 프로그램 (프로듀서라고 함)에서 브로드 캐스트되어 플랫폼으로 이동하며 메시지에 관심이있는 여러 응용 프로그램 (소비자)이 읽습니다.

특정 이벤트를 몇 군데 (예 : 데이터베이스,웨어 하우스, 전자 메일 전송 서비스 및 기타 제공 대상 작성)에 저장해야하는 경우 메시징 플랫폼은 해당 메시지를 가장 잘 전달하는 방법입니다.

소비자는 브로커에서 정보를 가져 오거나 (풀 모델) 브로커가 소비자에게 직접 정보를 푸시하도록 할 수 있습니다 (푸시 모델).

인기있는 몇 가지 최고 메시징 플랫폼이 있습니다.

RabbitMQ — 라우팅 규칙 및 기타 쉽게 구성 할 수있는 설정을 통해 메시지 궤적을보다 세밀하게 제어 할 수있는 메시지 브로커입니다. 많은 논리가 있고이를 통과하는 메시지를 엄격하게 추적하므로 스마트 브로커라고 할 수 있습니다. CAP의 AP 및 CP에 대한 설정을 제공합니다. 소비자에게 알리기 위해 푸시 모델을 사용합니다.

Kafka — 메시지 브로커 (및 모든 플랫폼)는 어떤 메시지를 읽었는지 추적하지 않고 복잡한 라우팅 논리를 허용하지 않으므로 약간 낮은 수준입니다. 이는 놀라운 성능을 달성하는 데 도움이됩니다. 제 생각에 이것은 오픈 소스 커뮤니티의 적극적인 개발과 Confluent 팀의 지원으로이 분야에서 가장 큰 전망입니다. 카프카는 틀림없이 최고의 기술 회사에서 가장 널리 사용됩니다. 나는 이것에 대한 철저한 소개를 썼다.

Apache ActiveMQ — 2004 년에 시작된 것 중 가장 오래된 것입니다. JMS API를 사용합니다. 이는 Java EE 응용 프로그램에 맞춰져 있음을 의미합니다. Kafka와 동등한 성능을 제공하는 ActiveMQ Artemis로 다시 작성되었습니다.

Amazon SQS — AWS에서 제공하는 메시징 서비스입니다. Kafka와 같은 시스템을 설치하기가 까다로워서 기존 응용 프로그램과 신속하게 통합하고 자체 인프라를 처리 할 필요가 없어 큰 이점이 될 수 있습니다. Amazon은 SNS와 MQ의 두 가지 유사한 서비스도 제공합니다. SNS와 MQ는 후자가 기본적으로 ActiveMQ이지만 Amazon에서 관리합니다.

분산 애플리케이션

하나의 데이터베이스에 연결된 단일로드 밸런서 뒤에 5 개의 Rails 서버를 롤업하는 경우 분산 애플리케이션이라고 부를 수 있습니까? 위의 정의를 상기하십시오.

분산 시스템은 최종 사용자에게 단일 컴퓨터로 표시되도록 함께 작동하는 컴퓨터 그룹입니다. 이 머신은 공유 상태를 가지고 있으며 동시에 작동하며 전체 시스템 가동 시간에 영향을주지 않고 독립적으로 작동하지 않을 수 있습니다.

데이터베이스를 공유 상태로 계산하면이 시스템을 분산 시스템으로 분류 할 수 있지만 정의의 "함께 작동"부분을 놓치면 잘못되었을 수 있습니다.

시스템은 노드가 서로 통신하여 조치를 조정하는 경우에만 분배됩니다.

따라서 피어 투 피어 네트워크에서 백엔드 코드를 실행하는 응용 프로그램과 같은 것이 분산 응용 프로그램으로 더 잘 분류 될 수 있습니다. 어쨌든, 이것은 목적을 제공하지 않고 사물을 그룹화하는 것에 대해 우리가 얼마나 까다로운지를 보여주는 모든 불필요한 분류입니다.

알려진 스케일-2014 년 4 월, 왕좌의 게임 에피소드에서 193,000 노드의 비트 토런트 떼

얼랭 가상 머신

Erlang은 동시성, 배포 및 내결함성에 대한 의미가 큰 기능적 언어입니다. Erlang 가상 머신 자체는 Erlang 애플리케이션의 배포를 처리합니다.

이 모델은 내장 된 메시지 전달 시스템을 통해 서로 대화 할 수있는 많은 격리 된 경량 프로세스를 통해 작동합니다. 이것을 액터 모델이라고하며 Erlang OTP 라이브러리는 분산 액터 프레임 워크 (JVM의 Akka 라인)로 생각할 수 있습니다.

이 모델은 단순히 동시성을 달성하는 데 도움이되는 것입니다. 프로세스는 실행중인 시스템의 사용 가능한 코어에 분산되어 있습니다. 이는 메시지를 삭제하는 기능을 제외하고는 네트워크 설정과 구별 할 수 없기 때문에 Erlang의 VM은 동일한 데이터 센터 또는 다른 대륙에서 실행중인 다른 Erlang VM에 연결할 수 있습니다. 이 가상 머신 떼는 하나의 단일 애플리케이션을 실행하고 인계를 통해 머신 장애를 처리합니다 (다른 노드가 실행되도록 예약 됨).

사실, 내결함성을 제공하기 위해 언어의 분산 계층이 추가되었습니다. 단일 시스템에서 실행되는 소프트웨어는 항상 단일 시스템이 죽어 응용 프로그램을 오프라인 상태로 만들 위험이 있습니다. 많은 노드에서 실행되는 소프트웨어를 사용하면 응용 프로그램을 염두에두고 하드웨어 장애 처리가 쉬워집니다.

비트 토렌트

BitTorrent는 토런트를 통해 웹을 통해 대용량 파일을 전송하는 데 가장 널리 사용되는 프로토콜 중 하나입니다. 주요 아이디어는 주 서버를 거치지 않고 네트워크의 다른 피어간에 파일을 쉽게 전송하는 것입니다.

BitTorrent 클라이언트를 사용하면 전세계 여러 컴퓨터에 연결하여 파일을 다운로드 할 수 있습니다. .torrent 파일을 열면 조정자 역할을하는 시스템 인 소위 추적기에 연결됩니다. 네트워크에서 원하는 파일이있는 노드를 표시하여 피어 발견에 도움이됩니다.

샘플 네트워크

거머리와 파종 자라는 두 가지 유형의 사용자 개념이 있습니다. leecher는 파일을 다운로드하는 사용자이고 시더는 해당 파일을 업로드하는 사용자입니다.

피어 투 피어 네트워크의 재미있는 점은 일반 사용자로서 네트워크에 참여하고 네트워크에 참여할 수 있다는 것입니다.

BitTorrent 및 그 전구체 (Gnutella, Napster)를 사용하면 파일을 자발적으로 호스팅하고 원하는 다른 사용자에게 업로드 할 수 있습니다. BitTorrent가 인기를 얻는 이유는 네트워크에 기여할 인센티브를 제공 한 최초의 것이기 때문입니다. 사용자가 파일을 다운로드 만하는 Freeriding은 이전 파일 공유 프로토콜의 문제였습니다.

BitTorrent는 파종자가 최고의 다운로드 속도를 제공하는 사람들에게 더 많이 업로드하도록하여 프리 라이딩을 어느 정도 해결했습니다. 파일을 다운로드하는 동안 업로드하도록 장려함으로써 효과가 있습니다. 안타깝게도 작업을 마친 후에도 네트워크에서 계속 활동하게하는 것은 없습니다. 이로 인해 네트워크에 전체 파일을 보유한 파종자가 부족하고 프로토콜이 이러한 사용자에 크게 의존하기 때문에 개인 추적기와 같은 솔루션이 실현되었습니다. 개인 추적 프로그램을 사용하려면 분산 네트워크에 참여하기 위해 커뮤니티 회원 (초대 전용)이어야합니다.

현장에서 발전한 후, 추적 할 수없는 급류가 발명되었습니다. 메타 데이터를 수집하고 피어를 찾는 대신 중앙 집중식 추적기를 사용하지 않고 새로운 알고리즘을 사용하는 BitTorrent 프로토콜로 업그레이드되었습니다. 이러한 인스턴스 중 하나는 분산 해시 테이블 (DHT) 인 Kademlia (Mainline DHT)이며 다른 피어를 통해 피어를 찾을 수 있습니다. 실제로 각 사용자는 추적자의 의무를 수행합니다.

분산 원장

분산 원장은 분산 네트워크의 모든 노드에서 복제, 동기화 및 공유되는 불변의 추가 전용 데이터베이스로 생각할 수 있습니다.

알려진 규모-이더 리움 네트워크는 2018 년 1 월 4 일 하루에 130 만 건의 거래를 기록했습니다.

이벤트 소싱 패턴을 활용하여 언제든지 기록의 원장 상태를 재구성 할 수 있습니다.

블록 체인

블록 체인은 분산 원장에 사용되는 현재의 기본 기술이며 실제로 시작을 표시했습니다. 분산 공간에 대한이 최신의 가장 큰 혁신으로 최초의 진정한 분산 지불 프로토콜 인 비트 코인을 만들 수있었습니다.

블록 체인은 네트워크에서 발생한 모든 거래의 순서 목록을 전달하는 분산 원장입니다. 트랜잭션은 그룹화되어 블록으로 저장됩니다. 전체 블록 체인은 본질적으로 링크 된 블록 목록 (따라서 이름)입니다. 상기 블록은 계산 비용이 많이 들고 암호화를 통해 서로 밀접하게 연결되어있다.

간단히 말해서, 각 블록에는 현재 블록의 내용 (Merkle Tree 형식으로)과 이전 블록의 해시에 대한 특별 해시 (X 량은 0으로 시작)가 포함됩니다. 이 해시는 생성하는 유일한 방법은 무차별 대입을 통해 이루어지기 때문에 많은 CPU 성능이 필요합니다.

단순화 된 블록 체인

광부는 해시를 계산하려고하는 노드입니다 (bruteforce를 통해). 채굴 자들은 내용과 결합 될 때 위에서 언급 한 해시를 생성하는 임의의 문자열 (nonce)을 만들 수있는 사람을 위해 서로 경쟁합니다. 누군가가 올바른 nonce를 찾으면이를 전체 네트워크에 브로드 캐스트합니다. 그런 다음 해당 문자열은 각 노드에서 자체적으로 확인하여 체인에 적용합니다.

이것은 블록 체인을 수정하는 데 비용이 많이 들고 조작되지 않았 음을 확인하기 쉬운 시스템으로 해석됩니다.

다른 해시를 생성하기 때문에 블록의 내용을 변경하는 것은 비용이 많이 듭니다. 이후의 각 블록 해시는 블록에 따라 달라집니다. 위 그림의 첫 번째 블록에서 거래를 변경하려면 Merkle Root를 변경하십시오. 그러면 블록의 해시가 변경되고 (필요한 선행 0이 없을 가능성이 높음) 블록 # 2의 해시 등이 변경됩니다. 즉, 방금 수정 한 블록마다 모든 블록에 대해 새로운 nonce를 강제 실행해야합니다.

네트워크는 항상 가장 긴 유효 체인을 신뢰하고 복제합니다. 시스템을 속이고 결국 더 긴 체인을 만들려면 모든 노드에서 사용하는 총 CPU 전력의 50 % 이상이 필요합니다.

블록 체인은 긴급 합의를위한 분산 메커니즘으로 생각할 수 있습니다. 합의는 명시 적으로 이루어지지 않습니다. 합의가 발생하는 선거 또는 고정 된 순간은 없습니다. 대신 합의는 프로토콜 규칙에 따라 수천 개의 독립 노드가 비동기식으로 상호 작용 한 결과물입니다.

이 전례없는 혁신은 최근 사람들이 웹 3.0을 만들 것으로 예측하면서 기술 분야에서 붐이되었습니다. 그것은 현재 소프트웨어 엔지니어링 세계에서 가장 흥미로운 공간이며, 해결되기를 기다리는 매우 도전적이고 흥미로운 문제로 가득합니다.

비트 코인

이전의 분산 지불 프로토콜에 없었던 것은 분산 방식으로 이중 지출 문제를 실시간으로 실제로 방지하는 방법이었습니다. 연구 결과 흥미로운 제안이 있었지만 [1] 비트 코인은 다른 것보다 분명한 장점을 가진 실용적인 솔루션을 최초로 구현했습니다.

이중 지출 문제는 액터 (예 : Bob)가 단일 리소스를 두 곳에서 사용할 수 없다는 것을 나타냅니다. Bob이 $ 1을 가지고 있다면 Alice와 Zack 모두에게 제공 할 수 없어야합니다. 하나의 자산 일 뿐이므로 복제 할 수 없습니다. 분산 시스템에서이 보증을 실제로 달성하는 것은 실제로 어렵다는 것이 밝혀졌습니다. 블록 체인을 포식하는 몇 가지 흥미로운 완화 방법이 있지만 실제적으로 문제를 완전히 해결하지는 못합니다.

한 번에 하나의 블록 만 체인에 추가되므로 이중 지출은 비트 코인에 의해 쉽게 해결됩니다. 단일 블록 내에서는 이중 지출이 불가능하므로 두 개의 블록이 동시에 생성 되더라도 결국 가장 긴 체인에는 하나만있게됩니다.

비트 코인은 CPU 전력 축적의 어려움에 의존합니다.

투표 시스템에서 공격자는 네트워크에 노드를 추가하기 만하면되지만 (네트워크에 대한 무료 액세스는 설계 대상이므로 쉬움) CPU 전원 기반 체계에서 공격자는 물리적 한계에 직면합니다. 강력한 하드웨어.

악의적 인 노드 그룹이 실제로 성공적인 공격을 수행하기 위해 네트워크의 계산 능력의 50 % 이상을 제어해야하는 이유이기도합니다. 그보다 적으며 나머지 네트워크는 더 긴 블록 체인을 더 빠르게 만듭니다.

이더 리움

이더 리움은 프로그램 가능한 블록 체인 기반 소프트웨어 플랫폼으로 생각할 수 있습니다. 자체 암호 화폐 (Ether)가있어 블록 체인에 스마트 계약을 배포 할 수 있습니다.

스마트 컨트랙트는 이더 리움 블록 체인에서 단일 트랜잭션으로 저장된 코드입니다. 코드를 실행하려면 스마트 계약을 대상으로하여 트랜잭션을 발행하면됩니다. 그러면 광부 노드가 코드와 코드 변경 사항을 실행하게됩니다. 이 코드는 Ethereum Virtual Machine 내에서 실행됩니다.

이더 리움의 기본 프로그래밍 언어 인 Solidity는 현명한 계약을 작성하는 데 사용됩니다. 이더 리움 블록 체인과 직접 인터페이스하여 균형 또는 기타 스마트 계약 결과와 같은 상태를 쿼리 할 수있는 완벽한 프로그래밍 언어입니다. 무한 루프를 방지하려면 코드를 실행하려면 일정량의 Ether이 필요합니다.

블록 체인은 일련의 상태 변경으로 해석 될 수 있으므로 Ethereum 및 유사한 플랫폼 위에 많은 분산 응용 프로그램 (DApp)이 구축되었습니다.

분산 원장의 추가 사용법

존재 증명 — 특정 디지털 문서가 특정 시점에 존재했다는 증거를 익명으로 안전하게 저장하는 서비스입니다. 문서 무결성, 소유권 및 타임 스탬프를 보장하는 데 유용합니다.

DAO (Decentralized Autonomous Organizations) — 조직의 개선 제안에 대한 합의에 도달하기 위해 블록 체인을 사용하는 조직. Dash의 거버넌스 시스템 인 SmartCash 프로젝트가 그 예입니다

분산 인증 — 블록 체인에 ID를 저장하여 어디에서나 싱글 사인온 (SSO)을 사용할 수 있습니다. 소브린, 시민

그리고 훨씬 더. 분산 원장 기술은 실제로 무한한 가능성을 열어주었습니다. 우리가 말할 때 일부는 아마도 발명되고 있습니다!

요약

이 기사의 짧은 범위에서 분산 시스템이 무엇인지, 왜 하나를 사용하고 각 범주를 약간 살펴 보는지를 정의했습니다. 기억해야 할 중요한 사항은 다음과 같습니다.

  • 분산 시스템은 복잡하다
  • 그들은 규모와 가격의 필요성에 의해 선택됩니다
  • 그들은 일하기가 더 어렵다
  • CAP 정리-일관성 / 가용성 가용성 균형
  • 여기에는 데이터 저장소, 컴퓨팅, 파일 시스템, 메시징 시스템, 원장, 응용 프로그램의 6 가지 범주가 있습니다.

솔직히 말해서, 우리는 분산 시스템의 표면을 거의 만지지 않았습니다. 나는 합의, 복제 전략, 이벤트 순서 및 시간, 장애 허용, 네트워크를 통한 메시지 브로드 캐스트 등과 같은 핵심 문제를 철저히 다루고 설명 할 기회가 없었습니다.

주의

이별의 예고와 함께 당신을 떠나 보자 :

분산 시스템에서 최대한 멀리 떨어져 있어야합니다. 다른 방식으로 해결하거나 다른 기본 솔루션으로 문제를 해결하여 문제를 피할 수 있다면 그 자체로 발생하는 복잡한 오버 헤드는 그만한 가치가 없습니다.

[1]
2007 년 6 월 25 ~ 27 일, 협동 P2P 시스템을 이용한 이중 지출의 결합 – 각 '코인'이 만료되어 증인 (검증 인)이 할당되는 제안 된 솔루션입니다.

Bitgold, 2005 년 12 월 — Bitcoin과 매우 유사한 프로토콜에 대한 고급 개요. 이것이 비트 코인의 선구자라고합니다.

추가 분산 시스템 읽기 :

데이터 집약적 응용 프로그램 설계, Martin Kleppmann — 분산 시스템 등 모든 것을 다루는 훌륭한 책입니다.

일리노이 대학교 클라우드 컴퓨팅 전문화 과정 — 분산 시스템 개념, 응용 프로그램을 다루는 일련의 긴 과정 (6)

Jepsen — 많은 분산 기술 (ElasticSearch, Redis, MongoDB 등)을 설명하는 블로그

이 긴 (~ 5600 단어) 기사를 읽어 주셔서 감사합니다!

우연히이 유익한 정보를 찾거나 그것이 가치가 있다고 생각되면, 가치가 있다고 생각되는만큼 박수를 치고이 훌륭한 연구 분야에 대한 소개를 사용할 수있는 친구와 공유하는 것을 고려하십시오.

~ 스타니 슬라 프 코즐 로브 스키

최신 정보

저는 현재 Confluent에서 일하고 있습니다. Confluent는 Apache Kafka 제작자가 직접 만든 빅 데이터 회사입니다! 나는 그들이 나에게 준 기회에 대해 대단히 감사합니다. 저는 현재 Kafka 자체에서 일하고 있습니다. Confluent는 새로운 관리 형 Kafka-as-a-a- 서비스 클라우드 오퍼링을 포함하여 전체 오픈 소스 Kafka 생태계를 형성하는 데 도움을줍니다.

우리는 유럽과 미국에서 많은 직책 (특히 SRE / 소프트웨어 엔지니어)을 고용하고 있습니다! Kafka 자체 작업에 관심이 있거나 새로운 기회를 찾고 있거나 궁금한 점이 있으면 Twitter에 메시지를 보내 주시기 바랍니다. 베이 지역 회사에서 일하면서 얻은 모든 특전을 공유 할 것입니다.