Cloister → қарапайым OTP кластерін басқару

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

Cloister → қарапайым OTP кластерін басқару

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

Әртүрлі түйіндердегі процестер арасында, сондай-ақ сілтемелер мен мониторлар арасында өтетін хабар мөлдір […]

Іс жүзінде бәрі біршама күрделірек. Таратылды ерланг «контейнер» жүк тасымалдауға арналған үлкен темір қорапты білдіретін кезде әзірленді, ал «докер» жай ғана жағалаудағы жұмысшының синонимі болды. IN IP4 бос тұрған мекенжайлар көп болды, желі үзілістері әдетте егеуқұйрықтардың кабельді шайнауынан туындады және өндірістік жүйенің орташа жұмыс уақыты ондаған жылдармен өлшенді.

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

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

талаптар

Маған кластерді басқаруды алатын және келесі қасиеттерге ие болатын кітапхана қажет болды:

  • түйіндердің қатаң кодталған тізімімен де, қызметтер арқылы динамикалық табумен де мөлдір жұмыс ерланг;
  • әрбір топологияны өзгерту үшін толық функционалды кері шақыру (ондағы түйін, осында түйін, желінің тұрақсыздығы, бөлулер);
  • сияқты ұзын және қысқа атаулары бар кластерді іске қосуға арналған мөлдір интерфейс :nonode@nohost;
  • Инфрақұрылымдық кодты жазбастан Docker қолдауы қораптан шығады.

Соңғысы қолданбаны жергілікті түрде тексергеннен кейін дегенді білдіреді :nonode@nohost, немесе қолдан таратылған ортада test_cluster_task, Мен жай ғана жүгіргім келеді docker-compose up --scale my_app=3 және ешбір кодты өзгертусіз докердегі үш дананы қалай орындайтынын қараңыз. Мен сондай-ақ сияқты тәуелді қолданбаларды қалаймын mnesia - топология өзгерген кезде, сахнаның артында олар кластерді қолданбадан ешқандай қосымша соққысыз тікелей қайта құрады.

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

Таңдалған тәсіл

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

Қолданба ретінде іске қосылғанда, кітапхана сүйенеді config, одан ол келесі негізгі мәндерді оқиды:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

Жоғарыдағы параметрлер сөзбе-сөз мынаны білдіреді: Кластер OTP қолданбасы үшін пайдаланылады :my_app, пайдаланады erlang қызметінің ашылуы түйіндерді қосу үшін, кем дегенде үш, және MyApp.Listener модуль (іске асырушы @behaviour Cloister.Listener) топология өзгерістері туралы хабарландыруларды алу үшін конфигурацияланған. Толық конфигурацияның толық сипаттамасын мына жерден табуға болады құжаттама.

Осы конфигурациямен қолданба Кластер болады кезең-кезеңімен іске қосу, негізгі қолданбаны бастау процесін консенсусқа жеткенше кейінге қалдыру (жоғарыдағы мысалдағыдай үш түйін қосылған және қосылған.) Бұл негізгі қолданбаға ол іске қосылғанда кластер әлдеқашан қолжетімді деп болжауға мүмкіндік береді. Топология өзгерген сайын (олардың көпшілігі болады, өйткені түйіндер толығымен синхронды түрде басталмайды), өңдеуші шақырылады. MyApp.Listener.on_state_change/2. Көбінесе біз күй хабарын алған кезде әрекет жасаймыз %Cloister.Monitor{status: :up}, бұл: «Сәлеметсіз бе, кластер жиналды» дегенді білдіреді.

Көп жағдайда орнату consensus: 3 оңтайлы, өйткені біз көбірек түйіндердің қосылуын күтсек те, кері қоңырау өтеді status: :rehashingstatus: :up кез келген жаңадан қосылған немесе жойылған түйінде.

Әзірлеу режимінде іске қосу кезінде сіз жай ғана орнатуыңыз керек consensus: 1 и Кластер көргенде кластер құрастыруын күтуді қуана өткізіп жібереді :nonode@nohost, немесе :node@host, немесе :[email protected] - түйіннің конфигурациялануына байланысты (:none | :shortnames | :longnames).

Бөлінген қолданбаларды басқару

Вакуумда емес үлестірілген қолданбалар әдетте бөлінген тәуелділіктерді қамтиды, мысалы mnesia. Бізге олардың қайта конфигурациясын бірдей кері қоңырау арқылы өңдеу оңай on_state_change/2. Мұнда, мысалы, қайта конфигурациялаудың егжей-тегжейлі сипаттамасы берілген mnesia ұшып келеді құжаттама Кластер.

Қолданудың басты артықшылығы Кластер ол топологияны өзгерткеннен кейін кластерді қайта құру үшін барлық қажетті әрекеттерді орындайды сорғыштың астында. Қолданба IP мекенжайларын, демек, түйін атауларын алдын ала білетінімізге немесе олардың динамикалық түрде тағайындалғанына/өзгертілгеніне қарамастан, барлық түйіндер қосылған, дайын таратылған ортада жай ғана жұмыс істейді. Бұл ешқандай арнайы докер конфигурациясының параметрлерін қажет етпейді және қолданба әзірлеушісінің көзқарасы бойынша бөлінген ортада жұмыс істеу немесе жергілікті ортада жұмыс істеу арасында ешқандай айырмашылық жоқ. :nonode@nohost. Бұл туралы толығырақ бөлімінен оқи аласыз құжаттама.

Топология өзгерістерін күрделі өңдеу пайдаланушылық енгізу арқылы мүмкін болса да MyApp.Listener, бұл кітапхана шектеулері мен конфигурацияның бұрмаланулары іске асырудың іргетастары болып табылатын шеткі жағдайлар әрқашан болуы мүмкін. Жарайды, жоғарыдағыларды ал libcluster, бұл жалпы мақсатқа арналған немесе тіпті төменгі деңгейлі кластерді өзіңіз басқарыңыз. Бұл код кітапханасының мақсаты барлық мүмкін болатын сценарийді қамту емес, қажетсіз ауырсынусыз және көшіру-қоюды қиындатпай ең көп таралған сценарийді пайдалану болып табылады.

Ескертпе: Осы кезде түпнұсқада «Бақытты кластерлеу!» деген тіркес бар еді, мен оны аударатын Яндекс (мен сөздіктерді өзім аралаудың қажеті жоқ) маған «Бақытты кластерлеу!» опциясын ұсынды. Әсіресе қазіргі геосаяси жағдайды ескере отырып, жақсырақ аударманы елестету мүмкін емес шығар.

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

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