Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaGusztáv Magyar Megváltozta több, mint 10 éve
2
Table alter at scale Aosc története István Pödör MySQL Ops. Eng. Oct, 20. 2012
3
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
4
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) ▪ Petabyte méretű adattárház ▪ Több ezer instance amire 60m+ lekérdezés jut másodpercenként ▪ 8(+2+3(perf/eng)) fős csapat, ezért főleg fejlesztéssel foglalkozunk
5
Alapok ▪ Kérdezz! (jobb egy érdekes beszélgetes, mint egy unalmas előadás) ▪ Minden külön gép > host ▪ Minden futó mysql egy host-ton > instance ▪ Shard vagy dbid, replikáció lánc (gépcsoport) ▪ Tier egy gépcsoportokat összefogó lista (pl dbid, dbname, services/instances)
6
OnlineSchemaChange (OSC) ▪ Downtime nem elfogadható és a masterek váltása nem elég biztonságosan automatizálható, túl drága ▪ Kellett egy online megoldás (OSC) ▪ Új tábla az új schema-val ▪ Triggerek létrehozása ▪ Adatok átemelése ▪ Kicserélni a régit az újjal
7
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 (és nem teljesen megbízható) ▪ Leggyengébb láncszem problémája (slave/master, egy tábla egy időben) ▪ Az egyszerű és gyors alter 2hét volt (sok instance)
8
Fejlesztők manual-OSC dba Manuálisan
9
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_
10
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
11
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…
12
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)
13
CREATE TABLE `tabla1` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 (minden gepen van checkout) svn - tier/tabla1 Schema tárolás
14
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)
15
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
16
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
17
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 tárolás checksum
18
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 3. tárolá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
19
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)
20
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');
21
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 ?
22
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.
23
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');
24
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)
25
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');
26
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
27
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);
28
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.
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 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');
31
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) ▪ (hamarosan) súlyozást is támogatja
32
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 parameterek (‘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 |
33
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)
34
svn - tier/tabla1 scheduler 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`) | udb01.snc1| 3306| tabla1| OK| WAITING |0| NULL |0|10| NULL | udb | queue aosc_osc_ww jogosultság Inkonzisztens db-k
35
svn - tier/tabla1 scheduler 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
36
svn - tier/tabla1 scheduler 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 (osc_wrapper.php ) ellenőrzés jogosúltság alter inditása alter status>
37
svn - tier/tabla1 scheduler 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
38
svn - tier/tabla1 scheduler 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 (osc_wrapper.php ) ellenorzes jogosultsag alter inditasa alter befejezes
39
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
40
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)
41
Jelenlegi állapot ▪ Működik ▪ Nem tökéletes a queue-ing (nincs súlyozás)
42
Have an impact! ▪ Dolgozz nálunk! (www.facebook.com/careers) ▪ Move Fast! ▪ Dba-ként, egy hét után a newsfeedben volt a kódom... ▪ Személyes kedvenceim: ▪ Zseniális munkatársak ▪ Nincs pozícióval kapcsolatos versengés ▪ Korlátlan mennyiségű redbull… ▪ “Tedd amihez értesz, itt van hozzá minden”
43
Kérdések? ▪ (UI: ingyen ajándékok itt nálam)
44
(c) 2009 Facebook, Inc. or its licensors. "Facebook" is a registered trademark of Facebook, Inc.. All rights reserved. 1.0
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.