Барлығына әсер еткен шығарылым оқиғасы

Барлығына әсер еткен шығарылым оқиғасы
Шындықтың жаулары 12f-2 бойынша

Сәуір айының соңында, ақ серуендер Винтерфелді қоршап жатқанда, бізбен бір қызық оқиға болды; біз әдеттен тыс көшірме жасадық. Негізінде, біз үнемі өндіріске жаңа мүмкіндіктерді енгіземіз (басқалар сияқты). Бірақ бұл басқаша болды. Оның ауқымы соншалық, кез келген ықтимал қателіктер біздің барлық қызметтеріміз бен пайдаланушыларымызға әсер етеді. Нәтижесінде біз барлығын жоспарға сәйкес, жоспарланған және жарияланған тоқтау уақытында сатылымға салдарсыз шығардық. Мақалада біз бұған қалай қол жеткіздік және кез келген адам оны үйде қалай қайталай алады.

Мен қазір біз қабылдаған сәулеттік және техникалық шешімдерді сипаттамаймын немесе оның қалай жұмыс істейтінін айтпаймын. Бұл мен байқаған және мен тікелей қатысқан ең қиын прокаттардың бірі қалай өткені туралы жиектердегі жазбалар. Мен толық немесе техникалық мәліметтерді талап етпеймін; мүмкін олар басқа мақалада пайда болады.

Фон + бұл қандай функция?

Біз бұлтты платформа жасап жатырмыз Mail.ru бұлтты шешімдері (MCS), мен техникалық директор болып жұмыс істеймін. Енді барлық пайдаланушы тіркелгілерін, пайдаланушыларды, құпия сөздерді, рөлдерді, қызметтерді және т.б. бірыңғай басқаруды қамтамасыз ететін платформамызға IAM (Identity and Access Management) қосу уақыты келді. Неліктен бұлтқа қажет екендігі анық сұрақ: пайдаланушының барлық ақпараты сонда сақталады.

Әдетте мұндай заттар кез келген жобалардың басында салына бастайды. Бірақ тарихи тұрғыдан MCS-те бәрі басқаша болды. MCS екі бөліктен тұрғызылды:

  • Өзінің Keystone авторизация модулі бар Openstack,
  • Mail.ru Cloud жобасына негізделген Hotbox (S3 сақтау орны),

оның айналасында жаңа қызметтер пайда болды.

Негізінде бұл екі түрлі рұқсат түрі болды. Сонымен қатар, біз Mail.ru-ның кейбір жеке әзірлемелерін қолдандық, мысалы, жалпы Mail.ru құпия сөз қоймасы, сондай-ақ өздігінен жазылған openid қосқышы, соның арқасында Horizon панелінде SSO (соңғы авторизация) қамтамасыз етілді. виртуалды машиналар (туған OpenStack UI).

Біз үшін IAM жасау оның барлығын бір жүйеге, толығымен өзімізге байланыстыруды білдіреді. Сонымен қатар, біз бұл жолда ешқандай функционалдылықты жоғалтпаймыз, бірақ оны рефакторингсіз ашық түрде нақтылауға және функционалдылық тұрғысынан масштабтауға мүмкіндік беретін болашақтың негізін жасаймыз. Сондай-ақ, бастапқыда пайдаланушылар қызметтерге (орталық RBAC, рөлге негізделген қол жеткізуді басқару) және басқа да кішкене нәрселерге қол жеткізу үшін үлгі болды.

Тапсырма тривиальды емес болып шықты: python және Perl, бірнеше бэкендтер, тәуелсіз жазылған қызметтер, бірнеше әзірлеушілер тобы және әкімшілер. Ең бастысы, жауынгерлік өндіріс жүйесінде мыңдаған тірі пайдаланушылар бар. Осының барлығын жазып, ең бастысы адам шығынсыз шығару керек болды.

Біз нені шығарамыз?

Шамамен айтқанда, шамамен 4 айдың ішінде біз мынаны дайындадық:

  • Біз бұрын инфрақұрылымның әртүрлі бөліктерінде жұмыс істеген функцияларды біріктіретін бірнеше жаңа демондарды жасадық. Қалған қызметтерге осы жындар түріндегі жаңа сервер тағайындалды.
  • Біз өзіміздің барлық қызметтеріміз үшін қолжетімді құпия сөздер мен кілттердің орталық қоймасын жаздық, оларды қажетінше еркін өзгертуге болады.
  • Біз Keystone үшін нөлден бастап 4 жаңа сервер жаздық (пайдаланушылар, жобалар, рөлдер, рөлдерді тағайындау), олар іс жүзінде оның дерекқорын ауыстырды және қазір пайдаланушы құпия сөздері үшін бір репозиторий ретінде әрекет етеді.
  • Біз барлық Openstack қызметтеріне осы саясаттарды әрбір серверден жергілікті түрде оқудың орнына олардың саясаттары үшін үшінші тарап саясат қызметіне өтуді үйреттік (иә, Openstack әдепкі бойынша осылай жұмыс істейді!)

Мұндай үлкен қайта өңдеу әртүрлі әзірлеу топтары жазған бірнеше жүйелерде үлкен, күрделі және ең бастысы синхронды өзгерістерді талап етеді. Құрастырылғаннан кейін бүкіл жүйе жұмыс істеуі керек.

Мұндай өзгерістерді қалай таратуға және оны бұрмаламауға болады? Алдымен біз болашаққа сәл көз жүгіртеміз деп шештік.

Іске қосу стратегиясы

  • Өнімді бірнеше кезеңде шығаруға болады, бірақ бұл әзірлеу уақытын үш есеге арттырады. Сонымен қатар, біраз уақыт бойы бізде деректер қорларындағы деректерді толық десинхронизациялау болады. Сіз өзіңіздің синхрондау құралдарын жазып, ұзақ уақыт бойы бірнеше деректер қоймасымен өмір сүруіңіз керек еді. Және бұл көптеген тәуекелдерді тудырады.
  • Пайдаланушы үшін ашық түрде дайындалуы мүмкін барлық нәрсе алдын-ала жасалды. 2 ай болды.
  • Біз өзімізге бірнеше сағат бойы тоқтап тұруға рұқсат бердік - тек ресурстарды жасау және өзгерту үшін пайдаланушы операциялары үшін.
  • Барлық жасалған ресурстардың жұмыс істеуі үшін тоқтап қалуға жол берілмейді. Біз шығару кезінде ресурстар тоқтаусыз жұмыс істеп, клиенттерге әсер етуі керек деп жоспарладық.
  • Бірдеңе дұрыс болмаса, тұтынушыларымызға әсер етуді азайту үшін біз жексенбі күні кешке шығуды шештік. Түнде виртуалды машиналарды басқаратын тұтынушылар аз.
  • Біз барлық клиенттерімізге енгізу үшін таңдалған кезеңде қызметті басқару қолжетімсіз болатынын ескерттік.

Дигрессия: жылжыту дегеніміз не?

<сақтық, философия>

Әрбір IT маманы прокаттың не екеніне оңай жауап бере алады. Сіз CI/CD орнатасыз және бәрі дүкенге автоматты түрде жеткізіледі. 🙂

Әрине бұл рас. Бірақ қиындығы мынада, кодты жеткізуді автоматтандырудың заманауи құралдарының көмегімен шығарудың өзін түсіну жоғалады. Заманауи көлікке қарап отырып, доңғалақ өнертабыстың эпикалық қасиетін қалай ұмытасыз. Барлығы автоматтандырылғаны сонша, прокат көбінесе бүкіл суретті түсінбестен жүзеге асырылады.

Ал бүкіл сурет осылай. Іске қосу төрт негізгі аспектіден тұрады:

  1. Кодты жеткізу, соның ішінде деректерді өзгерту. Мысалы, олардың миграциясы.
  2. Кодты кері қайтару - бірдеңе дұрыс болмаса, кері қайтару мүмкіндігі. Мысалы, сақтық көшірме жасау арқылы.
  3. Әрбір шығару/қайтару операциясының уақыты. Алғашқы екі нүктенің кез келген операциясының уақытын түсіну керек.
  4. Әсер еткен функционалдылық. Күтілетін оң және ықтимал теріс әсерлерді бағалау қажет.

Барлық осы аспектілерді сәтті шығару үшін ескеру қажет. Әдетте бірінші немесе ең жақсы жағдайда екінші нүкте ғана бағаланады, содан кейін шығару сәтті деп саналады. Бірақ үшінші және төртінші одан да маңызды. Шығарылым бір минуттың орнына 3 сағатқа созылса, қай пайдаланушы оны қалайды? Немесе шығару кезінде қажетсіз нәрсе әсер етсе ме? Әлде бір қызметтің тоқтап қалуы күтпеген салдарға әкеп соғады ма?

1..n акт, босатуға дайындық

Бастапқыда мен кездесулерімізді қысқаша сипаттауды ойладым: бүкіл команда, оның бөліктері, кофе нүктелеріндегі көптеген талқылаулар, аргументтер, тесттер, ми шабуылдары. Содан кейін бұл қажет емес деп ойладым. Төрт айлық даму әрқашан осыдан тұрады, әсіресе сіз үнемі жеткізілетін нәрсені жазбасаңыз, бірақ тірі жүйе үшін бір үлкен мүмкіндік. Бұл барлық қызметтерге әсер етеді, бірақ пайдаланушылар үшін «веб-интерфейстегі бір түймеден» басқа ештеңе өзгермеуі керек.

Әр жаңа кездесуден бастап қалай шығару керектігі туралы түсінігіміз өзгерді және айтарлықтай өзгерді. Мысалы, біз шот ұсыну дерекқорын толығымен жаңартатын болдық. Бірақ біз уақытты есептедік және мұны ақылға қонымды айналым уақытында жасау мүмкін емес екенін түсіндік. Төлем дерекқорын бөлшектеу және мұрағаттау үшін бізге қосымша аптаға жуық уақыт кетті. Ал күтілетін шығару жылдамдығы әлі де қанағаттанарлық болмаған кезде, біз қосымша, қуаттырақ жабдыққа тапсырыс бердік, онда бүкіл база сүйрейді. Бұл біз мұны ертерек жасағымыз келмегендіктен емес, бірақ қазіргі қажеттілік бізге ешқандай мүмкіндіктер қалдырды.

Біздің біреуіміз прокат виртуалды машиналарымыздың қолжетімділігіне әсер етуі мүмкін деп күмәнданғанда, біз бір апта бойы сынақтар, эксперименттер, кодтық талдаулар жүргіздік және бұл біздің өндірісімізде болмайтынын анық түсіндік, тіпті ең күмәнді адамдар да келісті. осымен.

Осы уақыт ішінде техникалық қолдау қызметінің жігіттері тұтынушыларға қосылу әдістері туралы нұсқауларды жазу үшін өздерінің тәуелсіз эксперименттерін жүргізді, олар шығарылымнан кейін өзгеруі керек еді. Олар пайдаланушы UX бойынша жұмыс істеді, нұсқауларды дайындады және жеке кеңестер берді.

Біз мүмкін болатын барлық шығару операцияларын автоматтандырдық. Әрбір операция, тіпті ең қарапайымдары да сценариймен жазылды және үнемі сынақтар жүргізілді. Олар қызметті өшірудің ең жақсы жолы - демонды өткізіп жіберу немесе желіаралық қалқан арқылы қызметке кіруді блоктау туралы дауласады. Біз шығарудың әр кезеңі үшін топтардың бақылау тізімін жасап, оны үнемі жаңартып отырдық. Біз барлық шығару жұмыстары үшін Гант диаграммасын сызып, уақыттарымен үнемі жаңартып отырдық.

Міне…

Шығаруға дейінгі соңғы акт

...шығару уақыты келді.

Олар айтқандай, өнер туындысын аяқтауға болмайды, тек онымен жұмыс істеу керек. Сіз бәрін таба алмайтыныңызды түсіне отырып, барлық мүмкін болатын жағдайларды қарастырған, барлық сыни қателерді жауып, барлық қатысушылар қолдан келгеннің бәрін жасағаныңызға сене отырып, күш салуыңыз керек. Кодты неғұрлым көп шығарсаңыз, соғұрлым өзіңізді бұған сендіру қиынырақ болады (сонымен қатар, барлығын алдын ала көру мүмкін емес екенін бәрі түсінеді).

Пайдаланушыларымыз үшін күтпеген әсерлер мен тоқтап қалулармен байланысты барлық тәуекелдерді жабу үшін қолдан келгеннің бәрін жасағанымызға көз жеткізгеннен кейін біз шығаруға дайынбыз деп шештік. Яғни, мыналардан басқа кез келген нәрсе дұрыс емес болуы мүмкін:

  1. Пайдаланушы инфрақұрылымына әсер ету (біз үшін қасиетті, ең қымбат),
  2. Функционалдылық: қызметімізді шығарғаннан кейін пайдалану бұрынғыдай болуы керек.

Шығару

Барлығына әсер еткен шығарылым оқиғасы
Екі орам, 8 кедергі жасамайды

Біз пайдаланушылардың барлық сұраулары үшін 7 сағат бойы тоқтау уақытын аламыз. Қазіргі уақытта бізде шығару жоспары да, кері қайтару жоспары да бар.

  • Шығарудың өзі шамамен 3 сағатты алады.
  • Тестілеуге 2 сағат.
  • 2 сағат - өзгерістерді кері қайтару үшін резерв.

Әрбір әрекет үшін Гант диаграммасы жасалды, ол қанша уақытқа созылады, не ретімен болады, не параллель орындалады.

Барлығына әсер еткен шығарылым оқиғасы
Бастапқы нұсқалардың бірі (параллельді орындаусыз) Гантт диаграммасының бір бөлігі. Ең құнды синхрондау құралы

Барлық қатысушылардың шығарылымдағы рөлі, олар қандай тапсырмаларды орындайтыны және не үшін жауапты екені анықталады. Біз әр кезеңді автоматтандыруға, оны шығаруға, кері айналдыруға, кері байланыс жинап, қайтадан шығаруға тырысамыз.

Оқиғалар шежіресі

Сонымен 15 сәуір, жексенбі күні сағат 29-де 10 адам жұмысқа келді. Негізгі қатысушылардан басқа, кейбіреулер команданы қолдауға келді, бұл үшін оларға ерекше рахмет.

Біздің негізгі тестілеушіміздің демалыста екенін де айта кеткен жөн. Тестілеусіз шығару мүмкін емес, біз опцияларды зерттеп жатырмыз. Әріптесіміз бізді демалыстан сынауға келіседі, бұл үшін ол бүкіл ұжымнан үлкен алғыс алады.

00:00. Тоқта
Біз пайдаланушылардың сұрауларын тоқтатамыз, техникалық жұмыс деген жазуды іліп қоямыз. Бақылау айқайлайды, бірақ бәрі қалыпты. Біз құлау керек болғаннан басқа ештеңе құламағанын тексереміз. Ал біз көші-қон бойынша жұмысты бастаймыз.

Барлығында нүкте бойынша басып шығарылған шығару жоспары бар, барлығы кімнің не істеп жатқанын және қандай сәтте екенін біледі. Әрбір әрекеттен кейін біз уақытты тексеріп, олардан асып кетпеуімізді тексереміз және бәрі жоспарға сәйкес жүреді. Қазіргі кезеңде прокатқа тікелей қатыспайтындар әріптестеріне кедергі келтірмеу үшін онлайн ойыншықты (Xonotic, 3 типті quacks) іске қосу арқылы дайындалуда. 🙂

02:00. Шығарылды
Жағымды тосынсый – дерекқорларымыз бен көшіру сценарийлерімізді оңтайландырудың арқасында біз шығаруды бір сағат бұрын аяқтаймыз. Жалпы айқайлап: «Шығып кетті!» Барлық жаңа функциялар өндірісте, бірақ әзірге оларды интерфейсте біз ғана көре аламыз. Барлығы тестілеу режиміне өтіп, оларды топтарға бөліп, соңында не болғанын көре бастайды.

Бұл өте жақсы болмады, біз мұны 10 минуттан кейін, ештеңе қосылмаған немесе топ мүшелерінің жобаларында жұмыс істегенде түсінеміз. Жылдам синхрондау, біз өз проблемаларымызды айтамыз, басымдықтарды белгілейміз, топтарға бөлініп, жөндеуге кірісеміз.

02:30. Төрт көзге қарсы екі үлкен мәселе
Біз екі үлкен проблеманы табамыз. Біз тұтынушылардың кейбір қосылған қызметтерді көрмейтінін және серіктес тіркелгілерінде мәселелер туындайтынын түсіндік. Екеуі де кейбір шеткі жағдайлар үшін көшіру сценарийлерінің жетілмегендігіне байланысты. Біз оны қазір түзетуіміз керек.

Біз мұны жазатын сұрауларды кемінде 4 көзбен жазамыз. Біз олардың жұмыс істеп тұрғанына және ештеңені бұзбайтынына көз жеткізу үшін оларды алдын ала өндіру кезінде сынаймыз. Сіз айналдыра аласыз. Сонымен қатар, біз тағы бірнеше мәселені ашатын тұрақты интеграциялық тестілеуді жүргіземіз. Олардың барлығы кішкентай, бірақ олар да жөндеуді қажет етеді.

03:00. -2 есеп +2 есеп
Бұрынғы екі үлкен мәселе және барлық дерлік кішігірім мәселелер де шешілді. Түзетулерде бос жүргендердің барлығы өз шоттарында белсенді жұмыс істеп, тапқандары туралы есеп береді. Біз басымдықтарды белгілейміз, командалар арасында таратамыз және маңызды емес нәрселерді таңертең қалдырамыз.

Біз сынақтарды қайтадан жүргіземіз, олар екі жаңа үлкен мәселені анықтайды. Барлық қызмет саясаттары дұрыс келмеді, сондықтан кейбір пайдаланушы сұраулары авторизациядан өтпейді. Сонымен қатар серіктес тіркелгілерінде жаңа мәселе. Қарауға асығайық.

03:20. Төтенше синхрондау
Бір жаңа мәселе түзетілді. Екіншіден, біз төтенше жағдайды синхрондауды ұйымдастырамыз. Біз не болып жатқанын түсінеміз: алдыңғысы бір мәселені түзетсе, екіншісін жасады. Біз мұны қалай дұрыс және салдарсыз жасау керектігін анықтау үшін үзіліс жасаймыз.

03:30. Алты көз
Біз барлық серіктестер үшін бәрі жақсы болуы үшін базаның соңғы күйі қандай болуы керек екенін түсінеміз. Біз 6 көзбен сұраныс жазамыз, оны алдын-ала дайындаймыз, сынаймыз, өндіріске шығарамыз.

04:00. Барлығы жұмыс істейді
Барлық сынақтар өтті, ешқандай сыни мәселелер көрінбейді. Кейде командадағы бірдеңе біреуге жұмыс істемейді, біз дереу әрекет етеміз. Көбінесе дабыл жалған болады. Бірақ кейде бірдеңе келмей қалады немесе бөлек бет жұмыс істемейді. Біз отырамыз, түзетеміз, түзетеміз, түзетеміз. Жеке топ соңғы үлкен мүмкіндікті - есепшотты іске қосуда.

04:30. Қайтып келмейтін нүкте
Қайта оралмайтын сәт жақындап қалды, яғни кері қарай бұрыла бастасақ, бізге берілген бос уақытты кездестірмейтін кез. Барлығын біліп, жазып отыратын, бірақ клиенттердің ақшасын есептен шығарудан қыңырлықпен бас тартатын есепшотта проблемалар бар. Жеке беттерде, әрекеттерде және күйлерде бірнеше қателер бар. Негізгі функционалдық жұмыс істейді, барлық сынақтар сәтті өтеді. Шығарылым болды деп шештік, біз кері қайтармаймыз.

06:00. Пайдаланушы интерфейсіндегі барлық адамдар үшін ашық
Қателер түзетілді. Пайдаланушыларға ұнамайтын кейбіреулер кейінірек қалдырылады. Біз интерфейсті барлығына ашамыз. Біз пайдаланушылардың пікірін және бақылау нәтижелерін күте отырып, шот ұсыну бойынша жұмысты жалғастырамыз.

07:00. API жүктемесіне қатысты мәселелер
API-дегі жүктемені сәл қате жоспарлағанымыз және мәселені анықтай алмаған бұл жүктемені сынағанымыз анық болды. Нәтижесінде сұраулардың ≈5% сәтсіз аяқталады. Жұмылдырайық, себебін іздейік.

Есепшот қыңыр және жұмыс істегісі келмейді. Өзгерістерді сабырлы түрде жүзеге асыру үшін оны кейінге қалдыруды ұйғардық. Яғни, онда барлық ресурстар жинақталған, бірақ клиенттерден есептен шығару өтпейді. Әрине, бұл мәселе, бірақ жалпы шығарумен салыстырғанда бұл маңызды емес сияқты.

08:00. API түзетіңіз
Біз жүктемені түзетуді шығардық, сәтсіздіктер жойылды. Біз үйге бара бастаймыз.

10:00. Барлық
Барлығы бекітілген. Бақылауда тыныш және тұтынушылардың орнында команда бірте-бірте ұйқыға кетеді. Төлем қалды, оны ертең қалпына келтіреміз.

Содан кейін күн ішінде кейбір клиенттеріміз үшін журналдарды, хабарландыруларды, қайтару кодтарын және теңшеулерді бекітетін шығарылымдар болды.

Сонымен, шығару сәтті болды! Бұл, әрине, жақсырақ болуы мүмкін, бірақ біз кемелділікке жету үшін не жеткіліксіз екендігі туралы қорытынды жасадық.

Барлығы

Шығаруға белсенді дайындықтың 2 айында екі сағаттан бірнеше күнге дейін созылатын 43 тапсырма орындалды.

Шығарылым кезінде:

  • жаңа және өзгерген жындар - 5 монолетті алмастыратын 2 дана;
  • дерекқорлардағы өзгерістер - пайдаланушы деректері бар біздің 6 дерекқорымыздың барлығына әсер етті, үш ескі дерекқордан бір жаңасына жүктеулер жасалды;
  • толығымен қайта жасалған фронтенді;
  • жүктелген кодтың көлемі – жаңа кодтың 33 мың жолы, ≈ сынақтардағы кодтың 3 мың жолы, ≈ көші-қон кодының 5 мың жолы;
  • барлық деректер бұзылмаған, бірде-бір тұтынушының виртуалды машинасы зақымдалмаған. 🙂

Жақсы тарату үшін жақсы тәжірибелер

Олар бізге осы қиын жағдайда жол көрсетті. Бірақ, жалпы айтқанда, кез келген шығару кезінде оларды ұстану пайдалы. Бірақ шығарылым неғұрлым күрделі болса, соғұрлым олардың рөлі артады.

  1. Сізге бірінші кезекте шығару пайдаланушыларға қалай әсер ететінін немесе әсер ететінін түсіну керек. Бос уақыт болады ма? Олай болса, тоқтау уақыты қандай? Бұл пайдаланушыларға қалай әсер етеді? Ең жақсы және ең нашар сценарийлер қандай болуы мүмкін? Және тәуекелдерді жабу.
  2. Барлығын жоспарлаңыз. Әрбір кезеңде сіз шығарудың барлық аспектілерін түсінуіңіз керек:
    • кодты жеткізу;
    • кодты кері қайтару;
    • әрбір операцияның уақыты;
    • әсер ететін функционалдылық.
  3. Шығарылымның барлық кезеңдері, сондай-ақ олардың әрқайсысында тәуекелдер айқын болғанша сценарийлер арқылы ойнаңыз. Қандай да бір күмәніңіз болса, үзіліс жасап, күмәнді кезеңді бөлек қарастыруға болады.
  4. Әрбір кезең біздің пайдаланушыларға көмектесетін болса, жетілдірілуі мүмкін және керек. Мысалы, ол тоқтау уақытын қысқартады немесе кейбір тәуекелдерді жояды.
  5. Қайтару тестілеу кодты жеткізу тестінен әлдеқайда маңызды. Кері қайтару нәтижесінде жүйе бастапқы күйіне оралатынын тексеріп, оны сынақтармен растау керек.
  6. Автоматтандыруға болатынның бәрі автоматтандырылуы керек. Автоматтандыруға болмайтынның барлығын алдын ала парақта жазу керек.
  7. Табыс критерийін жазыңыз. Қандай функция қолжетімді болуы керек және қай уақытта? Бұл орындалмаса, кері қайтару жоспарын іске қосыңыз.
  8. Ең бастысы - адамдар. Әрбір адам не істеп жатқанын, не үшін және нені шығару процесіндегі әрекеттеріне байланысты екенін білуі керек.

Бір сөйлеммен, жақсы жоспарлау және өңдеу арқылы сіз қалағаныңыздың барлығын сатуға салдарсыз шығара аласыз. Тіпті өндірістегі барлық қызметтеріңізге әсер ететін нәрсе.

Ақпарат көзі: www.habr.com

пікір қалдыру