24 окт

GitHub изнутри

point
0

28.jpg

Совсем недавно, co-founder проекта GitHub по имени Tom Preston-Werner (аka mojombo), на радостях от переезда с Engineyard на Rackspace написал очень подробную статью о внутренних составляющих их детища. Краткая выдержка как всегда под катом.


Полученная архитектура примечательна тем, что она основана на стандартных и распространенных компонентах. Где возникают несостыковки или нужен доп. функционал, приходит на помощь Ruby. На нем написаны некоторые библиотеки для сглаживания шероховатостей и расширения возможностей.

Основной список компонент:

  • ldirectord под Xen для балансировки нагрузки.
  • 4 frontend с 8 ядрами, 16GB RAM. Здесь стоят Nginx, Unicorn, Rails.
  • MySQL база расположена на двух 8 core, 32GB RAM серверах с DRBD репликацией.
  • Для получения данных о git репозитории используется собственная разработка Grit.
  • Grit делает RPC запрос на балансировщик с HAProxy
  • Информация о роутинге к реальному расположению git хранилища на файловых серверах размещена в Redis.
  • Файл-сервера с пользовательскими хранилищами идут парами с DRBD репликацией. Помимо этого в каждом сервере имеется 6 SAS дисков c RAID 10. Забэкапились по самое нехочу :)
  • Собственная разработка Ernie RPC сервера спрятаны за HAProxy. Они служат для чтения информации о хранилище.
  • Кеширование в Rails выполнено на основе memcached Ruby библиотеки.
  • Патченный ssh демон, которых хранит сертификаты не в локальной файловой системе, а в MySQL базе данных.

Также в этой статье присутствует ссылка на отдельную статью об их собственной разработке -- протоколе сериализации BERT и протоколе BERT-RPC для межпроцессного и межсерверного взаимодействия.

Отдельно хотелось бы обратить внимание на причины написание своего протокола и на анализ современного положения дел в области RPC. В этой статье рассматриваются современные Thrift и Protocol Buffers, а также вполне устоявшиеся XML-RPC, SOAP, JSON-RPC. Ни один из них не прошел по выдвигаемым критериям:

  • Чрезвычайная простота
  • Динамичность (Никаких IDL или кодогенераций) //согласен, очень порочная практика
  • Богаты набор встроенных типов (nil, symbols, hashes, bignums, heterogenous arrays, и т.д.)
  • Поддержка составных и сложных типов (Time, Regex, и т.д.)
  • Отсутствие необходимости кодировать двоичные данные
  • Синхронные/асинхронные вызовы
  • Быстрая сериализация/десериализация
  • Поддержка потоковой передачи во все направления
  • Директивы для кеширования.

Еще раз, ссылки на статьи:

PS

А еще меня можно найти в twitter-е под ником @apoint. Присоединяйтесь, будет интересно.


Категории:



Стоит почитать


Добавь свой

Комментарии (0)

Имя (обязательное)
Email (обязательное, скрыто)
Web-сайт
Комментарий

© WebDev.tk, 2009