RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት

የስህተት መቻቻል እና ከፍተኛ ተገኝነት ትልቅ ርዕሰ ጉዳዮች ናቸው፣ ስለዚህ የተለየ መጣጥፎችን ለ RabbitMQ እና Kafka እናቀርባለን። ይህ መጣጥፍ ስለ RabbitMQ እና ቀጣዩ ስለ ካፍካ እና RabbitMQ ነው። ጽሑፉ ረጅም ነው, ስለዚህ እራስዎን ምቹ ያድርጉ.

ስህተትን መቻቻል፣ ወጥነት ያለው እና ከፍተኛ ተደራሽነት (HA) ስትራቴጂዎችን እና እያንዳንዱ ስትራቴጂ ሊያደርጋቸው የሚገቡትን ግብይቶች እንመልከት። RabbitMQ በክላስተር አንጓዎች ላይ ሊሠራ ይችላል - እና ከዚያ እንደ የተከፋፈለ ስርዓት ይመደባል. ወደ ተከፋፈሉ ስርዓቶች ስንመጣ, ብዙ ጊዜ ስለ ወጥነት እና ተገኝነት እንነጋገራለን.

እነዚህ ጽንሰ-ሀሳቦች ስርዓቱ ሲወድቅ እንዴት እንደሚሠራ ይገልጻሉ. የአውታረ መረብ ግንኙነት አለመሳካት፣ የአገልጋይ አለመሳካት፣ የሃርድ ዲስክ አለመሳካት፣ የአገልጋይ ጊዜያዊ አለመገኘት በቆሻሻ አሰባሰብ፣ ፓኬት መጥፋት ወይም የአውታረ መረብ ግንኙነት መቀዛቀዝ። ይህ ሁሉ ወደ የውሂብ መጥፋት ወይም ግጭቶች ሊመራ ይችላል. ለሁለቱም ሙሉ ለሙሉ ወጥነት ያለው (የመረጃ መጥፋት, የውሂብ ልዩነት የለም) እና ለሁሉም የውድቀት ሁኔታዎች (ንባብ እና መፃፍ ይቀበላል) ስርዓትን ማሳደግ ፈጽሞ የማይቻል ነው.

ወጥነት እና ተገኝነት በተለያዩ የጨረር ጫፎች ላይ እንዳሉ እናያለን, እና የትኛውን መንገድ ለማመቻቸት መምረጥ አለብዎት. ጥሩ ዜናው በ RabbitMQ ይህ ምርጫ ይቻላል. ሚዛኑን ወደ ብዙ ወጥነት ወይም የበለጠ ተደራሽነት ለማሸጋገር አንዳንድ ዓይነት "ነርዲሽ" ማንሻዎች አሉዎት።

እውቅና በተሰጣቸው ጽሁፎች ምክንያት የትኛዎቹ አወቃቀሮች ወደ የውሂብ መጥፋት እንደሚመሩ ልዩ ትኩረት እንሰጣለን. በአሳታሚዎች፣ ደላሎች እና ሸማቾች መካከል የኃላፊነት ሰንሰለት አለ። መልእክቱ ለደላላው ከተላለፈ በኋላ መልእክቱን አለማጣት የሱ ስራ ነው። አንድ ደላላ መልዕክቱን ለአሳታሚ እውቅና ሲሰጥ፣ እንዲጠፋ አንጠብቅም። ነገር ግን ይህ እንደ ደላላዎ እና አታሚዎ ውቅር ላይ በመመስረት ሊከሰት እንደሚችል እናያለን።

ነጠላ የመስቀለኛ መንገድ የመቋቋም ፕሪሚቲቭስ

ዘላቂ ወረፋዎች/ማዘዋወር

በ RabbitMQ ውስጥ ሁለት አይነት ወረፋዎች አሉ፡ የሚበረክት/የተረጋጋ (የሚበረክት) እና ያልተረጋጋ (የማይበረክት)። ሁሉም ወረፋዎች በMnesia የውሂብ ጎታ ውስጥ ተከማችተዋል። ዘላቂ ወረፋዎች በመስቀለኛ ጅምር ላይ እንደገና ይታወቃሉ እና እንደገና ከተጀመረ፣ የስርዓት ብልሽት ወይም የአገልጋይ ብልሽት ይተርፋሉ (መረጃው እስካለ)። ይህ ማለት ማዞሪያ (ልውውጡ) እስካወጁ እና ወረፋው እስከቀጠለ ድረስ፣ የወረፋው/የመስመሩ መሠረተ ልማት መስመር ላይ ተመልሶ ይመጣል።

መስቀለኛ መንገዱ እንደገና ሲጀመር ተለዋዋጭ ወረፋዎች እና መስመሮች ይወገዳሉ.

ዘላቂ መልእክቶች

ወረፋ የሚበረክት ስለሆነ ብቻ ሁሉም መልእክቶቹ በመስቀለኛ መንገድ ዳግም ሲጀመር ይተርፋሉ ማለት አይደለም። በአታሚው የተቀናበሩ መልዕክቶች ብቻ ዘላቂ (የቀጠለ)። የማያቋርጡ መልእክቶች በደላላው ላይ ተጨማሪ ሸክም ያደርጋሉ፣ ነገር ግን የመልእክት መጥፋት ተቀባይነት ከሌለው ሌላ አማራጭ የለም።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 1. የመረጋጋት ማትሪክስ

ከወረፋ መስታወት ጋር መሰብሰብ

የደላላ ማጣትን ለመትረፍ፣ ተደጋጋሚነት ያስፈልገናል። በርካታ የ RabbitMQ ኖዶችን ሰብስበን በመቀጠል ወረፋዎችን በበርካታ ኖዶች ላይ በማባዛት ተጨማሪ ድግግሞሽ ማከል እንችላለን። ስለዚህ አንድ መስቀለኛ መንገድ ከወረደ መረጃ አናጣም እና እንደተገኝ እንቆያለን።

ወረፋ ማንጸባረቅ፡

  • ሁሉንም የጽሑፍ እና የንባብ ትዕዛዞች የሚቀበል አንድ ዋና ወረፋ (መምህር)
  • ሁሉንም መልዕክቶች እና ሜታዳታ ከዋናው ወረፋ የሚቀበሉ አንድ ወይም ብዙ መስተዋቶች። እነዚህ መስተዋቶች ለመቅላት አይኖሩም ፣ ግን ለድጋሜ ብቻ።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 2. ወረፋውን በማንጸባረቅ ላይ

ማንጸባረቅ የሚዘጋጀው በተገቢው ፖሊሲ ነው። በእሱ ውስጥ, የማባዛት ሁኔታን እና ወረፋው መቀመጥ ያለበትን አንጓዎችን እንኳን መምረጥ ይችላሉ. ምሳሌዎች፡-

  • ha-mode: all
  • ha-mode: exactly, ha-params: 2 (አንድ ጌታ እና አንድ መስታወት)
  • ha-mode: nodes, ha-params: rabbit@node1, rabbit@node2

የአሳታሚ ማረጋገጫ

ወጥነት ያለው ጽሑፍን ለማግኘት አታሚ ያረጋግጣል። ያለ እነርሱ, መልዕክቶችን የማጣት እድል አለ. መልእክቱ ወደ ዲስክ ከተፃፈ በኋላ እውቅና ወደ አታሚው ይላካል. RabbitMQ መልዕክቶችን ወደ ዲስክ የሚጽፈው ደረሰኝ ላይ ሳይሆን በየጊዜው በጥቂት መቶ ሚሊሰከንዶች ክልል ውስጥ ነው። ወረፋ ሲንጸባረቅ፣ ሁሉም መስተዋቶች የመልእክቱን ቅጂ ወደ ዲስክ ከፃፉ በኋላ ብቻ እውቅና ይላካል። ይህ ማለት የማረጋገጫዎች አጠቃቀም መዘግየትን ይጨምራል, ነገር ግን የውሂብ ደህንነት አስፈላጊ ከሆነ, ከዚያ አስፈላጊ ናቸው.

ያልተሳካ ወረፋ

አንድ ደላላ ሲዘጋ ወይም ሲበላሽ፣ ሁሉም የወረፋ መሪዎች (ጌቶች) በዚያ መስቀለኛ መንገድ ላይ ይወድቃሉ። ክላስተር ከእያንዳንዱ ጌታ በጣም ጥንታዊውን መስታወት ይመርጣል እና እንደ አዲሱ ጌታ ያስተዋውቀዋል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 3. በርካታ የተንፀባረቁ ወረፋዎች እና ፖሊሲዎቻቸው

ደላላ 3 ተበላሽቷል። በደላላ 2 ላይ ያለው የ Queue C መስታወት ወደ ጌታነት ከፍ ማለቱን ልብ ይበሉ። እንዲሁም በደላላ 1 ላይ ለ Queue C አዲስ መስታወት መፈጠሩን ልብ ይበሉ። RabbitMQ ሁልጊዜ በፖሊሲዎችዎ ውስጥ የተገለጸውን የማባዛት ሁኔታ ለማቆየት ይሞክራል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 4. ደላላ 3 ወድቋል፣ ይህም ወረፋ C እንዲወድቅ አድርጓል

ቀጣዩ ደላላ 1 ቀንሷል! አንድ ደላላ ብቻ ነው የቀረን። የ Queue B መስታወት ወደ ጌታው ከፍ ብሏል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
የበለስ. 5

ደላላን መልሰናል 1. ደላላው ከጠፋበት እና ከተመለሰ መረጃው የቱንም ያህል በጥሩ ሁኔታ ቢተርፍም፣ ሁሉም የተንጸባረቁ የወረፋ መልእክቶች እንደገና ሲጀመሩ ይጣላሉ። ውጤቱም ስለሚኖር ይህ ትኩረት ሊሰጠው የሚገባ ጉዳይ ነው. እነዚህን አንድምታዎች በቅርቡ እንገመግማለን። ስለዚህ ደላላ 1 አሁን እንደገና የክላስተር አባል ሆኗል፣ እና ክላስተር መመሪያዎቹን ለማክበር ይሞክራል እና ስለዚህ በደላላ 1 ላይ መስተዋቶችን ይፈጥራል።

በዚህ አጋጣሚ የደላላው 1 መጥፋት ተጠናቅቋል፣ ልክ እንደ የውሂብ መጥፋት ሁሉ፣ ስለዚህ መስታወት የሌለው ወረፋ B ሙሉ በሙሉ ጠፍቷል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 6. ደላላ 1 ወደ አገልግሎት ይመለሳል

ደላላ 3 ወደ መስመር ተመልሷል፣ስለዚህ ወረፋዎች ሀ እና ቢ የHA ፖሊሲያቸውን ለማሟላት መስታወቶቻቸውን መልሰው ያገኛሉ። አሁን ግን ሁሉም ዋና ወረፋዎች በተመሳሳይ መስቀለኛ መንገድ ላይ ናቸው! ፍጹም አይደለም, በአንጓዎች መካከል አንድ ወጥ የሆነ ስርጭት መኖሩ የተሻለ ነው. እንደ አለመታደል ሆኖ ጌቶችን እንደገና ለማመጣጠን ምንም ልዩ አማራጮች የሉም። መጀመሪያ የወረፋ ማመሳሰልን ማጤን ስላለብን ወደዚህ ችግር በኋላ እንመለሳለን።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 7. ደላላ 3 ወደ አገልግሎት ይመለሳል። በአንድ መስቀለኛ መንገድ ላይ ሁሉም ዋና ወረፋዎች!

ስለዚህ አሁን መስተዋቶች እንዴት ድግግሞሽ እና ስህተትን መቻቻል እንደሚሰጡ ሀሳብ ሊኖርዎት ይገባል ። ይህ ነጠላ መስቀለኛ መንገድ ብልሽት በሚከሰትበት ጊዜ መገኘቱን ያረጋግጣል እና ከመረጃ መጥፋት ይከላከላል። ግን እስካሁን አልጨረስንም, ምክንያቱም በእውነቱ ሁሉም ነገር በጣም የተወሳሰበ ነው.

ማመሳሰል

አዲስ መስታወት ሲፈጠር ሁሉም አዳዲስ መልዕክቶች ሁልጊዜ ወደዚያ መስታወት እና ወደሌሎች ይባዛሉ። በዋናው ወረፋ ውስጥ ያለውን መረጃ በተመለከተ, ወደ አዲስ መስታወት መድገም እንችላለን, ይህም የጌታው ሙሉ ቅጂ ይሆናል. እንዲሁም ነባር መልዕክቶችን ላለመድገም እና ዋናው ወረፋ እና አዲሱ መስታወት አዲስ መልዕክቶች ወደ ጭራው በሚገቡበት ጊዜ እና ነባር መልዕክቶች ከዋናው ወረፋ ራስ ላይ በሚወጡበት ሰዓት ላይ እንዲገናኙ መፍቀድ እንችላለን።

ይህ ማመሳሰል አውቶማቲክ ወይም በእጅ ነው እና በወረፋ ፖሊሲ ነው የሚቆጣጠረው። አንድ ምሳሌ እንመልከት።

ሁለት የሚያንጸባርቁ ወረፋዎች አሉን። ወረፋ A በራስ ሰር ይመሳሰላል፣ ወረፋ B ደግሞ በእጅ ይመሳሰላል። ሁለቱም ወረፋዎች አሥር መልዕክቶችን ይይዛሉ።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 8. የተለያዩ የጊዜ ሁነታዎች ያላቸው ሁለት ወረፋዎች

አሁን ደላላ 3 እያጣን ነው።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 9. ደላላ 3 ወረደ

ደላላ 3 ወደ አገልግሎት ተመልሷል። ክላስተር በአዲሱ መስቀለኛ መንገድ ላይ ለእያንዳንዱ ወረፋ መስታወት ይፈጥራል እና በራስ ሰር አዲሱን ወረፋ A ከጌታው ጋር ያመሳስለዋል። ሆኖም የአዲሱ ወረፋ ቢ መስታወት ባዶ ሆኖ ይቆያል። ስለዚህ፣ የ Queue A ሙሉ ድግግሞሽ እና ለነባር የ Queue B መልዕክቶች አንድ መስታወት ብቻ አለን።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 10. አዲሱ የ Queue A መስታወት ሁሉንም ነባር መልዕክቶች ይቀበላል ነገር ግን አዲሱ የ Queue B መስታወት አይቀበለውም.

ሁለቱም ወረፋዎች አሥር ተጨማሪ መልዕክቶችን ይቀበላሉ. ደላላ 2 ከዚያ ይወርዳል፣ እና ወረፋ A ወደ ቀደመው መስታወት ይመለሳል፣ ይህም በደላላ 1 ላይ ነው። ሲሳካ የውሂብ መጥፋት የለም። ወረፋ ለ በመምህሩ ውስጥ ሃያ መልእክቶች ያሉት ሲሆን በመስተዋቱ ውስጥ ደግሞ አስር ብቻ ነው ምክንያቱም ወረፋው የመጀመሪያዎቹን አስር መልእክቶች ፈጽሞ አይደግምም ።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 11. ወረፋ A ያለ መልእክት መጥፋት በደላላ 1 ተንከባሎ ይመለሳል

ሁለቱም ወረፋዎች እያንዳንዳቸው አሥር ተጨማሪ መልእክት ይቀበላሉ። ደላላ 1 አሁን ተበላሽቷል፡ ወረፋ A ምንም መልእክት ሳይጠፋ ወደ መስታወት ቀርቧል። ሆኖም ወረፋ B ችግሮች እያጋጠሙት ነው። በዚህ ጊዜ፣ ተገኝነትን ወይም ወጥነትን ማሳደግ እንችላለን።

ተገኝነትን ለማመቻቸት ከፈለግን ፖሊሲው ነው። ሃ-ማስተዋወቅ-ላይ-ውድቀት ውስጥ መጫን አለበት። ሁል ጊዜ. ይህ ነባሪ እሴት ነው፣ ስለዚህ በቀላሉ ፖሊሲውን በጭራሽ መግለጽ አይችሉም። በእንደዚህ ዓይነት ሁኔታ, በተጨባጭ, ከማመሳሰል ውጪ በሆኑ መስተዋቶች ውስጥ ውድቀቶችን እንፈቅዳለን. ይህ መልዕክቶች እንዲጠፉ ያደርጋል፣ ነገር ግን ወረፋው የሚነበብ እና የሚፃፍ ሆኖ ይቆያል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 12. ወረፋ A ያለ መልእክት መጥፋት ወደ ደላላው 3 ተንከባሎአል። ወረፋ B ወደ ደላላ 3 ተመልሶ አስር መልዕክቶች ጠፍተዋል።

መጫንም እንችላለን ha-promote-on-failure ወደ ትርጉም when-synced. በዚህ አጋጣሚ ወረፋው ወደ መስታወት ከመመለስ ይልቅ ደላላ 1 መረጃውን ይዞ ወደ ኦንላይን እስኪመለስ ድረስ ይጠብቃል። ከተመለሰ በኋላ ዋናው ወረፋ ወደ ደላላ 1 ያለመረጃ መጥፋት ይመለሳል። ተገኝነት ለመረጃ ደህንነት የተከፈለ ነው። ነገር ግን ይህ አደገኛ ሁነታ ነው, ይህም ወደ ሙሉ የውሂብ መጥፋት እንኳን ሊያመራ ይችላል, ይህም በቅርቡ እንመለከታለን.

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 13. ደላላው 1 ከተሸነፈ በኋላ ወረፋ ለ አይገኝም

ጥያቄውን መጠየቅ ይችላሉ: "ምናልባት አውቶማቲክ ማመሳሰልን በጭራሽ አለመጠቀም የተሻለ ሊሆን ይችላል?". መልሱ ማመሳሰል የማገድ ስራ ነው። በማመሳሰል ጊዜ ዋናው ወረፋ ምንም አይነት የማንበብ እና የመፃፍ ስራዎችን ማከናወን አይችልም!

አንድ ምሳሌ እንመልከት። አሁን በጣም ረጅም ወረፋዎች አሉን። እንዴት ወደ እንደዚህ ዓይነት መጠን ሊያድጉ ይችላሉ? በብዙ ምክንያቶች፡-

  • ወረፋዎች በንቃት ጥቅም ላይ አይውሉም
  • እነዚህ ከፍተኛ ፍጥነት ያላቸው ወረፋዎች ናቸው, እና አሁን ሸማቾች ቀስ ብለው እየሮጡ ነው.
  • እነዚህ ከፍተኛ ፍጥነት ያላቸው ወረፋዎች ናቸው, ውድቀት ታይቷል እና ሸማቾች እየያዙ ነው

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 14. የተለያዩ የጊዜ ሁነታዎች ያላቸው ሁለት ትላልቅ ወረፋዎች

ደላላ 3 አሁን ተበላሽቷል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 15. ደላላ 3 ተበላሽቷል በእያንዳንዱ ወረፋ አንድ ጌታ እና መስታወት ትቶ

ደላላ 3 ተመልሶ መስመር ላይ ይመጣል እና አዳዲስ መስተዋቶች ተፈጥረዋል። Master Queue A ያሉትን መልዕክቶች ወደ አዲሱ መስታወት ማባዛት ይጀምራል፣ እና በዚህ ጊዜ ወረፋው አይገኝም። መረጃን ለመድገም ሁለት ሰአታት ይወስዳል፣ይህም ለዚህ ወረፋ የሁለት ሰአታት ቆይታ!

ነገር ግን ወረፋ B በክፍለ ጊዜው ውስጥ እንዳለ ይቆያል። ለተደራሽነት አንዳንድ ድጋሚ መስዋዕትነት ከፍላለች።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 16. ወረፋ በማመሳሰል ጊዜ አይገኝም

ከሁለት ሰአታት በኋላ ወረፋ A እንዲሁ ይገኛል እና እንደገና ማንበብ እና መፃፍ መቀበል ይጀምራል።

ዝማኔዎች

ይህ በማመሳሰል ጊዜ የማገድ ባህሪ በጣም ትልቅ ወረፋ ያላቸው ስብስቦችን ለማዘመን አስቸጋሪ ያደርገዋል። በአንድ ወቅት, ዋናው መስቀለኛ መንገድ እንደገና መጀመር አለበት, ይህም ማለት ወደ መስታወት መሄድ ወይም በአገልጋዩ ማሻሻያ ጊዜ ወረፋውን ማጥፋት ማለት ነው. ለመሸጋገር ከመረጥን መስተዋቶቹ ከስምረት ውጪ ከሆኑ መልዕክቶችን እናጣለን። በነባሪነት፣ በደላላ መቋረጥ ወቅት፣ ከስምረት ውጭ የሆነ መስታወት አለመሳካት አይከናወንም። ይህ ማለት ደላላው እንደተመለሰ ምንም አይነት መልእክት አናጣም ጉዳቱ ቀላል ወረፋ ብቻ ነበር። ደላላው ሲቋረጥ የባህሪ ህጎች በፖሊሲው የተቀመጡ ናቸው። ha-promote-on-shutdown. ከሁለት እሴቶች አንዱን ማዘጋጀት ይችላሉ፡-

  • always= ያልተመሳሰሉ መስተዋቶች አለመሳካት ነቅቷል።
  • when-synced= ወደ ተመሳሰለ መስታወት ብቻ ውሰድ፣ ይህ ካልሆነ ወረፋው የማይነበብ እና የሚፃፍ ይሆናል። ወረፋው ደላላው እንደተመለሰ ወደ አገልግሎት ይመለሳል

አንድ መንገድ ወይም ሌላ፣ በትልቅ ወረፋዎች፣ ከመረጃ መጥፋት እና ካለመገኘት መካከል መምረጥ አለቦት።

ተገኝነት የውሂብ ደህንነትን ሲያሻሽል

ውሳኔ ከማድረግዎ በፊት ሊታሰብበት የሚገባ አንድ ተጨማሪ ውስብስብ ነገር አለ. ለተደጋጋሚነት አውቶማቲክ ማመሳሰል የተሻለ ቢሆንም፣ የውሂብ ደህንነትን እንዴት ይነካል? በእርግጥ፣ በተሻለ ድግግሞሽ፣ RabbitMQ ነባር መልዕክቶችን የማጣት ዕድሉ አነስተኛ ነው፣ ግን ከአሳታሚዎች ስለ አዳዲስ መልዕክቶችስ?

እዚህ የሚከተሉትን ነገሮች ግምት ውስጥ ማስገባት አለብዎት.

  • አታሚው ስህተቱን ብቻ ይመልስ እና የላይ አገልግሎቱ ወይም ተጠቃሚው በኋላ እንደገና እንዲሞክር ማድረግ ይችላል?
  • በኋላ እንደገና ለመሞከር አታሚው መልእክቱን በአገር ውስጥ ወይም በመረጃ ቋቱ ውስጥ ማስቀመጥ ይችላል?

አታሚው መልእክቱን መጣል ብቻ ከቻለ፣ በእውነቱ፣ ተደራሽነትን ማሻሻል የውሂብ ደህንነትን ያሻሽላል።

ስለዚህ, ሚዛን መፈለግ አለበት, እና ውሳኔው በተለየ ሁኔታ ላይ የተመሰረተ ነው.

በ ha-promote-on-failure=በመመሳሰል ላይ ያሉ ችግሮች

ሐሳብ ሃ-ማስተዋወቅ-ላይ-ውድቀት= ሲሰምር ወደ ማይመሳሰል መስታወት መቀየርን እንከላከል እና የውሂብ መጥፋትን እናስወግዳለን. ወረፋው የማይነበብ ወይም የማይጻፍ ሆኖ ይቆያል። ይልቁንስ የወደቀውን ደላላ ከመረጃ መጥፋት ውጭ እንደ ዋና ስራ እንዲቀጥል ባልተነካ መረጃ ለመመለስ እየሞከርን ነው።

ግን (ይህ ትልቅ ነው ግን) ደላላው መረጃውን ከጠፋ ትልቅ ችግር አለብን፡ ወረፋው ጠፋ! ሁሉም ውሂብ ጠፍቷል! ምንም እንኳን በአብዛኛው ዋናውን ወረፋ የሚይዙ መስተዋቶች ቢኖሩዎትም, እነዚህ መስተዋቶች እንዲሁ ይጣላሉ.

ተመሳሳይ ስም ያለው መስቀለኛ መንገድ እንደገና ለመጨመር፣ ወላጅ አልባ የሆነውን መስቀለኛ መንገድ እንዲረሳው ለክላስተር እንነግረዋለን (በ rabbitmqctl እርሳ_ክላስተር_ኖድ) እና በተመሳሳይ የአስተናጋጅ ስም አዲስ ደላላ ይጀምሩ። ክላስተር የጠፋውን መስቀለኛ መንገድ ሲያስታውስ፣ የድሮውን ወረፋ እና ከስምረት ውጪ የሆኑ መስተዋቶችን ያስታውሳል። ክላስተር የጠፋውን መስቀለኛ መንገድ እንዲረሳ ሲነገረው ይህ ወረፋም ይረሳል። አሁን እንደገና ማወጅ አለብን። ከፊል የውሂብ ስብስብ ጋር መስተዋቶች ቢኖረንም ሁሉንም ውሂብ አጥተናል። ወደ ማይመሳሰል መስታወት መቀየር የተሻለ ይሆናል!

ስለዚህ, በእጅ ማመሳሰል (እና ማመሳሰል አለመቻል) ከ ጋር በማጣመር ha-promote-on-failure=when-syncedበእኔ አስተያየት በጣም አደገኛ. ዶክተሮቹ ይህ አማራጭ ለመረጃ ደህንነት አለ ነገር ግን ባለ ሁለት ጫፍ ቢላዋ ነው ይላሉ።

ማስተር እንደገና ማመጣጠን

ቃል እንደገባን, በአንድ ወይም በብዙ አንጓዎች ላይ የሁሉም ጌቶች ክምችት ወደ ችግሩ እንመለሳለን. ይህ በክላስተር በሚንከባለል ዝማኔ ምክንያት እንኳን ሊከሰት ይችላል። በሶስት-ኖድ ክላስተር ውስጥ ሁሉም ዋና ወረፋዎች በአንድ ወይም በሁለት አንጓዎች ላይ ይሰበሰባሉ.

ማስተሮችን ማመጣጠን በሁለት ምክንያቶች ችግር ሊሆን ይችላል፡-

  • መልሶ ማመጣጠን ለማከናወን ጥሩ መሳሪያዎች የሉም
  • የወረፋ ማመሳሰል

መልሶ ለማመጣጠን ሶስተኛ ወገን አለ። ሰካውበይፋ ያልተደገፈ። በ RabbitMQ መመሪያ ውስጥ የሶስተኛ ወገን ተሰኪዎችን በተመለከተ በማለት ተናግሯል።ፕለጊኑ አንዳንድ ተጨማሪ ውቅረት እና የሪፖርት ማድረጊያ መሳሪያዎችን ያቀርባል፣ነገር ግን በ RabbitMQ ቡድን አይደገፍም ወይም አይሞከርም። በራስህ ኃላፊነት ተጠቀም"

በ HA ፖሊሲዎች ውስጥ ዋናውን ወረፋ ለማንቀሳቀስ ሌላ ዘዴ አለ. መመሪያው ይጠቅሳል ስክሪፕት ለዚህ. እንደሚከተለው ይሰራል፡-

  • አሁን ካለው የHA ፖሊሲ የበለጠ ቅድሚያ የሚሰጠው ጊዜያዊ ፖሊሲ በመጠቀም ሁሉንም መስተዋቶች ያስወግዳል።
  • ዋናውን ወረፋ ለማንቀሳቀስ የሚፈልጉትን መስቀለኛ መንገድ በመግለጽ የ HA ጊዜያዊ ፖሊሲን "nodes" ሁነታን ይለውጣል.
  • ለግዳጅ ስደት ወረፋውን ያመሳስለዋል።
  • ፍልሰት ከተጠናቀቀ በኋላ ጊዜያዊ ፖሊሲውን ይሰርዛል. ዋናው የ HA ፖሊሲ ተግባራዊ ሲሆን የሚፈለገው የመስታወት ብዛት ይፈጠራል።

ጉዳቱ ትልቅ ወረፋዎች ወይም ጥብቅ የቅጂ መስፈርቶች ካሉዎት ይህ አካሄድ ላይሰራ ይችላል።

አሁን የ RabbitMQ ስብስቦች ከአውታረ መረብ ክፍልፋዮች ጋር እንዴት እንደሚሠሩ እንይ።

የግንኙነት መቋረጥ

የተከፋፈለው ስርዓት አንጓዎች በኔትወርክ አገናኞች የተገናኙ ናቸው፣ እና የአውታረ መረብ ማገናኛዎች ግንኙነታቸው ሊቋረጥ እና ሊቋረጥ ይችላል። የመቋረጡ ድግግሞሽ በአካባቢው መሠረተ ልማት ወይም በተመረጠው ደመና አስተማማኝነት ላይ የተመሰረተ ነው. ያም ሆነ ይህ, የተከፋፈሉ ስርዓቶች እነሱን መቆጣጠር መቻል አለባቸው. በድጋሚ በተገኝነት እና በወጥነት መካከል ምርጫ አለን, እና ጥሩ ዜናው RabbitMQ ሁለቱንም አማራጮች ያቀርባል (በተመሳሳይ ጊዜ አይደለም).

በ RabbitMQ ሁለት ዋና አማራጮች አሉን:

  • አመክንዮአዊ መለያየትን ፍቀድ (የተከፈለ-አንጎል)። ይህ መገኘቱን ያረጋግጣል፣ ነገር ግን የውሂብ መጥፋት ሊያስከትል ይችላል።
  • ምክንያታዊ መለያየትን አሰናክል። ደንበኞች እንዴት ከጥቅሉ ጋር እንደሚገናኙ ላይ በመመስረት የአጭር ጊዜ ተገኝነትን ሊያሳጣ ይችላል። እንዲሁም በሁለት-ኖድ ክላስተር ውስጥ ሙሉ ለሙሉ አለመገኘትን ሊያስከትል ይችላል።

ግን አመክንዮአዊ ክፍፍል ምንድን ነው? ይህ በኔትወርክ ማገናኛዎች መጥፋት ምክንያት ክላስተር ለሁለት ሲከፈል ነው. በእያንዳንዱ ጎን, መስተዋቶች ወደ ጌታው እንዲራመዱ ይደረጋል, ስለዚህም በመጨረሻ በርካታ ጌቶች በአንድ ወረፋ ውስጥ ይገኛሉ.

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 17. ዋና ወረፋ እና ሁለት መስተዋቶች እያንዳንዳቸው በተለየ መስቀለኛ መንገድ ላይ. ከዚያ የአውታረ መረብ ብልሽት አለ እና አንድ መስታወት ተለያይቷል። የተነጠለው መስቀለኛ መንገድ ሁለቱ እንደወደቁ አይቶ መስታወቶቹን ​​ወደ ጌታው አቀረበ። አሁን ሁለት ዋና ወረፋዎች አሉን, ሁለቱም የሚነበቡ እና የሚጻፉ ናቸው.

አታሚዎች ውሂብን ለሁለቱም ጌቶች ከላኩ፣ የወረፋው ሁለት የተለያዩ ቅጂዎች ይኖረናል።

የተለያዩ የ RabbitMQ ሁነታዎች ተገኝነትን ወይም ወጥነትን ይሰጣሉ።

ሁነታን ችላ በል (ነባሪ)

ይህ ሁነታ ተደራሽነትን ያቀርባል. ግንኙነቱ ከጠፋ በኋላ, ምክንያታዊ መለያየት ይከሰታል. ግንኙነቱ ከተመለሰ በኋላ አስተዳዳሪው የትኛውን ክፍል እንደሚቀድም መወሰን አለበት። የጠፋው ወገን እንደገና ይጀመራል እና ከዚያ ወገን ሁሉም የተጠራቀመ ውሂብ ይጠፋል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 18. ሶስት አስፋፊዎች ከሶስት ደላላዎች ጋር የተቆራኙ ናቸው. ከውስጥ፣ ክላስተር ሁሉንም ጥያቄዎች በደላላ 2 ወደ ዋናው ወረፋ ያደርሳል።

አሁን ደላላ እያጣን ነው 3. ሌሎቹ ደላሎች ወድቀው አይቶ መስታወቱን ወደ ጌታው አቀረበ። አመክንዮአዊ መለያየት የሚከሰተው በዚህ መንገድ ነው።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 19. ምክንያታዊ ክፍፍል (የተከፈለ-አንጎል). መዝገቦቹ ወደ ሁለቱ ዋና ወረፋዎች ይሄዳሉ, እና ሁለቱ ቅጂዎች ይወጣሉ.

ግንኙነቱ ወደነበረበት ተመልሷል ፣ ግን አመክንዮአዊ መለያየት ይቀራል። አስተዳዳሪው ተሸናፊውን አካል መምረጥ አለበት። በሚከተለው ሁኔታ አስተዳዳሪው ደላላ 3ን እንደገና ያስጀምረዋል. ለማስተላለፍ ጊዜ የሌላቸው ሁሉም መልዕክቶች ጠፍተዋል.

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 20. አስተዳዳሪ ደላላን ያሰናክላል 3.

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 21. አስተዳዳሪ ደላላ 3ን ይጀምራል እና ክላስተርን ይቀላቀላል፣ እዚያ የተተዉ መልዕክቶችን ሁሉ ያጣል።

ግንኙነቱ በጠፋበት ጊዜ እና ከታደሰ በኋላ ክላስተር እና ይህ ወረፋ ለማንበብ እና ለመፃፍ ተዘጋጅቷል።

ራስ-ፈውስ ሁነታ

ክላስተር ራሱ ከተለያየ እና ከተገናኘ በኋላ የጠፋውን ጎን ይመርጣል ካልሆነ በስተቀር ከኢንጂ ሞድ ጋር ተመሳሳይ ነው። የተሸነፈው ወገን ወደ ባዶ ክላስተር ይመለሳል፣ እና ወረፋው ወደዚያ ወገን ብቻ የተላኩትን ሁሉንም መልዕክቶች ያጣል።

አነስተኛ ሁነታን ለአፍታ አቁም

አመክንዮአዊ ክፍፍልን መፍቀድ ካልፈለግን ያለን አማራጭ ከክላስተር ክፍፍል በኋላ በትንሿ በኩል ለማንበብ እና ለመፃፍ እምቢ ማለት ብቻ ነው። ደላላው በትንሹ በኩል መሆኑን ሲያይ ሥራን ያቆማል ፣ ማለትም ሁሉንም ነባር ግንኙነቶችን ይዘጋዋል እና አዲስ ግንኙነቶችን አይቀበልም። በሴኮንድ አንድ ጊዜ እንደገና መገናኘቱን ይፈትሻል። ግንኙነቱ እንደተመለሰ፣ ስራውን ይቀጥላል እና ክላስተርን ይቀላቀላል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 22. ሶስት አስፋፊዎች ከሶስት ደላላዎች ጋር የተቆራኙ ናቸው. ከውስጥ፣ ክላስተር ሁሉንም ጥያቄዎች በደላላ 2 ወደ ዋናው ወረፋ ያደርሳል።

ደላሎች 1 እና 2 ከዛም ከደላላ 3 ይለያሉ፡ መስታወትን ወደ ጌታው ከማስተዋወቅ ይልቅ ደላላ 3 ቆም ብሎ አይገኝም።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 23. ደላላ 3 አግዷል፣ ሁሉንም ደንበኞች ያላቅቃል እና የግንኙነት ጥያቄዎችን ውድቅ ያደርጋል።

ግንኙነቱ እንደተመለሰ ወደ ክላስተር ይመለሳል።

ዋናው ወረፋ በደላላ 3 ላይ የሚገኝበትን ሌላ ምሳሌ እንመልከት።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 24. ዋና ወረፋ በደላላ 3.

ከዚያ ተመሳሳይ የግንኙነት ማጣት ይከሰታል. ደላላ 3 ባለበት ይቆማል ምክንያቱም በትንሹ በኩል ነው። በሌላ በኩል፣ አንጓዎቹ ደላላ 3 መውደቁን ያያሉ፣ ስለዚህ ከደላላ 1 እና 2 የቆየው መስታወት ወደ ጌታነት ከፍ ብሏል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 25. ደላላ 2 በማይገኝበት ጊዜ ወደ ደላላ 3 መቀየር።

ግንኙነቱ ወደነበረበት ሲመለስ ደላላው 3 ክላስተርን ይቀላቀላል።

RabbitMQ vs. Kafka፡ የስህተት መቻቻል እና በክላስተር ውስጥ ከፍተኛ ተገኝነት
ሩዝ. 26. ክላስተር ወደ መደበኛ ስራ ተመልሷል.

ወጥነት እንደምናገኝ እዚህ መረዳት አስፈላጊ ነው፣ ነገር ግን ተደራሽነትንም ማግኘት እንችላለን፣ ከሆነ በተሳካ ሁኔታ ደንበኞችን ወደ አብዛኛው ክፍል እናስተላልፋለን። ለአብዛኛዎቹ ሁኔታዎች፣ እኔ በግሌ Pause Minority ሁነታን እመርጣለሁ፣ ግን በእውነቱ በግለሰብ ጉዳይ ላይ የተመሠረተ ነው።

መገኘቱን ለማረጋገጥ ደንበኞች በተሳካ ሁኔታ ከአስተናጋጁ ጋር መገናኘታቸውን ማረጋገጥ አስፈላጊ ነው. አማራጮቻችንን እንመልከት።

የደንበኛ ግንኙነትን ማረጋገጥ

ግንኙነቱ ከጠፋ በኋላ (ከአንድ መስቀለኛ መንገድ ውድቀት በኋላ) ደንበኞችን ወደ ክላስተር ዋና ክፍል ወይም ወደ ሥራ አንጓዎች እንዴት እንደሚመሩ ብዙ አማራጮች አሉን ። በመጀመሪያ፣ አንድ የተወሰነ ወረፋ በተወሰነ መስቀለኛ መንገድ ላይ እንደሚስተናግድ እናስታውስ፣ ነገር ግን ማዘዋወር እና ፖሊሲዎች በሁሉም አንጓዎች ላይ ይባዛሉ። ደንበኞች ከማንኛውም መስቀለኛ መንገድ ጋር ሊገናኙ ይችላሉ፣ እና የውስጥ መስመር ወደሚፈልጉበት ቦታ ይመራቸዋል። ነገር ግን መስቀለኛ መንገድ ባለበት ሲቆም ግንኙነቶችን ውድቅ ያደርጋል፣ ስለዚህ ደንበኞች ከሌላ መስቀለኛ መንገድ ጋር መገናኘት አለባቸው። መስቀለኛ መንገዱ ከወደቀ፣ ምንም ማድረግ ይችላል።

የእኛ አማራጮች፡-

  • ክላስተር የሚደርሰው በሎድ ሚዛኑ በቀላሉ የሚሽከረከር ሲሆን ደንበኞቹ እስኪሳካ ድረስ ለመገናኘት ይሞክራሉ። አንድ መስቀለኛ መንገድ ከተቋረጠ ወይም ከታገደ፣ ከዚያ መስቀለኛ መንገድ ጋር ለመገናኘት የሚደረጉ ሙከራዎች አይሳኩም፣ ነገር ግን ተከታይ ሙከራዎች ወደ ሌሎች አገልጋዮች (በክብ ሮቢን ፋሽን) ይሄዳሉ። ይህ ለጊዜያዊ የግንኙነት ማጣት ወይም በፍጥነት ለሚመጣው አገልጋይ ለጠፋ አገልጋይ ተስማሚ ነው።
  • ክላስተርን በሎድ ሚዛን መድረስ እና የታገዱ/የወደቁ ኖዶች እንደተገኙ ከዝርዝሩ ማስወገድ። ይህ በፍጥነት ከተሰራ እና ደንበኞች ግንኙነትን እንደገና መሞከር ከቻሉ የማያቋርጥ ተገኝነት እናገኛለን።
  • ለእያንዳንዱ ደንበኛ የሁሉም አንጓዎች ዝርዝር ይስጡ፣ እና ደንበኛው ሲገናኝ በዘፈቀደ ከመካከላቸው አንዱን ይመርጣል። ለመገናኘት በሚሞክርበት ጊዜ ስህተት ካጋጠመው, እስኪገናኝ ድረስ በዝርዝሩ ውስጥ ወደሚቀጥለው መስቀለኛ መንገድ ይንቀሳቀሳል.
  • ዲ ኤን ኤስ በመጠቀም ከወደቀ/ከታገደ አስተናጋጅ ትራፊክን ያስወግዱ። ይህ በትንሽ ቲቲኤል ይከናወናል.

ግኝቶች

RabbitMQ ስብስብ ጥቅሞቹ እና ጉዳቶቹ አሉት። በጣም ከባድ የሆኑ ጉዳቶች የሚከተሉት ናቸው-

  • ክላስተር በሚቀላቀሉበት ጊዜ አንጓዎች ውሂባቸውን ይጥላሉ;
  • ማመሳሰልን ማገድ ወረፋው እንዳይገኝ ያደርጋል።

ሁሉም አስቸጋሪ ውሳኔዎች ከእነዚህ ሁለት የስነ-ሕንፃ ባህሪያት የመነጩ ናቸው. RabbitMQ ክላስተርን በሚቀላቀልበት ጊዜ ውሂብን መቆጠብ ከቻለ ማመሳሰል ፈጣን ይሆናል። ማመሳሰልን አለማገድ የሚችል ቢሆን ኖሮ ትላልቅ ወረፋዎችን መደገፍ ይሻል ነበር። እነዚህን ሁለት ጉዳዮች ማስተካከል የ RabbitMQን አፈጻጸም እንደ ስህተት-ታጋሽ እና በጣም የሚገኝ የመልእክት መላላኪያ ቴክኖሎጂን በእጅጉ ያሻሽላል። በሚከተሉት ሁኔታዎች ውስጥ RabbitMQን ከስብስብ ጋር ለመምከር አመነታ ይሆናል፡

  • የማይታመን አውታረ መረብ.
  • የማይታመን ማከማቻ።
  • በጣም ረጅም መስመሮች.

ለከፍተኛ ተገኝነት ቅንብሮችን በተመለከተ፣ እነዚህን ያስቡበት፡-

  • ha-promote-on-failure=always
  • ha-sync-mode=manual
  • cluster_partition_handling=ignore (ወይም autoheal)
  • ዘላቂ መልዕክቶች
  • አንዳንድ መስቀለኛ መንገድ ሲወርድ ደንበኞች ከገባሪው መስቀለኛ መንገድ ጋር መገናኘታቸውን ያረጋግጡ

ለ ወጥነት (የውሂብ ደህንነት) የሚከተሉትን ቅንብሮች ያስቡበት፡

  • አታሚ በሸማች በኩል ማረጋገጫ እና በእጅ ምስጋናዎችን ያረጋግጣል
  • ha-promote-on-failure=when-syncedአታሚዎች በኋላ እንደገና መሞከር ከቻሉ እና በጣም ጠንካራ ማከማቻ ካለዎት! አለበለዚያ አስቀምጡ =always.
  • ha-sync-mode=automatic (ነገር ግን ትላልቅ የቦዘኑ ወረፋዎች በእጅ ሞድ ሊፈልጉ ይችላሉ፤ እንዲሁም አለመገኘት መልዕክቶች እንዲጠፉ ያደርጋቸው እንደሆነ ግምት ውስጥ ያስገቡ)
  • የአናሳ ሁነታን ባለበት አቁም
  • ዘላቂ መልዕክቶች

እስካሁን ድረስ ሁሉንም የስህተት መቻቻል እና ከፍተኛ ተገኝነት ጉዳዮችን አልሸፈንንም; ለምሳሌ አስተዳደራዊ ሂደቶችን (እንደ ማንከባለል ማሻሻያ ያሉ) በደህና እንዴት ማከናወን እንደሚቻል። ስለ ፌዴሬሽን እና ስለ አካፋ ፕለጊን መነጋገርም አለብን።

ሌላ ነገር ካመለጠኝ እባክዎን ያሳውቁኝ።

የኔንም ተመልከት ፖስትበዚህ ጽሁፍ ውስጥ የተገለጹትን አንዳንድ የመልዕክት መጥፋት ሁኔታዎችን ለመፈተሽ የ RabbitMQ ክላስተርን ከዶከር እና ከብሎኬት ጋር እየገለበጥኩ ነው።

በተከታታይ ውስጥ ያሉ ቀዳሚ መጣጥፎች፡-
ቁጥር 1 - habr.com/ru/company/itsumma/blog/416629
ቁጥር 2 - habr.com/ru/company/itsumma/blog/418389
ቁጥር 3 - habr.com/ru/company/itsumma/blog/437446

ምንጭ: hab.com

አስተያየት ያክሉ