MySQL لاءِ آرڪيسٽرٽر: توهان ان کان سواءِ غلطي برداشت ڪندڙ پروجيڪٽ ڇو نٿا ٺاهي سگهو

ڪو به وڏو منصوبو ڪجهه سرورن سان شروع ٿيو. شروعات ۾ اتي ھڪڙو ڊي بي سرور ھو، پوء پڙھڻ کي ماپ ڪرڻ لاء ٻانھن کي شامل ڪيو ويو. ۽ پوء - روڪي! اتي ھڪڙو مالڪ آھي، پر اتي ڪيترائي غلام آھن. جيڪڏھن ٻانھن مان ھڪڙو ڇڏي وڃي ته سڀ ڪجھ ٺيڪ ٿي ويندو، پر جيڪڏھن ماسٽر ڇڏي، اھو خراب ٿيندو: وقت ختم ٿيڻ، منتظمين سرور کي وڌائڻ جي ڪوشش ڪري رھيا آھن. ڇا ڪجي؟ هڪ ماسٽر محفوظ ڪريو. منهنجي ساٿي Pavel اڳ ۾ ئي هن جي باري ۾ لکيو آهي مضمون، مان ان کي ٻيهر نه ڏيندس. ان جي بدران، مان توهان کي ٻڌايان ٿو ته توهان کي يقيني طور تي MySQL لاءِ آرڪيسٽرٽر جي ضرورت ڇو آهي!

اچو ته بنيادي سوال سان شروع ڪريون: "جڏهن ماسٽر ڇڏي ٿو ته اسان ڪوڊ کي نئين مشين ۾ ڪيئن تبديل ڪنداسين؟"

  • مون کي VIP (ورچوئل IP) سان اسڪيم تمام گهڻي پسند آهي، اسان ان بابت هيٺ ڳالهائينداسين. اهو سڀ کان آسان ۽ سڀ کان وڌيڪ واضح آهي، جيتوڻيڪ ان ۾ هڪ واضح حد آهي: ماسٽر جيڪو اسان محفوظ ڪنداسين اهو لازمي آهي L2 حصي ۾ نئين مشين سان، اهو آهي، اسان ٻئي ڊي سي جي باري ۾ وساري سگهون ٿا. ۽، هڪ دوستانه طريقي سان، جيڪڏهن توهان قاعدي جي پيروي ڪندا آهيو ته هڪ وڏو L2 خراب آهي، ڇاڪاڻ ته L2 صرف في ريڪ آهي، ۽ L3 ريڪ جي وچ ۾ آهي، ۽ اهڙي منصوبي تي اڃا به وڌيڪ پابنديون آهن.
  • توهان ڪوڊ ۾ هڪ DNS نالو لکي سگهو ٿا ۽ ان کي حل ڪري سگهو ٿا /etc/hosts. حقيقت ۾، ڪو به حل نه ٿيندو. اسڪيم جو فائدو: پهرين طريقي جي ڪا خاص خصوصيت نه آهي، اهو آهي، اهو ممڪن آهي ته ڪراس ڊي سي کي منظم ڪرڻ. پر پوءِ واضح سوال پيدا ٿئي ٿو: اسان ڪيتري جلدي تبديلي کي پهچائي سگھون ٿا /etc/hosts ذريعي Puppet-Ansible؟
  • توھان ٻئي طريقي کي ٿورڙو تبديل ڪري سگھو ٿا: سڀني ويب سرورز تي ڪيشنگ ڊي اين ايس انسٽال ڪريو، جنھن ذريعي ڪوڊ ماسٽر ڊيٽابيس ڏانھن ويندا. توھان سيٽ ڪري سگھو ٿا TTL 60 ھن داخلا لاءِ DNS ۾. اهو لڳي ٿو ته جيڪڏهن صحيح طريقي سان عمل ڪيو وڃي، اهو طريقو سٺو آهي.
  • خدمت جي دريافت سان گڏ هڪ اسڪيم، جنهن ۾ قونصل ۽ وغيره جي استعمال جو مطلب آهي.
  • سان گڏ هڪ دلچسپ اختيار ProxySQL. توھان کي ضرورت آھي ته سموري ٽريفڪ کي MySQL ڏانھن ProxySQL ذريعي؛ ProxySQL پاڻ طئي ڪري سگھي ٿو ته ماسٽر ڪير آھي. رستي جي ذريعي، توهان هن پراڊڪٽ کي استعمال ڪرڻ لاء اختيارن مان هڪ بابت پڙهي سگهو ٿا منهنجي مضمون.

آرڪسٽريٽر جي ليکڪ، گٿب ۾ ڪم ڪري، پهرين پهرين اسڪيم کي VIP سان لاڳو ڪيو، ۽ پوء ان کي قونصل سان گڏ اسڪيم ۾ تبديل ڪيو.

عام بنيادي ڍانچي جي جوڙجڪ:

MySQL لاءِ آرڪيسٽرٽر: توهان ان کان سواءِ غلطي برداشت ڪندڙ پروجيڪٽ ڇو نٿا ٺاهي سگهو
آئون فوري طور تي واضح حالتن کي بيان ڪندس جن کي حساب ۾ رکڻ جي ضرورت آهي:

  • VIP ايڊريس ڪنهن به سرور تي ترتيب ۾ رجسٽر ٿيڻ نه گهرجي. اچو ته ھڪڙي صورتحال جو تصور ڪريو: ماسٽر ريبوٽ ڪيو، ۽ جڏھن اھو لوڊ ٿي رھيو ھو، آرڪيسٽرٽر فيل اوور موڊ ۾ ويو ۽ غلامن مان ھڪڙي کي ماسٽر بڻايو؛ پوء پراڻي ماسٽر گلاب، ۽ هاڻي VIP ٻن ڪارن تي آهي. هي خراب آهي.
  • آرڪيسٽرٽر لاءِ، توهان کي پراڻي ماسٽر ۽ نئين ماسٽر کي سڏڻ لاءِ اسڪرپٽ لکڻو پوندو. پراڻي ماسٽر تي توهان کي هلائڻ جي ضرورت آهي ifdown، ۽ نئين ماسٽر تي - ifup vip. اهو سٺو لڳندو ته هن اسڪرپٽ ۾ پڻ شامل ڪيو وڃي ته ناڪام ٿيڻ جي صورت ۾، پراڻي ماسٽر جي سوئچ تي بندرگاهن کي بند ڪيو ويو آهي ڪنهن به تقسيم کان بچڻ لاء.
  • آرڪيسٽرٽر کان پوءِ توهان جي اسڪرپٽ کي ڪال ڪيو ويو آهي پهريان VIP کي هٽائڻ لاءِ ۽/يا بندرگاهه کي بند ڪرڻ لاءِ، ۽ پوءِ سڏيو ويو VIP اسڪرپٽ نئين ماسٽر تي، آرپنگ ڪمانڊ استعمال ڪرڻ نه وساريو هر ڪنهن کي ٻڌائڻ لاءِ ته نئون VIP هاڻي آهي. هتي.
  • سڀني غلامن کي پڙهڻ گهرجي صرف = 1، ۽ جيئن ئي توهان غلام کي ماسٽر ڏانهن وڌايو، ان کي پڙهڻ گهرجي صرف = 0.
  • اهو نه وساريو ته ڪو به غلام جنهن کي اسان هن لاءِ چونڊيو آهي اهو مالڪ بڻجي سگهي ٿو (آرڪيسٽرٽر وٽ هڪ مڪمل ترجيحي ميکانيزم آهي جنهن لاءِ غلام کي نئين مالڪ لاءِ اميدوار سمجهي پهرين جاءِ تي، ڪهڙي ٻئي جاءِ تي، ۽ ڪهڙي غلام کي. ڪنهن به صورت ۾ نه چونڊيو وڃي ماسٽر). جيڪڏهن غلام آقا ٿي وڃي ته غلام جو بار به مٿس رهندو ۽ آقا جو بار به وڌندو، ان ڳالهه جو به خيال رکڻو پوندو.

توهان کي آرڪيسٽرٽر جي ضرورت ڇو آهي جيڪڏهن توهان وٽ ناهي؟

  • آرڪيسٽرٽر وٽ هڪ تمام صارف دوست گرافيڪل انٽرفيس آهي جيڪو پوري ٽوپولوجي کي ڏيکاري ٿو (هيٺ اسڪرين شاٽ ڏسو).
  • آرڪيسٽرٽر ٽريڪ ڪري سگھي ٿو ته ڪھڙا غلام پوئتي رهجي ويا آھن، ۽ ڪٿي نقل عام طور تي ٽوڙي وئي آھي (اسان وٽ ايس ايم ايس موڪلڻ لاءِ آرڪيسٽريٽر سان ڳنڍيل اسڪرپٽ آھن).
  • آرڪيسٽرٽر توهان کي ٻڌائي ٿو ته ڪهڙن غلامن وٽ GTID غلطي آهي.

آرڪيسٽرٽر انٽرفيس:

MySQL لاءِ آرڪيسٽرٽر: توهان ان کان سواءِ غلطي برداشت ڪندڙ پروجيڪٽ ڇو نٿا ٺاهي سگهو
GTID غلطي ڇا آهي؟

آرڪيسٽرٽر کي ڪم ڪرڻ لاءِ ٻه مکيه گهرجون آهن:

  • اهو ضروري آهي ته pseudo GTID سڀني مشينن تي MySQL ڪلستر ۾ فعال آهي؛ اسان GTID فعال ڪيو آهي.
  • اهو ضروري آهي ته هر جڳهه تي هڪ قسم جا binlogs هجن، توهان بيان استعمال ڪري سگهو ٿا. اسان وٽ ھڪڙي ترتيب ھئي جنھن ۾ آقا ۽ گھڻا ٻانھن جي قطار ھئي، ۽ ٻه تاريخي طور تي مخلوط موڊ ۾ رھيا. نتيجي طور، آرڪيسٽرٽر صرف انهن غلامن کي نئين ماسٽر سان ڳنڍڻ نه چاهيو.

ياد رهي ته پيداوار غلام ۾ سڀ کان اهم شيء ان جي مالڪ سان مطابقت آهي! جيڪڏهن توهان وٽ آهي گلوبل ٽرانزيڪشن ID (GTID) توهان جي مالڪ ۽ غلام ٻنهي تي، ته پوءِ توهان استعمال ڪري سگهو ٿا gtid_subset فنڪشن اهو معلوم ڪرڻ لاءِ ته ڇا ڊيٽا جي تبديلين لاءِ ساڳيون درخواستون انهن مشينن تي عمل ۾ آيون آهن. توھان ھن بابت وڌيڪ پڙھي سگھو ٿا هتي.

اهڙيء طرح، آرڪسٽرٽر توهان کي GTID غلطي ذريعي ڏيکاري ٿو ته غلام تي ٽرانزيڪشن آهن جيڪي ماسٽر تي نه آهن. ائين ڇو ٿي رهيو آهي؟

  • Read_only=1 غلام تي فعال نه آهي، ڪنهن سان ڳنڍيل آهي ۽ ڊيٽا کي تبديل ڪرڻ جي درخواست مڪمل ڪئي آهي.
  • Super_read_only=1 غلام تي فعال نه آهي، پوء منتظم، سرور کي پريشان ڪري، اندر ويو ۽ درخواست تي عمل ڪيو.
  • جيڪڏهن توهان ٻنهي پوئين نقطن کي حساب ۾ رکون ٿا، ته پوءِ هڪ وڌيڪ چال آهي: MySQL ۾، binlogs کي فلش ڪرڻ جي درخواست پڻ binlog ڏانهن وڃي ٿي، تنهنڪري پهرين فلش تي، هڪ GTID غلطي ظاهر ٿيندي ماسٽر ۽ سڀني غلامن تي. هن کان بچڻ لاء ڪيئن؟ Perona-5.7.25-28 متعارف ڪرايو binlog_skip_flush_commands=1 سيٽنگ، جيڪا منع ڪري ٿي binlogs تي فلش لکڻ. mysql.com ويب سائيٽ تي هڪ قائم ڪيل آهي بگ.

مون کي مٿي ڏنل سڀني کي اختصار ڪرڻ ڏيو. جيڪڏهن توهان اڃا تائين فيلو اوور موڊ ۾ آرڪيسٽرٽر کي استعمال ڪرڻ نٿا چاهيو ته پوءِ ان کي مشاهدي واري موڊ ۾ رکو. پوءِ توهان جي اکين اڳيان هميشه MySQL مشينن جي رابطي جو نقشو ۽ بصري معلومات هوندي ته هر مشين تي ڪهڙي قسم جي نقل آهي، ڇا غلام پوئتي رهجي ويا آهن، ۽ سڀ کان اهم، اهي ماسٽر سان ڪيترو مطابقت رکن ٿا!

واضح سوال آهي: "آرڪيسٽرٽر کي ڪيئن ڪم ڪرڻ گهرجي؟" هن کي موجوده غلامن مان هڪ نئون ماسٽر چونڊڻ گهرجي، ۽ پوءِ سڀني غلامن کي ان سان ڳنڍڻ گهرجي (انهي لاءِ GTID جي ضرورت آهي؛ جيڪڏهن توهان binlog_name ۽ binlog_pos سان پراڻي ميکانيزم کي استعمال ڪريو ٿا، ته پوءِ غلام کي تبديل ڪري موجوده مالڪ کان نئين ۾. بلڪل ناممڪن آهي!). ان کان اڳ جو اسان وٽ آرڪيسٽرٽر هجي، مون کي هڪ دفعو اهو سڀ ڪجهه دستي طور ڪرڻو پيو. پراڻو ماسٽر هڪ بگي اڊاپٽيڪ ڪنٽرولر جي ڪري لٽڪيل هو؛ ان ۾ اٽڪل 10 ٻانهن هئا. مون کي VIP کي ماسٽر کان غلامن مان هڪ ڏانهن منتقل ڪرڻ ۽ ٻين سڀني غلامن کي ان سان ٻيهر ڳنڍڻ جي ضرورت هئي. مون کي ڪيترا ڪنسولز کولڻا هئا، مون ڪيترا هڪ ئي وقت ۾ ڪمانڊ داخل ڪيا هئا... مون کي 3 وڳي تائين انتظار ڪرڻو پيو، ٻن ٻانهن کان سواءِ سڀني ٻانهن تان لوڊ هٽايو، پهرين مشين کي ٻن ماسٽرن مان ٺاهيو، ٻي مشين کي فوري طور تي ڳنڍيو. ان تي، تنهنڪري ٻين سڀني غلامن کي نئين ماسٽر سان ڳنڍيو ۽ لوڊ واپس ڏيو. مجموعي طور تي، خوفناڪ ...

آرڪيسٽرٽر ڪيئن ڪم ڪندو آهي جڏهن اهو ناڪامي موڊ ۾ وڃي ٿو؟ اهو سڀ کان وڌيڪ آساني سان بيان ڪيو ويو آهي هڪ اهڙي صورتحال جي مثال سان جتي اسان هڪ ماسٽر ٺاهڻ چاهيون ٿا هڪ وڌيڪ طاقتور، وڌيڪ جديد مشين جيڪو اسان وٽ آهي.

MySQL لاءِ آرڪيسٽرٽر: توهان ان کان سواءِ غلطي برداشت ڪندڙ پروجيڪٽ ڇو نٿا ٺاهي سگهو
نقشو عمل جي وچ ۾ ڏيکاري ٿو. هن وقت تائين ڇا ڪيو ويو آهي؟ اسان چيو ته اسان ڪجهه غلام کي نئون ماسٽر بڻائڻ چاهيون ٿا، آرڪيسٽرٽر صرف ان سان ٻين سڀني غلامن کي ٻيهر ڳنڍڻ شروع ڪيو، نئين ماسٽر ٽرانزٽ مشين جي طور تي ڪم ڪري رهيو آهي. هن اسڪيم سان، ڪا به غلطي نه ٿي ٿئي، سڀ غلام ڪم ڪن ٿا، آرڪيسٽراٽر VIP کي پراڻي ماسٽر کان هٽائي ٿو، ان کي نئين ۾ منتقل ڪري ٿو، صرف read_only = 0 ڪري ٿو ۽ پراڻي ماسٽر جي باري ۾ وساري ٿو. سڀ! اسان جي خدمت جو وقت VIP منتقلي جو وقت آهي، جيڪو 2-3 سيڪنڊ آهي.

اهو سڀ ڪجهه اڄ لاءِ آهي، توهان سڀني جي مهرباني. آرڪيسٽريٽر جي باري ۾ جلد ئي ٻيو مضمون هوندو. مشهور سوويت فلم "گيراج" ۾، هڪ ڪردار چيو، "مان هن سان گڏ نه وڃان ها!" سو، آرڪيسٽرٽر، مان توسان گڏ ويندس تحقيق تي!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو