도커로 실습하기

장후후·2021년 10월 25일
1

Docker Core Guide

목록 보기
3/5
post-thumbnail

레디스(Redis)

레디스(Redis)란?

NoSQL 데이터베이스에 한 종류로 모든 데이터를 메모리에 읽고쓴다. (그렇기 때문에 빠르다!)
Disk I/O 중에 제일 빠른 M.2 PCIe4.0 디스크가 읽기 7000MB/s 쓰기 5300MB/s
DRAM 중에 보편적으로 사용하는 DDR4-2666 스피드가 25.6 Gb/s이다. (물론 더 빠른것도 있다.)

그렇기 때문에, 메모리 기반 데이터 베이스인 레디스는 빠를 수 밖에 없다.

주요용도는 캐시서버로 사용한다.
예를 들어서 DB에 한번 요청된 데이터를 캐시서버에 저장하고, 재요청이 왔을 때, DB가 아니라 READ를 빨리 할 수 있는 캐시서버에 요청하는 것이다.
또 다른 예로는, DB에 너무 많은 부하가 몰릴때, 캐시서버를 앞에 두고, DB에 무리가 가지않게 처리해주는 방식이다.

하지만, 너무 캐시서버에 의존하게 된다면, 휘발성이 강한 메모리 특성상, 쉽게 데이터가 날아가기 때문에 잘 설계해서 사용해야 한다.

참고 https://brunch.co.kr/@jehovah/20

레디스 도커로 실행해보기

레디스를 도커 컨테이너 기반으로 한번 실행해보자.
레디스 이미지 받고, 네트워크 만들기

docker pull redis:alpine
docker network create redis-network

레디스 서버 실행하기

docker run -it --name redis-test \
-p 6379:6379 \
--network redis-network \
-v Redis:/data \
-d redis:alpine redis-server --appendonly yes

redis clinet로 redis server 단일성 접근해보기 (redis-test라는 컨테이너 이름으로 호출가능, 도메인 개념으로 보면 됨.)

docker run -it --network redis-network --rm redis:alpine redis-cli -h redis-test

직접 컨테이너에 접근하여 접속해보자.

docker run -it --network redis-network --rm redis:alpine ash
$ redis-cli -h redis-test

도커파일로 나만의 Redis 설정파일 사용하기

redis.conf

maxmemory 4g
maxmemory-policy noeviction
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

레디스 간단하게 맛보기


# 데이터 저장 set key value
> set user.name jsh
OK

# 데이터 검색 get key
> get user.name
"jsh"

# 키 이름 변경 rename key newkey
> rename user.name userid
OK
> get userid
"jsh"

# 저장된 키를 검색 keys [pattern]
> keys *
1) "user.name"

# 저장된 키중 u로 시작하는 검색
> keys u*
"user.name"

# 저장된 키중 .name 을 포함하는 key 검색
> keys *.name
"user.name"

# 저장된 키중 랜덤으로 불러오기 randomkey
> randomkey
"user1"

# 키 존재 여부 확인하기 exists key 
존재할 경우 1, 아닌 경우 0
> exists user.name
(integer) 1  
> exists user
(integer) 0   

# 키의 value 길이 strlen key
> strlen user.name
(integer) 3

# 모든 key 삭제 flushall
> flushall
OK
> keys *
(empty list or set)

node.js에서 redis 사용하기

node.js example code

const express=require('express');
const redis=require('redis');

const client=redis.createClient({
    host: "redis-test",
    port: 6379
})
const app=express();
app.listen(8080);

client.set("user.name","jsh");

app.get('/',(req, res)=>{
    client.get("user.name", (err, data)=>{
        client.set("hello", data + " hello!")
        res.send("안녕하세여! "+ data)
    })
})

console.log("Server is Running");

docker-compose

version: "3"
services:
  redis-server:
    image: "redis"
  node-app:
    build: .
    ports: 
      - "3000:8080"

python에서 redis 사용하기

redis 설치부터 해보자

pip install redis

redis sample code

import redis

# 레디스 연결
rd = redis.StrictRedis(host='redis-test', port=6379, db=0)

# 데이터 저장하기
rd.set("key","value")

# 키 불러오기
rd.get("[키]")

# 키 삭제하기
rd.delete("[키]")

# DB 데이터 삭제하기
rd.flushdb()

# 객체 데이터 선언
data = {
    "k1":"val1",
    "k2":"val2",
    "k3":"val3",
}

# json dumps
jsonData = json.dumps(data, ensure_ascii=False).encode('utf-8')

# dict 데이터 저장
rd.set("dict", jsonData)

# 데이터 get
result = rd.get("dict")
result = result.decode('utf-8')

# json으로 로드 하기
load_data = dict(json.loads(result))

InfluxDB & Telegraf로 시스템 모니터링 해보기

인플럭스는 시계열 Database이다. 즉 시간을 기준으로 저장하는 용도로 사용된다고 보면 됨
주로 빅데이터 수집용으로 많이 활용됩니다.

이번 실습은 Telegraf라는 에이전트 프로그램을 사용해서, 내 컴퓨터의 시스템 메트릭 수집을 해볼게요

Telegraf는 스택, 센서 및 시스템에서 메트릭(주기적으로 발생하는 데이터)을 수집하는데 도움을 주는 에이전트 프로그램입니다.
예를 들어서, 내 컴퓨터의 리소스 상태를 주기적으로 DB에 저장하고 싶다! 혹은 그라파나 모니터링 툴에서 실시간 모니터링을 하고 싶다! 이럴때 쓰는 거라고 생각하면 됩니다.

도커 네트워크 만들기

자 일단, influxdb와 telegraf가 공유하는 네트워크 부터 만들어봅시다.

docker network create influxdb-telegraf-net

인플럭스 컨테이너 생성하기

폴더는 f 드라이브의 /test/metricdata/influx를 만들어 놓겠습니다.

docker run -d --name=influxdb \ 
	-p 8086:8086 \ 
	-v /mnt/f/test/metricdata/influx:/root/.influxdb2 \
	--net=influxdb-telegraf-net \
	influxdb:2.0

제대로 생성했다면 docker ps로 컨테이너가 정상적으로 동작하는것을 확인할 수 있습니다.
크롬을 열어서, localhost:8086으로 접근해 볼게요

이런 화면이 뜨면 제대로 동작하는 거에요

인플럭스 설정하기

getstart 버튼을 누르고, 기초 설정을 진행합니다.

아래화면이 나오면 끝!

우리는 telegraf 설정을 할 것 이기 때문에 Advanced 버튼을 눌러보겠습니다.

system 모니터링(CPU, RAM, DISK 등 리소스를 모니터링 할 수 있음)을 진행해보겠습니다.

설정 이름 정해주시고

완료하면, 아래와 같이 토큰 정보가 생성 됩니다. 컨피그 파일에서 사용할 예정이니, 저장해놓십니다.

telegraf 설정하기

컨테이너가 정상적으로 실행되고 나면 telegraf 설정파일 만들어 줘야합니다.

위 influx에서 설정한 organiztion, bucket 이름과 token정보가 필요해요.

telegraf.conf는 아래와 같이 작성하면 됩니다.

# Configuration for telegraf agent
[agent]
  ## Default data collection interval for all inputs
  interval = "10s"
  ## Rounds collection interval to 'interval'
  ## ie, if interval="10s" then always collect on :00, :10, :20, etc.
  round_interval = true

  ## Telegraf will send metrics to outputs in batches of at most
  ## metric_batch_size metrics.
  ## This controls the size of writes that Telegraf sends to output plugins.
  metric_batch_size = 1000

  ## For failed writes, telegraf will cache metric_buffer_limit metrics for each
  ## output, and will flush this buffer on a successful write. Oldest metrics
  ## are dropped first when this buffer fills.
  ## This buffer only fills when writes fail to output plugin(s).
  metric_buffer_limit = 10000

  ## Collection jitter is used to jitter the collection by a random amount.
  ## Each plugin will sleep for a random time within jitter before collecting.
  ## This can be used to avoid many plugins querying things like sysfs at the
  ## same time, which can have a measurable effect on the system.
  collection_jitter = "0s"

  ## Default flushing interval for all outputs. Maximum flush_interval will be
  ## flush_interval + flush_jitter
  flush_interval = "10s"
  ## Jitter the flush interval by a random amount. This is primarily to avoid
  ## large write spikes for users running a large number of telegraf instances.
  ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s
  flush_jitter = "0s"

  ## By default or when set to "0s", precision will be set to the same
  ## timestamp order as the collection interval, with the maximum being 1s.
  ##   ie, when interval = "10s", precision will be "1s"
  ##       when interval = "250ms", precision will be "1ms"
  ## Precision will NOT be used for service inputs. It is up to each individual
  ## service input to set the timestamp at the appropriate precision.
  ## Valid time units are "ns", "us" (or "µs"), "ms", "s".
  precision = ""

  ## Logging configuration:
  ## Run telegraf with debug log messages.
  debug = false
  ## Run telegraf in quiet mode (error log messages only).
  quiet = false
  ## Specify the log file name. The empty string means to log to stderr.
  logfile = ""

  ## Override default hostname, if empty use os.Hostname()
  hostname = ""
  ## If set to true, do no set the "host" tag in the telegraf agent.
  omit_hostname = false
[[outputs.influxdb_v2]]	
  ## The URLs of the InfluxDB cluster nodes.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  ## urls exp: http://127.0.0.1:8086
  urls = ["http://localhost:8086"]

  ## Token for authentication.
  token = "OvrLbEjpH9_HkXRDoYxWvK7vljXkx16gGy8YSy8duTUuzmAXOnr0bZhc8v23c40tUf2KpSQna9I1ChGvgadbGQ=="

  ## Organization is the name of the organization you wish to write to; must exist.
  organization = "test"

  ## Destination bucket to write into.
  bucket = "Test"
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states.
  report_active = false
[[inputs.disk]]
  ## By default stats will be gathered for all mount points.
  ## Set mount_points will restrict the stats to only the specified mount points.
  # mount_points = ["/"]
  ## Ignore mount points by filesystem type.
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
[[inputs.mem]]
[[inputs.net]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]

telegraf 설치 및 실행하기

자, 이제 설정파일 작성이 완료되었으면 telegraf를 실행해보겠습니다.

도커 컨테이너

docker run -d --name=telegraf \
	> -v <telegraf.conf 경로>:/etc/telegraf/telegraf.conf:ro \
	> --net=influxdb-telegraf-net \
	> telegraf

최종적으로 컨테이너는 다음과 같이 생성되어 있으면 됩니다.

리눅스 계열

  1. macOS
brew install telegraf 

telegraf 설치후, /usr/local/etc/telegraf.conf 경로에 설정파일을 붙여넣거나,
vim으로 직접 편집하면된다.

설정파일이 적용된후

brew service start telegraf
  1. ubuntu

InfluxData 레포추가

cat <<EOF | sudo tee /etc/apt/sources.list.d/influxdata.list
deb https://repos.influxdata.com/ubuntu bionic stable
EOF

apt 키 임포트하기

sudo curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -

설치 및 시스템 활성화

sudo apt-get update
sudo apt-get -y install telegraf

/etc/telegraf/telegraf.conf 경로에 설정파일을 붙여넣거나 vim 편집기로 수정한다.

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

서비스 동작 확인하기

systemctl status telegraf

참고자료

윈도우 계열

링크를 클릭해서 다운로드 받는다 텔레그래프 1.20.3 다운
원하는 경로에 압축을 잘 풀어주고 포함되어있는 telegraf.config파일을 수정한다.

telegraf.conf 파일을 환경변수에 등록해준다.


변수이름은 TELEGRAF_CONFIG_PATH 변수값은 config파일 위치다.

환경변수를 사용할 수 있도록 관리자 권한으로 터미널을 실행하자

텔레그래프 바이너리가 포함되어 있는 폴더로 이동하고, telegraf.exe를 실행해준다.

InfluxDB & Telegraf로 redis db 모니터링 해보기

미리 만들어놓은 가상 네트워크 influxdb-telegraf-net 을 이용해서 redis 컨테이너를 연결해보자

redis 서버 컨테이너 생성

docker run -dit --name redis-server -p 6379:6379 --net=influxdb-telegraf-net redis:alpine

새 버킷 만들기

레디스 서버의 메트릭 수집을 위해서 새로 버킷을 만들어보자

Telegraf 설정하기

버킷의 telegraf 에이전트 설정을 들어가보자

레디스를 선택하고 다음을 누르자

시스템 메트릭 때와는 다르게 플러그인이 초록색으로 안되어있고, 회색 동그라미로 표시되어 있는데, 눌러서 설정을 해줘야 한다.

누르면 레디스 서버의 주소를 입력할 수 있는데 미리 컨테이너로 만들어놓은 redis-server:6379 를 입력하고 확인을 눌러보자

설정을 마치고, 확인을 누르면 토큰 정보가 나온다. 미리 복사해놓자
텔레그래프 탭으로 가서 redis-server-metric 설정을 누르고 안에 내용을 복사한다.

telegraf 컨테이너 생성하기

위의 복사한 내용을 telegraf.conf에 붙여넣고
influxdb urls와 token 정보 수정해주고

아래쪽에 redis설정도 확인해준다.

설정이 완료되면 바인드 마운트된 컨테이너를 생성해보겠다

docker run -dit --name telegraf-redis \ 
-v /home/jsh/telegraf-redis/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
--net=influxdb-telegraf-net telegraf

docker ps로 컨테이너들이 잘 생성되어 있는지 확인하고,
docker logs -f telegraf-redis 명령어로 telegraf가 정상적으로 작동하는지 확인해보자

influxDB 포탈에서 모니터링 하기

다시 inflxudb 포탈로 와서 보드 메뉴로 접근하면, Redis라는 대시보드가 자동으로 생성되있는걸 확인할 수 있다. 들어가보자

기본적인 대시보드 설정이 다되어 있어서 참편한 것 같다.
자기가 원하는 보고싶은 메트릭 설정도 가능하고, 다른 대시보드나 데이터 전송 매개체에도 연동이 가능하니까 활용을 해보느것도 좋을 것 같다.

profile
Backend Developer, DevOPS Engineer, IIoT, IoT

0개의 댓글