
Пешрафт ҳеҷ гоҳ дар як ҷо намеистад, аз ин рӯ сабабҳои навсозӣ ба версияҳои охирини MySQL ҷолибтар мешаванд. Ба наздикӣ яке аз лоиҳаҳои мо бояд кластерҳои Percona Server 5.7-и худро ба версияи 8 навсозӣ мекард. Ҳамаи ин дар платформа анҷом дода шуд. Ubuntu Linux 16.04 апрел. Чӣ тавр ин амалиётро бо вақти ками кор анҷом додан мумкин аст ва мо ҳангоми навсозӣ бо кадом мушкилот дучор шудем - ин мақоларо хонед.
Омодагӣ
Ҳар як навсозии сервери пойгоҳи додаҳо эҳтимолан аз нав танзимкунии пойгоҳи додаҳоро дар бар мегирад: тағир додани талабот барои маҳдудияти захираҳои система ва ислоҳи конфигуратсияҳои пойгоҳи додаҳо, ки бояд аз дастурҳои кӯҳна тоза карда шаванд.
Пеш аз навсозӣ, мо бешубҳа ба ҳуҷҷатҳои расмӣ муроҷиат мекунем:
- ;
- ;
- ;
- .
Ва биёед нақшаи амалро таҳия кунем:
- Файлҳои конфигуратсияро бо роҳи нест кардани дастурҳои кӯҳна ислоҳ кунед.
- Мутобиқатиро бо утилитҳо санҷед.
- Бо насб кардани баста пойгоҳи додаҳои ғуломро навсозӣ кунед
percona-server-server. - Бо насби ҳамон баста усторо навсозӣ кунед.
Биёед ҳар як нуқтаи нақшаро дида бароем ва бубинем, ки чӣ гуна хатогӣ метавонад рӯй диҳад.
Муҳимтарин! Навсозии кластери MySQL дар асоси Galera дорои нозукиҳои худро дорад, ки дар ин мақола фаро гирифта нашудаанд. Дар ин ҳолат шумо набояд ин дастурҳоро истифода баред.
Қисми 1: Санҷиши конфигуратсияҳо
Дар версияи 8-уми MySQL он хориҷ карда шуд query_cacheДар асл, ӯ буд. бозгашт ба версияи 5.7, аммо ҳоло Аз ин рӯ, зарур аст, ки дастурҳои алоқамандро хориҷ кунед. Ва асбобҳои беруна ҳоло метавонанд барои кэшкунии дархостҳо истифода шаванд - масалан, .
Инчунин, дар файли конфигуратсия дастурҳои кӯҳна пайдо шуданд. innodb_file_formatДар ҳоле ки MySQL 5.7 имкони интихоби формати InnoDB дошт, версияи 8 аллакай кор мекунад. .
Натиҷаи мо ин нест кардани дастурҳои зерин аст:
-
query_cache_type,query_cache_limitиquery_cache_size; -
innodb_file_formatиinnodb_file_format_max.
Барои санҷидани ин, мо тасвири Percona Server Docker -ро истифода мебарем. Мо конфигуратсияи серверро дар директория ҷойгир мекунем mysql_config_test, ва директорияҳо барои додаҳо ва гузоришҳо дар паҳлӯи онҳо эҷод кунед. Намунаи санҷиши конфигуратсияи percona-сервер:
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Натиҷа: ё дар гузоришҳои Docker ё дар феҳристи гузоришҳо, вобаста ба конфигуратсияи шумо, файле пайдо мешавад, ки дастурҳои мушкилотро тавсиф мекунад.
Ин аст он чизе ки мо доштем:
2020-04-03T12:44:19.670831Z 0 [Warning] [MY-011068] [Server] The syntax 'expire-logs-days' is deprecated and will be removed in a future release. Please use binlog_expire_logs_seconds instead.
2020-04-03T12:44:19.671678Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
2020-04-03T12:44:19.671682Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8_general_ci' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead. Аз ин рӯ, ба мо лозим омад, ки рамзҳоро муайян кунем ва дастури кӯҳнаро иваз кунем expire-logs-days.
Қисми 2: Санҷиши дастгоҳҳои корӣ
Ҳуҷҷатҳои такмилдиҳӣ ду утилитро барои санҷиши мутобиқати пойгоҳи додаҳо дар бар мегирад. Истифодаи ин утилитаҳо ба маъмур кӯмак мекунад, ки мутобиқати сохтори мавҷудаи маълумотро тафтиш кунад.
Биёед бо утилитаи классикии mysqlcheck оғоз кунем. Танҳо онро иҷро кунед:
mysqlcheck -u root -p --all-databases --check-upgradeАгар ягон мушкилот пайдо нашавад, утилита бо рамзи 0 хориҷ мешавад:

Илова бар ин, версияҳои муосири MySQL дорои утилитаҳои дастрас мебошанд (дар ҳолати Перкона, он баста аст percona-mysql-shell). Он ивазкунандаи мизоҷи классикии MySQL буда, вазифаҳои муштарӣ, муҳаррири SQL ва абзорҳои идоракунии MySQL-ро муттаҳид мекунад. Барои санҷидани сервер пеш аз навсозӣ, шумо метавонед фармонҳои зеринро иҷро кунед:
mysqlsh -- util check-for-server-upgrade { --user=root --host=1.1.1.1 --port=3306 } --config-path=/etc/mysql/my.cnfВа инҳоянд шарҳҳое, ки мо гирифтем:

Умуман, ҳеҷ чизи муҳим - танҳо огоҳиҳо дар бораи рамзгузорӣ (нигаред ба поён). Натиҷаи умумии иҷро:

Мо тасмим гирифтем, ки навсозӣ бояд бидуни мушкилот сурат гирад.
Эзоҳ дар бораи огоҳиҳои дар боло зикршуда, ки масъалаҳои рамзгузориро нишон медиҳанд. Гап дар он аст, ки UTF-8 то ба наздикӣ дар MySQL истифода мешуд. , зеро он ба ҷои 4 танҳо 3 байт захира кардааст. Дар MySQL 8, ин ниҳоят аст : тахаллус utf8 ба зудӣ ба рамзгузорӣ оварда мерасонад utf8mb4, ва сутунҳои кӯҳнаи ҷадвалҳо мешаванд utf8mb3. Рамзгузории минбаъда utf8mb3 хориҷ карда мешавад, аммо на дар ин нашр. Аз ин рӯ, мо тасмим гирифтем, ки рамзгузориро дар насби иҷрошавандаи DBMS пас аз навсозии он ислоҳ кунем.
Қисми 3: Навсозии серверҳо
Бо чунин нақшаи олиҷаноб чӣ метавонад хато кунад? Бо пурра дарк кардани он, ки нозукиҳо ҳамеша рух медиҳанд, мо таҷрибаи аввалини худро дар кластери MySQL таҳия кардем.
Тавре ки аллакай зикр шуд, масъалаи навсозии серверҳои MySQL-ро бо нусхабардорӣ фаро мегирад. Асос аз он иборат аст, ки шумо бояд аввал ҳама репликаҳоро (ғуломон) навсозӣ кунед, зеро MySQL 8 метавонад аз версияи асосии 5.7 нусхабардорӣ кунад. Як мушкилии ночиз дар он аст, ки мо истифода мебарем устод <-> устодвакте ки устои дурдаст дар режим аст хондаастИн маънои онро дорад, ки трафики воқеии ҷангӣ ба як маркази додаҳо меравад, дар ҳоле ки маркази дуюм ҳамчун нусхабардорӣ хизмат мекунад.
Топология чунин менамояд:

Навсозӣ бояд бо нусхабардорӣ оғоз шавад нусхаи mysql dc 2, mysql master dc 2 и mysql replica dc 1, ва бо сервери MySQL master dc 1 ба охир мерасад. Барои эътимоднокии бештар, мо мошинҳои виртуалиро қатъ кардем, аксҳои онҳоро гирифтем ва фавран пеш аз навсозӣ такрорро бо фармон қатъ кардем. STOP SLAVEҚисми боқимондаи навсозӣ чунин менамояд:
- Мо ҳар як репликаро бозоғоз мекунем ва ба танзимот 3 вариант илова мекунем:
skip-networking,skip-slave-start,skip-log-binГап дар он аст, ки навсозии пойгоҳи додаҳо гузоришҳои бинариро бо ҷадвалҳои системавии навсозӣ тавлид мекунад. Ин дастурҳо кафолат медиҳанд, ки ҳеҷ гуна тағйироти додаҳои барнома ба пойгоҳи додаҳо ворид карда нашавад ва маълумот дар бораи навсозии ҷадвалҳои система ба гузоришҳои бинарӣ дохил карда нашавад. Ин ҳангоми барқароркунии такрорӣ мушкилотро пешгирӣ мекунад. - Насб кардани баста
percona-server-serverБояд қайд кард, ки дар MySQL 8 не шумо бояд фармонро иҷро кунедmysqlupgradeпас аз навсозии сервер. - Пас аз оғози бомуваффақият, серверро аз нав оғоз кунед - ин дафъа бе параметрҳои дар қадами аввал иловашуда.
- Боварӣ ҳосил кунед, ки такрорӣ бомуваффақият кор мекунад: санҷед
SHOW SLAVE STATUSва мо мебинем, ки ҷадвалҳои ҳисобкунакҳо дар базаи барномаҳо нав карда мешаванд.
Ҳамааш ба қадри кофӣ оддӣ ба назар мерасад: навсозии таҳиякунанда бомуваффақият буд. Хуб, мо метавонем бехатарии навсозии шабонарӯзиро барои истеҳсолот ба нақша гирем.
Ҳеҷ гуна ғамгинӣ набуд - мо маҳсулотро нав кардем
Бо вучуди ин ба истехсолот гузарондани тачрибаи бомуваффакияти дех-конй бесабаб набуд.
Хушбахтона, худи раванди навсозӣ аз репликаҳо оғоз мешавад, бинобар ин, вақте ки мо ба мушкилот дучор шудем, мо ин равандро қатъ кардем ва нусхаро аз аксбардорӣ барқарор кардем. Тафтиши масъалахо то субхи дигар мавкуф гузошта шуд. Дар гузоришҳо сабтҳои зерин мавҷуданд:
2020-01-14T21:43:21.500563Z 2 [ERROR] [MY-012069] [InnoDB] table: t1 has 19 columns but InnoDB dictionary has 20 columns
2020-01-14T21:43:21.500722Z 2 [ERROR] [MY-010767] [Server] Error in fixing SE data for db1.t1
2020-01-14T21:43:24.208365Z 0 [ERROR] [MY-010022] [Server] Failed to Populate DD tables.
2020-01-14T21:43:24.208658Z 0 [ERROR] [MY-010119] [Server] Aborting Омӯзиши бойгонии бюллетенҳои гуногуни почтаи электронӣ дар Google боиси он гардид, ки ин мушкилот бо сабаби Гарчанде ки ин эҳтимолияти хатои хидматрасонӣ аст. mysqlcheck и mysqlsh.
Маълум мешавад, ки MySQL тарзи муаррифии маълумотро барои майдонҳои даҳӣ (int, tinyint ва ғайра) тағир додааст, аз ин рӯ MySQL-сервер усули дигари нигоҳдории дохилиро истифода мебарад. Агар базаи шумо дар аввал дар версияи 5.5 ё 5.1 буд, ва он гоҳ шумо ба 5.7 навсозӣ кардаед, пас ба шумо лозим меояд, ки иҷро кунед OPTIMIZE барои баъзе ҷадвалҳо. MySQL пас аз он файлҳои маълумотро навсозӣ мекунад ва онҳоро ба формати нигаҳдории ҷорӣ табдил медиҳад.
Инро бо истифода аз утилита низ метавон тафтиш кард mysqlfrm:
mysqlfrm --diagnostic -vv /var/lib/mysql/db/table.frm
...
'field_length': 8,
'field_type': 246, # формат поля
'field_type_name': 'decimal',
'flags': 3,
'flags_extra': 67,
'interval_nr': 0,
'name': 'you_deciaml_column',
... агар field_type агар он 0 бошад, пас ҷадвал навъи кӯҳнаро истифода мебарад - шумо бояд иҷро кунед OPTIMIZEАммо, агар арзиш 246 бошад, шумо аллакай навъи нав доред. Шумо метавонед дар бораи намудҳо бештар маълумот гиред .
Гузашта аз ин, дар Сабаби дуюми эҳтимолие, ки мо онро баррасӣ накардаем, дар ҷадвали система мавҷуд набудани ҷадвалҳои InnoDB мебошад. INNODB_SYS_TABLESPACES, агар онҳо, ҷадвалҳо, дар версияи 5.1 сохта шуда бошанд. Барои пешгирӣ кардани мушкилот ҳангоми навсозӣ, шумо метавонед истифода баред .
Чаро мо дар таҳия ин мушкилот надоштем? Махзани маълумот давра ба давра аз истеҳсолот нусхабардорӣ карда мешавад - ҳамин тавр, мизхо аз нав сохта мешаванд.
Мутаассифона, дар базаи воқеии кории калон ба таври оддӣ гирифтан ва иҷрои ҳама ҷо имконнопазир аст OPTIMIZEPercona-toolkit метавонад дар ин ҷо кӯмак кунад: утилитаи pt-online-schema-change барои амалиёти онлайни OPTIMIZE беҳтарин аст.
Нақшаи навшуда чунин шуд:
- Ҳама ҷадвалҳоро оптимизатсия кунед.
- Навсозии пойгоҳи додаҳоро иҷро кунед.
Барои санҷидани он ва инчунин муайян кардани вақти навсозӣ, мо яке аз репликаро ғайрифаъол кардем ва фармони зеринро барои ҳамаи ҷадвалҳо иҷро кардем:
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Навсозии ҷадвал бидуни қулфҳои тӯлонӣ иҷро карда мешавад, зеро утилита ҷадвали нави муваққатиро эҷод мекунад, ки ба он маълумотро аз ҷадвали асосӣ нусхабардорӣ мекунад. Пас аз якхела будани ҳарду ҷадвал, ҷадвали аслӣ баста мешавад ва бо ҷадвали нав иваз карда мешавад. Дар ҳолати мо, санҷиш нишон дод, ки навсозии ҳамаи ҷадвалҳо тақрибан як рӯзро дар бар мегирад, аммо нусхабардории маълумот ба дискҳо фишори аз ҳад зиёд меорад.
Барои он ки ба ин кор рох надихем, мо дар истехсолот ба фармон далеле илова кардем --sleep бо арзиши 10 — ин параметр вақти интизориро пас аз интиқоли маҷмӯи маълумот ба ҷадвали нав танзим мекунад. Ин метавонад сарбориро коҳиш диҳад, агар барномаи воқеии иҷрошаванда ба вақти посух ҳассос бошад.
Пас аз ба итмом расонидани оптимизатсия, навсозӣ муваффақ шуд.
…аммо на комилан!
Ҳамагӣ ним соат пас аз навсозӣ, муштарӣ бо мушкилот ворид шуд. Базаи база хеле ачоиб амал мекард: вай ба таври фосилавй cap шуд барқароркунии пайвастшавӣИн дар мониторинг чунин буд:

Намоиши скриншот графики арраро нишон медиҳад, ки нишон медиҳад, ки баъзе риштаҳои сервери MySQL давра ба давра вайрон мешаванд. Барнома бо хатогиҳои зерин сар кард:
[PDOException] SQLSTATE[HY000] [2002] Connection refusedСанҷиши фаврии гузоришҳо нишон дод, ки демони mysqld натавонистааст захираҳои лозимиро аз системаи оператсионӣ ба даст орад. Ҳангоми бартараф кардани хатогиҳо, мо дар система чизҳои зеринро кашф кардем: Файлҳои сиёсати AppArmor "бесоҳиб":
# 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Ин файлҳо чанд сол пеш ҳангоми навсозӣ ба MySQL 5.7 сохта шуда буданд ва ба бастаи хориҷшуда тааллуқ доранд. Хориҷ кардани файлҳо ва аз нав оғоз кардани хидмати apparmor ин масъаларо ҳал кард:
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Дар охир
Ҳама гуна амалиёт, ҳатто соддатарин, метавонад ба мушкилоти ғайричашмдошт оварда расонад. Ва ҳатто нақшаи хуб андешидашуда на ҳамеша натиҷаи интизориро кафолат медиҳад. Дастаи мо ҳоло тозакунии ҳатмии ҳама гуна файлҳои нолозимро дар бар мегирад, ки мумкин аст дар натиҷаи амалҳои охирин дар ҳама нақшаҳои навсозӣ ҷамъ шуда бошанд.
Ва бо ин эҷоди графикии на он қадар касбӣ, ман мехоҳам ба Percona барои маҳсулоти аълоашон ташаккури зиёд гӯям!

PS
Инчунин дар блоги мо хонед:
- «»;
- «»;
- «»;
- «»;
- «".
Манбаъ: will.com
