Po migracji Archa na MariaDB

28 marzec 2013

Nie sądzę, że będę mieć jeszcze okazję przeprowadzić równie szaleńczy plan migracji z jednego oprogramowania na drugie w swojej karierze w różnych dystrybucjach Linuksa. Migracja Arch Linuksa na MariaDB bez zepsucia niczego po drodze okazało się łatwiejsze niż się spodziewałem, ale nie ustrzegłem się od dosyć banalnych błędów wynikających zarówno z mojej niewiedzy lub zmęczenia, jak i pułapek zastawionych przez programistów z Monty Program AB…

Wyczucie czasu i miejsca to bardzo przydatna umiejętność, chociaż ciężko mi to nazwać zdolnościami, bardziej pasuje tutaj przypadek. Gdybym nie odezwał się w trakcie rozmowy na #archlinux-tu o planach związanych z MySQL, prawdopodobnie podobny wpis pisałby ktoś inny, o ile w ogóle by powstał. „Błysnąłem” wiedzą na tyle, aby uznano, że mam pomysł na przeprowadzenie migracji. Na moją korzyść działał również fakt, że żaden z developerów nie chciał z własnej woli podjąć się ani tego zadania, ani zajmowania się MySQL.

Tak czy siak, na liście arch-dev nikt nie był przeciwny awansowaniu mnie na Junior Developera. W ten sposób, 15 lutego uzyskałem dostęp do repozytoriów [extra] i (o dziwo) [core]. Uświadomienie mi, że nie jestem pełnoprawnym devem, nastąpiło bardzo szybko. Już przy pierwszym commicie (na wszelki wypadek wysłałem go do [testing]) okazało się, że wprowadzane przeze mnie zmiany są czytane od lewej do prawej, od prawej do lewej i zapewne na skosy. Cieszy mnie dbałość o jakość pakietów w repozytorium, ale moje zmiany nie różniły się od tych trafiających do [community]. Można zatem wysnuć wniosek, że Zaufani Użytkownicy są traktowani przez zespół developerski z większym pobłażaniem, niż do tej pory myślałem.

3 dni później na listę dyskusyjną arch-dev-public trafiły moje wypociny mające przekonać pozostałych developerów do migracji oraz zaprezentować jak miałaby ona wyglądać. Nie spotkałem się ze sprzeciwem (ba, paragraf dotyczący tak zwanej otwartości MySQL jest teraz cytowany w kilku miejscach), a jak się potem okazało, moje RFC było czystą formalnością. Kwestia zaufania do Oracle i przenosin na inną implementację MySQL został poruszony na zamkniętej liście arch-dev – w trakcie tej dyskusji padły analogiczne argumenty do moich.

Chociaż planowałem zająć się migracją jak najszybciej, repozytoria [staging] były zawalone pakietami związanymi z nowym Qt oraz libarchive. Dopiero na początku lutego zrobiło się na tyle spokojnie, abym mógł zrobić listę pakietów do przebudowania. Dzień wcześniej (tj. 02.02) przeniosłem poprawiony pakiet MariaDB do repozytorium [extra]. Lista pewnie wisiałaby długo z wielu powodów: leniwi opiekunowie, nieobecni opiekunowie, niechętni opiekunowie. Postanowiłem zatem samodzielnie zająć się pozostałymi pakietami i przy okazji trafiłem na oporną wersję libgda, która za nic nie chciała ze mną współpracować. Skończyło się na aktualizacji do testowej wersji (bleeding edge pełną gębą) i przebudowaniu zależności (zmiana soname…). Aby nie było zbyt łatwo, opiekun tej biblioteki nie przepada za ruszaniem „jego” pakietów bez zgody. Tym razem udało mi się uniknąć odgryzienia głowy.

15 marca przesunąłem przebudowane pakiety do [testing] i [community-testing]. W międzyczasie ujawniła się pierwsza niekompatybilność z MySQL. mysql_secure_install z MariaDB, uruchamiany przy instalacji pakietu, niespecjalnie współpracował z danymi utworzonymi przez analogiczne polecenie z MySQL. Teoretycznie skrypt powinien wykryć, czy ma cokolwiek do zrobienia i w przeciwnym wypadku zaniechać jakichkolwiek działań. W praktyce MariaDB (w okolicach wersji 5.5.27) wprowadza zmiany w strukturze plików i katalogów w bazach danych. W efekcie skrypt nie wykrywał, że dane są na miejscu. To oczywisty regres, któremu autorzy zaprzeczają (pozdrawiam gorąco), ale przy okazji został mi wskazany dosyć elementarny błąd. Skrypt mysql_secure_install powinien być uruchamiany wyłącznie podczas pierwszej instalacji. Po dodaniu więcej basha do pliku mariadb.install i ustaleniu, że użytkownik będzie musiał sam przenieść dotychczasowe instalacje na MariaDB/Perconę (mysql_upgrade), największy problem został zażegnany.

Po ostatnich testach pakietów i migracji pozostało przenieść pakiety do stabilnych repozytoriów i opublikować news opisujący zmiany oraz prezentujący przykładową migrację.

Co wyszło nie najlepiej

Nie wszystko się udało tak jak myślałem. Moim pierwszym grzechem było przesunięcie pakietów skompilowanych pod icu 51.1, bez właściwej biblioteki. Ucierpieli użytkownicy Qt 5, ale dzięki szybkiej reakcji Evangelos Foutrasa, w 3 godziny od zgłoszenia problemu wszystko było sprawne.

Inny błąd popełniłem przy przebudowaniu libdbi-drivers. Przez nieuwagę zamiast zmienić pkgrel z 3 na 4… obniżyłem go na 2. Chociaż nie unieruchomiło to żadnego programu, z pewnością część użytkowników była zdziwiona komunikatem twierdzącym, że zainstalowany pakiet jest nowszy niż ten dostępny w repozytoriach. (FS#34483)

Jak na razie ostatnim, równie głupim błędem, okazała się literówka w skrypcie instalacyjnym MariaDB. Po instalacji pakietu mariadb powinien zostać utworzony katalog /run/mysqld, ale nie był, bo systemd-tmpfiles używał nieistniejącego pliku mysqld.conf, a powinien korzystać z mysql.conf. Efektem błędu była niemożność uruchomienia MariaDB aż do restartu maszyny. Problem naprawiłem zanim trafił do bugtrackera.

News, chociaż znacznie lepszy od tego, który został zaproponowany przeze mnie, nie zawierał wszystkich potrzebnych informacji, po części przez moją ignorancję. Arch Linux jest głównie dystrybucją na komputery domowe, a przykład migracji dotyczył użytkowników serwerowych… Przypuszczalnie większość dotkniętych zmianą to użytkownicy KDE. W ich przypadku należało najpierw zatrzymać Akonadi (akonadictl stop), a potem wykonać polecenia ze strony głównej, na ponownym uruchomieniu Akonadi kończąc. Mea culpa.

Pojawiło się także kilka innych pomniejszych problemów, które w dystrybucji z większym devteamem i zapleczem finansowym pewnie zostałyby wyłapane podczas testowania, ale zwykle wystarczyło przeczytać komunikat błędu.

(Na marginesie, dobrze skonfigurowane MariaDB potrzebuje tyle samo lub mniej pamięci co MySQL.)

Po migracji

Najbardziej zaskoczyło mnie tempo obiegu informacji w Internecie. W niedługim czasie od wpisu o migracji, informacja pojawiła się między innymi na Reddicie (chociażby r/linux i r/programming; przemilczę r/archlinux, gdzie linka wrzuciłem sam), forum LowEndBox, Phoroniksie, Hacker News, DobrychProgramach (przy okazji dziękuję za podlinkowanie do bloga – w jeden dzień odwiedziło go tyle osób, ile zwykle odwiedzało przez tydzień), OSWorld czy blogu MariaDB. Jeżeli ktoś czuje się pominięty, to z góry przepraszam.

W komentarzach poruszano zwykle temat otwartości MySQL, wspominano także o innych dystrybucjach z MariaDB, chociaż nie zabrakło celnych pytań. W telegraficznym skrócie odnośnie MySQL: po przesunięciu do AUR nadal będę opiekował się pakietem, w maju planuję aktualizację do 5.6, a w czerwcu zacznę rozglądać się za nowym, kompetentnym opiekunem. Migracja została przeprowadzona w ekspresowym tempie z powodu zbliżającego się nowego wydania MariaDB, które częściowo zrywa z kompatybilnością z MySQL – zatem tak, to najlepszy moment, przynajmniej z punktu widzenia autorów dystrybucji.

Jako krótkie post scriptum, za sprawnie przeprowadzoną akcję zostałem awansowany na pełnego developera. Mam jeszcze kilka pomysłów na zmiany w Archu, ale z pewnością nie tak spektakularne jak rezygnacja z MySQL.