Ynglŷn â symud o Redis i Redis-clwstwr

Ynglŷn â symud o Redis i Redis-clwstwr

Приходя в продукт, который развивается больше десятка лет, совершенно не удивительно встретить в нем устаревшие технологии. Но что если через полгода вы должны держать нагрузку в 10 раз выше, а цена падений увеличится в сотни раз? В этом случае вам необходим крутой Highload Engineer. Но за неимением горничной такового, решать проблему доверили мне. В первой части статьи я расскажу, как мы переезжали с Redis на Redis-cluster, а во второй части дам советы, как начать пользоваться кластером и на что обратить внимание при эксплуатации.

Dewis technoleg

Так ли плох отдельный Redis (standalone redis) в конфигурации 1 мастер и N слейвов? Почему я называю его устаревшей технологией?

Na, nid yw Redis mor ddrwg â hynny... Fodd bynnag, mae rhai diffygion na ellir eu hanwybyddu.

  • Yn gyntaf, nid yw Redis yn cefnogi mecanweithiau adfer ar ôl trychineb ar ôl methiant meistr. I ddatrys y broblem hon, gwnaethom ddefnyddio cyfluniad gyda throsglwyddo VIPs yn awtomatig i feistr newydd, gan newid rôl un o'r caethweision a newid y gweddill. Gweithiodd y mecanwaith hwn, ond ni ellid ei alw'n ateb dibynadwy. Yn gyntaf, digwyddodd larymau ffug, ac yn ail, roedd yn un tafladwy, ac ar ôl llawdriniaeth roedd angen camau gweithredu â llaw i godi tâl ar y gwanwyn.

  • Во-вторых, наличие только одного мастера приводило к проблеме шардирования. Приходилось создавать несколько независимых кластеров «1 мастер и N слейвов», затем вручную разносить базы по этим машинам и надеяться, что завтра одна из баз не распухнет настолько, что её придется выносить на отдельный инстанс.

Beth yw'r opsiynau?

  • Yr ateb drutaf a chyfoethocaf yw Redis-Enterprise. Mae hwn yn ddatrysiad mewn bocsys gyda chefnogaeth dechnegol lawn. Er gwaethaf y ffaith ei fod yn edrych yn ddelfrydol o safbwynt technegol, nid oedd yn addas i ni am resymau ideolegol.
  • Reddis-clwstwr. Allan o'r bocs mae cefnogaeth i feistroli methu a rhannu. Nid yw'r rhyngwyneb bron yn wahanol i'r fersiwn arferol. Mae'n edrych yn addawol, byddwn yn siarad am y peryglon yn nes ymlaen.
  • Tarantool, Memcache, Aerospike ac eraill. Mae'r holl offer hyn yn gwneud yr un peth fwy neu lai. Ond mae gan bob un ei ddiffygion ei hun. Fe benderfynon ni beidio â rhoi ein wyau i gyd mewn un fasged. Rydym yn defnyddio Memcache a Tarantool ar gyfer tasgau eraill, ac, wrth edrych ymlaen, byddaf yn dweud bod mwy o broblemau gyda nhw yn ein harfer.

Специфика использования

Давайте взглянем, какие задачи мы исторически решали Redis’ом и какую функциональность использовали:

  • Cache cyn ceisiadau i wasanaethau o bell fel 2GIS | Golang

    GET SET MGET MSET "SELECT DB"

  • Кеш перед MYSQL | PHP

    GET SET MGET MSET SCAN "KEY BY PATTERN" "SELECT DB"

  • Y prif storfa ar gyfer y gwasanaeth o weithio gyda sesiynau a chyfesurynnau gyrrwr | Golang

    GET SET MGET MSET "SELECT DB" "ADD GEO KEY" "GET GEO KEY" SCAN

Fel y gwelwch, dim mathemateg uwch. Beth felly yw'r anhawster? Edrychwn ar bob dull ar wahân.

Dull
Disgrifiad
Особенности Redis-cluster
penderfyniad

GOSOD
Записать/прочитать ключ

MGET MSET
Записать/прочитать несколько ключей
Ключи будут лежать на разных нодах. Готовые библиотеки умеют делать Multi-операции только в рамках одной ноды
Заменить MGET на pipeline из N GET операций

SELECT DB
Dewiswch y sylfaen y byddwn yn gweithio gyda hi
Nid yw'n cefnogi cronfeydd data lluosog
Складывать всё в одну базу. Добавить к ключам префиксы

SCAN
Ewch drwy'r holl allweddi yn y gronfa ddata
Gan fod gennym un gronfa ddata, mae mynd trwy'r holl allweddi yn y clwstwr yn rhy ddrud
Cynnal amrywiad o fewn un cywair a gwneud HSCAN ar yr allwedd hon. Neu gwrthod yn llwyr

GEO
Gweithrediadau gyda geokey
Nid yw'r geokey wedi'i ddarnio

KEY BY PATTERN
Поиск ключа по паттерну
Поскольку у нас одна база, будем искать по всем ключам в кластере. Слишком затратно
Отказаться или поддерживать инвариант, как и в случае со SCAN-ом

Redis vs Redis-cluster

Beth ydyn ni'n ei golli a beth ydyn ni'n ei ennill wrth newid i glwstwr?

  • Недостатки: теряем функциональность нескольких баз.
    • Если мы хотим хранить в одном кластере логически не связанные данные, придется делать костыли в виде префиксов.
    • Теряем все операции «по базе», такие как SCAN, DBSIZE, CLEAR DB и т.п.
    • Mae aml-lawdriniaethau wedi dod yn llawer anoddach i'w gweithredu oherwydd efallai y bydd angen mynediad i sawl nod.
  • Byd Gwaith:
    • Goddefgarwch nam ar ffurf methiant meistr.
    • Шардирования на стороне Redis.
    • Перенос данных между нодами атомарно и без простоев.
    • Добавление и перераспределение мощностей и нагрузок без простоев.

Byddwn yn dod i’r casgliad, os nad oes angen ichi ddarparu lefel uchel o oddefiad o fai, yna nid yw symud i glwstwr yn werth chweil, oherwydd gall fod yn dasg nad yw’n ddibwys. Ond os dewiswch rhwng fersiwn ar wahân a fersiwn clwstwr i ddechrau, yna dylech ddewis clwstwr, gan nad yw'n waeth ac, yn ogystal, bydd yn eich rhyddhau o rai o'r cur pen.

Paratoi i symud

Начнем с требований к переезду:

  • Он должен быть бесшовным. Полная остановка сервиса на 5 минут нас не устраивает.
  • Dylai fod mor ddiogel a graddol â phosibl. Rwyf am gael rhywfaint o reolaeth dros y sefyllfa. Nid ydym am adael popeth ar unwaith a gweddïo dros y botwm dychwelyd.
  • Ychydig iawn o golli data wrth symud. Rydym yn deall y bydd yn anodd iawn symud yn atomig, felly rydym yn caniatáu rhywfaint o ddadgydamseru rhwng data mewn Redis rheolaidd a chlystyrog.

Cynnal a chadw clwstwr

Ychydig cyn symud, dylem feddwl a allwn gefnogi’r clwstwr:

  • Siartiau. Rydym yn defnyddio Prometheus a Grafana i graffio llwyth CPU, defnydd cof, nifer y cleientiaid, nifer y gweithrediadau GET, SET, AUTH, ac ati.
  • Экспертиза. Представьте, что завтра под вашей ответственностью будет огромный кластер. Если он сломается, никто, кроме вас, починить его не сможет. Если он начнет тормозить — все побегут к вам. Если нужно добавить ресурсы или перераспределить нагрузку — снова к вам. Чтобы не поседеть в 25, желательно предусмотреть эти случаи и проверить заранее, как технология поведет себя при тех или иных действиях. Поговорим об этом подробнее в разделе «Экспертиза».
  • Monitro a rhybuddion. Pan fydd clwstwr yn chwalu, rydych chi am fod y cyntaf i wybod amdano. Yma fe wnaethom gyfyngu ein hunain i hysbysiad bod pob nod yn dychwelyd yr un wybodaeth am gyflwr y clwstwr (ie, mae'n digwydd yn wahanol). A gellir sylwi ar broblemau eraill yn gyflymach trwy rybuddion gan wasanaethau cleientiaid Redis.

Adleoli

Sut byddwn yn symud:

  • В первую очередь, нужно подготовить библиотеку для работы с кластером. В качестве основы для версии на Gо мы взяли go-redis и немного изменили под себя. Реализовали Multi-методы через pipeline-ы, а также немного поправили правила повторения запросов. С версией для PHP возникло больше проблем, но в конечном счете мы остановились на php-redis. Недавно они внедрили поддержку кластера, и на наш взгляд она выглядит хорошо.
  • Nesaf mae angen i chi ddefnyddio'r clwstwr ei hun. Gwneir hyn yn llythrennol mewn dau orchymyn yn seiliedig ar y ffeil ffurfweddu. Byddwn yn trafod y lleoliad yn fanylach isod.
  • Ar gyfer symud graddol rydym yn defnyddio modd sych. Gan fod gennym ddwy fersiwn o'r llyfrgell gyda'r un rhyngwyneb (un ar gyfer y fersiwn arferol, a'r llall ar gyfer y clwstwr), nid yw'n costio dim i greu papur lapio a fydd yn gweithio gyda fersiwn ar wahân ac yn cyd-fynd â dyblygu pob cais i'r clwstwr, cymharu ymatebion ac ysgrifennu anghysondebau yn y logiau (yn ein hachos ni yn NewRelic). Felly, hyd yn oed os bydd y fersiwn clwstwr yn torri yn ystod y broses gyflwyno, ni fydd ein cynhyrchiad yn cael ei effeithio.
  • Выкатив кластер в dry-режиме, мы можем спокойно смотреть на график расхождений ответов. Если доля ошибок медленно, но верно движется к некоторой небольшой константе, значит, всё хорошо. Почему расхождения всё равно есть? Потому что запись в отдельной версии происходит несколько раньше, чем в кластере, и за счет микролага данные могут расходиться. Осталось только посмотреть на логи расхождений, и если все они объяснимы неатомарностью записи, то можно идти дальше.
  • Теперь можно переключить dry-mode в обратную сторону. Писать и читать будем из кластера, а дублировать в отдельную версию. Зачем? В течение следующей недели хочется понаблюдать за работой кластера. Если вдруг выяснится, что в пике нагрузки есть проблемы, или мы что-то не учли, у нас всегда есть аварийный откат на старый код и актуальные данные в благодаря dry-mode.
  • Осталось отключить dry-mode и демонтировать отдельную версию.

Arbenigedd

Сначала кратко об устройстве кластера.

В первую очередь, Redis — key-value хранилище. В качестве ключа используются произвольные строки. В качестве значений могут использоваться числа, строки и целые структуры. Последних великое множество, но для понимания общего устройства нам это не важно.
Y lefel nesaf o dynnu ar ôl bysellau yw slotiau (SLOTS). Mae pob allwedd yn perthyn i un o 16 o slotiau. Gall fod unrhyw nifer o allweddi y tu mewn i bob slot. Felly, rhennir yr holl allweddi yn 383 o setiau digyswllt.
Ynglŷn â symud o Redis i Redis-clwstwr

Далее, в кластере должно быть N мастер-нод. Каждую ноду можно представлять как отдельный инстанс Redis, который знает всё о других нодах внутри кластера. Каждая мастер-нода содержит некоторое количество слотов. Каждый слот принадлежит только одной мастер-ноде. Все слоты нужно распределить между нодами. Если какие-то слоты не распределены, то хранящиеся в них ключи будут недоступны. Каждую мастер-ноду имеет смысл запускать на отдельной логической или физической машине. Также стоит помнить, что каждая нода работает только на одном ядре, и если вы хотите запустить на одной логической машине несколько экземпляров Redis, то убедитесь, что они будут работать на разных ядрах (мы не пробовали так делать, но в теории все должно работать). По сути, мастер-ноды обеспечивают обычное шардирование, и большее количество мастер-нод позволяет масштабировать запросы на запись и чтение.

После того, как все ключи распределены по слотам, а слоты раскиданы по мастер-нодам, к каждой мастер-ноде можно добавить произвольное количество слейв-нод. Внутри каждой такой связки «мастер-слейв» будет работать обычная репликация. Cлейвы нужны для масштабирования запросов на чтение и для аварийного переключения в случае выхода из строя мастера.
Ynglŷn â symud o Redis i Redis-clwstwr

Теперь поговорим об операциях, которые лучше бы уметь делать.

Обращаться к системе мы будем через Redis-CLI. Поскольку у Redis нет единой точки входа, выполнять следующие операции можно на любой из нод. В каждом пункте отдельно обращаю внимание на возможность выполнения операции под нагрузкой.

  • Y peth cyntaf a phwysicaf sydd ei angen arnom yw gweithrediad nodau clwstwr. Mae'n dychwelyd cyflwr y clwstwr, yn dangos rhestr o nodau, eu rolau, dosbarthiad slotiau, ac ati. Gellir cael rhagor o wybodaeth gan ddefnyddio gwybodaeth clwstwr a slotiau clwstwr.
  • Хорошо бы уметь добавлять и удалять ноды. Для этого есть операции cluster meet и cluster forget. Обратите внимание, что cluster forget необходимо применить к КАЖДОЙ ноде, как к мастерам, так и к репликам. А cluster meet достаточно вызвать лишь на одной ноде. Такое различие может обескураживать, так что лучше узнать о нем до того, как запустили кластер в эксплуатацию. Добавление ноды безопасно выполняется в бою и никак не затрагивает работу кластера (что логично). Если же вы собираетесь удалить ноду из кластера, то следует убедиться, что на ней не осталось слотов (иначе вы рискуете потерять доступ ко всем ключам на этой ноде). Также не удаляйте мастер, у которого есть слейвы, иначе будет выполняться ненужное голосование за нового мастера. Если на нодах уже нет слотов, то это небольшая проблема, но зачем нам лишние выборе, если можно сначала удалить слейвы.
  • Os oes angen i chi gyfnewid safleoedd meistr a chaethweision yn rymus, yna bydd y gorchymyn methiant clwstwr yn gwneud hynny. Wrth ei alw mewn brwydr, mae angen i chi ddeall na fydd y meistr ar gael yn ystod y llawdriniaeth. Yn nodweddiadol mae'r switsh yn digwydd mewn llai nag eiliad, ond nid yw'n atomig. Gallwch ddisgwyl y bydd rhai ceisiadau i'r meistr yn methu yn ystod yr amser hwn.
  • Cyn tynnu nod o'r clwstwr, ni ddylai fod unrhyw slotiau ar ôl arno. Mae'n well eu hailddosbarthu gan ddefnyddio'r gorchymyn reshard clwstwr. Bydd slotiau'n cael eu trosglwyddo o un meistr i'r llall. Gall y llawdriniaeth gyfan gymryd sawl munud, mae'n dibynnu ar faint o ddata sy'n cael ei drosglwyddo, ond mae'r broses drosglwyddo yn ddiogel ac nid yw'n effeithio ar weithrediad y clwstwr mewn unrhyw ffordd. Felly, gellir trosglwyddo'r holl ddata o un nod i'r llall yn uniongyrchol o dan lwyth, a heb boeni am ei argaeledd. Fodd bynnag, mae yna gynildeb hefyd. Yn gyntaf, mae trosglwyddo data yn gysylltiedig â llwyth penodol ar nodau'r derbynnydd a'r anfonwr. Os yw'r nod derbynnydd eisoes wedi'i lwytho'n drwm ar y prosesydd, yna ni ddylech ei lwytho â derbyn data newydd. Yn ail, cyn gynted ag nad oes un slot ar ôl ar y meistr anfon, bydd ei holl gaethweision yn mynd ar unwaith at y meistr y trosglwyddwyd y slotiau hyn iddo. A'r broblem yw y bydd yr holl gaethweision hyn eisiau cydamseru data ar unwaith. A byddwch yn lwcus os yw'n rhannol yn hytrach na chydamseru cyflawn. Cymerwch hyn i ystyriaeth a chyfunwch y gweithrediadau o drosglwyddo slotiau ac analluogi/trosglwyddo caethweision. Neu gobeithio bod gennych ymyl diogelwch digonol.
  • Что делать, если при переносе вы обнаружили, что куда-то потеряли слоты? Надеюсь, эта проблема вас не коснется, но если что, есть операция cluster fix. Она худо-бедно раскидает слоты по нодам в случайном порядке. Рекомендую проверить её работу, предварительно удалив из кластера ноду с распределенными слотами. Поскольку данные в нераспределенных слотам и так недоступны, беспокоиться о проблемах с доступностью этих слотов уже поздно. В свою очередь на распределенные слоты операция не повлияет.
  • Gweithrediad defnyddiol arall yw monitor. Mae'n caniatáu ichi weld mewn amser real y rhestr gyfan o geisiadau sy'n mynd i'r nod. Ar ben hynny, gallwch chi ei grep a darganfod a oes y traffig angenrheidiol.

Также стоит упомянуть о процедуре аварийного переключения мастера. Если коротко, то она есть, и, на мой взгляд, прекрасно работает. Однако не стоит думать, что если выдернуть шнур из розетки на машине с мастер-нодой, Redis тут же переключится и клиенты не заметят потери. На моей практике переключение происходит несколько секунд. В течение этого времени часть данных будет недоступна: обнаруживается недоступность мастера, ноды голосуют за нового, слейвы переключаются, данные синхронизируются. Лучший способ убедиться самостоятельно в том, что схема рабочая, это провести локальные учения. Поднимите кластер на своем ноутбуке, дайте минимальную нагрузку, сымитируйте падение (например, заблокировав порты), оцените скорость переключения. На мой взгляд, только поиграв таким образом день-два, можно быть уверенным в работе технологии. Ну, или понадеяться, что софт, которым пользуется половина интернета, наверняка работает.

Ffurfweddiad

Yn aml, y ffurfweddiad yw'r peth cyntaf sydd ei angen arnoch i ddechrau gweithio gyda'r offeryn. A phan fydd popeth yn gweithio, nid ydych chi hyd yn oed eisiau cyffwrdd â'r ffurfwedd. Mae'n cymryd peth ymdrech i orfodi'ch hun i fynd yn ôl i'r gosodiadau a mynd drwyddynt yn ofalus. Yn fy nghof, cawsom o leiaf ddau fethiant difrifol oherwydd diffyg sylw i'r cyfluniad. Rhowch sylw arbennig i'r pwyntiau canlynol:

  • amseriad 0
    Время, через которое закрываются неактивные соединения (в секундах). 0 — не закрываются
    Не каждая наша библиотека умела корректно закрывать соединения. Отключив эту настройку, мы рискуем упереться в лимит по количеству клиентов. С другой стороны, если такая проблема есть, то автоматический разрыв потерянных соединений замаскирует её, и мы можем не заметить. Кроме того, не стоит включать эту настройку при использовании persist-соединений.
  • Save x y & appendonly yes
    Сохранение RDB-снепшота.
    Проблемы RDB/AOF мы подробно обсудим ниже.
  • stop-writes-on-bgsave-error no & slave-serve-stale-data yes
    Если включено, то при поломке RDB-снепшота мастер перестанет принимать запросы на изменение. Если соединение с мастером потеряно, то слейв может продолжать отвечать на запросы (yes). Или прекратит отвечать (no)
    Нас не устраивает ситуация, при которой Redis превращается в тыкву.
  • repl-ping-slave-period 5
    Через этот промежуток времени мы начнем беспокоиться о том, что мастер сломался и пора бы провести процедуру failover’a.
    Придется вручную находить баланс между ложными срабатываниями и запуском failover’а. На нашей практике это 5 секунд.
  • repl-backlog-size 1024mb & epl-backlog-ttl 0
    Gallwn storio cymaint â hyn o ddata yn union mewn byffer ar gyfer atgynhyrchiad sydd wedi methu. Os bydd y byffer yn dod i ben, bydd yn rhaid i chi gydamseru'n llwyr.
    Практика подсказывает, что лучше поставить значение побольше. Причин, по которым реплика может начать отставать, предостаточно. Если она отстает, то, скорей всего, ваш мастер уже с трудом справляется, а полная синхронизация станет последней каплей.
  • maxclients 10000
    Uchafswm nifer y cleientiaid un-amser.
    По нашему опыту, лучше поставить значение побольше. Redis прекрасно справляется с 10 тыс. соединений. Только убедитесь, что в системе достаточно сокетов.
  • maxmemory-policy anweddol-ttl
    Y rheol ar gyfer dileu allweddi pan gyrhaeddir y terfyn cof sydd ar gael.
    Тут важно не само правило, а понимание, как это будет происходить. Redis можно похвалить за умение штатно работать при достижении лимита памяти.

Проблемы RDB и AOF

Хотя сам Redis хранит всю информацию в оперативной памяти, также есть механизм сохранения данных на диск. А точнее, три механизма:

  • Ciplun RDB - ciplun cyflawn o'r holl ddata. Gosodwch gan ddefnyddio'r ffurfwedd SAVE XY ac mae'n darllen “Cadw ciplun llawn o'r holl ddata bob X eiliad os yw bysellau Y o leiaf wedi newid.”
  • Ffeil atodiad yn unig - rhestr o weithrediadau yn y drefn y cânt eu perfformio. Yn ychwanegu gweithrediadau newydd sy'n dod i mewn i'r ffeil bob X eiliad neu bob gweithrediad Y.
  • Mae RDB ac AOF yn gyfuniad o'r ddau flaenorol.

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

Yn gyntaf, mae arbed ciplun RDB yn gofyn am ffonio FORK. Os oes llawer o ddata, gall hyn hongian Redis i gyd am gyfnod o ychydig milieiliadau i eiliad. Yn ogystal, mae angen i'r system ddyrannu cof ar gyfer ciplun o'r fath, sy'n arwain at yr angen i gadw cyflenwad dwbl o RAM ar y peiriant rhesymegol: os dyrennir 8 GB ar gyfer Redis, yna dylai 16 GB fod ar gael ar y peiriant rhithwir gyda mae'n.

Yn ail, mae problemau gyda chydamseru rhannol. Yn y modd AOF, pan fydd y caethwas yn cael ei ailgysylltu, yn lle cydamseru rhannol, gellir perfformio cydamseriad llawn. Pam mae hyn yn digwydd, ni allwn ddeall. Ond mae'n werth cofio hyn.

Эти два пункта уже заставляют задуматься о том, а так ли нам нужны эти данные на диске, если и так всё дублируется слейвами. Потерять данные можно только при выходе из строя всех слейвов, а это проблема уровня «пожар в ДЦ». В качестве компромисса можно предложить сохранять данные только на слейвах, но в этом случае нужно убедиться, что эти слейвы никогда не станут мастером при аварийном восстановлении (для этого есть настройка приоритета слейвов в их конфиге). Для себя мы в каждом конкретном случае думаем над тем, надо ли сохранять данные на диск, и чаще всего отвечаем «нет».

Casgliad

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

Ffynhonnell: hab.com

Ychwanegu sylw