Split brain что это
Один хорошо, а два лучше: как работает мозг с расщепленными полушариями
В издательстве Corpus выходит книга нейробиолога Майкла Газзаниги «Истории от разных полушарий мозга. Жизнь в нейронауке» в переводе Юлии Плискиной и Светланы Ястребовой. Газзанига рассказывает о расщепленном мозге, исследованием которого он занимается с 1960-х. После разъединения правая и левая половины мозга начинают функционировать независимо друг от друга — в голове фактически возникают два самостоятельных разума. Публикуем фрагмент из главы, посвященной тому, как более полувека назад начинали исследовать расщепленный мозг у пациентов, перенесших операцию на мозолистом теле.
Майкл Газзанига (М. Г.): Зафиксируйте взгляд на точке.
У. Дж.: Вы имеете в виду маленький кусочек бумаги, прилипший к экрану?
М. Г.: Да, это точка… Смотрите прямо на нее.
У. Дж.: Хорошо.
Я убеждаюсь, что он смотрит прямо на точку, и вывожу на экран изображение простого объекта, квадрата, расположенного справа от точки, ровно на 100 миллисекунд. Объект, расположенный таким образом, проецируется в левое, «говорящее» полушарие мозга. Этот разработанный мной тест с пациентами Акелайтиса еще не проводился.
М. Г.: Что вы видели?
У. Дж.: Прямоугольник.
М. Г.: Хорошо, давайте попробуем еще раз. Зафиксируйте взгляд на точке.
У. Дж.: Вы имеете в виду кусочек бумаги?
М. Г.: Да, именно. Смотрите на него.
И снова я вывожу на экран изображение квадрата, но на этот раз слева от точки, на которой зафиксирован взгляд пациента, и оно попадает только в правое полушарие мозга, то, что не способно говорить. Из-за особой операции, при которой связующие волокна между полушариями рассекли, правое полушарие У. Дж. больше не могло обмениваться информацией с левым. Это был решающий момент. Сердцебиение у меня учащается, во рту пересыхает, когда я спрашиваю:
М. Г.: Что вы видели?
У. Дж.: Ничего.
М. Г.: Ничего? Вы ничего не видели?
У. Дж.: Ничего.
Сердце колотится. Я начинаю потеть. Неужели я только что лицезрел два мозга, вернее сказать, два разума, работающих отдельно друг от друга в одной голове? Один мог говорить, другой — нет. Это ведь происходило?
У. Дж.: Хотите, чтобы я что‑нибудь еще сделал?
М. Г.: Да, один момент.
Я быстро нахожу еще более простые слайды, когда на экран проецируются только отдельные маленькие круги. На каждом слайде изображен только один круг, но появляется он на экране всякий раз в новом месте. Что будет, если пациента просто попросить указывать на то, что он видит?
М. Г.: Просто показывайте рукой на то, что увидите.
У. Дж.: На экране?
М. Г.: Да, причем какой хотите рукой.
У. Дж.: Хорошо.
М. Г.: Зафиксируйте взгляд на точке.
Круг высвечивается справа от точки, на которой зафиксирован взгляд, что позволяет левому полушарию пациента увидеть его. Правая рука У. Дж. поднимается со стола и указывает на то место, где был круг. Мы проделываем это еще несколько раз, причем круг появляется то на одной половине экрана, то на другой. Ничего не меняется. Когда круг находится справа от точки фиксации взгляда, правая рука, контролируемая левым полушарием, указывает на него. Когда круг расположен слева от точки фиксации взгляда, на него указывает левая рука, контролируемая правым полушарием. Одна рука или другая верно показывает на нужное место на экране. Это означает, что каждое полушарие действительно видит круг, когда он находится в противоположном поле зрения, и каждое отдельно от второго может направлять контролируемую им руку для ответа на стимул. Однако лишь левое полушарие способно сказать об этом. Я едва могу сдерживаться. О сладость открытия!
Так начинается направление исследований, которое двадцатью годами позже, почти день в день, будет отмечено Нобелевской премией.
Выберите любой период жизни, в событиях которого принимало участие много людей, — и каждый из них перескажет историю по‑своему. У меня шестеро детей, и на рождественские каникулы вся орава приезжает домой. Слушая их воспоминания о детстве, я диву даюсь, насколько по‑разному у них в памяти запечатлелись одни и те же события. Это верно и для всех нас, когда мы вспоминаем события из профессиональной жизни. На переднем плане находилась фактическая сторона научных исследований, а что происходило на заднем плане? Конечно же, тот волшебный миг с У. Дж. случился не только благодаря нам двоим.
Смелый доктор и его добровольный пациент
Джозеф Боген был молодым нейрохирургом, ярким и напористым, и он продвигал идею проводить операции по расщеплению мозга на человеке. Он убедил главу нейрохирургического отделения, Питера Вогеля, провести первые современные операции по расщеплению мозга. Джо был неутомимым интеллектуалом с особым вкусом к жизни и помог взглянуть на проект с ценной медицинской точки зрения. А еще именно он нашел первого подходящего пациента. Я мог бы объяснить, как это вышло, но гораздо лучше об этом расскажет он сам, вспоминая того пациента и те ранние годы. Революционный вклад пациента У. Дж. очевиден с самого начала:
«Я впервые встретил Билла Дженкинса летом 1960 года, когда его привезли в реанимацию в эпилептическом статусе; я в тот момент дежурил в неврологическом отделении. В последующие месяцы мне стали очевидны гетерогенность вкупе с устойчивостью к медикаментозному лечению и тяжестью его многоочаговых припадков. И в клинике, и в госпитале я был свидетелем психомоторных нарушений, внезапных падений тонуса мышц и односторонних подергиваний, а также генерализованных судорог. В конце 1960‑го я написал Мейтленду Болдуину, на тот момент главе нейрохирургического отделения НИЗ (Национальных институтов здравоохранения) в Бетесде, штат Мэриленд. Несколькими месяцами позже Билла перевели в эпилептологический центр НИЗ, где он провел шесть недель. Его отправили домой весной 1961‑го, сказав, что для его случая не существует эффективного метода лечения, ни уже проверенного, ни экспериментального.
Тогда Биллу и его жене Ферн рассказали о результатах работы Ван Вагенена [нейрохирург, который впервые провел рассечение мозолистого тела человеку в 1940‑х годах. — Прим. ред.], главным образом с частичным рассечением комиссур мозга. Я высказал предположение, что поможет полное рассечение. Их энтузиазм вдохновил меня обратиться к Филу (моему шефу): у него имелся большой опыт по удалению артериовенозных мальформаций мозолистого тела. Он предложил пять-шесть раз попрактиковаться в морге. К концу лета (в течение которого я снова работал нейрохирургом) мы уверенно овладели техникой операции. В разговорах со Сперри я упирал на то, что это уникальная возможность проверить результаты его экспериментов с кошками и обезьянами на людях и что его направление исследований было крайне важным. Он упомянул, что студент, который вот-вот выпустится из Дартмутского колледжа, провел предыдущее лето в лаборатории и будет рад протестировать человека. Майк Газзанига начал свою аспирантскую работу в сентябре и, как сказал Сперри, жаждал протестировать испытуемого-человека. Мы с ним вскоре подружились и стали вместе планировать экспери-
менты, которые нужно провести до и после операции. Перед ней случилась небольшая задержка, во время которой Билла тестировали в лаборатории Сперри. Во время этой отсрочки у нас также была возможность достаточно полно и подробно зарегистрировать многократные припадки Билла.
Шел период предоперационного тестирования, когда Билл сказал: „Знаете, даже если операция не поможет унять мои припадки, но вы благодаря ей узнаете что‑то новое, это принесет больше пользы, чем что‑либо сделанное мною за долгие годы“.
Его прооперировали в феврале 1962 года. Оглядываясь назад, я думаю, что, если бы тогда в нашем госпитале существовал исследовательский комитет, одобрение членов которого требовалось бы для проведения любой процедуры, эту операцию никогда бы не сделали. В то время глава отделения в одиночку мог принять подобное решение, что, полагаю, напоминало ситуацию в Рочестерском университете в конце 1930‑х».
Наука тогда и сейчас
Тогда, в 1961‑м, жизнь была простой. Или так кажется сейчас. То было время, когда люди уезжали в колледж, усердно учились, поступали в магистратуру или аспирантуру, получали ученую степень, становились постдоками, переходили на оплачиваемую позицию, затем становились профессорами в каком‑нибудь институте. Они проживали жизнь, преследуя свои интересы в интеллектуальной сфере. Сегодня карьерные пути не так четко определены и все больше постдоков уходят в индустрию, просветительскую деятельность, стартапы, зарубежные исследовательские организации и так далее. У многих есть коллеги, приехавшие из‑за рубежа или проведшие там некоторое время. Это все тоже прекрасно, но отличается от прежнего порядка и в социальном смысле более сложно устроено.
Читайте также
В начале 1960‑х некоторые аспекты биологии тоже обманчиво казались простыми. Уотсон и Крик совершили свое прорывное открытие структуры ДНК и ее роли в наследственности. По сегодняшним стандартам молекулярных механизмов, построенная ими модель проста. Гены продуцируют белки, а белки затем выполняют всевозможные функции организма. Раз-два — и вот у вас полный механизм. Он стал известен под названием «центральная догма». Информация перемещалась в одном направлении — от ДНК к белкам, которые затем давали команды организму. Сегодня уже, правда, существуют серьезные расхождения даже по поводу того, что именовать геном, и уж тем более по поводу того, сколько разных взаимодействий существует между молекулами, которые, как считается, составляют звенья некоей причинно-следственной цепи. Чтобы еще усложнить картину, добавим, что информация идет в обоих направлениях: то, что образуется, в свою очередь, влияет на то, как оно образуется. Молекулярные аспекты жизни отражают сложную систему, основанную на петлях обратной связи и множественных взаимодействиях, — в ней нет ничего линейного и простого.
На заре современной науки о мозге обсуждения велись в незатейливых терминах. Нейрон A посылал сигнал нейрону Б, а тот — нейрону В. Информация передавалась по цепочке и каким‑то образом постепенно трансформировалась из ощущений от сенсорных систем в действия, под влиянием внешних подкреплений. Сегодня столь упрощенное описание работы мозга выглядит смешным. Взаимодействия различных сетей мозга так же сложны, как и взаимодействия составляющих их молекул. Построение схемы их работы почти парализующе по своей сложности. Хорошо, что тогда мы этого не осознавали, а то бы никто не отважился взяться за эту работу.
Оглядываясь на те ранние годы, я думаю: исследованию расщепленного мозга на людях сыграло на руку, что его развивал наивнейший из исследователей — я. Я не знал ничего.
Я просто пытался понять проблему, используя собственный словарь и собственную простую логику. Это все, что у меня было помимо нескончаемой энергии. По иронии судьбы то же было верно и для Сперри, самого продвинутого специалиста по нейронауке своей эпохи. Он ранее никогда не работал с людьми в качестве испытуемых, так что мы пробивали путь вперед вместе.
В каком‑то смысле, конечно, мы все понимали, что пациенты с расщепленным мозгом — это пациенты с неврологическими расстройствами, а неврология была уже сформировавшейся областью с богатым словарем. Джо был нашим проводником по минному полю специальных терминов. Обследование пациента с инсультом или дегенеративным заболеванием было надежно отработано и точно описано. Богатая история первых неврологов принесла нам массу информации о том, какая часть мозга за какие когнитивные функции отвечает. Жившие в XIX веке гиганты профессии, Поль Брока и Джон Хьюлингс Джексон, и их коллеги из XX века, такие как нейрохирург Уайлдер Пенфилд и Норман Гешвинд, все сыграли важные роли в развитии медицинской точки зрения на устройство мозга.
Я все еще помню день, когда Джо приехал в Калтех из Мемориальной больницы Уайта, чтобы провести у нас в лаборатории семинар. Он описал наши первые результаты, используя классическую неврологическую терминологию. Хотя это не было абракадаброй, звучало это для меня именно так, и я помню, как сказал об этом Джо и Сперри. Джо был очень открытым и неизменно прогрессивным. Он просто сказал мне: «Хорошо, опиши лучше», и Сперри кивнул в знак согласия. В последующие годы мы это сделали, разработав в наших первых четырех статьях словарь научных терминов для описания происходящего с людьми, которым разделили половины мозга.
Разъяснение по CAP-теореме
Условности
Для начала, договоримся об уровне абстракций.
В рамках теоремы бессмысленно заявлять, что в «реальном мире» не может быть гарантированной связи между узлами распределенной системы. С тем же успехом можно сказать, что такое свойство как «availability» недостижимо в принципе, поскольку любая система перестанет быть доступной при отказе достаточного числа узлов (например, при отказе всех ее узлов).
Поэтому давайте условимся, что речь идет все-таки о модели и в ней сделаны некоторые допущения.
Мы будем считать, что вероятность отказа критического числа узлов системы пренебрежимо мала — это даст нам возможность говорить, что гарантировать availability все-таки можно.
Мы не будем рассматривать устройство узлов и характер связи между ними — для теоремы это неважно.
Технически, мы можем создать систему, в которой вероятность потери связи между узлами будет еще меньше, чем вероятность отказа критического числа узлов (которую мы считаем пренебрежимо малой). Благодаря этому мы можем говорить, что распределенная система с гарантированной связью между узлами (невозможностью partitioning’а) — возможна.
Как конкретно этого добиться — неважно. Возможно, понадобится миллионократное дублирование систем связи или изобретение сверхнадежного гравитонного передатчика, который на тучу порядков устойчивей к любым воздействиям, чем наши грубые кремниевые поделки. Факт, что это можно сделать, если кому-то правда приспичит. Делают же компьютеры, в которых 4 процессора считают одно и то же только чтобы перепроверить друг друга. С той же тщательностью можно подойти к гарантиям обеспечения связи.
Смерть милее
Важно понимать, что смерть узла системы и потеря с ним связи не эквивалентны.
Разница проста — умерший узел не может совершать действий, которые «по неведению» окажутся деструктивными по отношению к остальной системе. Всегда можно устроить так, чтобы он умирал навсегда, или приходя в себя первым делом консультировался с остальной системой, чтобы ненароком ничего не сломать.
При разрыве связи все печальнее. Узел не может позволить себе умереть, потому что возможно только он и обеспечивает работоспособность (без связи с другими узлами невозможно понять, есть ли еще кто-то живой). Не может он и синхронизировать свою работу с остальными — связи-то нет. Остается действовать вслепую, на свой страх и риск.
Рассмотрим происходящее на конкретном примере
Допустим, в нашей системе ровно 2 совершенно одинаковых узла — A и B. Каждый из них хранит копию данных второго и может независимо обрабатывать запросы извне. Каждый, обрабатывая запрос, уведомляет второго об изменениях, чтобы данные оставались согласованы.
Вариант 1: узел A умирает.
Система продолжает работать как ни в чем не бывало — B продолжает обрабатывать запросы. Когда A приведут в чувство, он первым делом синхронизируется с B и они вдвоем продолжат работать дальше. Ни доступность, ни согласованность не страдают.
Вариант 2: A и B живы, но связь между ними прервана.
При этом каждый из них продолжает принимать запросы извне, но не может уведомить второго об изменениях. Для каждого узла все выглядит так, будто второй узел умер и он действует в одиночку. Эту ситуацию часто называют «split-brain» — мозг разделился на два полушария, каждое из которых считает себя единственным хозяином ситуации. Система заболела шизофренией.
Если в этот момент на A был обработан запрос на удаление некой записи R, а на B был обработан запрос на модификацию той же самой записи, то данные стали несогласованы. Когда связь между A и B восстановится, при синхронизации всплывет конфликт — удалить R или оставить модифицированную версию? Тут можно выкручиваться разными стратегиями разрешения конфликтов, но consistency мы уже потеряли.
Альтернативный способ решения проблемы — A и B, видя, что потеряли связь друг с другом, перестают обрабатывать запросы. В этом случае согласованность не нарушится, но будет потеряна availability.
Ближе к реальности
Конечно, системы ровно из двух узлов встречаются нечасто. Но то же самое верно, если считать что A и B не два отдельных узла, а два набора узлов. При этом считаем, что общение между двумя любыми узлами в пределах A и в пределах B осталось возможным, но узлы из A не могут взаимодействовать с узлами из B. При этом оба набора продолжают получать и обрабатывать запросы извне.
По сути это описание типичной ситуации, когда прервалась связь между двумя датацентрами. Split-brain надежно обеспечивает системе шизофрению даже в таком простом случае. Если же сплитов несколько или в разных группах оказались доступны неполные наборы данных, все может оказаться еще хуже.
Возвращаясь к теореме
Теорема гласит, что CA достигается только потерей устойчивости к нарушению связи между узлами. На практике это означает, что CA-системы правильно использовать в случаях, когда мы считаем вероятность потери связи пренебрежимо малой.
Какими путями мы этого добиваемся — теореме пофиг. Не нужно призывать «реальный мир», чтобы показать, что чуваки чего-то не догоняли. Теорема существует в рамках модели. Как она верна сейчас, также она будет верна и послезавтра, когда наконец изобретут гравитонный передатчик.
Но даже без гравитонного передатчика не так все плохо. Потеря связи между датацентрами — явление не столь частое. В пределах одного датацентра — еще реже. Да, если сплит возникнет, придется решать конфликты. Возможно даже руками, хотя огромное число задач позволяет разрешить многие конфликты автоматически. Но, возможно, прелести CA-системы привлекут нас гораздо больше, чем отпугнет необходимость чинить что-то руками в случае маловероятного сплита. В этом случае мы с чистым сердцем будем считать вероятность возникновения проблем пренебрежимо малой, даже не опираясь на супертехнологии будущего.
Ну а если в своем проекте вы считаете вероятность сплита достаточно высокой, можно переформулировать теорему таким образом: при возниконовении сплита остается только выбирать — A или C.
Лирическое отступление
Существуют приемы, позволяющие смягчить CAP-теорему в разных частных случаях. Человеку не обязательно нужна система, работающая идеально. Часто хватает того, чтобы она работала достаточно хорошо, хотя бы в большинстве случаев.
Эти приемы включают как попытки автоматического восстановления целостности, после того как страшное случилось, так и попытки недопустить потери целостности, при этом не скатываясь в полный отказ от доступности.
Простейший пример: каждый узел автоматически прекращает обрабатывать запросы извне, если видит меньше чем половину остальных узлов. Это гарантирует, что если система разделится на две неравные части, то одна из них продолжит работу, а другая автоматически совершит харакири, чтобы не наделать глупостей.
Другое дело, что оставшись с половиной мощности, система скорее всего целиком ляжет под нагрузкой. Но можно применить еще одну хитрость — узлы, оставшиеся в изоляции, могут продолжить работать на чтение, не создавая конфликтов. Для систем с интенсивным чтением вполне оправданный ход. Правда, отдаваемые данные не всегда будут актуальны, но часто это лучше чем ничего. Однако при разделении на несколько частей, уже ни одна из них не сможет обрабатывать запросы на запись. Хотя можно придумать что-нибудь и похитрее…
Как ни изворачивайся, в целом CAP-теорему не обойти. Но в большинстве проектов есть огромные просторы для поисков способа выкрутиться, сводя вероятность проблемных сценариев к минимуму.
PS javaspecialist, спасибо за повод для написания этой статьи.
Мониторинг Elasticsearch через боль и страдания
Мы наконец допинали функционал мониторинга elasticsearch до публичного релиза. Суммарно мы переделывали его три раза, так как результат нас не устраивал и не показывал проблемы, которые мы огребали на нашем кластере ES.
Под катом история про наш production кластер, наши проблемы и наш новый мониторинг ES.
Супер краткий курс по эластику
Elasticsearch — это распределенный само-масштабирующийся RESTful сервис полнотекстового поиска, построенный на базе библиотеки Apache Lucene.
Внутри каждый шард — это индекс, но уже в Lucene’овских терминах, и он делится на сегменты.
Как мы используем ES
У всех метрик в okmeter.io есть метки, проще говоря, идентификатором метрики в нашей системе является словарь ключ-значение, например:
Каждый такой словарь-идентификатор метрики — это документ в ES. Например, чтобы построить такой график
мы ищем в ES по такому (очень упрощенно) запросу
он возвращает сколько-то id метрик, по которым мы достаем значения метрик из кассандры.
Статус кластера
Сам ES считает, что кластер может находиться в трех состояниях:
Основной график нашего стандартного дашборда по ES мы выбирали исходя из этих же состояний:
Расскажу про этот день. Накануне мы добавили более мощные серверы в кластер, а теперь нужно было убрать две старые ноды. Приблизительно в 14:00 мне пришла в голову идея, а не провести ли учения? Обсудили и решили, что можно поэкспериментировать — выключить одну ноду и посмотреть, как такой эластичный эластик это отработает.
Выключили, и тут же заорал мониторинг, что на коллекторе метрик проблемы. Why??
Вернули ноду, подождали немного, всё наладилось. Странно, ну не может же быть такого, чтобы из-за выключения одного из нескольких эластиков мы прилегли. Наверное, что-то другое.
Выключили ноду опять где-то в 14:30 — опять алерты. Хмммм. Учения показали, что падение одного эластика делает нам больно — тоже результат, но нужно разбираться.
Сделали своего рода decommission — аккуратно вывели ноды по одной из кластера. Синее на графике в 15:10 — это оно, шарды перемещались на другие ноды. Обошлось без проблем.
Присмотрелись к количеству шардов: 140 — странно, number_of_shards у нас 20, number_of_replicas — 2, и еще одна мастер копия, т.е. должно быть 60 шардов на индекс. Индексов 3 — свой на каждый месяц, значит должно быть всего 180 шардов. Оказалось, что декабрьский индекс создался с number_of_replicas — 0, т.е. без реплик, поэтому выключение любой ноды полностью ломает работу с этим индексом!
Хорошо, что отсутствие реплик обнаружилось в контролируемом эксперименте. Если бы мы это не заметили, могли огрести большие проблемы в будущем — пришлось бы аврально делать полную переиндексацию по данным из основного хранилища.
Чтобы увидеть эту проблему в будущем, мы сделали автоматический триггер, который сообщит, если в каком-то индексе 0 реплик. Этот триггер выпустили в виде авто-триггера для всех клиентов сразу, мы же сервис мониторинга 🙂
Split brain
Самая пугающая и известная проблема с эластиком — это split brain, когда из-за проблем со связностью нод по сети, или если нода не отвечала долго (потому что застряла в GC например), в кластере может появиться вторая мастер-нода.
В этом случае получается как бы две версии индекса, какие-то документы попадают на индексацию в одну часть кластера, другие — в другую. Неконсистентность будет проявляться при поиске — на один и тот же запрос будут выдаваться разные результаты. Восстановление индекса в таком случае будет сложной задачей, скорее всего, потребуется либо полная переиндексация, либо восстановление из бэкапа и с последующей доливкой изменений до текущего момента.
В ES есть механизм защиты от сплит-брейна, самая важная настройка — minimum_master_nodes, но по-умолчанию discovery.zen.minimum_master_nodes: 1, т.е. никакой защиты нет.
Мы воспроизводили это на тестовом кластере ElasticSearch и по результатам сделали два авто-триггера: один сработает, если увидит более одной мастер ноды в кластере, второй предупредит, если значение параметра discovery.zen.minimum_master_nodes меньше, чем рекомендованное — кворум (N/2+1) от текущего размера кластера. Это нужно именно мониторить, потому что вы можете решить добавить нод и забыть подправить minimum_master_nodes.
Мониторинг запросов в elastic
C состоянием кластера вроде разобрались, дальше нужно понимать, сколько каких запросов обрабатывает кластер и как быстро они отрабатывают.
Любой поиск по нашему ES мы делаем сразу по трем индексам, каждый из которых поделен на 20 шардов. Из-за этого изначальные
250 запросов в секунду на поиск от нашего кода для ES превращаются в
Запросов на идексацию на самом деле у нас около 200 в секунду, но так как каждый шард хранится в трех копиях (основная + 2 реплики), то ES видит
По временам запросов ES дает достаточно скудную статистику: есть счетчик обработанных запросов и есть кумулятивная сумма времен запросов по типам. Таким образом, мы можем посчитать только среднее время ответа по каждому типу запросов, получаем график такого вида (мы вычисляем среднее прямо при отрисовке графика, так как сумма времен ответов тоже интересная метрика сама по себе):
Оранжевая линия — это поиск. Видно, что в какой-то момент он ускорился приблизительно в 3 раза.
Это мы всего лишь сделали force merge сегментов. У нас индекс порезан помесячно. Индексируется всегда (почти) в текущий месяц, ищется по трём. Так как из индексов за предыдущие месяцы идет только чтение, мы можем сделать на них force merge сегментов прямо под нагрузкой:
В итоге осталось по одному сегменту в каждом шарде, поиск по этим индексам стал заметно быстрее. Возможно, нам стоит сделать крон, который будет делать force merge индекса за прошедший месяц.
Background ops графики
Кроме того, мы отдельно вывели «background» операции — это то, что эластик делает в фоне сам или по запросу как с force merge. Отдельно, потому что логичнее видеть «пользовательские» запросы отдельно от «системных»: у них и совсем разные тайминги — секунды вместо милисекунд, поэтому на одном графике будет неудобно смотреть. И количество таких операций бывает очень маленьким и может теряться на фоне всех пользовательских реквестов.
Этот график показывает тот самый merge, который снизил нам время ответа поиска, но в этот раз удобнее смотреть на сумму времен ответа ES (мы как бы смотрим, на что в целом тратились вычислительные ресурсы кластера):
С точки зрения системных метрик линукса, этот merge выглядел как активная запись на диск процессом ES:
Для обеспечения скорости выполнения запросов в эластике есть кэши:
Подробнее что кешируется, когда кешируется, когда инвалидируется, как тюнить, лучше читать в документации.
Наш мониторинговый агент снимет для каждого из этих кэшей: размер, хиты, миссы, эвикшены (вытестения).
Вот, например, был случай — эластики у нас упали по OutOfMemory. По логам разобраться сложно, но потом, когда уже подняли, заметили на графике резкий рост использования памяти fielddata кэшем:
Вообще-то мы не используем агрегации elasticsearch, мы вообще используем только самый базовый функционал. Нам нужно без скоринга найти все документы, в которых у заданных полей заданные значения. Почему же так выросло использование fielddata кэша?
Оказалось, что это был тоже контролируемый эксперимент 🙂 Вручную curl’ом дёргали тяжелые запросы на агрегацию, и от этого всё попадало. По идее от этого можно было защититься правильной настройкой лимитов памяти для fielddata. Но или они не сработали, или баги эластика (мы тогда сидели на старой версии 1.7).
Системные метрики
В дополнении к внутренним метрикам эластика, стоит смотреть на него сверху, как на процесс в операционной системе. Сколько он потребляет процессорного времени, сколько памяти, сколько создает нагрузки на диск.
Когда мы затевали обновление ES с версии 1.7.5, то решили обновиться сразу на 2.4 (последнюю, пятёрку, пока побаиваемся). Мажорное обновление elastic по стандартной процедуре нам делать как-то стрёмно, мы обычно поднимаем второй кластер и делаем синхронную копию через наш код — он умеет индексировать в несколько кластеров сразу.
При включении нового кластера в индексацию, обнаружилось, что новый ES пишет на диск
350 раз в секунду, в то время как старый всего
es101 — это нода из старого кластера, а es106 — из нового. Плюс на новые ноды не стали ставить SSD (посчитали, что всё влезет в память), поэтому такое io уронило производительность очень сильно.
Пошли перечитывать все новинки версии 2 эластика и нашли index.translog.durability. Он по умолчанию стал request, при таком значении translog синкается на диск после каждого запроса на индексацию. Поменяли на async со стандартныйм sync_interval в 5 секунд и стало почти как раньше.
Помимо системных метрик для ES полезно смотреть за метриками JVM — gc, memory пулы и прочее. Наш агент автоматически подцепит всё это через jmx, и так же автоматически появятся графики.
Автоматическое обнаружение ES
Не так давно мы уже рассказывали, что очень много сил тратим на то, чтобы все сервисы на серверах наших клиентов включались в мониторинг автоматом, без настройки. Такой подход позволяет ничего не забыть замониторить и сильно ускоряет внедрение.
Автодетект для ES устроен примерно так:
Дальше дело техники — периодически снимаем метрики по стандартному API и отправляем их в облако.
Вместо заключения
Мы всегда стараемся исходить из реальных use case’ов. Чтобы запилить мониторинг какого-то сервиса, нам приходится досконально с ним разбираться, понимать, что и как там может сломаться. Поэтому в первую очередь мы делали поддержку тех сервисов, которые хорошо умеем готовить и которыми пользуемся сами.
Кроме того, очень помогают клиенты, которые рассказывают про свои проблемы. Мы постоянно дорабатываем дашборды/автотриггеры, чтобы в итоге показывать не какие-то графики, а сразу причины проблем.
Если у вас есть ES, который ждет, чтобы его замониторили, наш бесплатный 2х недельный триал — то, что вам нужно, ссылка на сайт чуть ниже 🙂