Познакомимся игра в одноклассниках

Рассмотрим сервисы подробнее. У сервиса есть полное имя, которое всегда включает в себя имя очереди. Тогда сервис web фронта будет иметь имя ok-web. А сервис сервера приложений, к которому он обращается, станет именоваться ok-app. У каждого сервиса есть манифест, в котором указывается вся необходимая информация для размещения на конкретных машинах: сколько ресурсов потребляет эта задача, какая для неё нужна конфигурация, сколько реплик должно быть, свойства для обработки отказов этого сервиса.

И после размещения сервиса непосредственно на машинах появляются его экземпляры. Они тоже именуются однозначно — как номер экземпляра и имя сервиса: 1. Задачи с короткой задержкой. У такой задачи паттерн потребления ЦП будет похож на этот:. На обработку поступает запрос от пользователя, задача начинает использовать все доступные ядра ЦП, отрабатывает, возвращает ответ, ждёт следующего запроса и стоит. Поступил следующий запрос — опять выбрали всё, что было, обсчитали, ждём следующего. Чтобы гарантировать минимальную задержку для такой задачи, мы должны взять максимум потребляемых ею ресурсов и зарезервировать нужное количество ядер на миньоне машине, которая будет выполнять задачу.

Тогда формула резервации для нашей задачи окажется такой:. Особо отметим, что среднее потребление процессора у таких задач часто очень низкое — что очевидно, так как значительную часть времени задача находится в ожидании запроса и ничего не делает. Среднее потребление ресурсов процессора у таких задач достаточно высокое. Часто мы хотим, чтобы расчётная задача выполнялась за определённое время, поэтому нужно зарезервировать минимальное количество процессоров, которое ей необходимо, чтобы весь расчёт закончился за приемлемое время. Её формула резервирования будет выглядеть так:.

Тут с эффективностью использования уже значительно лучше, чем на задачах с короткой задержкой. Но выигрыш будет гораздо больше, если совместить оба типа задач на одной машине-миньоне и распределять её ресурсы на ходу. Когда задача с короткой задержкой требует процессор — она его получает немедленно, а когда ресурсы становятся не нужны — они передаются расчётной задаче, т. Нам нужно зарезервировать четыре ядра.

В Docker run это можно сделать двумя способами:. Довольно привлекательно выглядит cpuset. У задачи четыре выделенных ядра, значит, процессорные кеши будут работать максимально эффективно.

‎App Store: Кис Кис: бутылочка, знакомства

У этого есть и оборотная сторона: нам пришлось бы взять на себя задачу распределением вычислений по незагруженным ядрам машины вместо ОС, а это довольно нетривиальная задача, особенно если мы попробуем размещать на такой машине batch-задачи. Тесты показали, что здесь лучше подходит вариант с квотой: так у операционной системы больше свободы в выборе ядра для выполнения задачи в текущий момент и процессорное время распределяется более эффективно. Разберёмся, как в docker сделать резервирование по минимальному количеству ядер.

Квота для batch-задач уже неприменима, потому что ограничивать максимум не нужно, достаточно только гарантировать минимум. И тут хорошо подходит опция docker run --cpushares. Cpu shares никак не вмешиваются в распределение процессорного времени до тех пор, пока его хватает. Таким образом, если prod не использует в данный момент все свои четыре ядра — ничто не ограничивает batch-задачи, и они могут использовать дополнительное процессорное время.

А вот в ситуации нехватки процессора, если prod потребил все свои четыре коры и упёрся в квоту — оставшееся процессорное время будет поделено пропорционально cpushares, т. Но использования quota и shares недостаточно. Нам нужно сделать так, чтобы задача с короткой задержкой получала приоритет перед batch-задачей при распределении процессорного времени.

Без такой приоритизации batch-задача будет забирать всё процессорное время в момент, когда оно необходимо prod. В Docker run нет никаких опций приоритизации контейнеров, но на помощь приходят политики планировщика центрального процессора в Linux. Подробно о них можно прочитать тут , а в рамках этой статьи мы по ним пройдёмся кратко:. Но задачи потребляют не только процессор, но и трафик, который влияет на задержку сетевой задачи ещё больше, чем неправильное распределение ресурсов процессора. Поэтому мы, естественно, хотим получить точно такую же картинку и для трафика.

Здесь Docker не имеет никаких примитивов, которые мы могли бы использовать. Но нам на помощь приходит Linux Traffic Control. Мы смогли добиться нужного результата с помощью дисциплины Hierarchical Fair Service Curve. В итоге конфигурация для исходящего трафика получается вот такая:. Обычно дисциплины tc служат для приоритизации только исходящего трафика. Для этого мы используем модуль ifb , который создаёт виртуальный интерфейс ifbX для каждого сетевого интерфейса и перенаправляет входящий трафик с интерфейса в исходящий на ifbX. Далее для ifbX работают все те же дисциплины для контроля исходящего трафика, для которого конфигурация hsfc будет очень похожей:.

В противном случае неприоритетный трафик слишком сильно влияет на задержку prod-задач. Текущую величину свободной полосы miniond определяет каждую секунду, измеряя среднее потребление трафика всеми prod-задачами данного миньона и вычитая её из пропускной способности сетевого интерфейса c небольшим запасом, т. Полосы определяются для входящего и исходящего трафика независимо. И в соответствии с новыми значениями miniond переконфигурирует лимит неприоритетного класса Таким образом мы реализовали все три класса изоляции: prod, batch и idle.

Эти классы сильно влияют на характеристики исполнения задач. Поэтому мы решили поместить этот признак наверх иерархии, чтобы при взгляде на имя иерархической очереди сразу было понятно, с чем мы имеем дело:. Все наши знакомые web и music фронты тогда помещаются в иерархии под prod. А примером сервиса под idle может служить music transformer , нормализующий уровень громкости музыки. Снова убрав лишние линии, мы можем записать имена наших сервисов более плоско, дописав класс изоляции задачи в конец полного имени сервиса: web.

И теперь, глядя на имя сервиса, мы понимаем не только то, какую функцию он выполняет, но и его класс изоляции, а значит, его критичность и т. Всё замечательно, но есть одна горькая правда. Полностью изолировать задачи, работающие на одной машине, невозможно. Чего нам удалось добиться: если batch интенсивно потребляет только ресурсы процессора, то встроенный планировщик ЦП Linux очень хорошо справляется со своей задачей, и влияния на prod-задачу практически нет. Но если эта batch-задача начинает активно работать с памятью, то взаимное влияние уже проявляется. Изолировать трафик ещё сложнее из-за того, что у современных сетевых карт есть внутренняя очередь пакетов.

Если пакет от batch-задачи туда попал первым, значит, он первым и будет передан по кабелю, и тут ничего не поделаешь. Одной из целей при разработке one-cloud было улучшение отказоустойчивости Одноклассников. Поэтому далее я хотел бы поподробнее рассмотреть возможные сценарии отказов и аварий. Давайте начнём с простого сценария — с отказа контейнера.

Контейнер сам по себе может отказать несколькими способами. Это может быть какой-то эксперимент, баг или ошибка в манифесте, из-за которой prod-задача начинает потреблять больше ресурсов, чем указано в манифесте. У нас был случай: разработчик реализовал один сложный алгоритм, много раз его переделывал, сам себя перемудрил и запутался так, что в конечном счёте задача весьма нетривиально зацикливалась. А поскольку prod-задача более приоритетная, чем все остальные на тех же миньонах, она начала потреблять все доступные ресурсы процессора.

В этой ситуации спасла изоляция, а точнее квота на процессорное время.

Рыбалка на Андроид

Если задаче выделена квота, задача не потребит больше. Поэтому batch- и другие prod-задачи, которые работали на той же машине, ничего не заметили. Вторая возможная неприятность — падение контейнера. И здесь нас спасают политики рестарта, все их знают, Docker сам прекрасно справляется. Практически все prod-задачи имеют политику рестарта always. Очевидно, запустить контейнер на другой машине. Самое интересное здесь — что происходит с IP-адресом адресами , назначенными на контейнер.

Мы можем назначать контейнерам такие же IP-адреса, как и у машин-миньонов, на которых эти контейнеры запускаются. Тогда при запуске контейнера на другой машине его IP-адрес меняется, и все клиенты должны понять, что контейнер переехал, теперь надо ходить на другой адрес, что требует отдельного сервиса Service Discovery. Service Discovery — это удобно. На рынке много решений разной степени отказоустойчивости для организации реестра сервисов.

Что делать, если не получается зайти в игру «Пообщаемся»

Часто в таких решениях реализуется логика балансировщика нагрузки, хранение дополнительной конфигурации в виде KV-стораджа и т. Однако, нам хотелось бы обойтись без необходимости внедрения отдельного реестра, ведь это означало бы ввод критической системы, которая используется всеми сервисами в production. А значит, это потенциальная точка отказа, и нужно выбирать или разрабатывать очень отказоустойчивое решение, что, очевидно, очень непросто, долго и дорого.

И ещё один большой недостаток: чтобы наша старая инфраструктура работала с новой, пришлось бы переписать абсолютно все задачи под использование какой-то Service Discovery системы. Работы ОЧЕНЬ много, а местами до невозможности, когда речь заходит о низкоуровневых устройствах, работающих на уровне ядра ОС или непосредственно с железом. Реализация же этой функциональности с помощью устоявшихся паттернов решений, как например side-car означала бы местами дополнительную нагрузку, местами — усложнение эксплуатации и дополнительные сценарии отказов.

Усложнять же нам не хотелось, поэтому решили сделать использование Service Discovery опциональным. В one-cloud IP следует за контейнером, т. Если в течение жизни сервис имел различное количество экземпляров — то в итоге за ним будет закреплено столько IP-адресов, сколько максимально было экземпляров. Впоследствии эти адреса не изменяются: они присвоены единожды и продолжают существовать в течение всей жизни сервиса в production. IP-адреса следует за контейнерами по сети. Если контейнер переносится на другой миньон, то и адрес перейдёт за ним. Таким образом, сопоставление имени сервиса со списком его IP-адресов меняется очень редко.

Если ещё раз посмотреть на имена экземпляров сервиса, которые мы упоминали в начале статьи 1. Причём этот DNS возвращает все зарезервированные IP-адреса всех контейнеров — и работающих, и остановленных допустим, используется три реплики, а у нас там пять адресов зарезервированы — все пять будут возвращаться. Клиенты, получив эту информацию, попытаются установить соединение со всеми пятью репликами — и определят таким образом тех, которые работают.

Такой вариант определения доступности значительно более надёжен, в нём не участвуют ни DNS, ни Service Discovery, а значит, нет и трудно решаемых задач с обеспечением актуальности информации и отказоустойчивости этих систем. Более того, в критических сервисах, от которых зависит работа всего портала, мы можем вообще не использовать DNS, а просто забивать в конфигурацию IP-адреса. Реализация такого переноса IP за контейнерами может быть нетривиальной — и мы остановимся на том, как это работает, на следующем примере:. Допустим, one-cloud мастер даёт команду миньону M1 запустить 1.

На миньоне работает BIRD , который анонсирует этот адрес в специальные серверы route reflector. У последних есть BGP-сессия с сетевой железкой, в которую и транслируется маршрут адреса 1. M1 же маршрутизирует пакеты внутрь контейнера уже средствами Linux. Серверов route reflector три, так как это очень критичная часть инфраструктуры one-cloud — без них сеть в one-cloud работать не будет.

Мы размещаем их в разных стойках, по возможности расположенных в разных залах дата-центра, чтобы уменьшить вероятность единовременного отказа всех трёх. Давайте теперь предположим, что связь между мастером one-cloud и миньоном М1 пропала. Мастер one-cloud теперь будет действовать, исходя из предположения, что М1 отказал полностью. То есть даст команду миньону М2 запустить web. Теперь у нас есть два конфликтующих маршрута в сети для 1. Для того чтобы разрешать подобные конфликты, мы используем Multi Exit Discriminator, который указывается в BGP-анонсе.

Это число, которое показывает вес анонсируемого маршрута. Из конфликтующих будет выбран маршрут с меньшим значением MED. В ситуации же такого аварийного переноса контейнера мастер уменьшает MED, и М2 уже получит команду анонсировать адрес 1. Экземпляр же, работающий на M1, останется при этом без связи, и его дальнейшая судьба нас мало интересует до момента восстановления связи с мастером, когда он и будет остановлен как старый дубль.

Все системы управления дата-центрами всегда приемлемо отрабатывают мелкие отказы. Вылет контейнера — это норма практически везде. Давайте рассмотрим, как мы отрабатываем аварию, например отказ питания в одном или более залах дата-центра. Что означает авария для системы управления дата-центром?

В первую очередь это массированный единовременный отказ множества машин, и системе управления нужно одновременно мигрировать очень много контейнеров. Часто аварии сопровождаются отказом и управляющего слоя. Это может случиться из-за выхода из строя его оборудования, но чаще из-за того, что аварии не тестируются, и управляющий слой сам падает от возросшей нагрузки.

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

Мы это указываем это с помощью приоритета размещения — числа, которое может быть назначено очереди. Если у какой-то очереди приоритет выше, её сервисы размещаются в первую очередь. На prod мы назначаем приоритеты повыше, 0; на batch — чуть пониже, ; на idle — ещё ниже, Приоритеты применяются иерархически.

У всех задач ниже по иерархии будет соответствующий приоритет. Если же, например, мы хотим, чтобы из фронтов в первую очередь запускался основной портал, а music фронт уже потом, то последнему можем назначить приоритет пониже — Следующая проблема — нехватка ресурсов. Итак, у нас отказало большое количество оборудования, целые залы дата-центра, а мы поназапускали сервисов столько, что теперь на всех не хватает ресурсов.


  • Одноклассники: знакомства..
  • Одиннадцать игр на знакомство детей в школе?
  • ЗНАКОМСТВА НА ОДНОКЛАССНИКАХ.
  • Хочу Общаться - игра онлайн без регистрации.

Нужно решить, какими задачами пожертвовать, чтобы работали основные критичные сервисы. В отличие от приоритета размещения, мы не можем огульно пожертвовать всеми batch-задачами, некоторые из них важны для работы портала. Поэтому мы выделили отдельно приоритет вытеснения задачи. При размещении задача с более высоким приоритетом может вытеснить, т. При этом задача с низким приоритетом, вероятно, так и останется неразмещённой, т.

В нашей иерархии очень просто указать такой приоритет вытеснения, чтобы prod- и batch-задачи вытесняли или останавливали idle-задачи, но не друг друга, указав для idle приоритет, равный Так же, как и в случае с приоритетом размещения, можем использовать нашу иерархию для того, чтобы описывать более сложные правила. Например, укажем, что функцией музыки мы жертвуем, если нам не хватит ресурсов для основного веб-портала, установив для соответствующих узлов приоритет пониже: Почему может отказать весь дата-центр?

Был хороший пост, как ураган повлиял на работу дата-центра. Стихией можно считать бомжей, которые спалили как-то раз в коллекторе оптику, и дата-центр полностью потерял связь с остальными площадками. Причиной выхода из строя бывает и человеческий фактор: оператор выдаст такую команду, что весь дата-центр упадёт. Такое может случиться из-за большого бага. В общем, дата-центры падают — это не редкость. У нас такое происходит раз в несколько месяцев.

Знакомства на Одноклассниках

Первая стратегия — изоляция. Каждый инстанс one-cloud изолирован и может управлять машинами только одного дата-центра. То есть потеря облака из-за багов или неправильной команды оператора — это потеря лишь одного дата-центра.


  1. ‎App Store: Пообщаемся?!
  2. Распределение ресурсов.
  3. знакомства для инвалидов в тольятти.
  4. Мы к этому готовы: есть политика резервирования, при которой реплики приложения и данных размещаются во всех дата-центрах. Мы используем отказоустойчивые базы данных и периодически тестируем отказы. Поскольку сегодня у нас четыре дата-центра, то есть и четыре отдельных, полностью изолированных экземпляра one-cloud. А что ещё можно сделать с человеческим фактором?

    Классы изоляции задач

    Когда оператор даёт облаку какую-то странную или потенциально опасную команду, от него могут внезапно потребовать решить небольшую задачу, чтобы проверить, насколько хорошо он подумал. Например, если это какая-то массовая остановка многих реплик или просто странная команда — уменьшение количества реплик или смена имени образа, а не только номера версии в новом манифесте. Все эти функции потребовали бы значительных переделок существующих решений под себя, и, оценив количество работы, мы поняли, что сможем разработать своё решение приблизительно с теми же трудозатратами.

    Но своё решение будет значительно проще эксплуатировать и развивать — в нём нет ненужных абстракций, поддерживающих ненужный нам функционал. Прочитал, порадовался, что люди независимо сделали свой маленький Borg , респект им. Манифесты, назначение ресурсов на задачи, раздельное управление классом изоляции и приоритетом размещения appclass и priority соответственно в терминологии Borg , FQDN-like имена.

    Даже из lessons learned два пункта присутствуют: глубокая иерархия задач и IP на контейнер. Только Service Discovery нет, что отдельно проговаривается. Но у простых пользователей cluster management вопросы к проприетарному решению могут быть только из праздного любопытства, а архитекторы… не знаю, может на HighLoad своё любопытство удовлетворили? Mesos в продакшене проявил себя достаточно безбажным, но Марафон — это нечто.

    Затем руководитель семейной программы Верина И. После этого был выбран и утверждён состав Читательского совета и рассмотрен план его работы. Надеемся на плодотворное сотрудничество! Библиотеки города Урай. Продление литературы Обращение Карта сайта. Центральная библиотека им.