440 likes | 597 Views
Table alter at scale Aosc története. István Pödör MySQL Ops. Eng. Oct, 20. 2012. Agenda. Db ops team. A csapat amiben én magam is dolgozom ( MySQL Infrastructure Operations Engineering) Minden adat , aminek perzisztensnek kell lennie ( 1milliárd aktív felhasználóhoz )
E N D
Table alter at scaleAosctörténete IstvánPödör MySQL Ops. Eng. Oct, 20. 2012
Db ops team • A csapatamibenénmagam is dolgozom (MySQL Infrastructure Operations Engineering) • Minden adat, aminekperzisztensnekkelllennie(1milliárd aktívfelhasználóhoz) • Petabyte méretűadattárház • Többezer instance amire 60m+ lekérdezés jut másodpercenként • 8(+2+3(perf/eng)) főscsapat, ezértfőlegfejlesztésselfoglalkozunk
Alapok • Kérdezz! (jobbegyérdekesbeszélgetes, mint egyunalmaselőadás) • Minden különgép> host • Minden futómysqlegy host-ton > instance • Shard vagydbid, replikációlánc (gépcsoport) • Tier egygépcsoportokatösszefogólista (pldbid, dbname, services/instances)
OnlineSchemaChange (OSC) • Downtime nemelfogadhatóésa masterekváltásanemelégbiztonságosanautomatizálható, túldrága • Kellettegy online megoldás(OSC) • Újtáblaazújschema-val • Triggereklétrehozása • Adatokátemelése • Kicserélnia régitazújjal
Megoldásés a problémák • Futtatnimindengépenésdb-n kézzel(tool-ok) • Borzalmasansokidő • Rengeteg a hibalehetőség • A gépekgyakrancserélődnek, a hostname irreleváns • Nehézjegyezniholkészültel, azellenőrzésköltséges (ésnemteljesenmegbízható) • Leggyengébbláncszemproblémája(slave/master, egytáblaegyidőben) • Azegyszerűésgyors alter 2hét volt (sok instance)
Fejlesztők manual-OSC dba Manuálisan
A szükség • Alter automatikusan, ember nélkül • Maximáliskihasználtság • szabályozhatóan, concurrency, prioritás • Failsafe működés • Nyomonkövethető, bármikorszüneteltethető, leállítható • _automatikusan_
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetek • Instance aktuálisállapotánaktárolása • Helyistátuszokösszegyűjtése • Alter management • Helyiállapotokösszegyűjtése • Queue összeállítása • Alter elindítása
Mielőttelkezdjük… • Végigmegyünkegypéldán • Kérdezz, vitatkozzbátran! • jobbegyérdekesbeszélgetes, mint egyunalmaselőadás…
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetektárolása(svn) • Aktuálisállapotoktárolása(mysql, local/central) • Helyistátuszokelké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)
Schema tárolás svn - tier/tabla1 CREATE TABLE `tabla1` ( `id` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1(minden gepen van checkout)
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetektárolása(svn) • Aktuálisállapotoktárolása(mysql, local/central) • Helyistátuszokelké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)
checksum svn - tier/tabla1 kivántschema aosc_checksum (oscsegítségével) 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
checksum svn - tier/tabla1 kivántschema aosc_checksum (oscsegítségével) összehasonlítás udbxx.snc:3306 udbxx.snc:3306 • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 udbxx.snc| 3306 | dbid1 | tabla1 | abcd| efgh| INC udbxx.snc| 3306 | dbid2 | tabla1 | efgh | efgh| OK udbxx.snc| 3306 | dbid3 | tabla1 | NULL| efgh| NA 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
checksum svn - tier/tabla1 kivántschema aosc_checksum (oscsegítségével) összehasonlítás udbxx.snc:3306 tárolás udbxx.snc:3306 • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 udbxx.snc| 3306 | dbid1 | tabla1 | abcd | efgh | INC udbxx.snc| 3306 | dbid2 | tabla1 | efgh | efgh | OK udbxx.snc| 3306 | dbid3 | tabla1 | NULL| efgh | NA 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
checksum svn - tier/tabla1 1. kivántschema aosc_checksum (oscsefítségével) 2. összehasonlítás udbxx.snc:3306 3. tárolás udbxx.snc:3306 • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 udbxx.snc| 3306 | dbid1 | tabla1 | abcd | efgh | INC udbxx.snc| 3306 | dbid2 | tabla1 | efgh | efgh | OK udbxx.snc| 3306 | dbid3 | tabla1 | NULL| efgh | NA 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 • osc_wrapper.php –dry_runopcióval • checksum md5() function-nelphp-ból • Lekérdezés 1 query-vel(select database from aosc_local_status where table_name = ‘tabla1’ and status <> ‘OK’)
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetektárolása(svn) • Aktuálisállapotoktárolása(mysql, local/central) • Helyistátuszokelké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)
brain svn - tier/tabla1 dba aosc_db insert into allowed_to_alter values (‘udb', ‘tabla1’, 'istvan', NULL, 10, 'default'); udbxx.snc:3306 • MySQL: • allowed_alters • current_alters CREATE TABLE `allowed_alters` ( `group`, `table_name`, `allowed_by`, `allowed_at`, `priority`, `server_list` enum('default','custom’), ) ENGINE=InnoDB DEFAULT CHARSET=latin1 MySQL: aosc_local_status
brain svn - tier/tabla1 (‘udb', ‘tabla1’, 'istvan', NULL, 10, 'default'); CREATE TABLE `allowed_alters` ( `group`, `table_name`, `allowed_by`, `allowed_at`, `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters MySQL: aosc_local_status aosc_brain ? CREATE TABLE `finished_alters` ( `group`, `table_name`, `finished_at`, `tries` )) ENGINE=InnoDB DEFAULT CHARSET=latin1
brain svn - tier/tabla1 (‘udb', ‘tabla1’, 'istvan', NULL, 10, 'default'); CREATE TABLE `allowed_alters` ( `group`, `table_name`, `allowed_by`, `allowed_at`, `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters 1. MySQL: aosc_local_status aosc_brain 2. 3. (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); ? – 3x24h sleep CREATE TABLE `current_alters` ( `group`, `table_name`, `status` enum('DONE','IPR','HOLD’), `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 CREATE TABLE `finished_alters` ( `group`, `table_name`, `finished_at`, `tries` )) ENGINE=InnoDB DEFAULT CHARSET=latin1
brain (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); svn - tier/tabla1 CREATE TABLE `current_alters` ( `group`, `table_name`, `status` enum('DONE','IPR','HOLD’), `priority`, `server_list` enum('default','custom’) )) ENGINE=InnoDB DEFAULT CHARSET=latin1 aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters MySQL: - aosc_local_status aosc_brain ellenorzes aosc_checksum • Allowed_altersazegyetlentáblaamihez ember/alkalmazáskivülrőlhozzányúlhat • A gépekcserélődésemiatt, minimum 3x24 óráigvárunkha a gépeketkonzisztensnekítéltük • A harmadikprobálkozásután, azaosc_brainellenőrzi, hogyvalóbanmind rendben van-e
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetek (svn) • Aktuálisállapottárolása(mysql, local/central) • Helyistátuszokösszegyűjtése(aosc_cheksum) • Alter management (aosc_brain) • Helyiállapotokbegyűjtése(aosc_collector) • Queue összeállítása(aosc_scheduler) • Alter elindítása(aosc_osc_ww)
collector svn - tier/tabla1 aosc_brain aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 MySQL: - aosc_local_status (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_collector aosc_checksum
collector svn - tier/tabla1 aosc_brain aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 MySQL: - aosc_local_status (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_collector aosc_checksum CREATE TABLE `alter_udb_tabla1`( `host`, `port`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1
collector svn - tier/tabla1 aosc_brain aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 MySQL: - aosc_local_status (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); pmysql aosc_collector aosc_checksum (‘udbxx.snc’, 3306); CREATE TABLE `alter_udb_tabla1`( `host`, `port`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1
collector svn - tier/tabla1 aosc_brain aosc_db udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 MySQL: - aosc_local_status (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); 1. pmysql 3. aosc_collector aosc_checksum 2. (‘udbxx.snc’, 3306); • A collector hozzalétreazalter_$tier_$tabletáblát • Amennyibennemtalálinkonzisztens instance-ot, kezeli a finished_alterstáblátis • A server lista, a csoportnevealapjánegyközpontirendszerünkbőljön • Pmysql > paralellmysql query 4. CREATE TABLE `alter_udb_tabla1`( `host`, `port`, )) ENGINE=InnoDB DEFAULT CHARSET=latin1
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetek (svn) • Aktuálisállapottárolása(mysql, local/central) • Helyistátuszokösszegyűjtése(aosc_cheksum) • Alter management (aosc_brain) • Helyiállapotokbegyűjtése(aosc_collector) • Queue összeállítása(aosc_scheduler) • Alter elindítása(aosc_osc_ww)
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • alter_db_tabla1 • running_alters • MySQL: • - aosc_local_status • - aosc_osc_ww paraméterek aosc_scheduler Queue aosc_checksum
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_db aosc_collector gépek (‘udbxxsnc’, 3306); udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • alter_db_tabla1 • running_alters • MySQL: • - aosc_local_status • - aosc_osc_ww paraméterek aosc_scheduler Queue aosc_checksum • Datacenter alapjánelosztja a terhelést • Figyelembeveszi a prioritást • Replikacióssorrendetkezel (master/slave) • (hamarosan) súlyozástis támogatja • Figyelembeveszi a tier/csoportegyénitulajdonságait(plmaximálisalterekszáma) • Host/instance alapúteljesítményelosztás • Queue karbantartás
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • alter_db_tabla1 • running_alters • MySQL: • - aosc_local_status • - aosc_osc_ww aosc_scheduler parameterek Queue aosc_checksum (‘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`) 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| tabla1| OK| WAITING | 0 | NULL |0|10| NULL | udb|
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetek (svn) • Aktuálisállapottárolása(mysql, local/central) • Helyistátuszokösszegyűjtése(aosc_cheksum) • Alter management (aosc_brain) • Helyiállapotokbegyűjtése(aosc_collector) • Queue összeállítása(aosc_scheduler) • Alter elindítása(aosc_osc_ww)
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_checksum aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); aosc_scheduler • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 • running_alters queue (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); udbxx.snc:3306 • MySQL: • - aosc_local_status • - aosc_osc_ww • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 aosc_osc_ww Inkonzisztens db-k jogosultság 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`) | udb01.snc1| 3306| tabla1| OK| WAITING |0| NULL |0|10| NULL | udb|
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_checksum aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); aosc_scheduler • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 • running_alters queue (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); udbxx.snc:3306 jogosúltság • MySQL: • - aosc_local_status • - aosc_osc_ww • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 ellenörzés aosc_osc_ww
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_checksum aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); aosc_scheduler • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 • running_alters queue (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); udbxx.snc:3306 jogosúltság • MySQL: • - aosc_local_status • - aosc_osc_ww • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 ellenőrzés aosc_osc_ww status> alter inditása alter aosc_osc_ww (osc_wrapper.php)
scheduler svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_checksum aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); aosc_scheduler • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 • running_alters queue (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); udbxx.snc:3306 • MySQL: • - aosc_local_status • - aosc_osc_ww • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 aosc_osc_ww befejezés
scheduler svn - tier/tabla1 aosc_brain tablak (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_checksum aosc_db aosc_collector gepek (‘udbxx.snc’, 3306); aosc_scheduler • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 • running_alters queue (‘udbxx.snc’, 3306,’udb’,’tabla1’,’READY’, NULL); udbxx.snc:3306 jogosultsag • MySQL: • - aosc_local_status • - aosc_osc_ww • dbid1.tabla1 • dbid2.tabla1 • dbid3.tabla1 ellenorzes aosc_osc_ww befejezes alter inditasa alter aosc_osc_ww (osc_wrapper.php)
Scheduler - karbantartás svn - tier/tabla1 aosc_brain táblák (‘udb', ‘tabla1’, ‘IPR', 10, 'default'); aosc_db aosc_collector gépek (‘udbxx.snc’, 3306); udbxx.snc:3306 • MySQL: • allowed_alters • current_alters • finished_alters • - alter_udb_tabla1 • running_alters • MySQL: • - aosc_local_status • - aosc_osc_ww aosc_scheduler aosc_checksum aosc_osc_ww • Ellenőrzia queue státuszokat • Nemvárunk-e túlrégótaaz alter indítására • Nemfut-e túlrégóta • Létezik-e egyáltalánmégaz instance • Ha egy instance-otelvesztünk, nemtörődünkvele, töröljük
Mitkelltudnunkazautomatizáláshoz? • Konzisztenstáblaszerkezetek(svn) • Aktuálisállapottárolása(mysql, local/central) • Helyistátuszokösszegyűjtése(aosc_cheksum) • Alter management (aosc_brain) • Helyiállapotokbegyűjtése(aosc_collector) • Queue összeállítása(aosc_scheduler) • Alter futtatása(aosc_osc_ww)
Jelenlegiállapot • Működik • Nemtökéletes a queue-ing (nincssúlyozás)
Have an impact! • Dolgozználunk! (www.facebook.com/careers) • Move Fast! • Dba-ként, egyhétután a newsfeedben volt a kódom... • Személyeskedvenceim: • Zseniálismunkatársak • Nincspozícióvalkapcsolatosversengés • Korlátlanmennyiségűredbull… • “Teddamihezértesz, itt van hozzáminden”
Kérdések? • (UI: ingyenajándékokittnálam)