Share
Embed
Driving Mercari with 50+ custom plugins / Mackerel DAY
Driving Mercari with 50+ custom plugins
Mackerel Day 2017/10/05
#mackerelday
kazeburo
October 06, 2017
Transcript
48 slides
-
Me • Masahiro Nagano / խ • id:kazeburo • Mercari,
Inc Principal Engineer Site Reliability Engineering (SRE) Team • BASE, Inc Technical Advisor -
Agenda • ϝϧΧϦ & ΠϯϑϥετϥΫνϟͷ؆୯ͳհ • Service/Roleઃܭ & Deploy •
MackerelʹΑΔࢹͱPlugins • ͦͷଞͷऔΓΈ -
Serviceઃܭ • αʔϏεΛߦ͏Region͝ͱʹServiceΛ͚Δ • mercari, mercari-us, mercari-gb • ֎ܗࢹผService •
mercari-jp-exetenal, mercari-us-external, mercari-gb-external • ௨νϟϯωϧΛ͚ΔͨΊ • QAڥɾϚΠΫϩαʔϏε -
Roleઃܭ • Role໊ͷPrefixʹҙຯΛ࣋ͨͤΔ • role- αʔόͷجຊతͳׂɻrole-mysqlɺrole-applicationͳͲ • z- ڞ௨ͷׂɻଟ͘ͷαʔόz-commonʹଐ͠ɺphp͕ೖ͍ͬͯΔαʔόz-phpΛ࣋ͭ •
x- ࢹ্ͷϑϥάɻrole-mysqlϨϓϦέʔγϣϯࢹΛߦ͏͕ɺx-mysql-masterΛՃ͢ Δ͜ͱͰࢹআ֎͢Δ • x- ख࡞ۀͰՃΛߦ͏͜ͱ͕ଟ͍ -
⚙mackerel-agent.conf $ cat mackerel-agent.conf apikey = “AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaa=" include = “/etc/mackerel-agent/conf.d/*.conf"
$ ls -1 conf.d/ role-mysql.conf z-common-jp.conf z-postfix.conf => mackerel-agent.conf ʹಛʹઃఆॻ͔ͳ͍ αʔόʹΑͬͯ͢Δconf͕ҟͳΔ role໊ͱ΄΅Ұக͕ͩશʹҰॹͰͳ͍ αʔόʹ༩͢ΔRoleΛͲ͔͜ͰࣗಈͰઃఆ͍ͨ͠ -
Roleͷࣗಈ༩ $ cat /etc/sysconfig/mackerel-agent ROLES=$(grep -h role-def: /etc/mackerel-agent/conf.d/*.conf \ |awk
-F: '{printf "-role=mercari:" $2 " “}') OTHER_OPTS=$ROLES conf.d ҎԼͷϑΝΠϧʹ #role-def:ϩʔϧ໊ ΛՃ͢Δͱ ىಈ࣌ʹಡΈࠐΈɺagentͷىಈΦϓγϣϯͱͯ͠ར༻ /usr/bin/mackerel-agent --pidfile=/var/run/mackerel-agent.pid --root=/var/lib/mackerel-agent \ -role=mercari:role-mysql -role=mercari:z-common -role=mercari:z-postfix -
Role ͷ࣮ࡍྫ $ head -1 role-mysql.conf z-common-jp.conf z-postfix.conf ==> role-mysql.conf
<== ## role-def:role-mysql ==> z-common-jp.conf <== #role-def:z-common ==> z-postfix.conf <== #role-def:z-postfix ࣮ࡍʹrole-defෳߦͰߏΘͳ͍ -
Service/Roleઃܭ & Deploy • RoleͷprefixʹҙຯɻconfʹRole໊Λॻ͍ͯࣗಈͰઃఆ • systemdʹͳΔͱಈ͔ͳ͍ͱ͍͏આ • confAnsibleͰ •
playbookʹͲͷconfΛΔͷ͔هड़ • pluginಉ͡Ansible roleͰཧ͠ɺconfͱͱʹΔ -
ࢹʹ·ͭΘΔࣈ • ࢹϧʔϧ: 265 • Hostຖͷࢹϧʔϧ • MySQL: 34 •
Application: 39 • Search: 36 • Custom Plugin: 50+ (check + metrics + utils) -
z-common-jp Ͱߦ͏ࢹ • unbound ͷϓϩηεࢹ • unbound Λ໊ͬͨલղܾ • crond
ͷϓϩηεࢹ • sshd ͷϙʔτࢹ • /etc/passwd ϑΝΠϧͷมߋࢹ • Global IPͱiptable • unameͷมߋࢹ • hostnameͷมߋࢹ • uptimeࢹ • inodeࢹ • ϝϞϦΤϥʔ • HW-RAIDࢹ • [metrics] NTP • [metrics] Linux Lite (CPU, Load avg, Process, Memory) • [ඪ४] File System • [ඪ४] Swap -
Custom PluginʹΑΔࢹ • unbound ͷϓϩηεࢹ • unbound Λ໊ͬͨલղܾ • resolv.confΛಡΜͰ໊લղܾ
• crond ͷϓϩηεࢹ • sshd ͷϙʔτࢹ • /etc/passwd ϑΝΠϧͷมߋࢹ • Global IPͱiptable • unameͷมߋࢹ • hostnameͷมߋࢹ • uptimeࢹ • inodeࢹ • ϝϞϦΤϥʔ • HW-RAIDࢹ • [metrics] NTP • [metrics] Linux Lite (CPU, Load avg, Process, Memory) • [ඪ४] File System • [ඪ४] Swap -
check_resolver • resolv.conf ΛಠࣗʹಡΈࠐΜͰ໊લղܾ͢Δ • resolv.conf ͕ॻ͖Θ໊ͬͯલղܾʹࣦഊ͢ΔࣄނΛ͙ • @kazuho͞Μͷ Net::DNS::Lite
Λར༻(pure-perlͳDNSΫϥΠΞϯτ) $ /etc/mackerel-agent/commands/check-resolver --host alive.local -w 2 -c 2 OK: elapsed_time 0.000888 sec (alive.local IN A 10.0.0.1) -
diff-detector • ίϚϯυ݁ՌͷมԽ͕͋ΔͱΞϥʔτ • `cat /etc/passwd`ɺ`uname -a`ɺ`hostname` Λݟ͍ͯΔ • https://github.com/kazeburo/diff-detector
$ diff-detector -- date NG: detect difference: ```@@ -1 +1 @@ -Tue May 10 08:11:42 UTC 2016 +Tue May 10 08:11:43 UTC 2016``` -
check-iptables • ͘͞Βͷઐ༻αʔόશͯglobal ipΛ࣋ͭɻෆඞཁͳαʔόdisableʹͯ͠ӡ༻ • global ip͕༗ޮ: ip6?tables_filter͕load͞Εͯͳ͚ΕΞϥʔτ • global
ip͕ແޮ: ip6?tables_filter͕load͞Ε͍ͯΔͱΞϥʔτ • ෆ༻ҙͳ iptables --list Ͱiptables_filter͕ಡΈࠐ·ΕɺύϑΥʔϚϯεʹӨڹ͢ΔͷΛൃݟ $ /etc/mackerel-agent/commands/check-iptables OK: does not have global-ip and iptables(iptable_filter) is disabled -
check-iptables #!/bin/sh set -e if ( ip addr | grep
'inet ' | fgrep -v 'inet 127.0.0.1' | grep -v -E '^ *inet (10\.| 192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)' > /dev/null 2>&1 ); then if ( lsmod |egrep 'ip6?table_filter' > /dev/null 2>&1 ); then echo "OK: have global-ip and iptables(iptable_filter) is enabled" exit 0 else echo "NG: have global-ip. but iptables(iptable_filter) is disabled" exit 2 fi else ... fi -
check-uptime • ෆҙͳ࠶ىಈΛݕ • ᮢ2-10ඵɻ1ճΞϥʔτ͕དྷ͙ͯ͢ʹ෮چ͢Δ • MySQLmemcachedͰߦͳ͍ͬͯΔ $ /etc/mackerel-agent/commands/check-uptime -w
110 -c 110 OK: up 59 days, 8:21 -
check-inode • inode ރׇࢭ • OSɺRoleʹΑͬͯpartitionͷαΠζ͕एׯҟͳΔɻׂ߹Ͱࢹ͠ɺҰͭͰ ᮢΛ্ճΔͱΞϥʔτ • mackerel-plugin-inode ࢹରϝτϦοΫʹ
wildcard ͕͑ͳ͍ $ /etc/mackerel-agent/commands/check-inode -w 80 -c 90 OK: /:1%, /dev:1%, /dev/shm:1%, /run:1%, /sys/fs/cgroup:1%, /boot:1%, /run/ user/1037:1% -
check-machine-exceptions ... sbridge: HANDLING MCE MEMORY ERROR CPU 0: Machine
Check Exception: 0 Bank 8: cc0427c000010090 TSC 0 ADDR 37805ac0 MISC 45048ce86 PROCESSOR 0:406f1 TIME 1495654896 SOCKET 0 APIC 0 [Hardware Error]: Machine check events logged EDAC MC1: CE row 0, channel 0, label "CPU_SrcID#0_Ha#0_Channel#0_DIMM": 4255 Unknown error(s): memory read on FATAL area OVERFLOW: cpu=0 Err=0001:0090 (ch=0), addr = 0x37805ac0 => socket=0, ha=1, Channel=0(mask=1), rank=0 ... -
check-raid-disk (MegaRAID) • MegaCLI Λ͍֤ཧDiskͷঢ়ଶΛࢹ Spun UpͰͳ͚ΕΞϥʔτ • ͘͞Βͷઐ༻αʔόͷStorageඞͣRAIDߏͰఏڙ͞ΕɺGlobalଆͷ͘͞Βͷઐ༻ αʔό͔ΒSNMPͰࢹ͞Ε͍ͯΔ
• GlobalΛด͍ͯͨ͡ΓɺSNMPΛfilter͍ͯ͠Δͱࢹ͞Εͳ͍ɻࣗલͰࢹ͕͋͠ΕอकΛґཔ • SSDյΕͨ͜ͱͳ͍ $ /etc/mackerel-agent/commands/check-raid-disk Firmware state: Online, Spun Up Firmware state: Online, Spun Up -
mackerel-plugin-ntpq • offset(ઈର)ͱϦϞʔτͱͷSyncঢ়گͷՄࢹԽ • Sync < 0.1ɺoffset > 300 ͰΞϥʔτ
• ঃʑʹ͕࣌ؒͣΕ͍ͯ͘αʔό͕͋Γɺntp.confͷௐʹՄࢹԽ͕ศར -
mackerel-plugin-linux-lite • 2Core͔Β56Core·Ͱαʔό͕͋Δ • Ұ؏ͨ͠ࢹᮢΛઃ͚͍͢Α͏ʹՄࢹԽ • ۭ͖ϝϞϦ • 100% ্ݶͷCPU
• ίΞ͋ͨΓͷϩʔυΞϕϨʔδ • ϓϩηε -
✂ periodic-checker • ಛఆͷ࣌ؒͷΈࢹΛߦ͏ • Daily ϝϯςφϯεͳͲͷରԠ • mackerel-agentͰཉ͍͠ͳʔ $
periodic-checker --range 00:00-06:00,06:30-24:00 \ -- check-tcp -p 80 -
check-dns-rr • consul+DNSͰՔಇ͍ͯ͠ΔαʔϏεͷࢹ • check-resolverಉ༷ɺಠࣗʹresolv.confΛಡΈࠐΉ • ᮢҎԼͷʹͳΔͱΞϥʔτ $ /etc/mackerel-agent/commands/check-dns-rr \
--host=production.app.service.dc.consul -w 2 -c 2 OK: 3 dns-rr hosts found -
check-spf-and-reserve-lookup • ϝʔϧ৴ʹͯར༻ • ֘IP͕SPFϨίʔυʹؚ·Ε͍ͯΔ͔ɺٯҾ͖ͨ࣌͠ʹυϝΠϯؚ͕·Ε ͍ͯΔ͔Λ֬ೝ $ /usr/local/bin/check-spf-and-reserve-lookup 192.168.1.1 mercari.jp
NG: spf check failed: result=SoftFail NG: reverse lookup dig failed: no result -
check-spf-and-reserve-lookup-all • αʔό͕͍࣋ͬͯΔGlobal IPશͯ֬ೝ #!/bin/bash set -e for ip in
$(ip addr | grep 'inet ' | fgrep -v 'inet 127.0.0.1' | grep -v -E '^ *inet (10\.|192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)' | sort | awk '{print $2}' | awk -F / '{print $1}') do /usr/local/bin/check-spf-and-reserve-lookup $ip mercari.jp done echo "OK: ALL" -
check-mysql-slave-sql-error • ʮϨϓϦέʔγϣϯ͕ࢭ·ͬͨ࣌ʹɺͦͷཧ༝௨ͯ͘͠ΕΔͱศརʯ Ͱ࡞ͬͨplugin • Multi Source ReplicationରԠ $ /usr/local/bin/check-mysql-slave-sql-error
--user=monitor --password=xxx mysql-slave-sql-error - MySQL slave SQL error CRITICAL: Last_SQL_Error found: Error 'Table 'tmp_replication_stop' already exists' on query. Default database: 'mercari'. Query: 'CREATE TABLE tmp_replication_stop ... -
check-mysql-msr • MySQLͷMulti Source Replicationͷࢹ • 1ͭͰࢭ·͍ͬͯͨΓɺᮢΑΓԆ͍ͯͨ͠ΒΞϥʔτ $ /usr/local/bin/check-mysql-msr --host=127.0.0.1
--port=3306 -- user=monitor --password=xxx -w 1 -c 1 MySQL Multi Source Replication OK: [O] admin-db=io:Yes,sql:Yes,behind:0 main-db=io:Yes,sql:Yes,behind:0 web-db=io:Yes,sql:Yes,behind:0 (࣮ࡍ1ߦ) -
fping ʹΑΔૄ௨֬ೝ • fpingฒྻͯ͠ૄ௨֬ೝ͢ΔίϚϯυ • /24 ͷnetwork͝ͱʹfpingΛ࣮ߦ͠IPҰཡΛ࡞ • fpingΛ͞ΒʹฒྻԽ͢Δ͜ͱͰ࣌ؒॖ $
seq 0 255 | xargs -I{} -P 16 fping -q -a -r 2 -i 10 -g x.y.{}.0/24 YBSHTΠϝʔδ