Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Alter at scale - Podor István (Facebook)

Alter at scale - Podor István (Facebook)

Az előadás célja, röviden bemutatni egy saját fejlesztésű megoldást arról, hogyan végezzük a táblák alterelését online, a világ egyik legnagyobb mysql clusterén.

Budapest Database Meetup

March 07, 2013
Tweet

More Decks by Budapest Database Meetup

Other Decks in Technology

Transcript

  1. 1 Alapok 2 Rendszerek felépítése és a problémák 3 Manuális

    megoldások és a múlt 4 Automatizált megoldás 5 Q&A Agenda
  2. Db ops team ▪  A csapat amiben én magam is

    dolgozom (MySQL Infrastructure Operations Engineering) ▪  Minden adat, aminek perzisztensnek kell lennie ▪  Petabyte méretű adattárház ▪  Több ezer instance amire 60m+ lekérdezés jut másodpercenként ▪  10 fős csapat, ezért főleg fejlesztéssel foglalkozunk
  3. Alapok ▪  Kérdezz! (jobb egy érdekes beszélgetes, mint egy unalmas

    előadás) ▪  Tier > host > instance >> shard/dbid ▪  Tier egy gépcsoportokat összefogó lista (pl dbid, dbname, services/instances)
  4. Megoldás és a problémák ▪  Futtatni minden gépen és db-n

    kézzel (tool-ok) ▪  Borzalmasan sok idő ▪  Rengeteg a hibalehetőség ▪  A gépek gyakran cserélődnek, a hostname irreleváns ▪  Nehéz jegyezni hol készült el, az ellenőrzés költséges ▪  Leggyengébb láncszem problémája (slave/master, egy tábla egy időben) ▪  Az egyszerű és gyors alter 2hét volt (inkább 3 hónap)
  5. A szükség ▪  Alter automatikusan, ember nélkül ▪  Maximális kihasználtság

    ▪  szabályozhatóan, concurrency, prioritás ▪  Failsafe működés ▪  Nyomonkövethető, bármikor szüneteltethető, leállítható ▪  _automatikusan_
  6. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek ▪ 

    Instance aktuális állapotának tárolása ▪  Helyi státuszok összegyűjtése ▪  Alter management ▪  Helyi állapotok összegyűjtése ▪  Queue összeállítása ▪  Alter elindítása
  7. Mielőtt elkezdjük… ▪  Végigmegyünk egy példán ▪  Kérdezz, vitatkozz bátran!

    ▪  jobb egy érdekes beszélgetes, mint egy unalmas előadás…
  8. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek tárolása

    (svn) ▪  Aktuális állapotok tárolása (mysql, local/central) ▪  Helyi státuszok elkészítése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok összegyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter elindítása (aosc_osc_ww)
  9. CREATE TABLE `tabla1` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB

    DEFAULT CHARSET=latin1 (minden gepen van checkout) svn - tier/tabla1 Schema tárolás
  10. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek tárolása

    (svn) ▪  Aktuális állapotok tárolása (mysql, local/central) ▪  Helyi státuszok elkészítése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok összegyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter elindítása (aosc_osc_ww)
  11. svn - tier/tabla1 checksum udbxx.snc:3306 MySQL tábla: aosc_local_status CREATE TABLE

    `aosc_local_status` ( `host`, `port` int(4), `database`, `table_name`, `hash_current`, `hash_desired`, `status` enum('OK','NA','INC’), `last_run` timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 aosc_checksu m (osc segítségével) kivánt schema
  12. svn - tier/tabla1 udbxx.snc:3306 MySQL tábla: aosc_local_status CREATE TABLE `aosc_local_status`

    ( `host`, `port` int(4), `database`, `table_name`, `hash_current`, `hash_desired`, `status` enum('OK','NA','INC’), `last_run` timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 udbxx.snc:3306 -  dbid1.tabla1 -  dbid2.tabla1 -  dbid3.tabla1 aosc_checksu m (osc segítségével) udbxx.snc | 3306 | dbid1 | tabla1 | abcd | efgh | INC udbxx.snc | 3306 | dbid2 | tabla1 | efgh | efgh | OK udbxx.snc | 3306 | dbid3 | tabla1 | NULL| efgh | NA kivánt schema összehasonlítá s checksum
  13. svn - tier/tabla1 udbxx.snc:3306 MySQL tábla: aosc_local_status CREATE TABLE `aosc_local_status`

    ( `host`, `port` int(4), `database`, `table_name`, `hash_current`, `hash_desired`, `status` enum('OK','NA','INC’), `last_run` timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 udbxx.snc:3306 -  dbid1.tabla1 -  dbid2.tabla1 -  dbid3.tabla1 aosc_checksu m (osc segítségével) udbxx.snc | 3306 | dbid1 | tabla1 | abcd | efgh | INC udbxx.snc | 3306 | dbid2 | tabla1 | efgh | efgh | OK udbxx.snc | 3306 | dbid3 | tabla1 | NULL| efgh | NA kivánt schema összehasonlítá s checksum
  14. svn - tier/tabla1 udbxx.snc:3306 MySQL tábla: aosc_local_status CREATE TABLE `aosc_local_status`

    ( `host`, `port` int(4), `database`, `table_name`, `hash_current`, `hash_desired`, `status` enum('OK','NA','INC’), `last_run` timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 udbxx.snc:3306 -  dbid1.tabla1 -  dbid2.tabla1 -  dbid3.tabla1 aosc_checksu m (osc sefítségével) udbxx.snc | 3306 | dbid1 | tabla1 | abcd | efgh | INC udbxx.snc | 3306 | dbid2 | tabla1 | efgh | efgh | OK udbxx.snc | 3306 | dbid3 | tabla1 | NULL| efgh | NA 1. kivánt schema 2. összehasonlítás ▪  osc_wrapper.php –dry_run opcióval ▪  checksum md5() function-nel php-ból ▪  Lekérdezés 1 query-vel (select database from aosc_local_status where table_name = ‘tabla1’ and status <> ‘OK’) checksum
  15. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek tárolása

    (svn) ▪  Aktuális állapotok tárolása (mysql, local/central) ▪  Helyi státuszok elkészítése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok összegyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter elindítása (aosc_osc_ww)
  16. svn - tier/tabla1 brain udbxx.snc:3306 MySQL: aosc_local_status aosc_db MySQL: - 

    allowed_alters -  current_alters dba CREATE TABLE `allowed_alters` ( `group`, `table_name`, `allowed_by`, `allowed_at`, `priority`, `server_list` enum('default','custom’), ) ENGINE=InnoDB DEFAULT CHARSET=latin1 insert into allowed_to_alter values (‘udb', ‘tabla1’, 'istvan', NULL, 10, 'default');
  17. svn - tier/tabla1 brain udbxx.snc:3306 MySQL: aosc_local_status aosc_brain aosc_db MySQL:

    -  allowed_alters -  current_alters -  finished_alters CREATE TABLE `allowed_alters` ( `group`, `table_name`, `allowed_by`, `allowed_at`, `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udb', ‘tabla1’, 'istvan', NULL, 10, 'default'); CREATE TABLE `finished_alters` ( `group`, `table_name`, `finished_at`, `tries` )) ENGINE=InnoDB DEFAULT CHARSET=latin1 ?
  18. svn - tier/tabla1 brain udbxx.snc:3306 MySQL: aosc_local_status aosc_brain aosc_db MySQL:

    -  allowed_alters -  current_alters -  finished_alters CREATE TABLE `allowed_alters` ( `group`, `table_name`, `allowed_by`, `allowed_at`, `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udb', ‘tabla1’, 'istvan', NULL, 10, 'default'); CREATE TABLE `current_alters` ( `group`, `table_name`, `status` enum('DONE','IPR','HOLD’), `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); CREATE TABLE `finished_alters` ( `group`, `table_name`, `finished_at`, `tries` )) ENGINE=InnoDB DEFAULT CHARSET=latin1 ? – 3x24h sleep 1. 2. 3.
  19. svn - tier/tabla1 brain udbxx.snc:3306 MySQL: - aosc_local_status aosc_brain aosc_db

    MySQL: -  allowed_alters -  current_alters -  finished_alters ▪  Allowed_alters az egyetlen tábla amihez ember/alkalmazás kivülről hozzányúlhat ▪  A gépek cserélődése miatt, minimum 3x24 óráig várunk ha a gépeket konzisztensnek ítéltük ▪  A harmadik probálkozás után, az aosc_brain ellenőrzi, hogy valóban mind rendben van-e ellenorzes aosc_checksu m CREATE TABLE `current_alters` ( `group`, `table_name`, `status` enum('DONE','IPR','HOLD’), `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udb', ‘tabla1’, ‘IPR', 10, 'default');
  20. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek (svn)

    ▪  Aktuális állapot tárolása (mysql, local/central) ▪  Helyi státuszok összegyűjtése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok begyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter elindítása (aosc_osc_ww)
  21. svn - tier/tabla1 collector udbxx.snc:3306 MySQL: - aosc_local_status aosc_brain aosc_db

    MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 aosc_checksu m aosc_collector (‘udb', ‘tabla1’, ‘IPR', 10, 'default');
  22. svn - tier/tabla1 collector udbxx.snc:3306 MySQL: - aosc_local_status aosc_brain aosc_db

    MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 aosc_checksu m aosc_collector (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); CREATE TABLE `alter_udb_tabla1`( `host`, `port`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1
  23. svn - tier/tabla1 collector udbxx.snc:3306 MySQL: - aosc_local_status aosc_brain aosc_db

    MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 aosc_checksu m aosc_collector (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); pmysql CREATE TABLE `alter_udb_tabla1`( `host`, `port`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udbxx.snc’, 3306);
  24. svn - tier/tabla1 collector udbxx.snc:3306 MySQL: - aosc_local_status aosc_brain aosc_db

    MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 aosc_checksu m aosc_collector (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); pmysql CREATE TABLE `alter_udb_tabla1`( `host`, `port`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udbxx.snc’, 3306); ▪  A collector hozza létre az alter_$tier_$table táblát ▪  Amennyiben nem talál inkonzisztens instance-ot, kezeli a finished_alters táblát is ▪  A server lista, a csoport neve alapján egy központi rendszerünkből jön ▪  Pmysql > paralell mysql query 1. 2. 3. 4.
  25. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek (svn)

    ▪  Aktuális állapot tárolása (mysql, local/central) ▪  Helyi státuszok összegyűjtése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok begyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter elindítása (aosc_osc_ww)
  26. svn - tier/tabla1 scheduler udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww

    aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters -  alter_db_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler Queue paraméterek (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default');
  27. svn - tier/tabla1 scheduler udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww

    aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters -  alter_db_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler Queue paraméterek (‘udbxxsnc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); ▪  Figyelembe veszi a tier/csoport egyéni tulajdonságait (pl maximális alterek száma) ▪  Host/instance alapú teljesítmény elosztás ▪  Queue karbantartás ▪  Datacenter alapján elosztja a terhelést ▪  Figyelembe veszi a prioritást ▪  Replikaciós sorrendet kezel (master/slave) ▪  súlyozást is támogatja
  28. svn - tier/tabla1 scheduler udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww

    aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters -  alter_db_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); CREATE TABLE `running_alters` ( `host`, `port`, `group`, `table_name`, `osc_status` enum('READY','RUNNING','DONE’), `last_updated`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1 (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); CREATE TABLE `aosc_osc_ww` ( `host`, `port`, `table_name`, `osc_priv` enum('OK','STOP’), `status` enum(‘WAITING’,'RUNNING’,'DONE’). `percentage`, `last_update`, `try`, `priority`, `start_time`, `group`) | udbxx.snc |3306| tabla1| OK| WAITING | 0 | NULL |0|10| NULL | udb |
  29. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens tábla szerkezetek (svn)

    ▪  Aktuális állapot tárolása (mysql, local/central) ▪  Helyi státuszok összegyűjtése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok begyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter elindítása (aosc_osc_ww)
  30. svn - tier/tabla1 aosc_osc_ww udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww

    dbid1.tabla1 dbid2.tabla1 dbid3.tabla1 aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); CREATE TABLE `aosc_osc_ww` ( `host`, `port`, `table_name`, `osc_priv` enum('OK','STOP’), `status` enum(‘WAITING’,'RUNNING’,'DONE’). `percentage`, `last_update`, `try`, `priority`, `start_time`, `group`) | udbxx.snc1| 3306| tabla1| OK| WAITING |0| NULL |0|10| NULL | udb | queue aosc_osc_ww jogosultság Inkonzisztens db-k
  31. svn - tier/tabla1 udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww dbid1.tabla1

    dbid2.tabla1 dbid3.tabla1 aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); queue aosc_osc_ww ellenörzés jogosúltság aosc_osc_ww
  32. svn - tier/tabla1 udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww dbid1.tabla1

    dbid2.tabla1 dbid3.tabla1 aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); queue aosc_osc_ww aosc_osc_ww (osc_wrapper.php) ellenőrzés jogosúltság status> aosc_osc_ww
  33. svn - tier/tabla1 udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww dbid1.tabla1

    dbid2.tabla1 dbid3.tabla1 aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); queue aosc_osc_ww befejezés aosc_osc_ww
  34. svn - tier/tabla1 udbxx.snc:3306 MySQL: - aosc_local_status - aosc_osc_ww dbid1.tabla1

    dbid2.tabla1 dbid3.tabla1 aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gepek tablak (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); queue aosc_osc_ww aosc_osc_ww (osc_wrapper.php) ellenorzes jogosultsag befejezes aosc_osc_ww
  35. svn - tier/tabla1 Scheduler - karbantartás udbxx.snc:3306 MySQL: - aosc_local_status

    - aosc_osc_ww aosc_brain aosc_db MySQL: -  allowed_alters -  current_alters -  finished_alters - alter_udb_tabla1 -  running_alters aosc_checksu m aosc_collector aosc_scheduler (‘udbxx.snc’, 3306); gépek táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); ▪  Ellenőrzi a queue státuszokat ▪  Nem várunk-e túl régóta az alter indítására ▪  Nem fut-e túl régóta ▪  Létezik-e egyáltalán még az instance ▪  Ha egy instance-ot elvesztünk, nem törődünk vele, töröljük aosc_osc_ww
  36. Mit kell tudnunk az automatizáláshoz? ▪  Konzisztens táblaszerkezetek (svn) ▪ 

    Aktuális állapot tárolása (mysql, local/central) ▪  Helyi státuszok összegyűjtése (aosc_cheksum) ▪  Alter management (aosc_brain) ▪  Helyi állapotok begyűjtése (aosc_collector) ▪  Queue összeállítása (aosc_scheduler) ▪  Alter futtatása (aosc_osc_ww)
  37. Jelenlegi állapot ▪  Működik J ▪  “Nagy” alter (100tb+) ~24h

    ▪  “Kis” alter (10tb+) ~3h ▪  100+ alter egyszerre ▪  Nincs downtime, lock, problémák
  38. (c) 2009 Facebook, Inc. or its licensors. "Facebook" is a

    registered trademark of Facebook, Inc.. All rights reserved. 1.0