MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

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:

  1. Parandada konfiguratsioonifailid, eemaldades aegunud direktiivid.
  2. Kontrollime ĂŒhilduvust utiliitidega.
  3. Uuendame slave andmebaasid, paigaldades paketi percona-server-server.
  4. 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 aegunud juba 5.7 versioonis, kuid nĂŒĂŒd on see tĂ€ielikult eemaldatud. Seega tuleb eemaldada sellega seotud direktiivid. KĂŒsimuste vahemĂ€lu jaoks vĂ”ib kasutada nĂŒĂŒd vĂ€liseid tööriistu — nĂ€iteks ProxySQL.

Samuti leidsime konfiguratsioonist aegunud direktiive innodb_file_format. Kui MySQL 5.7-s oli vÔimalik valida InnoDB formaati, siis 8. versioon töötab ainult Barracuda formaadiga.

Meie lĂ”pptulemus — jĂ€rgmiste direktiivide eemaldamine:

  • query_cache_type, query_cache_limit ja query_cache_size;
  • innodb_file_format ja innodb_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-centos

KokkuvĂ”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-upgrade

Kui probleeme ei leita, lÔppeb tööriist koodiga 0:

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

Lisaks on tĂ€napĂ€evastes MySQL versioonides saadaval tööriist mysql-shell (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.cnf

Ja siin on, milliseid mÀrkusi me saime:

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

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

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

Otsustasime, et uuendus peaks minema probleemideta.

Eelneva hoiatused, mis viitavad kodeeringute probleemidele. Asi on selles, et UTF-8 MySQL-is ei olnud hiljuti tÔeline "UTF-8", kuna salvestas vaid 3 baiti neljast. MySQL 8-s on see lÔpuks otsustatud parandada: 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, ametlik dokumentatsioon 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:

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

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:

  1. 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.
  2. Paigaldame paketi percona-server-server. Oluline on mÀrkida, et MySQL 8 versioonis ei tuleb kÀivitada kÀsk mysqlupgrade peale serveri vÀrskendamist.
  3. PÀrast edukat kÀivitamist kÀivitame serveri veel kord - juba ilma esimeses punktis lisatud parameetriteta.
  4. Veendume, et replikatsioon töötab edukalt: kontrollime SHOW SLAVE STATUS ja 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 MySQL veast. 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 koodis.

Lisaks sellele, et selles veas 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 lisatud SQL-skripti.

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:

  1. Teha optimeerimine kÔikide tabelite jaoks.
  2. 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=t1

Tabelite 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:

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

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 keelatud

Kiire ĂŒ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      amd64

Need 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 apparmor

KokkuvÔ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!

MySQL (Percona Server) versiooni 5.7 uuendamine 8.0-ks

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster