uy - Kompyuterlar
MySQL da replikatsiya asoslari. MySQL ma'lumotlar bazasi replikatsiyasini sozlash Master dasturini o'rnatish va sozlash

Hammaga xayrli kun! Bugun bizning maqolamizda "master-qul" turini replikatsiya qilishni o'rnatish misollarini ko'rib chiqamiz.

Bir oz nazariya

Nega replikatsiya kerak? Avvalo, bu asosiy MySQL serveri ishlamay qolganda xavfsizlik tarmog'idir, keyin siz slave serverga o'tishingiz va ishlashni davom ettirishingiz mumkin. Ikkinchidan, bu asosiy serverdan faqat yozish uchun foydalanish va tobe serverda o'qish operatsiyalarini bajarish orqali asosiy Mysql serveridagi yukni kamaytirish imkoniyatidir. Replikatsiya qanday sodir bo'ladi? Asosiy server binloglarni yozadi, unda ma'lumotlar bazasida (ma'lumotlar bazalari) bajariladigan operatsiyalarni ko'rsatadi va jurnaldagi ofsetni boshidan joriy yozuv (pozitsiya)gacha eslab qoladi. To'g'ri server masterga ulanadi, pozitsiya qiymatlarini solishtiradi va jurnaldagi o'zgarishlarni o'z pozitsiyasining qiymatidan boshlab va master pozitsiyasining qiymati bilan yakunlanadi. U tobe serverdagi ma'lumotlar bazalariga o'zgartirishlarni (buyruqlarni) qo'llaydi.

Master-ni o'rnatish va sozlash

Bosh serverda my.cnf ni o'zgartiramiz:

Server-id = 1 - server identifikatorini ko'rsating log_bin = /var/log/mysql/mysql-bin.log - jurnal nomi va yo'li

Kichik tushuntirish: sukut bo'yicha, sehrgar barcha ma'lumotlar bazalari uchun binloglarni yozadi, buni "binlog-do-db" yordamida o'zgartirish mumkin. Muayyan ma'lumotlar bazasidan foydalanilganda qiymatlar jurnallarda qayd etiladi, boshqa ma'lumotlar bazalaridagi o'zgarishlar qayd etilmaydi. Bu yerda siz jurnallarni qancha kun saqlash kerakligini, ularning maksimal hajmini belgilashingiz mumkin (expire_logs_days va max_binlog_size parametrlari). MySQL-ga foydalanuvchini qo'shing, uning huquqlari asosida replikatsiya qilinadi:

replikatsiya qulini YO'QING *.* TO user_name@ip_slave_server TO "parol" BILAN Identifikatsiya qilinadi;

replikatsiya tobe - foydalanuvchiga binloglarni o'qish imkonini beruvchi imtiyoz. ip_slave_server - foydalanuvchi ulanadigan serverning IP-si. MySQL serverini qayta ishga tushiring:

/etc/init.d/mysql-ni qayta ishga tushiring

Keling, magistrning ishini tekshiramiz:

Asosiy holatni ko'rsatish;

Siz binlog nomini va uning o'rnini ko'rishingiz kerak. Ma'lumotlar bazasida buyruqlarni bajarishda pozitsiya o'zgaradi.

Tobeni sozlash

my.cnf fayliga o'zgartirishlar kiritamiz:

Server-id = 2 - tobe server identifikatori asosiy identifikatordan farq qilishi kerak. relay-log = /var/lib/mysql/mysql-relay-bin - ikkilik jurnal kabi ma'lumotlar bazasidagi o'zgarishlarni tavsiflovchi voqealarni o'z ichiga olgan raqamlangan fayllar to'plamidan iborat. relay-log-index = /var/lib/mysql/mysql-relay-bin.index - ishlatilayotgan barcha relay jurnali fayllari nomlarini o'z ichiga olgan indeks fayli. replicate-do-db = replikatsiya qilinadigan ma'lumotlar bazasi.

Muhim eslatma! O'zaro JB ni tashkil qilishda (bir ma'lumotlar bazasidan foydalanilganda va ma'lumotlar boshqa ma'lumotlar bazasida yangilanganda), binlog-do-db asosiy server sozlamalarida ko'rsatilishi shart emas, binlog- va barcha ma'lumotlar bazalari uchun yozilishi kerak va tobe sozlamalari o'rniga replicate-do dan foydalanish kerak -db replicate-wild-do-table=db_name.% belgilang, bu erda db_name replikatsiya qilingan ma'lumotlar bazasi nomidir. MySQL serverini qayta ishga tushiring:

/etc/init.d/mysql-ni qayta ishga tushiring

Replikatsiyani yoqish

SET GLOBAL faqat o'qish uchun = ON;

Keling, ustaning holatiga qaraylik:

Asosiy holatni ko'rsatish;

Biz Fayl va Position qiymatlarini eslaymiz (yoki yaxshiroq, ularni yozib oling). Position qiymati hozir o'zgarmasligi kerak. Biz masterni mysqldump buyrug'i yordamida o'chirib tashlaymiz:

Mysqldump -uname -ppassword db_master_name > dump_db,

bu yerda nom – foydalanuvchi nomi, parol – parol, db_master_name – ma’lumotlar bazasi nomi, dump_db – dump nomi. Damp tugagandan so'ng biz ma'lumotlar bazasiga yozishga ruxsat beramiz:

SET GLOBAL faqat o'qish uchun = OFF;

Biz axlatni qulga o'tkazamiz va uni kengaytiramiz

Mysql -uname -ppassword db_slave_name< dump_db

Replikatsiyani sozlash

MASTERNI MASTER_HOSTGA O'ZGARTIRING = "master ip", MASTER_USER = "foydalanuvchi_nomi", MASTER_PASSWORD = "parol", MASTER_LOG_FILE = "jurnal nomi", MASTER_LOG_POS = pozitsiya;

master ip - master joylashgan serverning IP-si, foydalanuvchi nomi - biz masterda yaratgan foydalanuvchi nomi, jurnal nomi - ma'lumotlar bazasini tashlab yuborish amalga oshirilganda masterdagi Fayl qiymati, joylashuv - Position qiymati ma'lumotlar bazasi dumpi yaratilganda master. Qulni boshlaylik:

Qulni ishga tushirish;

Keling, replikatsiya qanday ketayotganini ko'rib chiqaylik: Masterda: KO'RSATISH MASTER STATUS\G To'g'ridan-to'g'ri: SLAVE STATUS\G

Asosiy serverdagi xavfsizlik sozlamalari

/etc/mysql/my.cnf-dagi bog'lanish manzili parametri ulanishni kutayotganda MySQL serveri qaysi IP-manzilni tinglashini belgilaydi. Odatda u bog'lanish manzili = 127.0.0.1 qiymatiga ega. Biroq, tobe serverni o'rnatgandan so'ng, biz tobe serverdan ulanishga ruxsat berishimiz kerak va mahalliy ulanishlar ishlashi kerak. Ulanish manzili faqat bitta IP dan yoki barchasidan ulanishga ruxsat berishi mumkin. Chunki ulanish uchun bir nechta ipni ko'rsatishimiz kerak, biz bog'lanish manzili = 127.0.0.1 bilan qatorni sharhlaymiz. Endi MySQL serveri barcha IP manzillardan ulanishlarni qabul qiladi, bu juda xavflidir. iptables bu muammoni hal qilishga yordam beradi:

Iptables -I INPUT -p tcp -s ip_slave_server-a --dport 3306 -j ACCEPT -birinchi navbatda tobe serverning IP-manzilidan ulanishga ruxsat bering iptables -I INPUT -p tcp --dport 3306 -j DROP -keyin ulanishni rad eting boshqa barcha IP manzillar.

Endi bizda master-slave rejimida ishlaydigan 2 ta MySQL server bo'ladi, bu sayt ishonchliligini sezilarli darajada oshiradi va ba'zi Drupal saytlari uchun ish tezligini oshirishga yordam beradi. Keyingi maqolada biz asosiy server ishlamay qolganda asosiy va tobe rejimlarni almashtirishni ko'rib chiqamiz.

Men MySQL serverlarining replikatsiyasi bilan nisbatan yaqinda tanishdim va konfiguratsiya bilan turli tajribalar o'tkazar ekanman, men uchun nima ishlaganini yozdim. Men juda ko'p material to'plaganimda, ushbu maqolani yozish g'oyasi paydo bo'ldi. Men duch kelgan ba'zi eng asosiy muammolar bo'yicha maslahatlar va echimlarni to'plashga harakat qildim. Yo'lda men hujjatlar va boshqa manbalarga havolalar beraman. Men buni to'liq tasvirlab bera olmayman, lekin maqola foydali bo'ladi deb umid qilaman.

Qisqacha kirish

Replikatsiya (lotincha replico - takrorlayman) - asosiy ma'lumotlar bazasi serveridan bir yoki bir nechta qaram serverlarga ma'lumotlar o'zgarishini takrorlash. Biz asosiy serverga qo'ng'iroq qilamiz usta, va qaram - nusxalar.
Magistrda sodir bo'lgan ma'lumotlar o'zgarishi replikalarda takrorlanadi (lekin aksincha emas). Shuning uchun ma'lumotlarni o'zgartirish bo'yicha so'rovlar (INSERT, UPDATE, DELETE va boshqalar) faqat masterda bajariladi, ma'lumotlarni o'qish uchun so'rovlar (boshqacha aytganda, SELECT) ham replikalarda, ham masterda bajarilishi mumkin. Replikalarning birida takrorlash jarayoni boshqa replikalarning ishlashiga ta'sir qilmaydi va deyarli ustaning ishiga ta'sir qilmaydi.
Replikatsiya masterda saqlanadigan ikkilik jurnallar yordamida amalga oshiriladi. Ular ma'lumotlar bazasidagi o'zgarishlarga olib keladigan (yoki potentsial olib keladigan) barcha so'rovlarni saqlaydi (so'rovlar aniq saqlanmaydi, shuning uchun ularni ko'rishni istasangiz, mysqlbinlog yordam dasturidan foydalanishingiz kerak bo'ladi). Binloglar replikalarga o'tkaziladi (masterdan yuklab olingan binlog "relay binlog" deb ataladi) va saqlangan so'rovlar ma'lum bir pozitsiyadan boshlab bajariladi. Shuni tushunish kerakki, replikatsiya paytida o'zgartirilgan ma'lumotlarning o'zi emas, balki faqat so'rovlar o'zgarishlarga olib keladi.
Replikatsiya bilan ma'lumotlar bazasi tarkibi bir nechta serverlarda takrorlanadi. Nega dublikatsiyaga murojaat qilish kerak? Bir nechta sabablar bor:
  • ishlash va miqyoslilik. Bitta server ma'lumotlar bazasida bir vaqtning o'zida o'qish va yozish operatsiyalari tufayli yuzaga keladigan yukni bajara olmasligi mumkin. Replikalarni yaratishning afzalliklari tizimingizda har bir yozish uchun qancha ko'p o'qilgan bo'lsa, shuncha ko'p bo'ladi.
  • xatolarga chidamlilik. Replikatsiya ishlamay qolsa, barcha o'qish so'rovlari masterga xavfsiz tarzda o'tkazilishi mumkin. Agar master muvaffaqiyatsiz bo'lsa, yozish so'rovlari replikaga o'tkazilishi mumkin (magistr qayta tiklangandan so'ng u replika rolini o'z zimmasiga olishi mumkin).
  • ma'lumotlarni zaxiralash. Mysqldump-ni bajarish uchun replika bir muddat “sekinlashishi” mumkin, lekin master buni qila olmaydi.
  • kechiktirilgan hisob-kitoblar. Og'ir va sekin SQL so'rovlari butun tizimning normal ishlashiga xalaqit berishdan qo'rqmasdan alohida nusxada bajarilishi mumkin.
Bundan tashqari, boshqa qiziqarli xususiyatlar mavjud. Replikalarga ma'lumotlarning o'zi emas, balki ularning o'zgarishiga sabab bo'lgan so'rovlar uzatilganligi sababli, biz master va replikalarda turli jadval tuzilmalaridan foydalanishimiz mumkin. Xususan, jadval turi (dvigatel) yoki indekslar to'plami farq qilishi mumkin. Misol uchun, to'liq matnli qidiruvni amalga oshirish uchun, master InnoDB-dan foydalanishiga qaramay, replikada MyISAM jadval turidan foydalanishimiz mumkin.

Replikatsiyani sozlash

Aytaylik, bizda allaqachon ma'lumotlar bilan to'ldirilgan va yoqilgan ishlaydigan MySQL ma'lumotlar bazasi mavjud. Va yuqorida tavsiflangan sabablardan biriga ko'ra, biz serverimiz replikatsiyasini yoqmoqchimiz. Bizning dastlabki ma'lumotlarimiz:
  • Asosiy IP-manzil 192.168.1.101, nusxalari 192.168.1.102.
  • MySQL o'rnatildi va sozlandi
  • testdb ma'lumotlar bazasi replikatsiyasini sozlashingiz kerak
  • biz sehrgarni bir muddat to'xtatib qo'yishimiz mumkin
  • Albatta, ikkala mashinada ham root mavjud
Sehrgar sozlamalari
Bo'limda noyob server identifikatorini, ikkilik jurnallar yo'lini va replikatsiya uchun ma'lumotlar bazasi nomini ko'rsatishni unutmang:
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb
Ikkilik jurnallar uchun diskda etarli joy mavjudligiga ishonch hosil qiling.

Replikatsiya foydalanuvchisini qo'shamiz, uning huquqlari ostida replikatsiya amalga oshiriladi. "Replikatsiya qul" imtiyozi etarli bo'ladi:
mysql@master> "testdb" da replikatsiya qulini GRANT.* TO "replikatsiya"@"192.168.1.102" "parol" BILAN Identifikatsiya qilinadi;

Konfiguratsiyadagi o'zgarishlar kuchga kirishi uchun MySQL-ni qayta ishga tushiring:
root@master# xizmati mysqld-ni qayta ishga tushiring

Agar hamma narsa yaxshi bo'lsa, "bosh maqomini ko'rsatish" buyrug'i shunday ko'rsatilishi kerak:
mysql@master>MASTER STATUSNI KO'RSATISH\G
Fayl: mysql-bin.000003
Lavozim: 98
Binlog_Do_DB:
Binlog_Ignore_DB:
Magistrdagi ma'lumotlar bazasiga o'zgartirishlar kiritilganda pozitsiya qiymati oshishi kerak.

Replikatsiya sozlamalari
Konfiguratsiya bo'limida server identifikatorini, replikatsiya uchun ma'lumotlar bazasi nomini va relay binloglariga yo'lni belgilaymiz, keyin MySQL-ni qayta ishga tushiramiz:
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

Root@replica# xizmati mysqld-ni qayta ishga tushiring

Ma'lumotlarni uzatish
Bu erda biz yozish uchun ma'lumotlar bazasini bloklashimiz kerak. Buning uchun siz ilovalarni to'xtatishingiz yoki masterdagi faqat o'qish belgisidan foydalanishingiz mumkin (diqqat: bu bayroq SUPER imtiyozli foydalanuvchilarga ta'sir qilmaydi). Agar bizda MyISAM jadvallari bo'lsa, keling, "jadvallarni tozalash" ham qilaylik:
mysql@master> JADVALLARNI O'QISH QULFI BILAN YUVLASH;
mysql@master> SET GLOBAL faqat o'qish uchun = ON;

"Master statusini ko'rsatish" buyrug'i bilan usta holatini ko'rib chiqamiz va Fayl va Position qiymatlarini eslaymiz (magistrni muvaffaqiyatli bloklagandan so'ng ular o'zgarmasligi kerak):
Fayl: mysql-bin.000003
Lavozim: 98

Biz ma'lumotlar bazasini o'chirib tashlaymiz va operatsiya tugagandan so'ng biz masterning qulfini olib tashlaymiz:
mysql@master> SET GLOBAL faqat o'qish uchun = OFF;

Biz dumpni replikaga o'tkazamiz va undan ma'lumotlarni tiklaymiz.
Nihoyat, biz replikatsiyani "masterni o'zgartirish" va "qulni ishga tushirish" buyruqlari bilan boshlaymiz va hamma narsa yaxshi ketayotganligini tekshiramiz:
mysql@replica> MASTERNI MASTER_HOSTGA O'ZGARTIRISh = "192.168.1.101", MASTER_USER = "replikatsiya", MASTER_PASSWORD = "parol", MASTER_LOG_FILE = "mysql-bin.000003", MASTER_9 =;
mysql@replica> qulni ishga tushirish;
Biz masterdan MASTER_LOG_FILE va MASTER_LOG_POS qiymatlarini olamiz.

Keling, "qul holatini ko'rsatish" buyrug'i bilan replikatsiya qanday ketayotganini ko'rib chiqamiz:
mysql@replica> QO'L HOLATINI KO'RSATISH\G
Slave_IO_State: master tadbir yuborishini kutmoqda
Master_Xost: 192.168.1.101
Master_User: replikatsiya
Master_Port: 3306
Ulanish_qayta urinish: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Ha
Slave_SQL_Running: Ha
Replicate_Do_DB: testdb, testdb
Replicate_Ignore_DB:
Replicate_do_jadval:
Replicate_Ignore_jadval:
Replicate_Wild_Do_jadval:
Replicate_Wild_Ignore_jadval:
Oxirgi_xato: 0
Oxirgi_Xato:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Shartgacha: Yo'q
Log_Filegacha:
_Log_Posgacha: 0
Master_SSL_Ruxsat berilgan: Yo'q
Master_SSL_CA_Fayl:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Magistrning_orqasida_soniyalar: 5

Men hozir eng qiziqarli qadriyatlarni ta'kidladim. Agar replikatsiya muvaffaqiyatli boshlansa, ularning qiymatlari ro'yxatdagi bilan taxminan bir xil bo'lishi kerak (hujjatlardagi "qul holatini ko'rsatish" buyrug'ining tavsifiga qarang). Seconds_Behind_Master qiymati har qanday butun son bo'lishi mumkin.
Agar replikatsiya normal bo'lsa, replika masterga amal qiladi (Master_Log_File-dagi jurnal raqami va Exec_Master_Log_Pos pozitsiyasi ortadi). Magistrdan replikatsiyaning kechikish vaqti (Seconds_Behind_Master), ideal holda, nolga teng bo'lishi kerak. Agar u kamaymasa yoki o'smasa, replikadagi yuk juda yuqori bo'lishi mumkin - bu ustada sodir bo'lgan o'zgarishlarni takrorlashga vaqt topolmaydi.
Agar Slave_IO_State bo'sh va Seconds_Behind_Master NULL bo'lsa, replikatsiya boshlanmagan. Buning sababini bilish, uni yo'q qilish va replikatsiyani qayta boshlash uchun MySQL jurnaliga qarang:
mysql@replica> qulni ishga tushirish;

Ushbu oddiy qadamlar orqali biz ma'lumotlari masterdagi ma'lumotlar bilan bir xil bo'lgan nusxani olamiz.
Aytgancha, usta blokirovka qilingan vaqt - bu axlatni yaratish vaqti. Agar yaratish uchun qabul qilib bo'lmaydigan darajada uzoq vaqt kerak bo'lsa, buni sinab ko'rishingiz mumkin:

  • faqat o'qish bayrog'i bilan masterga yozishni bloklang, pozitsiyani eslang va MySQL-ni to'xtating.
  • shundan so'ng, ma'lumotlar bazasi fayllarini replikaga nusxalash va masterni yoqing.
  • odatiy tarzda takrorlashni boshlang.
Ustani umuman to'xtatmasdan replika yaratishning bir necha yo'li mavjud, ammo ular har doim ham ishlamaydi.

Replikalarni qo'shish

Aytaylik, bizda allaqachon ishlaydigan usta va replika mavjud va biz ularga yana bittasini qo'shishimiz kerak. Buni ustaga birinchi nusxani qo'shishdan ko'ra qilish osonroq. Va bundan ham yoqimlisi shundaki, buning uchun ustani to'xtatishning hojati yo'q.
Birinchidan, ikkinchi nusxada MySQL-ni sozlaymiz va konfiguratsiyaga kerakli parametrlarni kiritganimizga ishonch hosil qilamiz:
server-id = 3
replicate-do-db = testdb

Endi birinchi replikada replikatsiyani to'xtatamiz:
mysql@replica-1> qulni to'xtatish;

Replika odatdagidek ishlashda davom etadi, ammo undagi ma'lumotlar endi joriy bo'lmaydi. Keling, holatni ko'rib chiqaylik va replikatsiya replikatsiyani to'xtatishdan oldin erishgan asosiy pozitsiyani eslaylik:
mysql@replica-1> QO'L HOLATINI KO'RSATISH\G

Bizga kerak bo'lgan qiymatlar Master_Log_File va Exec_Master_Log_Pos bo'ladi:
Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 155

Keling, ma'lumotlar bazasi dumpini yaratamiz va birinchi replikada replikatsiyani davom ettiramiz:
mysql@replica-1> SLAVE START;

Keling, ikkinchi nusxadagi axlatxonadan ma'lumotlarni tiklaylik. Keyin replikatsiyani yoqing:
mysql@replica-2> MASTERNI MASTER_HOSTGA O'ZGARTIRISh = "192.168.1.101", MASTER_USER = "replikatsiya", MASTER_PASSWORD = "parol", MASTER_LOG_FILE = "mysql-bin.000004", MASPOS5;
mysql@replica-2> SLAVE START;

MASTER_LOG_FILE va MASTER_LOG_POS qiymatlari mos ravishda Master_Log_File va Exec_Master_Log_Pos qiymatlari bo'lib, birinchi replikadagi "qul holatini ko'rsatish" buyrug'i natijasidir.
Replikatsiya birinchi replika to'xtatilgan joydan boshlanishi kerak (va shunga mos ravishda dump yaratiladi). Shunday qilib, biz bir xil ma'lumotlarga ega ikkita nusxaga ega bo'lamiz.

Replikalarni birlashtirish

Ba'zan quyidagi holat yuzaga keladi: masterda ikkita ma'lumotlar bazasi mavjud bo'lib, ulardan biri bitta replikada, ikkinchisi esa boshqasida takrorlanadi. Ikkala nusxada ikkita ma'lumotlar bazasini replikatsiya qilishni masterga tashlamasdan yoki uni o'chirmasdan qanday sozlash mumkin? Oddiy qilib aytganda, "to'lni ishga tushirishgacha" buyrug'idan foydalaning.
Shunday qilib, bizda testdb1 va testdb2 ma'lumotlar bazalari mavjud bo'lib, ular mos ravishda replika-1 va replika-2 replikalarida takrorlanadi. Keling, masterni to'xtatmasdan ikkala ma'lumotlar bazasining replikatsiyasini replika-1 ga sozlaymiz.
Buyruq bilan replika-2 da replikatsiyani to'xtating va masterning o'rnini eslang:
mysql@replica-2> TO'XT QUL;
mysql@replica-2> QO'L HOLATINI KO'RSATISH\G
Master_Log_File: mysql-bin.000015
Exec_Master_Log_Pos: 231

Testdb2 ma'lumotlar bazasining axlatini yaratamiz va replikatsiyani davom ettiramiz (bu replika-2 bilan manipulyatsiyani yakunlaydi). Biz dumpni replika-1 ga tiklaymiz.

Replika-1da vaziyat quyidagicha: testdb1 ma'lumotlar bazasi bitta asosiy pozitsiyada va replikatsiya qilishda davom etmoqda, testdb2 ma'lumotlar bazasi boshqa pozitsiyadan chiqindixonadan tiklandi. Keling, ularni sinxronlashtiramiz.

Keling, replikatsiyani to'xtatamiz va usta pozitsiyasini eslaylik:
mysql@replica-1> TO'XT QUL;
mysql@replica-1> QO'L HOLATINI KO'RSATISH\G
Exec_Master_Log_Pos: 501

Replika-1 konfiguratsiyasida ikkinchi ma'lumotlar bazasi nomi bo'limda ko'rsatilganligiga ishonch hosil qilaylik:
replicate-do-db = testdb2

Konfiguratsiyadagi o'zgarishlar kuchga kirishi uchun MySQL-ni qayta ishga tushiramiz. Aytgancha, replikatsiyani to'xtatmasdan MySQL-ni shunchaki qayta ishga tushirish mumkin edi - jurnaldan biz master replikatsiyaning qaysi pozitsiyasida to'xtaganini bilib olamiz.

Keling, replika-2 to'xtatilgan joydan biz replikatsiyani to'xtatib qo'ygan holatga takrorlaymiz:
mysql@replica-1> MASTERNI MASTER_HOSTGA O'ZGARTIRISh = "192.168.1.101", MASTER_USER = "replikatsiya", MASTER_PASSWORD = "parol", MASTER_LOG_FILE = "mysql-bin.000015",_132G;_13;
mysql@replica-1> MASTER_LOG_FILE = "mysql-bin.000016 ", MASTER_LOG_POS = 501 gacha ishga tushirish;

Replikatsiya qadar bo'limida ko'rsatilgan pozitsiyaga etib borishi bilan replikatsiya tugaydi, shundan so'ng bizning ikkala ma'lumotlar bazamiz bir xil asosiy pozitsiyaga to'g'ri keladi (biz replika-1da replikatsiyani to'xtatdik). Keling, bunga ishonch hosil qilaylik:
mysql@replica-1> QO'L HOLATINI KO'RSATISH\G
mysql@replica-1> SLAVE START;
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Pos: 501

Keling, ikkala ma'lumotlar bazasining nomlarini bo'limdagi replika-1 uchun konfiguratsiyaga qo'shamiz:
replicate-do-db = testdb1
replicate-do-db = testdb2

Muhim: har bir ma'lumotlar bazasi alohida qatorda ko'rsatilishi kerak.
MySQL-ni qayta ishga tushiring va replikatsiyani davom ettiring:
mysql@replica-1> MASTERNI MASTER_HOSTGA O'ZGARTIRISh = "192.168.1.101", MASTER_USER = "replikatsiya", MASTER_PASSWORD = "parol", MASTER_LOG_FILE = "mysql-bin.000016", MASPOS;_1
Replika-1 master bilan uchrashgandan so'ng, ularning ma'lumotlar bazasi tarkibi bir xil bo'ladi. Siz ma'lumotlar bazasini replika-2 bilan birlashtirishingiz mumkin yoki shunga o'xshash tarzda yoki replika-1ni to'liq yig'ish orqali.

Kasting ustasi va nusxasi

Replikani asosiy rejimga o'tkazish kerak bo'lishi mumkin, masalan, master ishlamay qolganda yoki unda texnik ishlarni bajarishda. Bunday almashtirishni amalga oshirish uchun siz replikani master kabi sozlashingiz yoki uni amalga oshirishingiz kerak passiv usta.

Keling, bo'limdagi konfiguratsiyada ikkilik jurnalni (reley binloglaridan tashqari) yoqaylik:
log-bin = /var/lib/mysql/mysql-bin

Va replikatsiya uchun foydalanuvchi qo'shing:
mysql@master> 'testdb' OSHIDA replikatsiya to'g'ridan-to'g'ri GRANT.* TO 'replication'@'192.168.1.101' "parol" BILAN ANSIYLANGAN;

Passiv master oddiy replika kabi replikatsiyani amalga oshiradi, lekin qo'shimcha ravishda u binar logiyalarni yaratadi - ya'ni biz undan replikatsiyani boshlashimiz mumkin. Buni "master statusini ko'rsatish" buyrug'i bilan tekshiramiz:
mysql@replica> MASTER STATUSNI KO'RSATISH\G
Fayl: mysql-bin.000001
Lavozim: 61
Binlog_Do_DB:
Binlog_Ignore_DB:

Endi passiv masterni faol rejimga o'tkazish uchun siz undagi replikatsiyani to'xtatishingiz va avvalgi faol masterda replikatsiyani yoqishingiz kerak. O'tish vaqtida ma'lumotlar yo'qolmasligini ta'minlash uchun, faol usta yozish bloklangan bo'lishi kerak.
mysql@master> JADVALLARNI O'QISH BO'LISHI BILAN YUVLASH
mysql@master> SET GLOBAL faqat o'qish uchun = ON;
mysql@replica> TO'XT QUL;
mysql@replica> MASTER STATUSNI KO'RSATISH;
Fayl: mysql-bin.000001
Lavozim: 61
mysql@master> MASTERNI MASTER_HOSTGA O'ZGARTIRISh = "192.168.1.102", MASTER_USER = "replikatsiya", MASTER_PASSWORD = "parol", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_1;
mysql@master> qulni ishga tushirish;
Hammasi shu, shuning uchun biz faol ustani o'zgartirdik. Siz blokni sobiq ustadan olib tashlashingiz mumkin.

Xulosa

Biz MySQL-da replikatsiyani qanday o'rnatish va ba'zi bir asosiy operatsiyalarni bajarish haqida biroz bilib oldik. Afsuski, quyidagi muhim savollar ushbu maqola doirasidan tashqarida qolmoqda:

  • yagona nosozlik nuqtalarini bartaraf etish (SPF, Single Points of Failure). Bitta MySQL serveridan foydalanilganda uning ishdan chiqishi butun tizimning ishlamay qolishiga olib keldi. Bir nechta serverlardan foydalanilganda, ulardan birortasining ishlamay qolishi, agar biz bunga alohida e'tibor bermasak, tizimning ishlamay qolishiga olib keladi. Biz master va replikaning ishlamay qolishi bilan bog'liq vaziyatni hal qilishni ta'minlashimiz kerak. Mavjud vositalardan biri MMM, ammo u fayl bilan o'zgartirishni talab qiladi.
  • yukni muvozanatlash. Bir nechta replikalardan foydalanganda, ayniqsa, replikalarning ishlashi notekis bo'lsa, shaffof muvozanat mexanizmidan foydalanishni xohlaymiz. Linux ostida standart yechim - LVS dan foydalanish mumkin.
  • dastur mantig'ini o'zgartirish. Ideal vaziyatda ma'lumotlarni o'qish uchun so'rovlar replikalarga yuborilishi kerak va ma'lumotlarni o'zgartirish so'rovlari masterga yuborilishi kerak. Biroq, replikalarning mumkin bo'lgan kechikishi tufayli, bunday sxema ko'pincha samarasiz bo'lib, masterda hali ham bajarilishi kerak bo'lgan o'qish so'rovlarini aniqlash kerak.
Kelgusi maqolalarda ushbu masalalarni yoritishga umid qilaman.
E'tiboringiz uchun rahmat!

Teglar: teglar qo'shish

Replikatsiya - ob'ektning bir nechta nusxalari tarkibini sinxronlashtirish mexanizmi. Bu jarayon ma'lumotlarni bir manbadan boshqa ko'plab manbalarga va aksincha nusxalashni nazarda tutadi.

Belgilar:

  • master - ma'lumotlarini takrorlash kerak bo'lgan asosiy server;
  • replika - asosiy ma'lumotlarning nusxasini saqlaydigan ta'mirlangan server

MySQL-da replikatsiyani o'rnatish uchun siz quyida tavsiflangan harakatlar ketma-ketligiga rioya qilishingiz kerak, ammo bu dogma emas va parametrlar sharoitga qarab o'zgarishi mumkin.

Asosiy serverda my.cnf faylini tahrirlang va mysqld bo'limiga quyidagi qatorlarni qo'shing:

Server-id = log-bin = mysql-bin log-bin-index = mysql-bin.index log-error = mysql-bin.err relay-log = relay-bin relay-log-info-fayl = relay-bin. info relay-log-index = relay-bin.index expire_logs_days=7 binlog-do-db =

  • - noyob MySQL server identifikatori, 2 oralig'idagi raqam (0-31)
  • - ma'lumotlar bazasining nomi, bu haqda ma'lumot ikkilik jurnalga yoziladi; agar bir nechta ma'lumotlar bazalari mavjud bo'lsa, ularning har biri binlog_do_db parametri bilan alohida qatorni talab qiladi.

Tobeda my.cnf faylini tahrirlang va mysqld bo'limiga quyidagi qatorlarni qo'shing:

Server-id = master-host = master master-user = replikatsiya master-parol = parol master-port = 3306 relay-log = relay-bin relay-log-info-file = relay-log.info relay-log-index = relay-log.index replicate-do-db =

Asosiy serverda ma'lumotlarni takrorlash huquqiga ega replikatsiya foydalanuvchisini qo'shing:

"Parol" BILAN Identifikatsiya qilingan "replikatsiya" @ "replika" GA *.* BO'YICHA GRANT REPLIKATSIYA QILIShI

Keling, asosiy serverdagi takrorlangan ma'lumotlar bazalarini dasturiy ravishda yoki MySQL funksiyasidan foydalangan holda ma'lumotlarni o'zgartirishni bloklaylik:

Mysql@master> JADVALLARNI O'QISH QULFI BILAN YUVLASH; mysql@master> SET GLOBAL faqat o'qish uchun = ON;

Qulfni ochish uchun quyidagi buyruqdan foydalaning:

Mysql@master> SET GLOBAL faqat o'qish uchun = OFF;

Keling, asosiy serverdagi (yoki bizga kerak bo'lgan) barcha ma'lumotlar bazalarining zaxira nusxalarini yarataylik:

Root@master# tar -czf mysqldir.tar.gz /var/lib/mysql/

yoki mysqldump yordam dasturidan foydalanish:

Root@master# mysqldump -u root -p --lock-all-tables > dbdump.sql

Keling, ikkala serverni ham to'xtatamiz (ba'zi hollarda siz usiz ham qilishingiz mumkin):

Root@master# mysqlamdin -u root -p shutdown root@replica# mysqlamdin -u root -p shutdown

Katalogni nusxalash orqali tobe serverda takrorlangan ma'lumotlar bazalarini tiklaylik. Replikatsiya boshlanishidan oldin ma'lumotlar bazalari bir xil bo'lishi kerak:

Root@replica# cd /var/lib/mysql root@replica# tar -xzf mysqldir.tar.gz

yoki MySQL funksionalligi bo'lsa, to'g'ri serverda MySQL-ni to'xtatishning hojati yo'q edi:

Root@replica# mysql -u root -p< dbdump.sql

Keling, MySQL-ni asosiy serverda (keyin, agar kerak bo'lsa, tobe serverda) ishga tushiramiz:

Root@master# /etc/init.d/mysql start root@replica# /etc/init.d/mysql start

Keling, asosiy va tobe serverlarning ishlashini tekshiramiz:

Mysql@replica> qulni ishga tushirish; mysql@replica> QO'L HOLATINI KO'RSATISH\G mysql@master> MASTER STATUSNI KO'RSATISH\G

Tobe serverda master.info faylidagi jurnallarni tekshiring, unda ma'lumotlar bazasidagi ma'lumotlarni o'zgartirish so'rovlari bo'lishi kerak. Shunday qilib, bu ikkilik fayl avval matn formatiga aylantirilishi kerak:

Root@replica# mysqlbinlog master.info > master_info.sql

Agar xatolar yuzaga kelsa, siz quyidagi buyruqlardan foydalanishingiz mumkin:

Mysql@replica> qulni to'xtatish; mysql@replica> SLAVEni RESET; mysql@master> MASTERni RESET;

va ma'lumotlar bazalarini blokirovka qilishdan boshlab barcha amallarni takrorlang.

Replikatsiya serverlarini issiq qo'shish uchun siz quyidagi sintaksisdan foydalanishingiz mumkin:

Mysql@replica> QO'L HOLATINI KO'RSATISH\G mysql@master> MASTER STATUSNI KO'RSATISH\G mysql@replica-2> MASTERNI MASTER_HOST GA O'ZGARTIRISh = "master", MASTER_USER ="replikatsiya", MASTER_PASSWORD MASTER_PASSWORD = "l-s"m bin.000004 ", MASTER_LOG_POS = 155; mysql@replica-2> SLAVE START;

Holatlardan olingan ma'lumotlar joriy jurnal faylining joylashuvi va nomini ko'rsatadi.

Asinxron replikatsiya bilan bir nusxadagi yangilanish bir xil tranzaksiyada emas, balki ma'lum vaqtdan keyin boshqalarga tarqaladi. Shunday qilib, asinxron replikatsiya kechikish yoki kutish vaqtini kiritadi, bu vaqt davomida individual replikalar bir xil bo'lmasligi mumkin. Ammo bu turdagi replikatsiyaning ijobiy tomonlari ham bor: asosiy server ma'lumotlar sinxronizatsiyasi haqida qayg'urmasligi kerak, siz foydalanuvchilar uchun muammosiz ma'lumotlar bazasini (masalan, zaxira nusxasini yaratish uchun) qul mashinasida bloklashingiz mumkin.

Foydalanilgan manbalar ro'yxati

  1. Habrahabr.ru - MySQL-da replikatsiya asoslari (http://habrahabr.ru/blogs/mysql/56702/)
  2. Vikipediya (http://ru.wikipedia.org/wiki/Replication_(computing_technology))

Saytdagi har qanday materiallardan to'liq yoki qisman foydalanganda manba sifatida havolani aniq ko'rsatishingiz kerak.

Hozirgi kunda MySQL ma'lumotlar bazasi deyarli hamma joyda qo'llaniladi. MySQLsiz ishlaydigan veb-saytni tasavvur qilib bo'lmaydi. Albatta, ba'zi istisnolar mavjud, ammo bozorning asosiy qismini ushbu ma'lumotlar bazasi tizimi egallaydi. Va eng mashhur dastur bu MariaDB. Loyiha kichik bo'lsa, uni ishga tushirish uchun bitta server kifoya qiladi, unda barcha xizmatlar joylashgan: veb-server, ma'lumotlar bazasi serveri va pochta serveri. Ammo loyiha kattalashganda, siz har bir xizmat uchun alohida server ajratishingiz yoki hatto bitta xizmatni bir nechta serverlarga bo'lishingiz kerak bo'lishi mumkin, masalan, MySQL.

Barcha serverlarda bir vaqtning o'zida ma'lumotlar bazalarining sinxron holatini saqlab qolish uchun siz replikatsiyadan foydalanishingiz kerak. Ushbu maqolada MariaDB Galera Cluster yordamida MySQL replikatsiyasini qanday sozlashni ko'rib chiqamiz.

MARIADB GALERA NIMA?

MariaDB Galera - bu MariaDB uchun master-master klaster tizimi. MariaDB 10.1 dan boshlab, Galera Server va MariaDB Server dasturlari bitta paketda keladi, shuning uchun siz darhol barcha kerakli dasturlarni olasiz. Ayni paytda MariaDB Galera faqat InnoDB va XtraDB ma'lumotlar bazasi dvigatellari bilan ishlashi mumkin. Replikatsiyadan foydalanishning afzalliklaridan biri bu sayt ma'lumotlar bazasiga ortiqcha qo'shilishdir. Agar ma'lumotlar bazalaridan biri ishlamay qolsa, darhol boshqasiga o'tishingiz mumkin. Barcha serverlar bir-biri bilan sinxronlashtirilgan holatni saqlab turadi va hech qanday yo'qolgan tranzaktsiyalar yo'qligini ta'minlaydi.

MariaDB Galera-ning asosiy xususiyatlari:

  • Doimiy sinxronizatsiya bilan replikatsiya;
  • Tugunlarni avtomatik ravishda birlashtirish;
  • Bir nechta asosiy tugunlarni ulash imkoniyati;
  • Har qanday tugunlarga yozib olishni qo'llab-quvvatlash;
  • Shaffof parallel replikatsiya;
  • O'qish va yozish miqyosi, minimal kechikish;
  • Muvaffaqiyatsiz tugunlar avtomatik ravishda klasterdan uziladi;
  • Jadvallarga kirishni bloklay olmaysiz.

MYSQL REPLIKASINI SOZLASH

Ushbu qo'llanmada biz Ubuntu 16.04 va MariaDB 10.1 versiyasidan misol sifatida foydalanamiz. Boshlashdan oldin tizimingizni to'liq yangilang:

sudo apt-get update -y
sudo apt-get upgrade -y

Biz konfiguratsiyani bir nechta tugunlarga joylashtirganimiz sababli, ularning barchasida yangilash operatsiyalarini bajarishimiz kerak. MariaDB ma'lumotlar bazasi serveri hali o'rnatilmagan bo'lsa, uni o'rnatishingiz kerak. Avval omborni va uning kalitini qo'shing:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

sudo add-apt-repository "deb http://ftp.utexas.edu/mariadb/repo/10.1/ubuntu xenial main"

sudo apt-get update -y

Paket ro'yxatini yangilash tugagach, MariaDB-ni buyruq bilan o'rnating:

sudo apt o'rnating mariadb-server rsync -y

To'g'ridan-to'g'ri sinxronizatsiya qilish uchun bizga rsync paketi kerak bo'ladi. O'rnatish tugallangach, mysql_secure_installation skripti yordamida ma'lumotlar bazasini himoyalashingiz kerak:

sudo mysql_secure_installation

Odatiy bo'lib, mehmonlarga kirishga ruxsat beriladi, test ma'lumotlar bazasi mavjud va ildiz foydalanuvchisi uchun parol o'rnatilmagan. Bularning barchasini tuzatish kerak. Batafsil maqolada o'qing. Muxtasar qilib aytganda, siz bir nechta savollarga javob berishingiz kerak:

Ildiz uchun joriy parolni kiriting (hech biri uchun kiriting):
Ildiz parolini o'zgartirasizmi? n
Anonim foydalanuvchilar olib tashlansinmi? Y
Masofadan kirishga ruxsat berilsinmi? Y
Sinov ma'lumotlar bazasini olib tashlash va unga kirish kerakmi? Y
Imtiyozli jadvallar hozir qayta yuklansinmi? Y

Hamma narsa tayyor bo'lgach, MySQL ma'lumotlar bazalari takrorlanadigan tugunlarni o'rnatishga o'tishingiz mumkin. Birinchidan, birinchi tugunni o'rnatishni ko'rib chiqaylik. Siz barcha sozlamalarni my.cnf ga qo'yishingiz mumkin, ammo bu maqsadlar uchun /etc/mysql/conf.d/ papkasida alohida fayl yaratganingiz ma'qul.

Ushbu qatorlarni qo'shing:


binlog_format=ROW

innodb_autoinc_lock_mode=2
ulanish manzili = 0.0.0.0

wsrep_on=ON





wsrep_sst_method=rsync
# Galera tugun konfiguratsiyasi
wsrep_node_address="192.168.56.101"
wsrep_node_name="tugun1"

Bu erda 192.168.56.101 manzili joriy tugunning manzilidir. Keyin boshqa serverga o'ting va u erda bir xil fayl yarating:

sudo vi /etc/mysql/conf.d/galera.cnf


binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
ulanish manzili = 0.0.0.0
# Galera provayder konfiguratsiyasi
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera klaster konfiguratsiyasi
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.56.101,192.168.56.102"
# Galera sinxronizatsiya konfiguratsiyasi
wsrep_sst_method=rsync
# Galera tugun konfiguratsiyasi
wsrep_node_address="192.168.56.102"
wsrep_node_name="tugun2"

Xuddi shunday, bu erda tugun manzili 192.168.0.103. Keling, ikkita serverli misolga to'xtalib o'tamiz, chunki bu tizimning ishlashini namoyish qilish uchun etarli va siz wsrep_cluster_address maydoniga qo'shimcha IP-manzilni kiritish orqali boshqa server qo'shishingiz mumkin. Endi asosiy parametrlarning qiymatlari nimani anglatishini ko'rib chiqamiz va ishga tushirishga o'tamiz:

  • binlog_format- so'rovlar saqlanadigan jurnal formati, satr qiymati ikkilik ma'lumotlarning u erda saqlanishini ko'rsatadi;
  • standart saqlash mexanizmi- biz foydalanadigan SQL jadval mexanizmi;
  • innodb_autoinc_lock_mode- AUTO_INCREMENT qiymat generatorining ishlash tartibi;
  • bog'lovchi manzil- dastur ulanishlarni tinglaydigan IP-manzil, bizning holatlarimizda barcha IP-manzillar;
  • wsrep_on- replikatsiyani ta'minlaydi;
  • wsrep_provider- replikatsiya amalga oshiriladigan kutubxona;
  • wsrep_cluster_name - klaster nomi barcha tugunlarda mos kelishi kerak;
  • wsrep_cluster_address- MySQL ma'lumotlar bazalari ko'paytiriladigan server manzillari ro'yxati vergul bilan ajratilgan;
  • wsrep_sst_method- ma'lumotlarni uzatish uchun foydalaniladigan transport;
  • wsrep_node_address- joriy tugunning IP manzili;
  • wsrep_node_name- joriy tugunning nomi.

MySQL replikatsiyasini sozlash deyarli tugallandi. Ishga tushirishdan oldin qolgan oxirgi qadam xavfsizlik devorini o'rnatishdir. Avval Ubuntu - UFW da iptables qoidalarini boshqarish vositasini yoqing:

Keyin quyidagi portlarni oching:

sudo ufw 3306/tcp ga ruxsat beradi
sudo ufw 4444/tcp ga ruxsat beradi
sudo ufw 4567/tcp ga ruxsat beradi
sudo ufw 4568/tcp ga ruxsat beradi
sudo ufw 4567/udp ga ruxsat beradi

MARIADB GALERA ISHLATILADI

Barcha tugunlarni muvaffaqiyatli o'rnatganimizdan so'ng, birinchi tugundagi Galera klasterini ishga tushirishimiz kerak. Klasterni ishga tushirishdan oldin MariaDB xizmati barcha serverlarda to'xtatilganligiga ishonch hosil qilishingiz kerak:

sudo galera_new_cluster

Klaster ishlayotganligini va unga nechta mashina ulanganligini buyruq bilan tekshirishingiz mumkin:

Endi faqat bitta mashina bor, endi boshqa serverga o'ting va u erda tugunni ishga tushiring:

sudo systemctl MySQL-ni ishga tushiring

Ishga tushirish muvaffaqiyatli yoki yo'qligini va buyruqda xatoliklar mavjudligini tekshirishingiz mumkin:

sudo systemctl status MySQL

Keyin xuddi shu buyruqni bajarish orqali siz yangi tugun avtomatik ravishda klasterga qo'shilganligini tekshirasiz:

mysql -u root -p -e ""wsrep_cluster_size" kabi holatni ko'rsatish"

Replikatsiya qanday ishlashini tekshirish uchun birinchi tugunda ma'lumotlar bazasini yarating va u haqiqatan ham boshqalarga qo'shilganligini tekshiring:

mysql -u root -p

MariaDB [(yo'q)]> test_db ma'lumotlar bazasini yaratish;
MariaDB [(yo'q)]> ma'lumotlar bazalarini ko'rsatish;

mysql -u root -p

MariaDB [(yo'q)]> ma'lumotlar bazalarini ko'rsatish;

Ko'rib turganingizdek, ma'lumotlar bazasi boshqa mashinada avtomatik ravishda paydo bo'ladi. MySQL ma'lumotlarini replikatsiya qilish ishlamoqda.



 


O'qing:



Eng yaxshi simsiz minigarnituralar reytingi

Eng yaxshi simsiz minigarnituralar reytingi

Universal quloqlarni arzon sotib olish mumkinmi? 3000 rubl - bunday pulga yuqori sifatli eshitish vositalarini sotib olish mumkinmi? Ma'lum bo'lishicha, ha. Va nutq ...

Mobil qurilmaning asosiy kamerasi odatda tananing orqa tomonida joylashgan bo'lib, fotosuratlar va videolarni olish uchun ishlatiladi

Mobil qurilmaning asosiy kamerasi odatda tananing orqa tomonida joylashgan bo'lib, fotosuratlar va videolarni olish uchun ishlatiladi

Yaxshilangan xarakteristikalar va yuqori avtonomiyaga ega planshetning yangilangan versiyasi.Acer smartfonlariga kamdan-kam tashrif buyuradi...

Raqamingizni saqlab qolgan holda boshqa operatorga qanday o'tish mumkin

Raqamingizni saqlab qolgan holda boshqa operatorga qanday o'tish mumkin

Rossiyada 1 dekabrdan boshlab abonent boshqa uyali aloqa operatoriga o‘tganda telefon raqamini saqlab qolish to‘g‘risidagi qonun kuchga kirdi. Biroq, ma'lum bo'lishicha, ...

phabletni ko'rib chiqish, qimmat, lekin juda malakali

phabletni ko'rib chiqish, qimmat, lekin juda malakali

Qimmatbaho, lekin juda malakali fablet sharhi 20.03.2015 Men dunyodagi etiksiz yagona poyabzalchiman, o'z smartfonimsiz smartfon sharhlovchisiman....

tasma tasviri RSS