Skip to content
isdnetworks
Go back

λ–  μžˆλŠ” 것과 μ‘λ‹΅ν•˜λŠ” 것은 λ‹€λ₯΄λ‹€

(μˆ˜μ •λ¨)

μ„œλΉ„μŠ€κ°€ μ•ˆ λœλ‹€λŠ” μ–˜κΈ°λ₯Ό λ“€μ—ˆλ‹€. μ„œλ²„μ— λ“€μ–΄κ°€μ„œ ν™•μΈν–ˆλ‹€.

$ ps -ef | grep java
deploy  3821  ... java -jar app.jar

λ–  μžˆμ–΄μ„œ 정상이라고 λ‹΅ν–ˆλ‹€. κ·Έλž˜λ„ μ•ˆ λœλ‹€κ³  ν–ˆλ‹€.

Table of contents

Open Table of contents

λ–  μžˆλŠ”λ° μ•ˆ λ°›κ³  μžˆμ—ˆλ‹€

포트λ₯Ό λ΄€λ‹€.

$ netstat -tlnp | grep 8080

아무것도 μ•ˆ λ‚˜μ˜¨λ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” μžˆλŠ”λ° 포트λ₯Ό μ•ˆ μ—΄κ³  μžˆμ—ˆλ‹€. 좜λ ₯의 μƒνƒœ 값이 무엇을 λœ»ν•˜λŠ”μ§€λŠ” man netstat 맀뉴얼에 μžˆλ‹€. 둜그λ₯Ό λ³΄λ‹ˆ μ‹œμž‘ν•˜λ‹€ λ°μ΄ν„°λ² μ΄μŠ€ μ ‘μ†μ—μ„œ 멈좰 μžˆμ—ˆλ‹€.

2014-03-13 09:12:03 Connecting to database...

μ—¬κΈ°μ„œ 더 μ•ˆ λ‚˜κ°„λ‹€. 접속을 λ¬΄ν•œμ • 기닀리고 μžˆμ—ˆλ‹€.

ν”„λ‘œμ„ΈμŠ€κ°€ μ‚΄μ•„ μžˆμ–΄λ„ μš”μ²­μ„ λ°›λŠ”λ‹€λŠ” λœ»μ€ μ•„λ‹ˆλ‹€. κ°μ‹œλŠ” μ•žμ˜ κ²ƒλ§Œ 보고 μžˆμ—ˆμœΌλ‹ˆ μ •μƒμ΄λΌλŠ” 닡이 ν‹€λ¦° 것은 μ•„λ‹ˆμ—ˆμ§€λ§Œ μ“Έλͺ¨κ°€ μ—†μ—ˆλ‹€.

검증 β€” 단계λ₯Ό λ‚˜λˆ  ν™•μΈν–ˆλ‹€

이 λ’€λ‘œ 확인을 λ‹¨κ³„λ‘œ λ‚˜λˆ΄λ‹€.

1. ν”„λ‘œμ„ΈμŠ€κ°€ μžˆλ‚˜        ps
2. 포트λ₯Ό μ—΄μ—ˆλ‚˜          netstat
3. 연결이 λ˜λ‚˜            nc -z
4. 응닡을 μ£Όλ‚˜            curl
5. 정상 응닡인가          응닡 λ‚΄μš© 확인

각 단계가 λ‹€λ₯Έ 것을 λ³Έλ‹€. netstat κΉŒμ§€λŠ” λ‚˜μ˜€λŠ”λ° curl μ—μ„œ λ©ˆμΆ”λŠ” κ²½μš°λ„ μžˆμ—ˆλ‹€. 연결은 λ°›λŠ”λ° μ²˜λ¦¬κ°€ μ•ˆ λ˜λŠ” μƒνƒœλ‹€.

μ–΄λŠ λ‹¨κ³„μ—μ„œ λŠκΈ°λŠ”μ§€μ— 따라 λ³Ό 곳이 달라진닀. 단계λ₯Ό λ‚˜λˆ„λ‹ˆ 같은 μ•ˆ λœλ‹€λŠ” 말이 λ‹€λ₯Έ μ‘°μ‚¬λ‘œ κ°ˆλ Έλ‹€.

μƒνƒœ 확인 경둜λ₯Ό λ§Œλ“€μ—ˆλ‹€

5λ²ˆμ„ μœ„ν•΄ κ°„λ‹¨ν•œ 경둜λ₯Ό ν•˜λ‚˜ λ’€λ‹€.

@RequestMapping("/health")
public Map<String, Object> health() {
    Map<String, Object> m = new HashMap<String, Object>();
    m.put("status", "ok");
    m.put("db", checkDb() ? "ok" : "fail");
    m.put("cache", checkCache() ? "ok" : "fail");
    m.put("version", APP_VERSION);
    return m;
}
$ curl -s http://localhost:8080/health
{"status":"ok","db":"ok","cache":"fail","version":"1.4.2"}

checkDb 와 checkCache λ₯Ό 각각 λ‹΄μœΌλ‹ˆ μΊμ‹œκ°€ μ•ˆ λœλ‹€λŠ” 것이 λ°”λ‘œ 보인닀. μ˜μ‘΄ν•˜λŠ” 것을 ν•˜λ‚˜μ”© 확인해야 μ–΄λ””κ°€ λ¬Έμ œμΈμ§€ λ‚˜μ˜¨λ‹€.

μƒνƒœ 확인이 무거우면 그것 λ•Œλ¬Έμ— λΆ€ν•˜κ°€ 생긴닀.

private boolean checkDb() {
    try {
        jdbcTemplate.queryForObject("SELECT 1", Integer.class);
        return true;
    } catch (Exception e) {
        return false;
    }
}

SELECT 1 처럼 κ°€μž₯ κ°€λ²Όμš΄ 쿼리λ₯Ό μ“΄λ‹€. μ‹€μ œ 업무 쿼리λ₯Ό 돌리면 μ•ˆ λœλ‹€. μ‹œκ°„ μ œν•œλ„ λ’€λŠ”λ° 확인이 였래 κ±Έλ¦¬λŠ” 것 μžμ²΄κ°€ 이상 μ‹ ν˜Έμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

μ• λ§€ν•œ 생쑴보닀 ν™•μ‹€ν•œ μ’…λ£Œ

μ‹œμž‘ 쀑인 것과 μ€€λΉ„λœ 것을 κ΅¬λΆ„ν–ˆλ‹€.

private volatile boolean ready = false;

@PostConstruct
public void onStart() {
    // μ΄ˆκΈ°ν™”
    ready = true;
}

ready κ°€ 아직 거짓이면 μƒνƒœ κ²½λ‘œκ°€ 503을 μ€€λ‹€. μ•žλ‹¨μ΄ 그것을 보고 μš”μ²­μ„ μ•ˆ 보낸닀. 이걸 λ„£κΈ° μ „μ—λŠ” μ‹œμž‘ 쀑인 μ„œλ²„λ‘œ μš”μ²­μ΄ κ°€μ„œ 였λ₯˜κ°€ 났닀.

λ¬΄ν•œμ • κΈ°λ‹€λ¦¬λŠ” 것도 κ³ μ³€λ‹€.

dataSource.setConnectionTimeout(10000);

μ •ν•΄ λ‘” μ‹œκ°„ μ•ˆμ— 접속이 μ•ˆ 되면 μ‹œμž‘μ΄ μ‹€νŒ¨ν•˜κ³  ν”„λ‘œμ„ΈμŠ€κ°€ μ£½λŠ”λ‹€. 죽으면 κ°μ‹œκ°€ μ•Œμ•„μ±„κ³  λ‹€μ‹œ λœ¬λ‹€.

μ• λ§€ν•˜κ²Œ μ‚΄μ•„ μžˆλŠ” 것보닀 ν™•μ‹€ν•˜κ²Œ μ£½λŠ” 게 λŒ€μ‘ν•˜κΈ° 쉽닀. μ‚΄μ•„ 있으면 아무도 μ†λŒ€μ§€ μ•Šμ§€λ§Œ 죽으면 μ•Œλ¦Όμ΄ κ°„λ‹€.

κ°μ‹œλ„ κ³ μ³€λ‹€.

# μ „
pgrep -f app.jar >/dev/null || alert "ν”„λ‘œμ„ΈμŠ€ μ—†μŒ"

# ν›„
CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 5 http://localhost:8080/health)
if [ "$CODE" != "200" ]; then
  alert "μƒνƒœ 확인 μ‹€νŒ¨ (HTTP ${CODE})"
fi

pgrep 이 μ•„λ‹ˆλΌ curl 의 응닡 μ½”λ“œλ₯Ό λ³Έλ‹€. λ–  μžˆλŠ”λ° μ•ˆ λ°›λŠ” μƒνƒœλ₯Ό 이걸둜 μž‘λŠ”λ‹€.

정리


Share this post on:

Previous Post
200인데 본문이 λΉ„μ–΄ μžˆμ—ˆλ‹€
Next Post
ν”„λ ˆμž„μ›Œν¬κ°€ μ •ν•΄ λ‘” 자리