Fluentd: ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ 

Fluentd: ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ 

์˜ค๋Š˜๋‚ ์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ ๋ชจ๋‘์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ELK ์Šคํƒ์ด ์—†๋Š” Kubernetes ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์ƒํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” Logstash ๋Œ€์‹  Fluentd์™€ ํ•จ๊ป˜ EFK ์Šคํƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Fluentd๋Š” ์ ์  ๋” ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ๋ฒ”์šฉ ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ์ด๋ฉฐ Cloud Native Computing Foundation์— ํ•ฉ๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ Fluentd์˜ ๊ฐœ๋ฐœ ๋ฒกํ„ฐ๊ฐ€ Kubernetes์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

Logstash ๋Œ€์‹  Fluentd๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€์˜ ์ผ๋ฐ˜์ ์ธ ๋ณธ์งˆ์„ ๋ฐ”๊พธ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Fluentd๋Š” ๋‹ค์žฌ๋‹ค๋Šฅํ•จ์œผ๋กœ ์ธํ•œ ๊ณ ์œ ํ•œ ๋‰˜์•™์Šค๊ฐ€ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊น… ๊ฐ•๋„๊ฐ€ ๋†’์€ ๋ฐ”์œ ํ”„๋กœ์ ํŠธ์—์„œ EFK๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ Kibana์—์„œ ์ผ๋ถ€ ๋ฉ”์‹œ์ง€๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ๋ณต์ œ ๋ฌธ์ œ

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ Fluentd๋Š” DaemonSet(Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์—์„œ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋จ)์œผ๋กœ ๋ฐฐํฌ๋˜๊ณ  /var/log/containers์—์„œ stdout ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง‘ ๋ฐ ์ฒ˜๋ฆฌ ํ›„ JSON ๋ฌธ์„œ ํ˜•์‹์˜ ๋กœ๊ทธ๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ์„ฑ๋Šฅ ๋ฐ ๋‚ด๊ฒฐํ•จ์„ฑ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ ๋˜๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ˜•์‹์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ElasticSearch๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Kibana๋Š” ๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ ๋ฒ„ํผ๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ Fluentd๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ElasticSearch์˜ ์ผ๋ถ€ ๋ฌธ์„œ์— ๋‚ด์šฉ์ด ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ณ  ์‹๋ณ„์ž๋งŒ ๋‹ค๋ฅธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Nginx ๋กœ๊ทธ๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์ด ๋ฉ”์‹œ์ง€ ๋ฐ˜๋ณต์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ ํŒŒ์ผ์—๋Š” ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹จ์ผ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -

๊ทธ๋Ÿฌ๋‚˜ ElasticSearch์—๋Š” ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "_index": "test-custom-prod-example-2020.01.02",
  "_type": "_doc",
  "_id": "HgGl_nIBR8C-2_33RlQV",
  "_version": 1,
  "_score": 0,
  "_source": {
    "service": "test-custom-prod-example",
    "container_name": "nginx",
    "namespace": "test-prod",
    "@timestamp": "2020-01-14T05:29:47.599052886 00:00",
    "log": "127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00  0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -",
    "tag": "custom-log"
  }
}

{
  "_index": "test-custom-prod-example-2020.01.02",
  "_type": "_doc",
  "_id": "IgGm_nIBR8C-2_33e2ST",
  "_version": 1,
  "_score": 0,
  "_source": {
    "service": "test-custom-prod-example",
    "container_name": "nginx",
    "namespace": "test-prod",
    "@timestamp": "2020-01-14T05:29:47.599052886 00:00",
    "log": "127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00  0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -",
    "tag": "custom-log"
  }
}

๋˜ํ•œ ๋‘ ๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Fluentd ๋กœ๊ทธ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ๋‚ด์šฉ์ด ํฌํ•จ๋œ ๋งŽ์€ ๊ฒฝ๊ณ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2020-01-16 01:46:46 +0000 [warn]: [test-prod] failed to flush the buffer. retry_time=4 next_retry_seconds=2020-01-16 01:46:53 +0000 chunk="59c37fc3fb320608692c352802b973ce" error_class=Fluent::Plugin::ElasticsearchOutput::RecoverableRequestFailure error="could not push logs to Elasticsearch cluster ({:host=>"elasticsearch", :port=>9200, :scheme=>"http", :user=>"elastic", :password=>"obfuscated"}): read timeout reached"

์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๋Š” ElasticSearch๊ฐ€ request_timeout ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ „๋‹ฌ๋œ ๋ฒ„ํผ ์กฐ๊ฐ์„ ์ง€์šธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ Fluentd๋Š” ๋ฒ„ํผ ์กฐ๊ฐ์„ ElasticSearch๋กœ ๋‹ค์‹œ ๋ณด๋‚ด๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์ž„์˜์˜ ํšŸ์ˆ˜๋งŒํผ ์‹œ๋„ํ•œ ํ›„์— ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

2020-01-16 01:47:05 +0000 [warn]: [test-prod] retry succeeded. chunk_id="59c37fc3fb320608692c352802b973ce" 
2020-01-16 01:47:05 +0000 [warn]: [test-prod] retry succeeded. chunk_id="59c37fad241ab300518b936e27200747" 
2020-01-16 01:47:05 +0000 [warn]: [test-dev] retry succeeded. chunk_id="59c37fc11f7ab707ca5de72a88321cc2" 
2020-01-16 01:47:05 +0000 [warn]: [test-dev] retry succeeded. chunk_id="59c37fb5adb70c06e649d8c108318c9b" 
2020-01-16 01:47:15 +0000 [warn]: [kube-system] retry succeeded. chunk_id="59c37f63a9046e6dff7e9987729be66f"

๊ทธ๋Ÿฌ๋‚˜ ElasticSearch๋Š” ์ „์†ก๋œ ๊ฐ ๋ฒ„ํผ ์กฐ๊ฐ์„ ๊ณ ์œ ํ•œ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ธ๋ฑ์‹ฑ ์ค‘์— ๊ณ ์œ ํ•œ _id ํ•„๋“œ ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฉ”์‹œ์ง€ ์‚ฌ๋ณธ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Kibana์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

Fluentd: ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ 

์†”๋ฃจ์…˜

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ํ•ด์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด fluent-plugin-elasticsearch ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋‚ด์žฅ๋œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ElasticSearch๋Š” ์ „๋‹ฌ ๋‹จ๊ณ„์—์„œ ๋ฐ˜๋ณต์„ ์ธ์‹ํ•˜๊ณ  ๋ฌธ์„œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์กฐ์‚ฌ์— ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์‹œ๊ฐ„ ์ œํ•œ์ด ๋ถ€์กฑํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ด ๋ฐฉ๋ฒ•์˜ ์‚ฌ์šฉ์„ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ๊ธฐ์ ์ธ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋˜๋Š” ๋กœ๊น… ๊ฐ•๋„ ์ฆ๊ฐ€ ์‹œ ๋กœ๊ทธ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Fluentd ์ถœ๋ ฅ์— ๋ฒ„ํผ๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ElasticSearch๊ฐ€ ๋ฌธ์„œ๋ฅผ ์ธ๋ฑ์Šค์— ์ฆ‰์‹œ ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์„œ๋Š” ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜์–ด ๋””์Šคํฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฌธ์ œ์˜ ์›์ธ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Fluentd ์ถœ๋ ฅ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜๊ณ  ๋ฒ„ํผ๋ง ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ํ• ๋‹น๋œ ์‹œ๊ฐ„ ๋‚ด์— ํด๋ฆฌ์–ด๋˜๋„๋ก ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์— ์„ค๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์„œ๋น„์Šค๋ณ„๋กœ ๋กœ๊ทธ์— ๋ฉ”์‹œ์ง€๋ฅผ ์“ฐ๋Š” ๊ฐ•๋„, ๋””์Šคํฌ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ, ๋„คํŠธ์›Œํฌ ๋“ฑ ์—ฌ๋Ÿฌ ์š”์†Œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ถœ๋ ฅ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ๋ฒ„ํผ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ํŠน์ • ์‚ฌ๋ก€๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์ด๋ผ๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„๋„ ๋กœ๋“œ ๋ฐ ๋Œ€์—ญํญ. ๋”ฐ๋ผ์„œ ๋ฌด์ž‘์ • ๊ธด ๊ฒ€์ƒ‰์„ ํ”ผํ•˜๊ณ  ๊ฐœ๋ณ„ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜๋ฉด์„œ๋„ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๋ฒ„ํผ ์„ค์ •์„ ์–ป์œผ๋ ค๋ฉด Fluentd๊ฐ€ ์ž‘์—… ์ค‘์— ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๋Š” ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ต์  ๋น ๋ฅด๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๊ธฐ๋ก๋œ ๋‹น์‹œ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

 <buffer>
        @type file
        path /var/log/fluentd-buffers/kubernetes.test.buffer
        flush_mode interval
        retry_type exponential_backoff
        flush_thread_count 2
        flush_interval 5s
        retry_forever
        retry_max_interval 30
        chunk_limit_size 8M
        queue_limit_length 8
        overflow_action block
      </buffer>

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Chunk_limit_size โ€” ๋ฒ„ํผ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ถ„ํ• ๋˜๋Š” ์ฒญํฌ์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.

  • flash_interval โ€” ๋ฒ„ํผ๊ฐ€ ์ง€์›Œ์ง„ ํ›„์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค.
  • queue_limit_length โ€” ๋Œ€๊ธฐ์—ด์˜ ์ตœ๋Œ€ ์ฒญํฌ ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • request_timeout์€ Fluentd์™€ ElasticSearch ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

์ด ๋ฒ„ํผ ํฌ๊ธฐ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ queue_limit_length์™€ Chunk_limit_size๋ฅผ ๊ณฑํ•˜์—ฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "๊ฐ๊ฐ ์ฃผ์–ด์ง„ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ๋Œ€๊ธฐ์—ด์˜ ์ตœ๋Œ€ ์ฒญํฌ ์ˆ˜"๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ๋กœ๊ทธ์— ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

2020-01-21 10:22:57 +0000 [warn]: [test-prod] failed to write data into buffer by buffer overflow action=:block

์ด๋Š” ํ• ๋‹น๋œ ์‹œ๊ฐ„ ๋‚ด์— ๋ฒ„ํผ๋ฅผ ์ง€์šธ ์‹œ๊ฐ„์ด ์—†์œผ๋ฉฐ, ์ „์ฒด ๋ฒ„ํผ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐจ๋‹จ๋˜์–ด ๋กœ๊ทธ์˜ ์ผ๋ถ€๊ฐ€ ์†์‹ค๋œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ์— ์žˆ๋Š” ๊ฐ ์ฒญํฌ์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ํ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ฒญํฌ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฒ„ํผ๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒญํฌ ํฌ๊ธฐ(chunk_limit_size)๋ฅผ 32MB ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์ด ๋„ˆ๋ฌด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ElasticSeacrh๋Š” ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„ํผ๋ฅผ ๋” ๋Š˜๋ ค์•ผ ํ•œ๋‹ค๋ฉด ์ตœ๋Œ€ ํ ๊ธธ์ด์ธ queue_limit_length๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฉˆ์ถ”๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ถ€์กฑ ๋ฉ”์‹œ์ง€๋งŒ ๋‚จ์œผ๋ฉด request_timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ’์„ 20์ดˆ ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด Fluentd ๋กœ๊ทธ์— ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2020-01-21 09:55:33 +0000 [warn]: [test-dev] buffer flush took longer time than slow_flush_log_threshold: elapsed_time=20.85753920301795 slow_flush_log_threshold=20.0 plugin_id="postgresql-dev" 

์ด ๋ฉ”์‹œ์ง€๋Š” ์‹œ์Šคํ…œ ์ž‘๋™์— ์–ด๋– ํ•œ ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ ๋ฒ„ํผ ํ”Œ๋Ÿฌ์‹œ ์‹œ๊ฐ„์ด Slow_flush_log_threshold ๋งค๊ฐœ๋ณ€์ˆ˜์— ์„ค์ •๋œ ๊ฒƒ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ ธ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋””๋ฒ„๊น… ์ •๋ณด์ด๋ฉฐ request_timeout ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ํ™”๋œ ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. request_timeout์„ ํ•„์š”ํ•œ ๊ฒƒ(์ˆ˜๋ฐฑ ์ดˆ)๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ์„ค์ •ํ•˜๋Š” ๋™์•ˆ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ๊ธฐ์ค€์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ถ€์กฑ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. Slow_flush_log_threshold ์ž„๊ณ„๊ฐ’ ์ดˆ๊ณผ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. elapsed_time ํ•„๋“œ์˜ ๊ฒฝ๊ณ  ํ…์ŠคํŠธ๋Š” ๋ฒ„ํผ๊ฐ€ ์ง€์›Œ์ง„ ์‹ค์‹œ๊ฐ„ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  3. request_timeout์„ ๊ด€์ฐฐ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ป์€ ์ตœ๋Œ€ elapsed_time ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. request_timeout ๊ฐ’์€ elapsed_time + 50%๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
  4. ๋กœ๊ทธ์—์„œ ๊ธด ๋ฒ„ํผ ํ”Œ๋Ÿฌ์‹œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Slow_flush_log_threshold ๊ฐ’์„ ์˜ฌ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ elapsed_time + 25%๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ์ข… ๊ฐ’์€ ๊ฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์–ป์–ด์ง‘๋‹ˆ๋‹ค. ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋”ฐ๋ฅด๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ๋ฉ”์‹œ์ง€๋กœ ์ด์–ด์ง€๋Š” ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ํ‘œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต์œผ๋กœ ์ด์–ด์ง€๋Š” ์ผ์ผ ์˜ค๋ฅ˜ ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋…ธ๋“œ-1
๋…ธ๋“œ-2
๋…ธ๋“œ-3
๋…ธ๋“œ-4

์ „ ํ›„
์ „ ํ›„
์ „ ํ›„
์ „ ํ›„

๋ฒ„ํผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
1749/2
694/2
47/0
1121/2

์žฌ์‹œ๋„ ์„ฑ๊ณต
410/2
205/1
24/0
241/2

ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋กœ๊ทธ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ ์„ค์ •์˜ ๊ด€๋ จ์„ฑ์ด ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ฃผ์š” ์ง•ํ›„๋Š” Fluentd ๋กœ๊ทธ์— ๊ธด ๋ฒ„ํผ ํ”Œ๋Ÿฌ์‹œ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Slow_flush_log_threshold ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ๋ถ€ํ„ฐ๋Š” request_timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๊ธฐ ์ „๊นŒ์ง€ ์•ฝ๊ฐ„์˜ ์—ฌ์œ ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€์— ์ ์‹œ์— ์‘๋‹ตํ•˜๊ณ  ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ตœ์ ์˜ ์„ค์ •์„ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

Fluentd ์ถœ๋ ฅ ๋ฒ„ํผ๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์€ EFK ์Šคํƒ ๊ตฌ์„ฑ์˜ ์ฃผ์š” ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ž‘๋™ ์•ˆ์ •์„ฑ๊ณผ ์ธ๋ฑ์Šค์—์„œ ๋ฌธ์„œ์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฐ์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…๋œ ๊ตฌ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๋กœ๊ทธ๊ฐ€ ๋ฐ˜๋ณต์ด๋‚˜ ์†์‹ค ์—†์ด ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ElasticSearch ์ธ๋ฑ์Šค์— ๊ธฐ๋ก๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ์—์„œ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€