
Evolutsioon ei seisa paigal, seetĂ”ttu muutuvad pĂ”hjused uuendada MySQL uusimatele versioonidele ĂŒha kaalukamaks. Hiljuti meie projektis tuli aeg uuendada mugavaid Percona Server 5.7 klastreid 8. versioonile. KĂ”ik see toimus Ubuntu Linux 16.04 platvormil. Kuidas sellist operatsiooni teostada minimaalse seisakuga ja millega me kokku puutusime uuendamise kĂ€igus â loe sellest artiklist.
Ettevalmistus
Iga andmebaasi serveri uuendamine on tĂ”enĂ€oliselt seotud andmebaasi seadistamisega: muutustega sĂŒsteemivahendite piirangute nĂ”uetes ja konfiguratsioonifailide parandamisega, mis tuleb puhastada aegunud direktiividest.
Enne uuendamist peame kindlasti tutvuma ametliku dokumentatsiooniga:
- ;
- ;
- ;
- .
Ja koostame tegevuskava:
- Parandada konfiguratsioonifailid, eemaldades aegunud direktiivid.
- Kontrollime ĂŒhilduvust utiliitidega.
- Uuendame slave andmebaasid, paigaldades paketi
percona-server-server. - Uuendame meistri, paigaldades sama paketi.
KÀime lÀbi iga tegevuskava punkti ja vaatame, mis vÔib valesti minna.
OLULINE! MySQL Galera klustri uuendamise protseduuril on omad nĂŒansid, mida here artikel ei kĂ€sitle. Sellisel juhul ei tohiks seda juhendit kasutada.
Osa 1: Konfiguratsioonide kontroll
MySQL 8. versioonis eemaldati query_cache. Tegelikult peeti seda juba 5.7 versioonis, kuid nĂŒĂŒd on see . Seega tuleb eemaldada sellega seotud direktiivid. KĂŒsimuste vahemĂ€lu jaoks vĂ”ib kasutada nĂŒĂŒd vĂ€liseid tööriistu â nĂ€iteks .
Samuti leidsime konfiguratsioonist aegunud direktiive innodb_file_format. Kui MySQL 5.7-s oli vÔimalik valida InnoDB formaati, siis 8. versioon töötab .
Meie lĂ”pptulemus â jĂ€rgmiste direktiivide eemaldamine:
-
query_cache_type,query_cache_limitjaquery_cache_size; -
innodb_file_formatjainnodb_file_format_max.
Kontrollimiseks kasutame Percona Server'i Docker-imaĆŸi. Serveri konfiguratsioon paigaldame katalooge mysql_config_test, ja loome kĂ”rvale andmete ja logide kataloogid. NĂ€ide percona-serveri konfiguratsiooni testist:
mkdir -p {mysql_config_test,mysql_data,mysql_logs}
cp -r /etc/mysql/conf.d/* mysql_config_test/
docker run --name some-percona -v $(pwd)/mysql_config_test:/etc/my.cnf.d/ -v $(pwd)/mysql_data/:/var/lib/mysql/ -v $(pwd)/mysql_logs/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD} -d percona:8-centosKokkuvĂ”tteks: kas Docker'i logidesse vĂ”i logide katalooge â sĂ”ltuvalt teie konfiguratsioonidest â ilmub fail, kus on kirjas probleemsed direktiivid.
Siin on, mis meil oli:
2020-04-03T12:44:19.670831Z 0 [Warning] [MY-011068] [Server] SĂŒntaks 'expire-logs-days' on aegunud ja eemaldatakse tulevases vĂ€ljaandes. Palun kasutage selle asemel binlog_expire_logs_seconds.
2020-04-03T12:44:19.671678Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' on hetkel alias tÀhtedele UTF8MB3, kuid tulevases vÀljaandes on see alias UTF8MB4 jaoks. Palun kasutage UTF8MB4-d, et see oleks selge.
2020-04-03T12:44:19.671682Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8_general_ci' on aegunud tĂ€htede UTF8MB3 sortimine. Palun kasutage selle asemel UTF8MB4 koos sobiva sortimisega. Nii olime sunnitud uurima ka kodeeringute ĂŒle ja asendama aegunud direktiivi expire-logs-days.
JÀrk 2: Töökindlate installatsioonide kontrollimine
Uuendamise dokumentatsioonis on 2 tööriista andmebaasi ĂŒhilduvuse kontrollimiseks. Nende kasutamine aitab administraatoril olemasolevate andmestruktuuride ĂŒhilduvust kontrollida.
Alustame klassikalisest tööriistast mysqlcheck. Piisab, kui kÀivitada:
mysqlcheck -u root -p --all-databases --check-upgradeKui probleeme ei leita, lÔppeb tööriist koodiga 0:

Lisaks on tĂ€napĂ€evastes MySQL versioonides saadaval tööriist (Percona puhul on see pakett percona-mysql-shell). See on asenduseks klassikalisele mysql kliendile ning ĂŒhendab endas kliendi, SQL koodi redaktori ja MySQL haldustööriistad. Serveri kontrollimiseks enne uuendamist saate selle kaudu tĂ€ita jĂ€rgmise kĂ€su:
mysqlsh -- util check-for-server-upgrade { --user=root --host=1.1.1.1 --port=3306 } --config-path=\/etc\/mysql\/my.cnfJa siin on, milliseid mÀrkusi me saime:

Ăldiselt ei ole midagi kriitilist â ainult hoiatused kodeeringutest (vt allpool). Ăldine tĂ€itmise tulemus:

Otsustasime, et uuendus peaks minema probleemideta.
Eelneva hoiatused, mis viitavad kodeeringute probleemidele. Asi on selles, et UTF-8 MySQL-is ei olnud hiljuti , kuna salvestas vaid 3 baiti neljast. MySQL 8-s on see lÔpuks : alias utf8 peagi suunatakse kodeeringule utf8mb4, ja vanad veerud tabelites muutuvad utf8mb3. Tulevikus kodeering utf8mb3 eemaldatakse, kuid mitte kÀesolevas vÀljaandes. SeetÔttu otsustasime kodeeringud juba töötava andmebaasi jÀrel, pÀrast selle uuendamist, parandada.
JĂ€rk 3: Serverite uuendamine
Mida vĂ”iks valesti minna, kui meil on nii suurepĂ€rane plaan?.. TĂ€iesti arusaadav, et nĂŒansid juhtuvad alati, seega viisime esimese katse lĂ€bi MySQL dev-klusteris.
Nagu juba mainitud, katab MySQL-serverite vĂ€rskendamise kĂŒsimuse replikatega. PĂ”himĂ”te on jĂ€rgmine: kĂ”igepealt tuleks vĂ€rskendada kĂ”ik replikad (slave), kuna MySQL 8 suudab replikeerida 5.7 versiooni masterist. Teatud keerukus seisneb selles, et meil on kasutusel reĆŸiim master master, kus kaugarvuti on read-only. See tĂ€hendab, et tegelik liiklus suundub ĂŒhte andmekeskusesse ja teine on varukoopia.
Topoloogia on jÀrgmine:

VÀrskendamine peaks algama replikatest mysql replica dc 2, mysql master dc 2 ja mysql replica dc 1, ja lÔppema - mysql master dc 1 serveriga. Suurema usaldusvÀÀrsuse tagamiseks peatame virtuaalmasinad, teeme nende snapshotid ja vahetult enne vÀrskendamist peatame replikatsiooni kÀsuga STOP SLAVE. Muul juhul tundub vÀrskendamine olevat jÀrgmine:
- Iga replikate kÀivitame uuesti, lisades konfiguratsioonidesse 3 valikut:
skip-networking,skip-slave-start,skip-log-bin. Asi on selles, et andmebaasi vĂ€rskendamine genereerib binaarlogid sĂŒsteemide tabelite vĂ€rskendamisel. Need direktiivid tagavad, et andmebaasis ei toimu rakenduse andmete muutmist, ja binaarlogidesse ei satu sĂŒsteemide tabelite vĂ€rskendamise kohta teavet. See aitab vĂ€ltida probleeme replikatsiooni taastamisel. - Paigaldame paketi
percona-server-server. Oluline on mÀrkida, et MySQL 8 versioonis ei tuleb kÀivitada kÀskmysqlupgradepeale serveri vÀrskendamist. - PÀrast edukat kÀivitamist kÀivitame serveri veel kord - juba ilma esimeses punktis lisatud parameetriteta.
- Veendume, et replikatsioon töötab edukalt: kontrollime
SHOW SLAVE STATUSja vaatame, et rakenduse andmebaasis uuendatakse tabelite kasutusloendeid.
See kÔik tundub piisavalt lihtne: dev vÀrskendamine lÀks edukalt. Okei, vÔime rahulikult planeerida öist vÀrskendamist productionile.
Mingeid probleeme ei olnud - prod vÀrskendasime
Kuid dev-lt production-le edasiviiv kogemus ei möödunud ĂŒllatusteta.
Ănneks algab vĂ€rskendamisprotsess replikatest, seega, kui tĂ”rgetega kokku puutusime, peatasime tööd ja taastastasime repliika snapshotist. Probleemide uurimine viidi jĂ€rgmisel hommikul edasi. Logides leidsime jĂ€rgmised kirjed:
2020-01-14T21:43:21.500563Z 2 [ERROR] [MY-012069] [InnoDB] tabel: t1 on 19 veergu, kuid InnoDB sÔnastikus on 20 veergu
2020-01-14T21:43:21.500722Z 2 [ERROR] [MY-010767] [Server] Viga SE andmete parandamisel db1.t1 jaoks
2020-01-14T21:43:24.208365Z 0 [ERROR] [MY-010022] [Server] DD tabelite tÀitmine ebaÔnnestus.
2020-01-14T21:43:24.208658Z 0 [ERROR] [MY-010119] [Server] Peatamine Erinevate meililisti arhiivide uurimine Google'is viis arusaamiseni, et see probleem tekib . Kuigi pigem on see isegi utiliitide viga mysqlcheck ja mysqlsh.
Selgub, et MySQL on muutnud andmete esitamise viisi kĂŒmnendikute aluste (int, tinyint jne) jaoks, seega kasutatakse mysql-serveris nende salvestamiseks muud meetodit. Kui teie andmebaas oli algselt versioonis 5.5 vĂ”i 5.1 ja seejĂ€rel uuendati versioonini 5.7, siis vĂ”ib olla, et peate teostama OPTIMIZE mĂ”nede tabelitega. Siis uuendab MySQL andmefailid, viies need uuemasse salvestusformaati.
Seda saab kontrollida ka utiliidiga mysqlfrm:
mysqlfrm --diagnostic -vv /var/lib/mysql/db/table.frm
...
'field_length': 8,
'field_type': 246, # vÀlja formaat
'field_type_name': 'decimal',
'flags': 3,
'flags_extra': 67,
'interval_nr': 0,
'name': 'you_deciaml_column',
... Kui field_type on 0, siis tabelis kasutatakse vana tĂŒĂŒpi â tuleb teha OPTIMIZE. Kuid kui vÀÀrtus on 246 â Teil on juba uus tĂŒĂŒp. TĂŒĂŒpidega saab tutvuda .
Lisaks sellele, et kaalutakse teist vĂ”imalikku pĂ”hjust, mis jĂ€i meid kĂ”rvale â see on InnoDB tabelite puudumine sĂŒsteemitabelis INNODB_SYS_TABLESPACES, kui need tabelid loodi versioonis 5.1. Uuendamise probleemide vĂ€ltimiseks saab kasutada .
Miks meil ei tekkinud selliseid probleeme dev'is? Andmebaasi kopeeritakse sinna pidevalt tootmisest â seega tabeleid luuakse ĂŒmber.
Kahjuks ei saa tegelikult töötava suure andmebaasiga lihtsalt vÔtta ja teha ulatuslikku OPTIMIZE. Siin aitab percona-toolkit: online OPTIMIZE'i toiminguks sobib suurepÀraselt utiliit pt-online-schema-change.
Uuendatud plaan sai selliseks:
- Teha optimeerimine kÔikide tabelite jaoks.
- Teha andmebaaside uuendamine.
Selle kontrollimiseks ning samal ajal uuendamise aega vĂ€lja selgitamiseks, lĂŒlitasime vĂ€lja ĂŒhe koopiatest ja kĂ”igi tabelite jaoks kĂ€ivitasime jĂ€rgmise kĂ€su:
pt-online-schema-change --critical-load Threads_running=150 --alter "ENGINE=InnoDB" --execute --chunk-size 100 --quiet --alter-foreign-keys-method auto h=127.0.0.1,u=root,p=${MYSQL_PASSWORD},D=db1,t=t1Tabelite uuendamine toimub ilma pĂŒsivate lukustusteta, kuna utiliit loob uue ajutise tabeli, kuhu kopeerib andmed pĂ”hietabelist. Hetkel, mil mĂ”lemad tabelid on sarnased, lukustatakse algne tabel ja asendatakse uuendatuga. Meie testkĂ€ivitus nĂ€itas, et kĂ”ikide tabelite uuendamiseks on vaja umbes ööpĂ€eva, kuid samal ajal pĂ”hjustas andmete kopeerimine liiga suurt koormust ketastele.
Selle vĂ€ltimiseks lisasime produktsioonis kĂ€sule argumendi --sleep vÀÀrtusega 10 â see parameeter reguleerib ooteaega pĂ€rast andmepaki edastamist uude tabelisse. Nii saab koormust vĂ€hendada, kui reaalselt aktiivne rakendus on vastuseaja suhtes nĂ”udlik.
PÀrast optimeerimise lÔpetamist lÀks uuendus edukalt lÀbi.
⊠kuid mitte lÔpuni!
Juba poole tunni möödudes pĂ€rast uuendamist tuli klient probleemiga. Andmebaas töötas vĂ€ga kummaliselt: perioodiliselt tekkisid ĂŒhenduse katkestamised. Nii see jĂ€lgimine vĂ€lja nĂ€gi:

Ehkki ekraanipildil on nÀha hambuline graafik, tulenes see sellest, et osa MySQL-serveri vooge kukkus perioodiliselt tÔrgete tÔttu. Rakenduses ilmusid vead:
[PDOException] SQLSTATE[HY000] [2002] Ăhendus keelatudKiire ĂŒlevaatus logidest paljastas, et mysqld teenus ei suutnud operatsioonisĂŒsteemilt vajalikke ressursse hankida. TĂ”rketeateid uurides avastasime sĂŒsteemis "hooldamata" apparmor'i poliitika failid:
# dpkg -S /etc/apparmor.d/cache/usr.sbin.mysqld
dpkg-query: no path found matching pattern /etc/apparmor.d/cache/usr.sbin.mysqld
# dpkg -S /etc/apparmor.d/local/usr.sbin.mysqld
dpkg-query: no path found matching pattern /etc/apparmor.d/local/usr.sbin.mysqld
# dpkg -S /etc/apparmor.d/usr.sbin.mysqld
mysql-server-5.7: /etc/apparmor.d/usr.sbin.mysqld
# dpkg -l mysql-server-5.7
rc mysql-server-5.7 5.7.23-0ubuntu0.16.04.1 amd64Need failid tekkisid paar aastat tagasi, kui uuendati MySQL 5.7 versioonile ning kuuluvad kustutatud paketile. Failide kustutamine ja apparmor teenuse taaskÀivitamine lahendas probleemi:
systemctl stop apparmor
rm /etc/apparmor.d/cache/usr.sbin.mysqld
rm /etc/apparmor.d/local/usr.sbin.mysqld
rm /etc/apparmor.d/usr.sbin.mysqld
systemctl start apparmorKokkuvÔtteks
Iga, isegi kĂ”ige lihtsam tegevus, vĂ”ib viia ootamatute probleemideni. Ja isegi hĂ€sti lĂ€bi mĂ”eldud plaan ei taga alati oodatud tulemust. NĂŒĂŒd sisaldab meie meeskonna igas uuendamisplaanis ka kohustuslikud ĂŒleliigsete failide puhastamine, mis vĂ”ivad olla tekkinud viimaste tegevuste tulemusena.
Selle mitte vÀga professionaalse graafilise loominguga tahaksin öelda suurt aitÀh ettevÔttele Percona nende suurepÀraste toodete eest!

P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
