
Edasiminek ei seisa paigal, seega muutuvad pĂ”hjused MySQLi uusimate versioonide vĂ€rskendamiseks ĂŒha pĂ”hjendatumaks. Hiljuti tuli ĂŒhes meie projektis aeg uuendada mugavaid Percona Server 5.7 klastreid versioonile 8. KĂ”ik see toimus Ubuntu Linux 16.04 platvormil. Kuidas sellist operatsiooni teostada minimaalsete seisakutega ja milliste probleemidega me uuendamise kĂ€igus silmitsi seisime â lugesite sellest artiklist.
Ettevalmistus
Igasugune andmebaasiserveri vĂ€rskendamine on tĂ”enĂ€oliselt seotud andmebaasi seadistamisega: sĂŒsteemivĂ”imsuse piirangute nĂ”uete muutmise ja konfigureerimise korrigeerimisega, mida tuleb vananenud juhistest puhastada.
Enne vÀrskendamist pöördume kindlasti ametlikku dokumentatsiooni:
- ;
- ;
- ;
- .
Ja koostame tegevusplaani:
- Parandame konfiguratsioonifailid, eemaldades vananenud juhised.
- Kontrollime ĂŒhilduvust utiliitide abil.
- VĂ€rskendame slave-andmebaasid, installides paketi
percona-server-server. - VĂ€rskendame meistri, paigaldades sama paketi.
LÀbime iga plaani punkti ja vaatame, mis vÔib valesti minna.
OLULINE! MySQL Galera klastrite uuendamise protsessil on oma keerukused, mida artiklis ei kÀsitleta. SeetÔttu ei tohiks seda juhendit niisugustes olukordades kasutada.
1. osa: Konfiguratsioonide kontrollimine
MySQL 8. versioonis eemaldati query_cache. Tegelikult oli see juba versioonis 5.7, kuid nĂŒĂŒd on see tĂ€iesti . SeetĂ”ttu tuleb eemaldada seotud direktiivid. KĂŒsimuste vahemĂ€lu jaoks on nĂŒĂŒd vĂ”imalik kasutada vĂ€list tööriista â nĂ€iteks .
Samuti leiti konfiguratsioonist vananenud direktiivid innodb_file_format. Kui MySQL 5.7-s oli vĂ”imalik valida InnoDB formaati, siis 8. versioon töötab nĂŒĂŒd .
Meie jÀreldus on jÀrgmiste direktiivide eemaldamine:
-
query_cache_type,query_cache_limitjaquery_cache_size; -
innodb_file_formatjainnodb_file_format_max.
Kontrollimiseks kasutame Percona Serveri Docker pildi. Serveri konfiguratsiooni paneme kausta mysql_config_test, ja loomeme kÔrval kaustad andmete ja logide jaoks. Percona-serveri konfiguratsiooni testimise nÀide:
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 logides vĂ”i logide kataloogis â olenevalt teie konfiguratsioonidest â ilmub fail, kus kirjeldatakse probleemseid direktiive.
Siin on, mis meil oli:
2020-04-03T12:44:19.670831Z 0 [Warning] [MY-011068] [Server] SĂŒntaks 'expire-logs-days' on vananenud ja eemaldatakse tulevasest versioonist. Palun kasutage selle asemel 'binlog_expire_logs_seconds'.
2020-04-03T12:44:19.671678Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' on praegu alias tĂ€hemĂ€rgikomplektile UTF8MB3, kuid tulevases versioonis on see alias UTF8MB4-le. Palun kaaluge UTF8MB4 kasutamist, et olla ĂŒhemĂ”tteline.
2020-04-03T12:44:19.671682Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8_general_ci' on vananenud tÀhemÀrgikomplekti UTF8MB3 collatsioon. Palun kaaluge UTF8MB4 kasutamist sobiva collatsiooniga. Nii et meil oli vaja veel tegeleda kodeeringutega ja asendada vananenud direktiiv. expire-logs-days.
Osa 2: Töötegevuste kontrollimine
Uuendamise dokumentatsioonis on kaks utiliiti, mis aitavad andmebaasi ĂŒhilduvust kontrollida. Nende kasutamine aitab administraatoril kontrollida olemasoleva andmestruktuuri ĂŒhilduvust.
Alustame klassikalisest utiliidist mysqlcheck. Piisab, kui kÀivitada:
mysqlcheck -u root -p --all-databases --check-upgradeKui probleeme ei leitud, lÔpetab utiliit koodiga 0:

Lisaks on nĂŒĂŒdisaegsetes MySQL versioonides saadaval utiliit, (Percona puhul on see paket percona-mysql-shell). See on klassikalise mysql kliendi asendaja, mis ĂŒhendab endas mysql kliendi, SQL-koodi redaktori ja haldustööriistad. Serveri kontrollimiseks enne uuendamist saab selle kaudu kĂ€ivitada 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 mÀrkused, mille me saime:

Ăldiselt mitte midagi kriitilist â ainult hoiatused kodeeringute kohta (vt allpool). Ăldine tulemused:

Oleme otsustanud, et uuendamine peaks kulgema probleemideta.
MĂ€rkused ĂŒlaltoodud hoiatuste kohta viitavad kodeeringu probleemidele. Asi on selles, et UTF-8 MySQL-is ei olnud hiljuti , kuna see salvestas vaid 3 baiti 4 asemel. MySQL 8-s on see lĂ”puks : alias utf8 varsti viib kodeeringule utf8mb4, ja vanad veerud tabelites muutuvad utf8mb3. Tulevikus eemaldatakse kodeering utf8mb3 aga mitte selles vĂ€ljaandes. SeetĂ”ttu otsustasime parandada kodeeringud juba töötavas andmebaasi installeerimises pĂ€rast selle uuendamist.
Osa 3: Serverite uuendamine
Mis vĂ”ib siis valesti minna, kui on olemas nii luksuslik plaan? Meie esimene katse toimus dev-klusteris MySQL, arvestades, et nĂŒansid on alati olemas.
Nagu juba mainitud, karjub MySQL-serverite vĂ€rskendamise kĂŒsimuse ĂŒle, kus on replikatsioonid. Oluline on see, et kĂ”igepealt tuleks vĂ€rskendada kĂ”ik replikad (slave), kuna MySQL 8 oskab replitseeruda versioonist 5.7. MĂ”ningane keerukus seisneb selles, et meil on kasutusel reĆŸiim master master, kus eemal asuv meister on reĆŸiimis read-only. See tĂ€hendab, et tegelik liiklus siseneb ĂŒhte andmekeskusesse, teine on varuplaan.
Topoloogia nÀeb vÀlja jÀrgmine:

VÀrskendus peaks algama replikatest mysql replica dc 2, mysql master dc 2 ja mysql replica dc 1, ja lÔppema peab mysql master dc 1 serveriga. TÀiendava usaldusvÀÀrsuse tagamiseks peatusime virtuaalmasinad, tegime neist snapshotid ja enne vÀrskenduse algust peatasime replikatsiooni kÀsuga STOP SLAVE. Muus osas nÀeb vÀrskendus vÀlja jÀrgmiselt:
- Iga replikat taaskÀivitame, lisades konfiguratsioonidesse kolm valikut:
skip-networking,skip-networking,skip-slave-startskip-log-bin - Installime paketi
percona-server-server. Oluline on mĂ€rkida, et MySQL 8 versioonis ei on vajalik kĂ€ivitada kĂ€skmysqlupgradeserveri uuendamise jĂ€rel. - PĂ€rast edukat kĂ€ivitamist kĂ€ivitame serveri veel kord â nĂŒĂŒd juba ilma esimeses punktis lisatud parameetriteta.
- Veendume, et replikatsioon töötab edukalt: kontrollime
SHOW SLAVE STATUSja vaatame, et rakenduse andmebaasis uuendatakse tabelid, mis sisaldavad loendureid.
KĂ”ik see tundub piisavalt lihtne: dev vĂ€rskendus lĂ€ks edukalt. Okei, nĂŒĂŒd saab rahulikult planeerida öö vĂ€rskendust production'ile.
Ei olnud muresid â prod oleme vĂ€rskendanud
Kuid dev'ist eduka kogemuse ĂŒleviimine production'ile ei möödunud ilma ĂŒllatusteta.
Ănneks algab vĂ€rskendamise protsess replikatelt, seega kohtades raskustes peatasime tööd ja taastasime repliika snapshot'ist. Probleemide uurimine lĂŒkkus jĂ€rgmisse hommikusse. Logides leiti jĂ€rgmised kirjed:
2020-01-14T21:43:21.500563Z 2 [ERROR] [MY-012069] [InnoDB] tabel: t1-l on 19 veergu, kuid InnoDB sÔnastikus on 20 veergu
2020-01-14T21:43:21.500722Z 2 [ERROR] [MY-010767] [Server] Vigane SE andmete parandamine 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] Katkestamine Erinevate postituste arhiivide uurimine Googles tÔi meele, et selline probleem tekib . Kuigi tÔenÀolisemalt on see lausa teenuse mysqlcheck ja mysqlsh.
Selgub, et MySQL on muutnud andmete esitamise meetodit kĂŒmnendkohtade (int, tinyint jne) jaoks, seega kasutatakse mysql-serveris nende salvestamiseks teistsugust meetodit. Kui teie andmebaas oli algselt versioonis 5.5 vĂ”i 5.1 ja siis uuendati see versioonile 5.7, siis vĂ”ib osutuda vajalikuks OPTIMIZE mĂ”nede tabelite jaoks. Siis uuendab MySQL failid andmetega, muutes need kaasaegseks salvestusvorminguks.
Seda saab kontrollida 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 kui teil on 0, siis laual kasutatakse vana tĂŒĂŒpi â tuleb teha OPTIMIZE. Kuid kui vÀÀrtus on 246 â teil on juba uus tĂŒĂŒp. TĂŒĂŒpide kohta saab rohkem teada .
Lisaks sellele kaalutakse teist vĂ”imalikku pĂ”hjust, mis meid kĂ”rvale jĂ€ttis â InnoDB-tabelite puudumine sĂŒsteemitabelis INNODB_SYS_TABLESPACES, kui need tabelid loodi versioonis 5.1. Uuendamiseks probleemide vĂ€ltimiseks vĂ”ib kasutada .
Kuid miks ei tekkinud meil selliseid probleeme dev-is? Andmebaas kopeeritakse sinna perioodiliselt tootmisest â seega tabelid luuakse ĂŒmber.
Kahjuks ei saa töötavas suuremas andmebaasis lihtsalt vÔtta ja teostada laialdast OPTIMIZE. Siin aitab percona-toolkit: online OPTIMIZE operatsiooni jaoks sobib suurepÀraselt tööriist pt-online-schema-change.
Uuendatud plaan sai selliseks:
- Teha kÔigi tabelite optimeerimine.
- Teha andmebaaside vÀrskendamine.
Kuna kontrollisime ja tahtsime selgitada vĂ€rskendamise aega, keelatasime ĂŒhe repliigi ning kĂ€ivitasime jĂ€rgmise kĂ€su kĂ”igi tabelite jaoks:
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 vĂ€rskendamine toimub ilma pikaajaliste blokeeringuteta, kuna utiliit loob uue ajutise tabeli, kuhu kopeeritakse andmed pĂ”hitaabelist. Kui mĂ”lemad tabelid on identsed, blokeeritakse algne tabel ja asendatakse uuega. Meie testkĂ€ivitamine nĂ€itas, et kĂ”ikide tabelite vĂ€rskendamiseks on vajalik umbes ĂŒks pĂ€ev, kuid andmete kopeerimine pĂ”hjustas liiga suurt koormust kettale.
Selle vĂ€ltimiseks lisasime produktsioonis kĂ€sule argumendi --sleep vÀÀrtusega 10 â see parameeter reguleerib ooteaega pĂ€rast andmepaki viimist uude tabelisse. Nii saab koormust vĂ€hendada, kui jahutusprotsessi ajal on rakendus ajakavade suhtes nĂ”udlik.
PÀrast optimeerimise tegemist lÀks vÀrskendus edukalt lÀbi.
⊠kuid mitte lÔpuni!
Juba poole tunni pĂ€rast pĂ€rast vĂ€rskendust tuli klient probleemiga. Andmebaas töötas vĂ€ga kummaliselt: perioodiliselt tekkisid ĂŒhenduste katkestamised. Nii see jĂ€lgimine vĂ€lja nĂ€gi:

Screenerilt on nÀha hambulise graafiku, mis on seotud sellega, et osa MySQL-serveri vooge kukkusid perioodiliselt vea tÔttu. Rakenduses ilmusid vead:
[PDOException] SQLSTATE[HY000] [2002] Ăhendus keeldusKiire ĂŒlevaatus logidest nĂ€itas, et mysqld deemon ei saanud operatsioonisĂŒsteemilt vajalikku ressursse. Vead lahendades avastasime sĂŒsteemis «hĂŒlgatud» apparmor poliitikafaile:
# 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 vÀrskendati MySQL 5.7 ja kuuluvad eemalduvale 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 operatsioon, vĂ”ib pĂ”hjustada ootamatuid probleeme. Ja isegi hĂ€sti lĂ€bimĂ”eldud plaan ei garanteeri alati oodatud tulemust. NĂŒĂŒd sisaldab meie meeskonna iga vĂ€rskendamise plaan kindlasti ka kohustuslikku ĂŒleliigsete failide puhastamist, mis on vĂ”inud tekkida viimaste tegevuste tulemusena.
Ma sooviksin vÀga tÀnada ettevÔtet Percona nende suurepÀraste toodete eest selle mitte eriti professionaalse graafilise loomingu kaudu!

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