Michał Gruchała
Transkrypt
Michał Gruchała
Automatyzacja infrastruktury Gadu-Gadu Michał Gruchała [email protected] 08/06/2010 □ Specyfika / Zasady □ Platforma/Wirtualizacja □ DNS □ Konfigurator □ Nagios □ collectd □ Podsumowanie 2 Na przebudzenie 3 Statystyki □ 2700 systemów ◊ 3000 core, 1500 dysków, 10TB pamięci □ ~20 TB danych wysłanych w ciągu dnia □ W szczycie □ ◊ 30 tysięcy requestów HTTP/s ◊ 2 miliony pakietów w warstwie access ◊ 2.5 miliona sesji TCP ◊ 3x9 tyś insert, 28 tyś select (MySQL) ~40 projektów 4 Specyfika / Zasady 5 Specyfika/Zasady □ KISS/Brzytwa Okchama ◊ Tak prosto jak sie da ◊ Proste struktury → shardowanie danych □ Skalowalność □ Redundancja □ ◊ Wirtualne maszyny “są tanie” ◊ Awaria węzła nie stanowi problemu Master-Master 6 Specyfika/Zasady □ Dużo projektów/funkcjonalności ◊ Codename ◊ vlan ◊ prefix maszyn ◊ grupy dostępowe ◊ Każdy projekt ma swój vlan ( ~60) ◊ Każdy projekt ma swoje maszyny ◊ ◊ każda ma swoją (jedną) rolę Separacja projektów ◊ komunikacja przez API 7 Specyfika/Zasady □ Typowy projekt www ◊ LB (haproxy/varnish) ◊ Cache (memcached) ◊ Workery (lighttpd, PHP5 fcgi) ◊ Storage ◊ MogileFS lub NFS+DRDB ◊ Sphinx ◊ Bazy (MySQL 5.x) ◊ ◊ Master - Master → slave HA zapewnia wackamole, pacemaker 8 Wirtualizacja 9 Platforma/Wirtualizacja □ Typowy serwer ◊ 1U ◊ 8-12 core (2-2.5GHz) ◊ 24-48 GB RAM ◊ 4 dyski (SATA, SAS, SSD) ◊ 2 x 1Ge intefejs (WAN, LAN) ◊ 2 x Raid1 ◊ … troche lepszy PC 10 Platforma/Wirtualizacja □ Xen (dom0) ◊ Maszyna fizyczna ◊ Overbooking CPU ◊ □ ... i tak w szczycie ¼ core'ów “nic nie robi” ◊ vlany (bridge) dodawane z automatu ◊ Storage lokalnie Guest (domU) ◊ Maszyna wirtualna ◊ / swap /var jako partycje LVM na xenie 11 Platforma/Wirtualizacja □ Problemy ◊ Narzut wirtualizacji? ◊ Obawy developerów ◊ ◊ “Szkiełko I oko” ◊ Obserwuj steal ◊ Rysuj wszystko (naucz czytania wykresów) Rozłożenie guestów ◊ Charakterysytka (CPU, dysk, pamięć) ●… ◊ i tak wąskim gardłem są dyski Padł xen – nic się nie stało 12 Platforma/Wirtualizacja □ □ Dane ◊ 05/2010 – około 2700 systemów ◊ ~350 xenów ◊ ~2300 guestów ◊ Systemy ◊ Debian 99.5% ◊ CentOS 0.4 % (z reguły fizyczne) ◊ Windows 2 sztuki (wirtualne) Plany ◊ PXE, iSCSI, dm-cache/flashcache 13 konfigurator 14 konfigurator □ Konfiguracja aplikacji ◊ Oparty o repozytorium subversion ◊ Historia zmian ◊ Blokowanie update/Selektywny upgrade ◊ Profil ◊ konfiguracja aplikacji X dla grupy maszyn Y w ramach projektu Z PROJEKT.FUNKCJA.APP.(PROD|TEST|DEV) ◊ Pliki, katalogi względem / ◊ Skrypty preinstall postinstall 15 konfigurator □ Profile ◊ Podstawowe ◊ Dodawane do każdej maszyny ◊ Obejmują dużo maszyn ◊ Domyślnie ~20 profili per maszyna ● syslog-ng ,monit, ssh-server ● collectd , nrpe, dns-client ◊ Specyficzne ◊ Obejmują wąskie grupy maszyn ◊ Dodawane do maszyn z rolą ● Na przykład ggportal.web.lighttpd.prod 16 konfigurator □ Propagacja zmian ◊ User ◊ ◊ Serwer SVN ◊ ◊ commit hooks/post-commit Maszyna kliencka ◊ → webservice ◊ ← rsync do $tmp ◊ ᴐ Podmiana zmiennych ◊ Preinstall, cp $tmp /, Postinstall 17 konfigurator □ Przykładowy profil ◊ Obsługa sysctl sysctl.client.prod/.scripts/konfiguratorpostinstall.sh sysctl.client.prod/etc/rcS.d/S31sysctl.sh sysctl.client.prod/etc/init.d/sysctl.sh sysctl.client.prod/etc/sysctl.d/00default.conf ◊ Ustawienia dla konkretnych aplikacji ggportal.web.lighttpd.prod/etc/sysctl.d/10lighttpd.conf 18 konfigurator □ □ Dane ◊ Stała w czasie propagacja (2-3 minuty) ◊ ~ 1300 profili Plany ◊ Rozproszenie serwera subversion ◊ Profile stabilne ◊ upgrade aplikacji 19 # host 91.197.14.147 147.14.197.91.inaddr.arpa domain name pointer ip9119714147.gadugadu.pl. $TTL 1200 $ORIGIN gg.pl. @ IN SOA ns1.gadugadu.pl. root.gadugadu.pl. ( $GG_KONFIGURATOR_TIMESTAMP 3601 1800 1800000 3600 ) IN NS ns1.gadugadu.pl. IN NS ns2.gadugadu.pl. DNS @ IN MX 10 mx1 @ IN MX 10 mx2 @ IN TXT "v=spf1 ip4:91.197.14.64/26 mx all" # host gadugadu.pl gadugadu.pl has address 91.197.14.141 gadugadu.pl has address 91.197.14.140 gadugadu.pl mail is handled by 5 mail.gadugadu.pl. 20 DNS □ WAN ◊ □ Domeny typu gadu-gadu.pl ◊ 2 x Master (bind) ◊ View internal/external ◊ Dodawane “z konfiguratora” ◊ Serial “podbija” konfigurator (zmienne) LAN ◊ Domeny wewnętrzne ◊ 2 x Master (powerdns) ◊ 2 x Slave (bind) 21 DNS □ TLD wewnętrzne ◊ Atm – serwery, guesty, switche (wszystko co “jest w sieci”) □ ◊ Cat – powiązanie maszyna-switch ◊ Xen – powiązanie guest-xen ◊ ... Rekordy ◊ dodawane automatycznie ◊ Usuwane automatycznie 22 DNS □ Gdzie jest lb portalu gadu-gadu.pl ? $ host gadugadu.pl gadugadu.pl has address 91.197.14.141 $ host 91.197.14.141 141.14.197.91.inaddr.arpa domain name pointer ggportallb2eth01.atm. $ host ggportallb2.xen ggportallb2.xen is an alias for xen8.atm. $ host ggportallb2.cat ggportallb2.cat is an alias for switch2szafa9kolokacja1.atm. ... kolokacja1, szafa9, switch9, xen-8 23 DNS □ Dane ◊ ◊ LAN ◊ 8k zapytań/s ◊ 10k wpisów WAN ◊ 500 domen ◊ 800 zapytań/s 24 nagios 25 nagios □ Rozproszony ◊ Mastery (front) ◊ Workery □ Maszyny dodaje na podstawie DNS □ Testy ◊ Podstawowe ◊ ◊ CPU, Load, Disk Util, RAM Specyficzne ◊ na podstawie profili ◊ If profil ~= lighttpd.prod then check_http 26 nagios □ □ Dane ◊ 30k testów ◊ Co minutę wykonywanych jest 10k testów Plany ◊ Waga testów ◊ Własny interfejs ◊ ◊ Jako front do API nagiosa Powiązanie z CMDB 27 collectd 28 collectd □ Maszyny zgłaszają się same ◊ Przesyłają dane co 30 sekund ◊ Podstawowe wykresy (około 30) ◊ □ ◊ CPU, RAM, Load, Procesy, Sieć, TCP ◊ HDD: zajętość, obciążenie (io, util, svctm,..) Wykresy specyficzne ◊ Konfiguracja w profilach ◊ Najczęściej jako plugin exec Mapowanie maszyna → collectd-server-* 29 collectd □ Dane ◊ ◊ □ 2 maszyny (oczywiście wirtualne) ◊ Dyski SSD ◊ 3000 IO/s na maszynę ◊ 80GB danych (rrd) 300k źródeł danych, 100k wykresów Plany ◊ Własny panel ◊ Agregacja wykresów 30 11:52:54 bozar kernel: [ 3.648120] Console: switching to colour frame buffer device 160x50 11:52:54 bozar kernel: [ 4.549613] REISERFS (device sda6): found reiserfs format "3.6" with s 11:52:54 bozar kernel: [ 4.549631] REISERFS (device sda6): using ordered data mode 11:52:54 bozar kernel: [ 4.568333] REISERFS (device sda6): journal params: device sda6, size 11:52:54 bozar kernel: [ 4.568597] REISERFS (device sda6): checking transaction log (sda6) 11:52:54 bozar kernel: [ 4.626498] REISERFS (device sda6): Using r5 hash to sort names 11:52:54 bozar kernel: [ 11.393141] Adding 979924k swap on /dev/sda1. Priority:1 extents:1 a 11:52:54 bozar kernel: [ 11.523889] udev: starting version 151 11:52:54 bozar kernel: [ 11.835781] lp: driver loaded but no devices found 11:52:54 bozar kernel: [ 12.138927] Linux video capture interface: v2.00 12:03:34 bozar su[1926]: + /dev/console root:michal 12:03:34 bozar su[1926]: pam_unix(su:session): session opened for user michal by (uid=0) 12:03:34 bozar su[1926]: pam_unix(su:session): session closed for user michal 12:04:02 bozar su[1689]: pam_unix(su:session): session closed for user root 12:39:03 bozar kernel: [ 2785.402576] wlan0: authenticated 12:39:03 bozar kernel: [ 2785.420303] wlan0: associate with AP 00:0f:61:88:a7:41 (try 1) 12:39:03 bozar kernel: [ 2785.421997] wlan0: RX AssocResp from 00:0f:61:88:a7:41 (capab=0x431 st 12:39:03 bozar kernel: [ 2785.422001] wlan0: associated 12:43:03 bozar kernel: [ 3025.379449] wlan0: direct probe to AP 00:0f:61:89:84:e1 (try 1) 12:43:03 bozar kernel: [ 3025.385053] wlan0: direct probe responded 12:57:05 bozar NetworkManager: <info> (wlan0): supplicant connection state: group handshake > 12:57:12 bozar sudo: pam_sm_authenticate: Called 12:57:12 bozar sudo: pam_sm_authenticate: username = [michal] 12:57:12 bozar sudo: pam_sm_authenticate: /home/michal is already mounted 12:03:34 bozar su[1926]: + /dev/console root:michal 12:03:34 bozar su[1926]: pam_unix(su:session): session opened for user michal by (uid=0) 12:03:34 bozar su[1926]: pam_unix(su:session): session closed for user michal 12:04:02 bozar su[1689]: pam_unix(su:session): session closed for user root 12:39:03 bozar kernel: [ 2785.402576] wlan0: authenticated 12:39:03 bozar kernel: [ 2785.420303] wlan0: associate with AP 00:0f:61:88:a7:41 (try 1) 12:39:03 bozar kernel: [ 2785.421997] wlan0: RX AssocResp from 00:0f:61:88:a7:41 (capab=0x431 st 12:39:03 bozar kernel: [ 2785.422001] wlan0: associated 12:43:03 bozar kernel: [ 3025.379449] wlan0: direct probe to AP 00:0f:61:89:84:e1 (try 1) 12:43:03 bozar kernel: [ 3025.385053] wlan0: direct probe responded 31 12:57:05 bozar NetworkManager: <info> (wlan0): supplicant connection state: group handshake > syslog syslog □ □ Maszyny ◊ Serwerowe - rsyslog ◊ Klienckie syslog-ng (migracja na rsyslog) Konfiguracja ◊ ◊ Wstępna ◊ w profilu syslog.client.syslog-ng.prod ◊ podstawowe ustawienia szczegółowa ◊ □ w profilach aplikacji Mapowanie klient-serwer 32 syslog □ Dane ◊ ◊ syslog-server-* ◊ logi z aktualnego dnia ◊ 4 guesty, SAS, raid0 ◊ Dziennie (razem) 250GB logów syslog-storage-* ◊ Logi archive ◊ 2 guesty, SATA ◊ storage DRDB ◊ Miesięcznie ~ 1TB logów ◊ Starsze niż … zgrywane na dyski ;/ 33 Podsumowanie 34 Podsumowanie □ □ Automatyzuj ◊ Powtarzalność czynności = nuda = błędy ◊ Kontrola automatów (człowiek) Wirtualizuj ◊ Tworzenie guesta (“odpal i zapomnij”) ◊ pojawi się w DNS, nagios ◊ Pojawią się wykresy ◊ Gotowy do specjalizacji (rola) ◊ Optymalne wykorzystanie zasobów ◊ Nie naprawiaj, stawiaj od nowa 35 Podsumowanie □ Typowy dzień ◊ ◊ Nie: ◊ oglądamy logów ◊ oglądamy wykresów ◊ logujemy się na maszyny Tak: ◊ Zaglądamy do nagiosa ● na bieżąco ● raporty ◊ Pomaga nam collectd ● Raporty na podstawie rrd 36 Dziękuję za uwagę 37