Pull to refresh
513
0
Слава Вишняков @yoihj

Нагруженные бэкэнды

Send message
Добавил сравнение в конец статьи.
Все верно. Для моего случая это скорее недостаток, для кого-то, вероятно, — критично.
Я тут без понятия — я просто знал что для Go есть несколько KV хранилищ, взял первые два попавшиеся ради интереса :) Никогда не эксплуатировал ее. Насколько я понимаю, авторы (Facebook) рекомендуют все же идти дальше и пользовать RocksDB (который у меня просто не скомпилировался в виде embedded, только в виде shared библиотеки, что не очень мне понравилось, поэтому открыл им issue и оставил за рамками статьи)

Думаю гугление на тему backup leveldb должно раскрыть тайну :)
На один комментарий ниже отписался. https://habrahabr.ru/post/282299/#comment_8867187
Собственно, меня от этого остановило то, что хотелось попробовать именно «сервер БД прямо рядом с кодом» — как это и сделано в tarantool.
Ну ок, у всех сейчас многоядерные сервера и машины и как бы в один поток ограничивать go — смысла большого нет, ибо на бою хочется именно использовать по-максимуму ресурсы системы, и вот тут вопрос.

А как использовать все ядра-то на Tarantool? Т.е. я так понял что для этого надо запускать несколько tarantool и включать на них master-master репликацию и потенциально связываться с конфликтами записи? Master-slave я так понимаю не решит тут, если речь идет о равном количестве записей и чтений (т.е. условно write-bound нагрузка)
> Обновление кода без перезагрузки сервера

Чуть ошибся. Имел в виду, что возможно это делать «без потери запросов», а не без перезагрузки :) Пардон.
С таким подходом вообще ничего в мире сравнивать нельзя. Как пример: MySQL это база со многими engine, а Redis это key-value кэш с другими характеристиками. Но неужели это автоматически обозначает что я не могу одну и ту же задачу решить на MySQL и на Redis? В одном случае мне одни плюшки предоставит система, а другие придется делать руками, в другом — другие предоставит другая система, а в первой их придется делать руками.

Тот же случай и тут. Я взял общий делитель — операцию которую можно сделать в обоих случаях. И сравнил ее по скорости. В чем проблема?
Отличные комментарии. Пару вещей хотелось бы правда, уточнить:

> 1. Обновление кода без перезагрузки сервера

Это я показал уже в статье после комментария — это более чем возможно.

> 2. Хранимые процедуры

Собственно говоря, Golang это и есть в данном случае «хранимая процедура». Просто склейка получается в другом направлении — к языку мы приклеиваем базу (golang + leveldb/rocksdb), а не к базе приклеиваем язык (tarantool.box + lua), но результат-то тот же получается — быстрый язык рядом с базой.

> 3. Репликация master-slave и master-master

Это абсолютно верно и это я и указал в статье — репликация, пока что, это важное достоинство, что есть у Tarantool. Хотя master-master я что-то не нашел (плохо искал?) А вот master-slave меня напугал когда прочитал что-то в духе, что изменение одних и тех же данных на двух разных slave полностью останавливают базу и требуется вмешательство админов… Вот тут у меня наступил некий ступор с тем как Mail.Ru справляется с этим на огромных объемах.

> 4. Другие СУБД-фишки (транзакции, например)

LevelDB, вроде, не поддерживает (не специалист тут, к сожлению), но вот RocksDB (следующее поколение от LevelDB) уже поддерживает.

Еще, к списку я бы добавил secondary index — это действительно тоже сильная сторона Tarantool.

> Кроме того, очевидно, что выставлять http-сервер на go в интернет плохо

Моя задача на самом деле не написание серверов для интернета, а бэкэндовых серверов для внутреннего потребления. Но я не скажу что выставлять go http это плохо или прямо драматично хуже чем nginx. Да, мы используем nginx почти везде и его преимущества очевидны, но, не все описанное Вами верно. Некоторые из них:

> делать различные административные действия (типа как rewrite и прочие)

Собственно, через gorilla/mux это решается примитивнейше в go.

> хорошо обрабатывать медленных клиентов

Golang с этим справляется ничуть не хуже nginx, в общем-то. Такие же мультиплексированные потоки на несколько тредов + асинхронная обработка.

> надо отдавать статику в конце концов

Тоже, в общем-то, достойно работает в Go.

Я не говорю что nginx это плохо, опять же — мы его используем почти везде, но я бы не был так категоричен с «выставлять http-сервер на go в интернет плохо».

> мы это обязательно протестируем, используя ваши тесты и выложим результаты.

Будет очень интересно прочитать. Я, если честно, вообще удивился что тестирования golang+X vs tarantool не нашел сходу.

> А в случае go + leveldb что делать?

Не очень понятна сложность, это вроде стандартный nginx upstream + proxy_next_upstream умеют делать?

> Будем улучшать! :)

:thumbs_up:

Ну и как бы мое мнение не является тут окончальным для всех — всегда нужен контекст. Наш контекст что у нас уже есть специалисты на Go + много кода и если бы вдруг Tarantool показал бы результаты там в 10 раз лучше — ну тогда бы имело смысл, конечно. А так переход не имеет большого смысла.
> Обновлять код без перезагрузки сервера можно в Erlang ;)

Ну я абсолютно лично за то, чтобы это было во всех языках :)
Все верно, как и сказано — сугубо ненаучно :) Моя задача была понять для себя — есть ли в Tarantool такое огромное преимущство, что стоит отказаться от Golang или использовать рядом с ним. Для этого вполне достаточно на одной машине сравнить — ведь нагружающий `wrk` одинаковое количество ресурсов скушает, так что отличие по производительности будет зависеть только от тестируемой стороны. Какая быстрее — та и быстрее :)
Добавил в конец статьи пример замены кода.
Верная мысль, в теории можно попробовать RocksDB или какие-то другие которые более хорошо умеют с lockами работать. Там в принципе, лок-то нужен только на время рестарта.
Можно подробнее? Что имеется в виду под «отдельные ноды»? Ноды серверов? И что именно в нотации JSON нужно?
Я, кстати, вот про это атомарное обновление не нашел, хороший момент. С другой стороны — раз уж мы говорим про http — то есть https://github.com/fvbock/endless который как раз и делает атомарное обновление — им мы на работе и пользуемся чтобы там, имея тысячи запросов в секунду к бэкэнду — без потерь запросов обновлять код.
Не совсем, leveldb встроен как библиотека и по сути хранит все в файле. Т.е. перезапускается все.
> От игр и 3d веб сайтов на мультитач-устройства, до embeded систем на микроконтроллеры.

«Вакансия: водитель.Требования: профессиональные навыки в управлении легковыми и грузовыми автомобилями, троллейбусами, трамваями, поездами метрополитена и фуникулёра, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимися на вооружении стран СНГ и НАТО. Навыки раллийного и экстремального вождения обязательны… „

далее тут
пардон, «интереса»
Чисто ради интересна — и как же это на PHP можно оптимизировать кэш L1/L2?

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity