페더레이션 실험 및 계정 마이그레이션

Nov 28 2022
안녕 친구들. 거친 달이었습니다.

안녕 친구들. 거친 달이었습니다. 우리의 작은 소셜 미디어 서버는 프로덕션 인프라로 바뀌었고 여전히 계속 성장하고 있습니다.

Twitter에서 기술 커뮤니티의 대규모 이탈은 매우 현실적입니다. 내 생각에 이 수치는 실리콘 밸리가 머스크의 트위터 주도 능력에 대한 믿음을 잃었다는 가설을 입증합니다. 저는 우리가 소셜 미디어와 기업의 르네상스에 접근하고 있음을 느낍니다.

Hachyderm 성장 및 숫자 개요

채택의 관점에서 볼 때 다음과 같이 부를 수 있다면 우리의 성장은 불합리한 "건강한" 것입니다.

11월 3일 : 사용자 720
명 11월 13일 : 사용자 6,000명
11월 23일 : 사용자 25,000 명

우리는 30일 이내에 단일 노드에서 전 세계적으로 분산된 중복 인프라로 성장했습니다. 우리의 작은 400mb postgres 데이터 저장소는 이제 177Gb의 데이터입니다. 향후 6개월 동안 콘텐츠 제공에만 30Tb 이상의 스토리지가 필요할 것으로 예상됩니다.

아마도 우리 서비스가 성장하는 것을 지켜본 가장 흥미로운 점은 트래픽일 것입니다. 예! 교통!

오늘 우리는 200Mbps로 스로틀링되는 주요 공용 파이프를 완전히 최대로 사용했습니다. 우리의 기본 ISP는 우리 계정을 관리하는 방식을 변경해야 했으며 이제 우리를 소규모 기업 계정 대신 대규모 기업 계정으로 간주합니다. 이 변경으로 인해 이제 우리는 Hachyderm을 호스팅하기 위해 탐색하고 있는 많은 새로운 기능과 서비스에 액세스할 수 있습니다.

우리는 가장 바쁜 날(11월 21일)에 파이프를 통해 최대 1Tb의 데이터를 처리했습니다.

페더레이션에 대한 생각

다른 날 우리 운영자 팀과 나는 예정된 가동 중지 시간 동안 서비스를 오프라인으로 전환했습니다. 우리는 업그레이드로 약간 눈이 먼 비행을 하고 있었고 확실히 내 최고의 작업은 아니었습니다. 내 트위치 채널에서 업그레이드를 생중계했습니다. 보관 된 비디오를 볼 수 있습니다 .

저의 훌륭한 파트너인 Quintessence는 업그레이드 후 저를 보고 온라인 스테이징 환경이 있는지 물었습니다. 그것은 매우 나쁜 대답을 가진 완벽하게 유효한 질문이었습니다.

아니요. 온라인 준비 환경이 없었습니다. 솔직히 말해서 나는 데이터를 분기하고 hachyderm의 작은 인스턴스를 만드는 것 외에 스테이징 환경이 어떻게 생겼는지조차 확신하지 못합니다. 문제는 마스토돈도 워드프레스나 다른 애플리케이션과 마찬가지로 자신의 도메인을 알고 있다는 점이다. "스테이징" 인스턴스를 생성하려면 약간의 생각이 필요합니다.

내가 문제에 대해 더 많이 생각할수록 분산형 시스템과 연합 시스템에는 우리 업계에서 훌륭한 패턴이 없는 몇 가지 새로운 문제가 있음이 드러났습니다. Mastodon은 전 세계의 사람들이 마스토돈과 인터페이스할 것이라는 믿음과 연합할 수 있는 다른 온라인 인스턴스가 있을 것이라는 사실을 기반으로 구축되었습니다.

페더레이션 또는 도메인 분리를 테스트할 수 있는 스테이징 환경을 구축하려면 어떻게 해야 합니까? 생각해보세요. 페더레이션은 어떻게 작동합니까? hachyderm은 fediverse의 다른 인스턴스에 얼마나 많은 영향을 줍니까? 다른 인스턴스가 내 시스템에 미치는 영향은 얼마나 됩니까?

hachyderm.wtf 생성

당연히 전 세계적으로 대규모로 분산되고 연합된 시스템을 온라인으로 보유하는 데 따른 보안 영향과 병목 현상에 대한 우려를 생각하며 마음이 뛰기 시작했습니다. 나는 도파민을 따라 새로운 도메인을 구입하기로 결정했습니다.

노드 중 하나를 구매 hachyderm.wtf하고 복제 했습니다. hachyderm.io몇 분 늦게 새 도메인이 이전 노드의 복사본을 가리켰습니다. 이제 Mastodon이 가정하고 페더레이션에 대해 배우는 리버스 엔지니어링을 시작할 때입니다.

도메인을 "변경"하려고 하면 Mastodon이 중단됩니다.

단일 Mastodon 노드는 자체 인식하며 일반적으로 분산 시스템에서 말하는 것은 큰 "아니오"입니다. 우리는 이것을 Kubernetes에서 배웠습니다. 대규모 인프라는 일반적으로 쉽게 복제하고 이동할 수 있도록 자체 도메인 이름을 인식하지 못합니다.

그러나 Mastodon은 "회사 네트워크용"이 아닌 "인터넷용"으로 구축되었으므로 도메인 이름은 실제로 모델에서 신중한 시스템 경계입니다. 더 많이 배울수록 인터넷이 처음으로 "올바른" 느낌을 받았다고 생각하기 시작했습니다.

여하튼 도메인 문제 때문에 프로덕션 데이터로 스테이징 노드를 만들지 못해서 그냥 데이터베이스를 nuked하고 새로 시작했습니다.

새 Mastodon 인스턴스에는 관리자 계정이 필요합니다.

새 인스턴스를 설정하려면 관리자 계정 을 만들어야 합니다. 그렇지 않으면 시스템에 액세스할 방법이 없습니다. 페더레이션할 데이터가 없습니다.

새 관리자 계정 [email protected]을 만들고 시스템을 온라인 상태로 만들기 시작했습니다.

대부분의 프로덕션 구성이 이미 새 서버에 로드되었기 때문에 새 Mastodon의 대부분의 기능이 "작동했습니다". 이메일이 전송되고 nginx가 트래픽에 응답했습니다. Sidekiq 등이 균형을 이루었습니다.

외부에서 Hachyderm

나는 hachyderm의 외부인이 되는 것이 어떤 것인지 보고 싶었습니다. 얼마나 많은 데이터가 hachyderm에 "고유"했습니까? 내 마스토돈 경험 중 어느 정도가 우리 인스턴스에 격리되었습니까?

내 결론은 "전부는 아니지만 많이"였습니다. Mastodon은 "추종자"와 매혹적인 관계를 맺고 있으며 더 이상 hachydermians가 누구를 따르는지 볼 수 없습니다. 이것은 특히 팔로워를 기반으로 콘텐츠를 학습하고 생성하는 시스템의 경우 큰 문제입니다.

예를 들어 hachyderm.wtf에서 내 파트너 Quintessence가 팔로우하는 사람들의 목록을 더 이상 볼 수 없었습니다.

해시태그

다음 관찰은 해시태그가 인스턴스 수준에서 관리된다는 것입니다. 내 뉴스, 커뮤니티, for you 페이지가 모두 비어있었습니다. 내 인스턴스에는 다른 사람이 없었기 때문에 "커뮤니티 콘텐츠"가 없었습니다.

나는 hachyderm에서 많은 양의 기술 뉴스, 블로그, 게시물 및 기사를 공유하는 데 익숙해졌습니다. 이것들은 이제 모두 사라졌습니다.

홈 타임라인

내 고향 타임라인은 유령 도시였습니다. 나는 누구를 팔로우하지 않았고 내 서버에는 아무도 없었습니다. 기본적으로 fediverse가 존재하지 않는 것과 같았습니다.

내 계정 마이그레이션

내 마음에 눈에 띄는 질문 중 하나는 Mastodon이 팔로워를 어떻게 관리합니까? 계정 이전은 어떻습니까?

여러 시스템에서 추종자 개념을 관리하는 것은 일반적으로 흥미로운 컴퓨터 과학 질문입니다. 저는 분산 해시 테이블과 방향성 및 비방향성 그래프의 기본 사항 중 일부를 통해 대화하는 방법으로 인터뷰를 코딩할 때 "The Twitter Follower" 문제를 사용했습니다.

마이그레이션 결정

공교롭게도 저는 아이슬란드에서 Sigur Rós 콘서트를 즐기기 위해 Hachyderm 관리와 GitHub에서의 일상 업무를 며칠 쉬기로 결정했습니다. 나는 약 5일 동안 "오프라인"이 될 것이라는 것을 알고 있었습니다.

내 마음에 있었던 질문 중 하나는 팔로워가 데이터베이스에 어떻게 저장되고 각 연합 인스턴스가 다른 외부 인스턴스를 얼마나 제어할 수 있는가 하는 것입니다. 분산 시스템에 대해 내가 아는 모든 것은 그들 사이에 느슨한 안무가 있는 상호의존적 시스템이 골칫거리이며 거의 항상 나쁜 생각이라는 것을 말해줍니다. 시스템의 노드에 다른 소유자가 있는 경우는 어떻습니까? 이것은 재앙의 비결처럼 보입니다.

한 인스턴스가 다른 인스턴스에 대해 얼마나 많은 제어권을 갖고 있는지 알아보기 위해 Mastodon의 마이그레이션 기능을 hachyderm.wtf로 시험해보기로 즉각 판단했습니다. 내 서버가 다른 모든 서버에 레코드를 업데이트하라고 지시했습니까? 어떻게 작동합니까? 프로덕션 데이터로 테스트하는 것이 좋겠다고 생각했는데, 마침 휴가 중에 프로토타입을 만들 계정이 있었습니다.

[email protected][email protected] 로 마이그레이션하는 스크린샷

원격 서비스 거부

그래서 설명서를 따르고 버튼을 클릭하여 내 계정을 마이그레이션했습니다. 일어날 수 있는 최악의 상황은 무엇입니까?

새 계정을 조사하는 데 잠시 시간을 할애하고 새 계정을 가리키도록 이전 계정을 구성했습니다. 두 인스턴스를 서로 "합의"로 유지하는 개념은 연합에서 공통된 주제가 될 것입니다.

프로세스를 시작한 지 몇 시간 후 나는 추종자들이 새 인스턴스로 "마이그레이션"하기 시작했음을 알았습니다. 기본적으로 총 132개 이상의 코어가 있는 랙의 여러 노드에 분산된 엔터프라이즈 서비스 하드웨어에서 실행 hachyderm.wtf되는 라즈베리 파이와 같은 2개의 코어가 있는 매우 작은 서버에서 실행되고 있다는 것을 이해하는 것이 중요합니다 .hachyderm.io

여기에서 Ruby에 정의된 프로세스 가 hachyderm.io시작 되는 것을 볼 수 있었고 로컬 인스턴스에서 팔로워를 다시 작성할 것입니다.move_worker

나는 거의 즉시 hachyderm.wtf. 서비스가 응답하지 않았습니다. 몇 분 후 작업 대시보드를 불러올 수 있었고 내 타임라인이 속도 제한 자체를 관찰했습니다.

429 비율 제한 요청
속도 제한 및 무응답 대시보드

크기 를 조정 hachyderm.wtf하고 더 많은 컴퓨팅을 제공했으며 서비스가 다시 응답했습니다.

팔로어가 팔로우하는 것을 지켜보기

상황이 안정되면서 내 팔로어의 약 10%만 유지했다는 사실을 알게 되었습니다. 문제가 있었나요?

나는 로그온을 살펴보고 hachyderm.wtf"배치"에서 분명히 어떤 일이 일어나고 있고 배치가 서버별로 그룹화되어 있음을 금방 발견했습니다.

즉 , 한 순간에 및 기타 인스턴스에서 수천 hachyderm.wtf건의 요청을 받는 것을 볼 수 있었습니다. 분명히 원격 서버는 추종자를 마이그레이션하기 위해 일종의 협상을 수행해야 했습니다 .mastodon.socialmastodon.sdf.orghachyderm.wtf

이것은 흥미로운 발견이었고 내가 마이그레이션할 때 어떻게 DDoS를 할 수 있었는지 설명합니다.

서버 자체를 다운시킬 수 있는 특정 벡터는 새로운 4.0.2 웹소켓 기능이 로드된 브라우저에서 타임라인을 연 사용자입니다. 마이그레이션 중에 팔로워가 실시간으로 채워져 대시보드의 다른 부분이 /accounts유지할 수 있는 것보다 빠르게 엔드포인트를 쿼리하게 됩니다. 이를 위해 잠재적으로 CVE를 여는 것에 대해 Mastodon 보안 팀에 연락했습니다.

hachyderm.wtf그러나 팔로워를 마이그레이션하려는 원격 서버 간에 너무 많은 오버헤드가 발생하는 일이 발생했습니다 .

마스토돈 추종자 관계

따라서 Mastodon 내 연합의 매우 흥미로운 기능은 팔로워/팔로우 관계를 관리하고 인증하는 방법입니다.

오프라인 상태 가 된 작업의 시작점을 보여주는 FollowRequest 코드를 찾았습니다 . hachyderm.wtfMastodon은 공개 암호화 키를 사용하여 시스템의 다양한 요청 및 기능을 인증합니다. Mastodon은 HTTP 서명 을 사용하여 두 인스턴스 사이를 인증하는 ActivityPub를 기반으로 합니다. 이것은 한 인스턴스가 다른 인스턴스가 실제로 그것이 말하는 사람임을 확신하는 방법입니다.

계정을 마이그레이션할 때 시스템 간의 신뢰가 깨지기 때문에 모든 주요 데이터를 다시 구축해야 합니다. DDoSing의 특징은 hachyderm.wtf수천 명의 팔로워가 각 호스트 서버와 각각 협상하고 재인증해야 한다는 것입니다.

이 모델에는 좋은 점과 나쁜 점이 있습니다. 페더레이션에 관한 한 이것은 인증과 관련하여 올바른 아키텍처 결정이었습니다. 앞으로 데이터를 원활하게 마이그레이션할 수 있는 다른 방법이 있는지 궁금합니다!

기타 의도하지 않은 결과

모든 실험은 성공적이었고 Mastodon 관리자로서 내가 가진 권한과 다른 관리자가 내 시스템에 대해 갖는 권한에 대해 많은 것을 공개했습니다. HTTP 서명으로 발생하는 시스템 간의 상호 신뢰를 보는 것은 매우 멋집니다!

로의 마이그레이션 hachyderm.iohachyderm.wtf성공적이었습니다. 나는 우리가 릴레이 작동 방식을 이해하기 위해 구축하려는 ActivityPub의 Rust 구현인 RustyPubhachyderm.wtf 에서 작업할 수 있도록 실험실 인스턴스로 계속 활용할 것임을 알고 있습니다.

커뮤니티 트러스트

나는 예기치 않게 hachyderm.io를 위로 떠나는 것에 대해 파트너 Quintessence로부터 상당히 심하게 꾸중을 받았습니다. 다른 사람들이 그 변화를 미지의 것으로 보고 최악의 상황을 추측할 것이라는 점에서 그녀는 좋은 점을 제기했다고 생각합니다. 결과적으로 그녀는 언제나처럼 옳았습니다.

fediverse가 평판과 이미지를 중심으로 덜 구축되기를 바라는 만큼 모든 사람이 저처럼 시스템을 이해하는 것은 아니며 도메인 변경과 같은 것을 실험이 아닌 위험으로 간주할 것이라고 믿습니다.

제한 요인: 시간

또 다른 예상치 못한 결과는 HTTP 서명을 재협상하는 그들의 작업이 매우 지연될 수 있다는 점에서 내 팔로워가 원래 내 계정을 팔로우했던 모든 마스토돈 인스턴스 소유자를 처분할 수 있다는 것입니다.

나는 당신을 따라온 원격 서버가 영구적으로 파괴되지 않는 한 마이그레이션 중에 팔로워를 잃지 않을 것이라고 생각합니다.

그러나 다른 인스턴스가 백엔드에서 재협상하는 데 며칠, 몇 주 또는 더 오래 걸릴 수 있다고 생각합니다. 일회성 팔로우는 대부분의 협상을 브라우저에서 수행할 수 있으므로 빠르고 쉽습니다. 그러나 백엔드에서 일괄 작업을 수행하면 다른 인스턴스가 sidekiq 를 올바르게 구성하고 대기열에 대기 시간이 없다는 많은 믿음이 생깁니다. .

Hachyderm.io의 집으로 돌아가기

몇 분 전에 저는 hachyderm.wtf홈 인스턴스 에서 다시 마이그레이션을 시작했습니다 hachyderm.io. 내 팔로어 대부분이 다시 재협상되기까지 며칠이 걸릴 것 같습니다.

뒤로 이동하면 hachyderm.io최근에 상황이 왜 그렇게 조용했는지 깨달았습니다.

전화를 끊고 있던 모든 알림이 갑자기 조용해진 것을 알아차렸습니다.

데이터 이해

따라서 Mastodon에서 귀하를 "귀하"로 만드는 데이터는 대부분 귀하의 인스턴스에 상주합니다. 주로.

인스턴스 이동의 경우 모든 알림이 갑자기 중지되는 것을 확인했습니다. 나는 마이그레이션이 마이그레이션 후 내 계정이 동결된다는 것을 의미한다는 것을 이해하는 데 시간을 보냈습니다. 즉, 마이그레이션 후 이전 계정으로 전송된 알림이 영원히 손실된다는 의미입니다.

새 계정에 더 많은 글을 게시하기 시작하면서 내 새 콘텐츠에 대한 새 알림이 생성됨에 따라 알림 스트림이 계속될 것 같습니다. 그러나 이전 답글, 좋아요 등은 이제 사라졌습니다.

삭제하자마자 hachyderm.wtf다른 서버의 메시지는 어떻게 되는지 궁금합니다. 원래 서버가 영원히 사라진 후에도 이러한 게시물이 계속 유지될 수 있습니까?

읽어 주셔서 감사합니다

나는 이것이 많았다는 것을 안다! 이것은 대부분 의식의 흐름이며 오늘 밤 콘서트를 준비하면서 내 필드 노트입니다.

자세한 내용 은 Mastodon [email protected] 에서 저를 팔로우하세요!