반응형

IP

Internet Protocol의 약자
OSI-7계층중에서 볼 수 있는 3계층인 네트워크 계층의 논리적인 주소값이다

IPv4

IPv4란?

IP version 4라는 의미로 IP version 0~3은 실험적인으로 버전이었고,
version 4부터 실제로 사용하게 되었다

2의 32승이면 42억개 가량의 ip주소를 할당할 수 있다는 건데
초창기 IP주소를 정의할 때는 인터넷이 크게 발전되지 않았기 때문에
충분할거라 생각했던 것 같다

지금 주변만 보더라도 핸드폰, 와이파이...
많을 줄 알았는데 2가지네...

많으면 1인당 4~5개 정도까지 기기를 사용하는 경우도 있기 때문에 지금와서는 부족한게 당연하게 되어버렸다

옥텟

옥텟이라 표현하는 숫자가 4개 모여있는 것인데,

1byte라 표현하면 되지 않나? 생각했고,
그냥 네트워크에서 사용하는 단어라고만 생각했지만

초기에는 1바이트=8비트 라는 공식이 없었고
1바이트라는 단위가 여러 비트를 표시했기 때문에 옥텟이라는 단어가 생기게 되었다고 한다

2진법으로 되어있는 형식을 사람이 보기 편하게 하기 위해 10진법으로 나타낸 것이며, 127.0.0.1 이런 식으로 표현된다

A클래스, B클래스, C클래스

IPv4에서는 3가지의 클래스로 나누어 지며
s - 네트워크 영역
h - 호스트 영역

  • A class
    0ss.hhh.hhh.hhh 
    가장 많은 호스트수를 가질 수 있는 클래스

1.0.0.0 ~ 126.255.255.255까지 가질 수 있음

A 클래스 하나당 사용할 수 있는 아이피의 갯수는 16,777,216개이다.

  • B class

    10s.sss.hhh_hhh

    B 클래스 하나당 사용할 수 있는 아이피는 65,536개이다.

  • C class
    ```text

110.sss.sss.hhh

C 클래스 하나당 사용할 수 있는 아이피는 256개이다 

만약 192.111.111.* 아이피를 할당받앗다면 
C클래스에서 호스트 영역인 192.111.111.0 ~ 192.111.111.255 까지의 아이피를 사용 할 수 있는 것이다 


### 사이더 블록 CIDR

Classless Inter-Domain Routing의 약자이다

이름에서도 알 수 있듯이 사이더 블록은 Classless 즉, 클래스가 존재 하지 않는 IP 주소 할당 방법이다 

```text
125.124.12.10/32
125.124.12.10/24
125.125.12.10/16

'/' 뒤에 붙는 숫자는 고정되는 비트의 숫자를 뜻한다

CIDR 표기법에서 1은 고정, 0은 고정되지 않는 값이다

/32 라면 고정되는 비트의 수가 32개이고,
CIDR로 표현한다면
11111111.11111111.11111111.11111111
IP주소의 범위는 125.124.12.10 한개이다

/24 라면 고정되는 비트의 수가 24개이고,
11111111.11111111.11111111.00000000
IP주소의 범위는 125.124.12.0 ~ 125.124.12.255까지 총 256가지이다

이 사이더 블록은 aws를 사용해본적이 있는 유저라면 아마 한번씩을 봤을 것 같다
나또한 네트워크를 공부하기 전까지는 무엇을 의미하는지 몰랐는데
사이더블록에 대해 알아보면서 aws가 생각났다

위 화면은 인바운드를 열거나 아웃바운드를 열때 볼 수 있는 화면인데 다시 보니까 뭔가 새롭다

이제는 무엇을 의미하는지 알겠고, Devops 하시는 분이 회사 와이파이 사용하면 인바운드 신경안쓰도록 왜 /24로 설정하라고 했는지 이해가 된다

그 당시에는 뭔지도 모르고 설정했엇는데... 다시 보니 눈에 보인다

반응형

'Infra' 카테고리의 다른 글

[ELK-Filebeat] #2 Logstash  (0) 2022.03.04
[ELK-Filebeat] #1 설치  (0) 2022.03.04

로깅 시스템 구축부터 데이터 시각화까지

어떤식으로 로그를 전달할지

  1. 각 서버에서 로그 저장
  2. Filebeat를 이용하여 Logstash로 전달
  3. Logstash에서 필터링하여 Elasticsearch에 저장
  4. Kibana를 통해 시각화

Log stash 설정에서 생각보다 시간을 많이 잡아먹음

Filebeat

일단 로컬에서 실행했기에 맥북에 Filebeat을 설치

filebeat.yml은 지난번에 올렸던 글에서 사용했던 파일 그대로 사용했고, 달라진건 EC2서버를 종료해뒀다가 재기동해서 IP가 변경됨

Logstash IP만 변경해주고 실행,
path는 로그 쌓아두는 곳으로 설정

Brew로 설치

brew install filebeat    

직접 설치가 필요하다면 이전글을 보면 됩니다
https://ddalkigum.tistory.com/9?category=994378

Brew는 정말 사용할때마다 느끼지만 정말 사기다

filebeat.yml

filebeat.inputs:
    - type: log
    enabled: true
    encoding: utf-8
    paths:
    - $LOG_PATH

Filebeat가 동작 하는 방식

일단 filebeat의 로그를 보면 Go로 개발이 되어있고,
아직 여러 설정을 건드려보진 않았지만

Elastic 공식홈페이지에 나와있는 걸 보면 로그를 보내는
interval을 logstash에서 설정을 해줄 수 있는 것으로 보인다

자세한 옵션설정은 천천히 살펴보기로 하자

Filebeat는 inputsharvesters로 구성되어있다

harvesters
각 파일을 한줄씩 읽고 내용을 보내는 역할
파일당 하나의 havesters가 담당한다

scan_frequency라는 옵션이 있고 기본값이 10초로 설정되어 있다
10초에 한번씩 파일을 읽고 수집된 로그를 보내는 방식인 셈이다

완전히 실시간은 아니다 엘라스틱에서도 웬만하면 설정하지 않는 것을 추천한다

실시간으로 작동하도록 하려면 close_inactive 옵션을 설정하면 되는 것 같다

로그 파일을 오픈하여 지켜보는 시간을 설정해주는 것이고, 5분으로 설정했다면
5분내로 로그가 쌓이지 않을 경우 오픈했던 로그파일을 닫아주는 것이다

이건 굳이? 라는 생각이 드는게 계속 지켜본다면 그 만큼의 메모리가 할당되게 되는 것이고
실시간 처리가 중요하다면 감수하겠지만, 계속 할당하는 건 비효율적이라고 생각된다

inputs
input type을 지정해줄수 있고, 내가 사용한 설정은 log로 되어있다

harvesters가 각각의 파일을 지켜보도록 설정한다 했는데
여기서 고루틴이 사용된다
고루틴은 멀티쓰레드와 비슷하고, OS에서 쓰레드를 가지고오는 것이 아니기 때문에 멀티쓰레드 처리보다 비용이 적게 사용되는 것으로 알고 있다

Go언어는 사용해본적이 없어서 정확히는 모르겠네요

마지막 위치를 기억하는 방법
harvester가 마지막으로 읽은 위치에 offset을 저장하고, 이후 추가된 로그가 있는지 확인한다

Filebeat가 실행되는 동안 log파일에 입력된 상태정보를 메모리에 유지한다고 나와있는데
Filebeat를 종료하고 로그 중간을 삭제하면 어떻게 되는거지?

궁금하네

레퍼런스: https://www.elastic.co/guide/en/beats/filebeat/current/how-filebeat-works.html
filebeat옵션: https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html#filebeat-input-log-scan-frequency

Logstash

사실 오늘 글을 쓰는 이유는 Filebeat보다는 이녀석 때문이었다

Filebeat는 애초에 로그를 전달하는 역할로만 사용하려 했기에 깊게 파고들지 않았다
설정에서 너무 애먹었고, 지금되돌아보면 정말 별거 아닌 것 같다

뭐가 잘못된지 전혀 몰랐다

filter {
  grok {
    match => {"message" => "(?<request_time>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}) (?<log_level>%{WORD}): %{WORD:http_method} %{URIPATHPARAM:request} %{NUMBER:http_status} %{NUMBER:content_length} - %{NUMBER:response_time}"}
  }
}

거의 한시간에서 두시간동안 삽질한 것같다
왜 로그가 전달이 안되지? grok문법이 잘못됬나? kibana페이지에서 테스트도 했는데
하면서 Logstash가 잘못된게 분명하다고 생각했다

filter {
  grok {
    match => {"message" => ["(?<request_time>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}) (?<log_level>%{WORD}): %{WORD:http_method} %{URIPATHPARAM:request} %{NUMBER:http_status} %{NUMBER:content_length} - %{NUMBER:response_time}"]}
  }
}

분명 나와 같은 실수를 하는 사람이 있을거다
grok문법에는 틀린게 없었고, []를 사용하지 않아서 로그가 제대로 필터링 되지 않았다...

grok 문법

처음 사용해본 친구인데 일단 문법관련 페이지 부터

Logstash github
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

위에 들어가보면 정규식을 어떤걸 사용해야하는지 나와있다
이걸보고 그대로 따라하면 된다

이것도 모르고 다른 블로그를 보면서 필터링 어떻게 사용해야 하지 Logstash에 바로적용했는데 안되면 어떡하지 생각했는데

Management > Dev tools

다행히도 Kibana페이지에서 Grok Debugger 기능을 제공해준다

여기서 테스트후 적용해주면 깔끔하게 나온다

데이터를 정제해주고 Elasticsearch로 보내주면 된다

위 두가지에서 가장 애먹었고 나머지는 나쁘지 않았던 것 같다

작동 방식

이전글 그대로 설치했다면 logstash.yml파일은 수정할 필요가 없다

logstash 디렉토리에 들어가면 위의 파일들을 볼 수 있는데
여기서 conf.d에 pipe line설정만 해주면 된다

yml파일

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => {"message" => ["(?<request_time>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}) (?<log_level>%{WORD}): %{WORD:http_method} %{URIPATHPARAM:request} %{NUMBER:http_status} %{NUMBER:content_length} - %{NUMBER:response_time}"]}
  }
}

output {
  elasticsearch {
    hosts => "52.79.234.81:9200"
    index => "filebeat-"
  }
}

보는 것처럼 간단하게 사용했고
다양한 옵션을 사용하지 않은 것을 변명하자면...
백엔드쪽 공부하는데 내가 구축해보고 싶은건 로그에서 시각화까지의 파이프라인이지
어떤 옵션을 사용해야 될지가 아니어서... 이건 간단하게 넘어가고
현재 하고있는 프로젝트에 시간을 좀더 쓰고 싶었다

Express 로그 세팅

Winston logger

const logFormat = printf(({ level, timestamp, message }) => {
      return `${timestamp} ${level}: ${message}`;
    });

    const debugFormat = printf(({ level, message }) => {
      return `${level}: ${message}`;
    });

    this.logger = winston.createLogger({
      format: combine(
        timestamp({
          format: 'YYYY-MM-DD HH:mm:ss',
        }),
        logFormat,
      ),

Morgan logger

stream: StreamOptions = {
    write: (message) => this.logger.http(message),
  };

  public init = () => {
    return morgan(':method :url :status :res[content-length] - :response-time ms', { stream: this.stream })
  };

morgan에서는 시간을 기록하지 않고 winston에서 시간을 기록하도록 하여
중복된 데이터가 없도록 했다

stream옵션을 사용하여 winston형식으로 로그가 기록되도록 하면 된다
혹시 자세한 코드가 보고싶다면 내 깃헙에 order레포지토리를 보면 된다

대시보드

평균응답시간이 6초처럼 보이는데 6ms이다...
logstash에서 설정을 잘못했는지 6.950ms로 나와야 하는데 6,950으로 인식이 되버렸다

데이터는 loadtest를 사용해서 넣어주었고,
url을 잘못입력해서 404가 많은 서버가 되버렸다 😂😂

다음엔 어떤걸?

  1. CI/CD
    ELK구축 관련은 이걸로 끝내고 CI/CD를 공부하면서 정리해볼 생각
    이미 되어있긴 한데, 좀더 공부해보려한다
  2. DB
    DB 정규화와 Index에 대해서 좀더 딥하게 공부해 볼 생각
반응형

'Infra' 카테고리의 다른 글

[네트워크] IP  (0) 2022.03.04
[ELK-Filebeat] #1 설치  (0) 2022.03.04

로그 수집, 시각화 툴로 유명한 오픈소스이고

운영에서는 이미 갖추어진 환경에서 사용해 보았는데
설치부터 실제 키바나까지 데이터가 이동하는 과정을 구축해보고 싶어서 해봤는데 재밌네여😁

각 서버에 설치하는 과정에서 어떤 옵션을 설정해야하는지 정리해볼 생각입니다

로그 수집

우선 Local서버에 있는 로그를 S3에 업로드하고
S3에 로그파일이 올라오게 되면 SQS( Simple Queue Service )에서 이벤트를 보고있다가 로그파일을 Filebeat로 전달해주는 방식으로 구축

각각의 서비스에 따라 구조는 변경될 수 있겠지만

모든 로그파일은 S3에 저장, 관리하고 Queue서비스에 등록해주면
로그파일을 안정적으로 쌓을수 있지 않을까 싶어 선택했습니다

Filebeat이후 부터는 Kafka, Logstash, Elasticsearch
등등 데이터 수집방향을 잡으면 될 것 같습니다

설치 환경

OS: CentOS7
Java version: 11.0.12
User: root

자바 설치: https://web-obj.tistory.com/359

일단 EC2에서 3개의 서버를 준비했고, S3와 SQS를 이용한 Message Queue 구축은 따로 정리해서 올릴 생각입니다

Elasticsearch 설치

공식문서: https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html

*서명키 import *

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

elasticsearch.repo 파일 생성
/etc/yum.repos.d/elasticsearch.repo 파일에 아래 내용을 복사해줍니다

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

설치

sudo yum install -y --enablerepo=elasticsearch elasticsearch

설정 변경

network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["host1", "host2"] - 주석제거 

network host는 0.0.0.0으로 외부 접속이 모두 가능하게 열어줍니다
( production레벨의 환경에서는 host를 지정하여 열어주시면 됩니다 )

실행

# Elasticsearch 실행 
systemctl start elasticsearch

# Elasticsearch 상태 확인 
systemctl status elasticsearch

Elasticsearch가 정상적으로 작동하는지 확인하고 싶다면

  • 명령어를 사용하여 9200, 9300이 정상적으로 작동하는지 확인
  • curl을 이용하여 정상적으로 응답이 오는지 확인
# 현재 사용중인 port 확인
ss -ntlp

# Elasticsearch 동작 확인 
curl --request GET http://localhost:9200

Kibana 설치

Kibana도 마찬가지로 공식문서를 확인하여 설치해주시면 됩니다
Kibana는 Elasticsearch와는 다르게 javascript로 구성되어있고
공식문서대로 설치를 하게되면 Node를 따로 설치하지 않아도 사용가능합니다

공식문서: https://www.elastic.co/guide/en/kibana/current/rpm.html

서명키 import

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

kibana.repo 파일 생성
/etc/yum.repos.d/kibana.repo에 복사해줍니다

[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

설치

sudo yum install kibana

설치된 곳이 궁금하시다면

/usr/share/kibana 여기서 확인 가능하고
설치된 곳을 보게되면 kibana 관련 디렉토리와 node디렉토리가 있는걸 확인할 수 있습니다

현재 공식홈페이지대로 설치했을경우 node는 16.13.0 버전을 사용하고있네요

16버전쓰는걸 보니 업데이트가 빠르네요
아마 LTS버전이 업데이트되면 바로 준비를 하나봅니다

설정 변경

yml파일은 /etc/kibana/kibana.yml파일을 수정해주면 됩니다

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: "http://$ElasticsearchIP:9200"

엘라스틱서치와는 다르게 외부 접속허용을 한 이후에 Elasticsearch에서 데이터를 받아와야 하므로 IP, Port를 지정해주세요

실행

# Kibana 실행 
systemctl start kibana

# Kibana 상태 확인 
systemctl status kibana

Kibana도 Elasticsearch와 마찬가지로 상태확인을 해주면 되고,

kibana server is not ready yet이라고 나오는 경우는 잠시 기다렸다 접속을 다시해주면 실행되거나 기다려도 실행이 안되는 경우는 디버깅하시면 되요

Logstash 설치

저는 filebeat와 logstash를 같은 곳에 설치예정이기 떄문에
서명키 import는 따로 안했습니다

공식문서: https://www.elastic.co/guide/en/logstash/7.16/installing-logstash.html

logstash.repo 파일 생성

/etc/yum.repos.d/logstash.repo

[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

설치

sudo yum install logstash 
input {
        beats {
                port => 5044
                host => "0.0.0.0"
        }
}

output {
  elasticsearch {
    hosts => $ElasticsearchDomain
    manage_template => false
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }
}

실행

# Logstash 실행
systemctl start logstash

# Logstash 상태 확인 
system status logstash

Filebeat 설치

Filebeat와 Logstash설치 방법도 위에 방법과 똑같아서 안적어도 되지 않을까 했는데... 이왕 하는김에 한번에 정리 할게요

공식문서: https://www.elastic.co/guide/en/beats/filebeat/7.16/setup-repositories.html#_yum

서명키 import

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

elasticsearch.repo파일 생성
엘라스틱서치와 같은 인스턴스에서 성치한다면 생략해도 됩니다

[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

설치

sudo yum install filebeat

설정 변경

/etc/filebeat/filebeat.yml을 수정해주면 됩니다
지금 설정으로는 s3에 저장되어 있는 로그파일을 SQS에서 받아올 것이기 때문에 input값을 설정해주면 됩니다

filebeat.inputs:
- type: s3
  queue_url: $SQS_URL
  visibility: 300s
  credential_profile_name: elastic-beats

실행

# filebeat 실행
systemctl start filebeat

# Filebeat 상태 확인 
system status filebeat

왜 사용하지?

적용을 하다보니 궁금한게 생겼습니다

Filebeat와 Logstash가 하는 역할이 비슷한 것 같기에
Elastic에서 왜 Filebeat를 만들었을까 하는 의문이 생겼습니다

설치를 하고 적용을 하면서도 잘 몰랐습니다
항상 붙어다니기에 당연히 설치하는 것이고,
Logstash에는 필터링이 있기에 필요하다고 생각했는데

이 둘은 성능, 필터링에 있어 가장 큰 차이가 있습니다

Logstash의 성능 문제

** 성능 **

Logstash를 실행하려면 JVM 이 필요 하며 고급 필터링이 필요한 경우 메모리 소모가 상당히 컸고, 이를 해결하기 위해 나온 것이 Filebeat입니다

실제로 Production에서 사용한 경험이 없기에 어떨지는 모르겠지만
Filbeat는 로그파일은 전달하고, Logstash에서 필터링을 하여
Elasticsearch에 전달하는 식으로 사용할 것으로 보입니다

더 추가한다면 Logstash의 자원 사용량이 높기 때문에 Filbeat와 Logstash의 중간에 MessageQueue를 넣어
관리해주면 조금 더 안정적으로 운영이 가능하지 않을까 싶습니다

S3, SQS 필요한가?

구축을 해보면서 느낀 점인데
처음에는 Filebeat로 로그를 어떻게 전달하지?라는 생각에
S3로 수집하고, SQS를 이용하여 전달하는 방식을 사용했는데

정말 대규모가 아니라면 S3와 SQS는 필요하지 않을 것 같고
차라리 각각의 API Server에 Filebeat를 설치하여 로그를 전달해도 괜찮을 것 같습니다

이후 서비스가 커진다면 API Server와 Filebeat를 분리하는 방향으로
재구성하고 ... 어떻게 전달할지는 생각해봐야겠네

대규모 운영환경에서 어떻게 사용하시는지 조언해주시면 감사합니다...

로그 수집은?

위의 그림처럼 되어있고,

작은 규모에서 로그를 저장한다면 가운데 다 없이

이렇게만 해도 무관할 것 같다
실제로 COOV를 개발하면서 적용한 모니터링은 두번째 그림으로 되어있고
불안정하다는 걸 많이 느낀다

최종적으로 적용해 보고 싶은 아키텍쳐

Logstash에서 처리하는 동안 Kafka에 쌓아놓고
처리하는 방식으로 적용해 보고 싶다

위 그림이 아니라면

이런식으로 각각의 서버에 Filebeat를 적용해서 전달하는 방식을 사용해 보고싶다

일단 적용전에 각각의 프로그램을 어떻게 써야 효율적인지 부터 공부하고...

개인 프로젝트에 적용해 봐야겠다

반응형

'Infra' 카테고리의 다른 글

[네트워크] IP  (0) 2022.03.04
[ELK-Filebeat] #2 Logstash  (0) 2022.03.04

+ Recent posts