Hoe om op te hou om bekommerd te wees en sonder 'n monoliet te begin leef

Hoe om op te hou om bekommerd te wees en sonder 'n monoliet te begin leef

Все мы любим истории. Нам нравится, сидя у костра, рассказывать о своих былых победах, сражениях или просто о своем опыте работы.

Сегодня как раз такой день. И пусть вы сейчас не у костра, но зато у нас есть история для вас. История о том, как мы начали работать с хранилищем на Tarantool.

Когда-то давным-давно в нашей компании была пара «монолитов» и один на всех «потолок», к которому эти монолиты медленно, но верно приближались, ограничивая полет нашей компании, наше развитие. И было однозначное понимание: однажды мы жестко упремся в этот потолок.

Это сейчас у нас господствует идеология разделения всего и вся, начиная от оборудования и заканчивая бизнес-логикой. Вследствие этого у нас, к примеру, есть два ДЦ, практически независимых на сетевом уровне. А тогда всё было совсем по-другому.

На сегодняшний день для внесения изменений есть куча инструментов и средств в виде CI/CD, K8S и т.п. В «монолитное» же время нам не требовалось так много всяких иностранных слов. Достаточно было просто поправить «хранимочку» в базе.

Maar die tyd het vorentoe beweeg, en die aantal versoeke het saam met dit vorentoe beweeg, en soms het RPS bo ons vermoëns geskiet. Met die toetrede van die GOS-lande tot die mark, het die las op die databasisverwerker van die eerste monoliet nie onder 90% gedaal nie, en RPS het op die vlak van 2400 gebly. En dit was nie net klein keurders nie, maar stewige navrae met 'n klomp tjeks en JOINs wat byna vir die helfte van die data kan loop teen die agtergrond van groot IO.

Когда же на сцене начали появляться полноценные распродажи на «Черную пятницу», — а Wildberries начал проводить их одним из первых в России, — то ситуация стала совсем печальной. Ведь нагрузка в такие дни возрастает в три раза.
Ох уж, эти «монолитные времена»! Уверен, что и вы сталкивались с подобным, и до сих пор не можете понять, как такое могло произойти с вами.

Что тут поделаешь — мода присуща и технологиям. Еще лет 5 тому назад нам пришлось переосмыслить одну из таких мод в виде имеющегося сайта на .NET и MS SQL-сервера, который бережно хранил в себе всю логику работы самого сайта. Хранил настолько бережно, что распиливать такой монолит оказалось долгим и совсем непростым удовольствием.
'n Klein afwyking.

На различного рода мероприятиях я говорю: «если вы не распиливали монолит, значит вы не росли!» Интересно ваше мнение по этому поводу, напишите его, пожалуйста, в комментариях.

'n Geluid van donderweer

Kom ons keer terug na ons “bonfire”. Om die vrag "monolitiese" funksionaliteit te versprei, het ons besluit om die stelsel in mikrodienste te verdeel wat op oopbrontegnologieë gebaseer is. Omdat hulle ten minste goedkoper is om te skaal. En ons het 100% begrip gehad dat ons sou moes skaal (en baie). Dit was immers reeds in daardie tyd moontlik om die markte van buurlande te betree, en die aantal registrasies, sowel as die aantal bestellings, het selfs sterker begin groei.

Nadat ons die eerste kandidate vir die afwyking van die monoliet na mikrodienste ontleed het, het ons besef dat 80% van die skrif daarin afkomstig is van agterkantoorstelsels en lees vanaf die voorkantoor. Eerstens het dit betrekking op 'n paar belangrike substelsels vir ons - gebruikersdata en 'n stelsel vir die berekening van die finale koste van goedere gebaseer op inligting oor bykomende klantafslag en koepons.

Ingekeep. Nou is dit skrikwekkend om te dink, maar benewens bogenoemde substelsels is produkkatalogusse, 'n gebruikersinkopiemandjie, 'n produksoekstelsel, 'n filterstelsel vir produkkatalogusse en verskeie soorte aanbevelingstelsels ook uit ons monoliet verwyder. Vir die werking van elkeen van hulle is daar afsonderlike klasse van nougepasmaakte stelsels, maar eens op 'n tyd het hulle almal in een "huis" gewoon.

Выносить данные о наших клиентах сразу запланировали на шардированную систему. Вынос же функционала по расчету конечной стоимости товаров требовал хорошей масштабируемости по чтению, ибо та создавала наибольшую нагрузку по RPS и была самой сложной в исполнении для базы (очень много данных вовлечены в процесс вычислений).

Gevolglik het ons met 'n skema vorendag gekom wat goed by Tarantool pas.

В то время для работы микросервисов были выбраны схемы работы с несколькими ЦОДами на виртуальных и аппаратных машинах. Как показано на рисунках, были применены варианты репликаций Tarantool как в режиме master-master, так и master-slave.

Hoe om op te hou om bekommerd te wees en sonder 'n monoliet te begin leef
Argitektuur. Opsie 1. Gebruikersdiens

На текущий момент времени это 24 шарда, в каждом из которых по 2 инстанса (по одному на каждый ДЦ), все в режиме мастер-мастер.

Op die top van die databasis is toepassings wat toegang verkry tot databasis replikas. Toepassings werk met Tarantool deur ons pasgemaakte biblioteek, wat die Tarantool Go-bestuurderkoppelvlak implementeer. Sy sien al die replikas en kan saam met die meester werk om te lees en skryf. In wese implementeer dit die replika-stelmodel, wat logika byvoeg vir die kies van replikas, die uitvoering van herprobasies, 'n stroombreker en 'n tempolimiet.

При этом имеется возможность конфигурировать политику выбора реплики в разрезе шарды. К примеру, раундробином.

Hoe om op te hou om bekommerd te wees en sonder 'n monoliet te begin leef
Архитектура. Вариант 2. Сервис расчета конечной стоимости товара

Несколько месяцев назад большая часть запросов по расчету конечной стоимости товаров ушла на новый сервис, который в принципе работает без баз данных, но какое-то время назад все 100% обрабатывал сервис с Tarantool под капотом.

Бд сервиса это 4 мастера, в которые синхронизатор собирает данные, и каждый из этих мастеров по репликации раздает данные на readonly-реплики. У каждого мастера примерно по 15 таких реплик.

Что в первой, что во второй схеме, при недоступности одного ДЦ, приложение может получать данные во втором.

Стоит отметить, что в Tarantool репликация довольно гибкая и конфигурируется в runtime. В иных системах бывало возникали сложности. К примеру с изменением параметров max_wal_senders и max_replication_slots в PostgreSQL требуется перезапуск мастера, что в ряде случаев может повлечь за собой разрыв соединений между приложением и СУБД.

Soek en jy sal vind!

Почему мы не сделали «как нормальные люди», а выбрали нетипичный способ? Смотря что считать нормальным. Многие вообще делают кластер из Mongo и размазывают его по трём гео-распределенным ДЦ.

Op daardie stadium het ons reeds twee Redis-projekte gehad. Die eerste was 'n kas, en die tweede was 'n aanhoudende berging vir nie te kritieke data nie. Dit was nogal moeilik met hom, deels deur ons skuld. Soms was nogal groot volumes in die sleutel, en van tyd tot tyd het die terrein onwel geraak. Ons het hierdie stelsel in die meester-slaaf weergawe gebruik. En daar was baie gevalle waar iets met die meester gebeur het en replikasie onklaar geraak het.

То есть Redis хорош для stateless-задач, а не для stateful. В принципе, он позволял решить большинство задач, но только если это были key-value-решения с парой индексов. Но у Redis на тот момент было довольно печально с персистентностью и репликацией. К тому же, были нарекания на производительность.

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

Uiteindelik het ons op Tarantool gevestig.

Ons het daarna gedraai toe dit in weergawe 1.6 was. Ons was daarin geïnteresseerd deur die simbiose van sleutel-waarde en die funksionaliteit van 'n relasionele databasis. Daar is sekondêre indekse, transaksies en spasies, dit is soos tabelle, maar nie eenvoudig nie, jy kan verskillende getalle kolomme daarin stoor. Maar die moordende kenmerk van Tarantool was sekondêre indekse gekombineer met sleutelwaarde en transaksionaliteit.

Также свою роль сыграло отзывчивое русскоязычное сообщество, готовое в чате прийти на помощь. Мы этим активно пользовались и прямо жили в чате. И не стоит забывать о приличном persistent без явных ляпов и косяков. Если посмотреть нашу историю с Tarantool, у нас было много болей и факапов с репликацией, но мы ни разу не потеряли данные по его вине!

Implementering het moeilik begin

Op daardie tydstip was ons hoofontwikkelingstapel .NET, waaraan daar geen verbinding vir Tarantool was nie. Ons het dadelik iets in Go begin doen. Dit het ook goed gewerk met Lua. Die grootste probleem op daardie tydstip was met ontfouting: in .NET is alles goed hiermee, maar daarna was dit moeilik om in die wêreld van ingebedde Lua in te duik, wanneer jy geen ontfouting het nie, behalwe logs. Boonop het replikasie om een ​​of ander rede periodiek uitmekaar geval, so ek moes in die struktuur van die Tarantool-enjin delf. Die klets het hiermee gehelp, en in 'n mindere mate die dokumentasie; soms het ons na die kode gekyk. Op daardie stadium was die dokumentasie so-so.

So, in die loop van 'n paar maande, het ek daarin geslaag om my kop rond te kry en ordentlike resultate te kry deur met Tarantool te werk. Ons het verwysingsontwikkelings in git saamgestel wat gehelp het met die vorming van nuwe mikrodienste. Byvoorbeeld, wanneer 'n taak ontstaan ​​het: om 'n ander mikrodiens te skep, het die ontwikkelaar na die bronkode van die verwysingsoplossing in die bewaarplek gekyk, en dit het nie meer as 'n week geneem om 'n nuwe een te skep nie.

Это были особенные времена. Условно, тогда можно было подойти к админу за соседним столом и попросить: «Дай мне виртуалку». Минут через тридцать машина была уже у тебя. Ты сам подключался, всё устанавливал, и тебе заводили на нее трафик.

Сегодня так уже не получится: надо накрутить на сервис мониторинг, журналирование, покрыть тестами функциональность, заказать виртуалку или поставку в Кубер и т.д. В целом, так будет лучше, хотя дольше и хлопотней.

Verdeel en heers. Wat is die saak met Lua?

Была серьезная дилемма: у некоторых команд не получалось надежно выкатывать изменения в сервисе с большим количеством логики на Lua. Зачастую это сопровождалось неработоспособностью сервиса.

Dit wil sê, die ontwikkelaars berei 'n soort verandering voor. Tarantool begin die migrasie doen, maar die replika is steeds met die ou kode; Sommige DDL of iets anders kom daar aan deur replikasie, en die kode val eenvoudig uitmekaar omdat dit nie in ag geneem word nie. As gevolg hiervan is die opdateringsprosedure vir die administrateurs op A4-vel uiteengesit: stop replikasie, werk dit op, skakel replikasie aan, skakel hier af, werk daar op. Nagmerrie!

В итоге, сейчас мы чаще всего пытаемся на Lua ничего не делать. Просто с помощью iproto (бинарный протокол для взаимодействия с сервером), и всё. Возможно, это недостаток знаний у разработчиков, но с этой точки зрения система сложная.

Мы не всегда слепо следуем этому сценарию. Сегодня у нас нет черного и белого: либо всё на Lua, либо всё на Go. Мы уже понимаем, как можно скомбинировать, чтобы потом не получить проблемы с миграцией.

Waar is Tarantool nou?
Tarantool word in die diens gebruik vir die berekening van die finale koste van goedere met inagneming van afslagkoepons, ook bekend as "Promotor". Soos ek vroeër gesê het, tree hy nou af: hy word vervang deur 'n nuwe katalogusdiens met vooraf berekende pryse, maar ses maande gelede is alle berekeninge in Promotizer gemaak. Voorheen was die helfte van sy logika in Lua geskryf. Twee jaar gelede is die diens in 'n bergingsfasiliteit omskep, en die logika is in Go herskryf, want die meganika van afslag het 'n bietjie verander en die diens het nie werkverrigting nie.

Один из самых критичных сервисов — это профиль пользователя. То есть все пользователи Wildberries хранятся в Tarantool, а их около 50 млн. Шардированная по ID пользователя система, разнесенная по нескольким ДЦ с обвязкой на Go-сервисах.
Volgens RPS was Promoter eens die leier en het 6 duisend versoeke bereik. Op 'n stadium het ons 50-60 kopieë gehad. Nou is die leier in RPS gebruikersprofiele, ongeveer 12 duisend. Hierdie diens maak gebruik van pasgemaakte sharding, gedeel deur reekse gebruikers-ID's. Die diens bedien meer as 20 masjiene, maar dit is te veel; ons beplan om die toegewese hulpbronne te verminder, want die kapasiteit van 4-5 masjiene is genoeg daarvoor.

Сервис сессий — это наш первый сервис на vshard и Cartridge. Настройка vshard и обновление Cartridge потребовали от нас определенных трудозатрат, но в итоге все получилось.

Сервис для отображения разных баннеров на сайте и в мобильном приложении был одним из первых, выпущенных сразу на Tarantool. Этот сервис примечателен тем, что ему лет 6-7, он до сих пор в строю и ни разу не перезагружался. Применялась репликация master-master. Никогда ничего не ломалось.

Есть пример использования Tarantool для функциональности быстрых справочников в складской системе, чтобы быстро перепроверять информацию в некоторых случаях. Пробовали использовать под это дело Redis, но данные в памяти занимали больше места, чем у Tarantool.

Сервисы листа ожидания, клиентских подписок, модных ныне сторис и отложенных товаров также работают с Tarantool. Последний сервис в памяти занимает около 120 ГБ. Это самый объемный сервис из вышеперечисленных.

Gevolgtrekking

Danksy sekondêre indekse gekombineer met sleutelwaarde en transaksionaliteit, is Tarantool goed geskik vir mikrodienste-gebaseerde argitekture. Ons het egter probleme ondervind met die uitrol van veranderinge aan dienste met baie logika in Lua - die dienste het dikwels opgehou werk. Ons kon dit nie oorkom nie, en mettertyd het ons tot verskillende kombinasies van Lua en Go gekom: ons weet waar om een ​​taal te gebruik en waar om 'n ander te gebruik.

Wat anders om te lees oor die onderwerp

Bron: will.com

Voeg 'n opmerking