RabbitMQ በኤርላንግ የተጻፈ የመልእክት ደላላ ሲሆን እያንዳንዱ መስቀለኛ መንገድ የማንበብ እና የመፃፍ ጥያቄዎችን የሚያገለግልበት ሙሉ የውሂብ ማባዛት ያለው የተሳካ ክላስተር እንዲያደራጁ የሚያስችልዎ ነው። በምርት ስራ ላይ ብዙ የኩበርኔትስ ክላስተር ስላለን፣ ብዙ ቁጥር ያላቸውን የ RabbitMQ ጭነቶች እንደግፋለን እና ያለማቋረጥ ውሂብ ከአንድ ክላስተር ወደ ሌላ የመሸጋገር አስፈላጊነት አጋጥሞናል።
ይህንን ክዋኔ ቢያንስ በሁለት አጋጣሚዎች እንፈልጋለን።
- መረጃን ከ RabbitMQ ክላስተር በኩበርኔትስ ውስጥ ከሌለው ወደ አዲስ - አስቀድሞ "kubernetized" (ማለትም በK8s pods ውስጥ የሚሰራ) - ክላስተር ማስተላለፍ።
- የ RabbitMQ ፍልሰት በኩበርኔትስ ውስጥ ከአንድ የስም ቦታ ወደ ሌላ (ለምሳሌ ወረዳዎች በስም ቦታዎች የተገደቡ ከሆነ፣ ከዚያም መሠረተ ልማትን ከአንድ ወረዳ ወደ ሌላ ለማስተላለፍ)።
በአንቀጹ ውስጥ የቀረበው የምግብ አዘገጃጀት በሁኔታዎች ላይ ያተኮረ ነው (ነገር ግን በእነሱ ብቻ የተገደበ አይደለም) አሮጌው RabbitMQ ክላስተር (ለምሳሌ ፣ የ 3 አንጓዎች) ፣ ቀድሞውኑ በ K8s ውስጥ ወይም በአንዳንድ የቆዩ አገልጋዮች ላይ ይገኛል። በ Kubernetes ላይ የተስተናገደ መተግበሪያ (ቀድሞውኑ አለ ወይም ወደፊት) ከእሱ ጋር ይሰራል፡
... እና ወደ ኩበርኔትስ ወደ አዲሱ ምርት የመሸጋገር ስራ ገጥሞናል።
በመጀመሪያ ደረጃ, የፍልሰት አጠቃላይ አቀራረብ ራሱ ይገለጻል, እና ከዚያ በኋላ የአተገባበሩ ቴክኒካዊ ዝርዝሮች ይገለፃሉ.
የፍልሰት ስልተ ቀመር
ከማንኛውም እርምጃ በፊት የመጀመሪያው ፣ የመጀመሪያ ደረጃ ፣ ከፍተኛ ተገኝነት ሁነታ በአሮጌው RabbitMQ ጭነት ውስጥ መንቃቱን ማረጋገጥ ነው።ha-mode: all
:
ቀጣዩ ደረጃ አዲስ የ RabbitMQ ክላስተር በ Kubernetes pods (በእኛ ሁኔታ, ለምሳሌ, 3 ኖዶችን ያካተተ, ግን ቁጥራቸው የተለየ ሊሆን ይችላል) ማሳደግ ነው.
ከዚህ በኋላ፣ አሮጌውን እና አዲሱን የ RabbitMQ ስብስቦችን እናዋህዳለን፣ አንድ ዘለላ (ከ6 አንጓዎች) እናገኛለን፡
በአሮጌው እና በአዲሱ የ RabbitMQ ስብስቦች መካከል የውሂብ ማመሳሰል ሂደት ተጀምሯል። አንዴ ሁሉም ውሂብ በክላስተር ውስጥ ባሉ ሁሉም አንጓዎች መካከል ከተመሳሰለ አዲሱን ክላስተር ለመጠቀም መተግበሪያውን መቀየር እንችላለን፡-
ከነዚህ ክዋኔዎች በኋላ የድሮውን አንጓዎች ከ RabbitMQ ክላስተር ማስወገድ በቂ ነው፣ እና እንቅስቃሴው እንደተጠናቀቀ ሊቆጠር ይችላል።
ይህንን እቅድ በምርት ውስጥ ብዙ ጊዜ ተጠቅመናል። ነገር ግን፣ ለራሳችን ምቾት፣ መደበኛ የRMQ ውቅሮችን በበርካታ የኩበርኔትስ ስብስቦች ላይ በሚያሰራጭ ልዩ ስርዓት ውስጥ ተግባራዊ አድርገነዋል። (ለማወቅ ለሚፈልጉ፡ እየተነጋገርን ያለነው
በተግባር እንሞክር
መስፈርቶች
ዝርዝሮቹ በጣም ቀላል ናቸው፡-
- የኩበርኔትስ ክላስተር (ሚኒኩቤ እንዲሁ ይሰራል);
- RabbitMQ ክላስተር (በባዶ ብረት ላይ ሊሰማራ ይችላል፣ እና ከኦፊሴላዊው Helm ገበታ በኩበርኔትስ ውስጥ እንደ መደበኛ ክላስተር የተሰራ)።
ከታች ላለው ምሳሌ፣ RMQ ን ወደ ኩበርኔትስ አሰማርኩ እና ደወልኩ። rmq-old
.
የቁም ዝግጅት
1. የ Helm ገበታውን ያውርዱ እና ትንሽ ያርትዑት፡-
helm fetch --untar stable/rabbitmq-ha
ለመመቻቸት የይለፍ ቃል አዘጋጅተናል፣ ErlangCookie
እና ፖለቲካ ያድርጉ ha-all
በነባሪነት ወረፋዎቹ በሁሉም የRMQ ክላስተር አንጓዎች መካከል እንዲመሳሰሉ፡-
rabbitmqPassword: guest
rabbitmqErlangCookie: mae9joopaol7aiVu3eechei2waiGa2we
definitions:
policies: |-
{
"name": "ha-all",
"pattern": ".*",
"vhost": "/",
"definition": {
"ha-mode": "all",
"ha-sync-mode": "automatic",
"ha-sync-batch-size": 81920
}
}
2. ገበታውን ጫን፡-
helm install . --name rmq-old --namespace rmq-old
3. ወደ RabbitMQ አስተዳዳሪ ፓነል ይሂዱ, አዲስ ወረፋ ይፍጠሩ እና ብዙ መልዕክቶችን ያክሉ. ከስደት በኋላ ሁሉም መረጃዎች እንደተጠበቁ እና ምንም ነገር እንዳላጣን ማረጋገጥ እንድንችል እነሱ ያስፈልጋሉ።
የሙከራው አግዳሚ ወንበር ዝግጁ ነው፡ ማስተላለፍ የሚያስፈልገው ውሂብ ያለው "አሮጌ" RabbitMQ አለን።
የ RabbitMQ ዘለላ በመሰደድ ላይ
1. መጀመሪያ፣ አዲሱን RabbitMQ ወደ ውስጥ እናሰማራ ጓደኛ የስም ቦታ ከ ጋር ተመሳሳይ ErlangCookie
እና ለተጠቃሚው የይለፍ ቃል. ይህንን ለማድረግ, RMQ ን ለመጫን የመጨረሻውን ትዕዛዝ ወደሚከተለው በመቀየር ከላይ የተገለጹትን ስራዎች እናከናውናለን.
helm install . --name rmq-new --namespace rmq-new
2. አሁን አዲሱን ክላስተር ከአሮጌው ጋር ማዋሃድ ያስፈልግዎታል. ይህንን ለማድረግ ወደ እያንዳንዱ ፖድ ይሂዱ አዲስ RabbitMQ እና ትእዛዞቹን አስፈጽም
export OLD_RMQ=rabbit@rmq-old-rabbitmq-ha-0.rmq-old-rabbitmq-ha-discovery.rmq-old.svc.cluster.local &&
rabbitmqctl stop_app &&
rabbitmqctl join_cluster $OLD_RMQ &&
rabbitmqctl start_app
በተለዋዋጭ OLD_RMQ
የአንዱ አንጓዎች አድራሻ ተገኝቷል ያረጀ የRMQ ዘለላ።
እነዚህ ትዕዛዞች የአሁኑን መስቀለኛ መንገድ ያቆማሉ አዲስ የRMQ ክላስተር፣ ከአሮጌው ክላስተር ጋር አያይዘው እና እንደገና ያስጀምሩት።
3. የ6 አንጓዎች የRMQ ክላስተር ዝግጁ ነው፡-
መልእክቶች በሁሉም አንጓዎች መካከል እስኪመሳሰሉ ድረስ መጠበቅ አለብዎት። የመልእክት ማመሳሰል ጊዜ ክላስተር በተዘረጋበት ሃርድዌር አቅም እና በመልእክቶች ብዛት ላይ የተመሰረተ ነው ብሎ ለመገመት አስቸጋሪ አይደለም። በተገለፀው ሁኔታ ውስጥ 10 የሚሆኑት ብቻ ናቸው ፣ ስለሆነም ውሂቡ ወዲያውኑ ተመሳስሏል ፣ ግን በበቂ ሁኔታ ብዛት ያላቸው መልዕክቶች ፣ ማመሳሰል ለሰዓታት ሊቆይ ይችላል።
ስለዚህ የማመሳሰል ሁኔታ፡-
ይህ ነው +5
መልእክቶች ገብተዋል ማለት ነው። ተጨማሪ በ 5 ኖዶች ላይ (በመስክ ላይ ከተጠቀሰው በስተቀር Node
). ስለዚህ, ማመሳሰል የተሳካ ነበር.
4. የቀረው በአፕሊኬሽኑ ውስጥ ያለውን የ RMQ አድራሻ ወደ አዲሱ ክላስተር መቀየር ብቻ ነው (እዚህ ላይ ያሉት የተወሰኑ ድርጊቶች እርስዎ በሚጠቀሙት የቴክኖሎጂ ቁልል እና ሌሎች የመተግበሪያ ዝርዝሮች ላይ የተመሰረቱ ናቸው) ከዚያ በኋላ የድሮውን መሰናበት ይችላሉ.
ለመጨረሻው ቀዶ ጥገና (ማለትም ቀድሞውኑ после ማመልከቻውን ወደ አዲስ ክላስተር መቀየር) ወደ እያንዳንዱ መስቀለኛ መንገድ ይሂዱ ያረጀ ክላስተር እና ትእዛዞቹን አስፈጽም
rabbitmqctl stop_app
rabbitmqctl reset
ክላስተር ስለ አሮጌ አንጓዎች "ረስተዋል" የድሮውን RMQ መሰረዝ ይችላሉ, በዚህ ጊዜ እንቅስቃሴው ይጠናቀቃል.
አመለከተ: የምስክር ወረቀቶችን በመጠቀም RMQ ን ከተጠቀሙ, ምንም በመሠረታዊነት አይለወጥም - የመንቀሳቀስ ሂደቱ በትክክል ይከናወናል.
ግኝቶች
RabbitMQን ለመሰደድ ወይም በቀላሉ ወደ አዲስ ክላስተር ለመሸጋገር ስንፈልግ የተገለጸው እቅድ ለሁሉም ማለት ይቻላል ተስማሚ ነው።
በእኛ ሁኔታ፣ RMQ ከበርካታ ቦታዎች ሲደረስ አንድ ጊዜ ብቻ ችግሮች ተፈጠሩ፣ እና የRMQ አድራሻን በየቦታው ወደ አዲስ ለመቀየር እድሉ አልነበረንም። ከዚያም በነባር አገልግሎቶች እና Ingresses ስር እንዲወድቅ አዲስ RMQ በዛው የስም ቦታ በተመሳሳይ መለያ አስጀመርን እና ፖድውን ስናስከፍት መለያዎቹን በእጃችን በማቀነባበር ጥያቄዎቹ ላይ እንዳይወድቁ መጀመሪያ ላይ እናስወግዳቸዋለን። ባዶ RMQ፣ እና መልእክቶቹ ከተመሳሰሉ በኋላ መልሰው ማከል።
RabbitMQ ን ከተለወጠ ውቅረት ጋር ወደ አዲስ ስሪት ስናዘምን ተመሳሳይ ስልት ተጠቀምን - ሁሉም ነገር እንደ ሰዓት ይሰራል።
PS
ለዚህ ቁሳቁስ ምክንያታዊ ቀጣይነት፣ ስለ MongoDB (ከሃርድዌር አገልጋይ ወደ ኩበርኔትስ ፍልሰት) እና MySQL (ይህን DBMS Kubernetes ውስጥ እንዴት እንደምናዘጋጅ) ጽሑፎችን እያዘጋጀን ነው። በሚቀጥሉት ወራት ውስጥ ይታተማሉ.
ፒፒኤስ
በብሎጋችን ላይ ያንብቡ፡-
ምንጭ: hab.com