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)
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");
version: "3"
services:
redis-server:
image: "redis"
node-app:
build: .
ports:
- "3000:8080"
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))
인플럭스는 시계열 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 설정파일 만들어 줘야합니다.
위 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를 실행해보겠습니다.
docker run -d --name=telegraf \
> -v <telegraf.conf 경로>:/etc/telegraf/telegraf.conf:ro \
> --net=influxdb-telegraf-net \
> telegraf
최종적으로 컨테이너는 다음과 같이 생성되어 있으면 됩니다.
brew install telegraf
telegraf 설치후, /usr/local/etc/telegraf.conf 경로에 설정파일을 붙여넣거나,
vim으로 직접 편집하면된다.
설정파일이 적용된후
brew service start telegraf
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-net
을 이용해서 redis 컨테이너를 연결해보자
docker run -dit --name redis-server -p 6379:6379 --net=influxdb-telegraf-net redis:alpine
레디스 서버의 메트릭 수집을 위해서 새로 버킷을 만들어보자
버킷의 telegraf 에이전트 설정을 들어가보자
레디스를 선택하고 다음을 누르자
시스템 메트릭 때와는 다르게 플러그인이 초록색으로 안되어있고, 회색 동그라미로 표시되어 있는데, 눌러서 설정을 해줘야 한다.
누르면 레디스 서버의 주소를 입력할 수 있는데 미리 컨테이너로 만들어놓은 redis-server:6379
를 입력하고 확인을 눌러보자
설정을 마치고, 확인을 누르면 토큰 정보가 나온다. 미리 복사해놓자
텔레그래프 탭으로 가서 redis-server-metric 설정을 누르고 안에 내용을 복사한다.
위의 복사한 내용을 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가 정상적으로 작동하는지 확인해보자
다시 inflxudb 포탈로 와서 보드 메뉴로 접근하면, Redis라는 대시보드가 자동으로 생성되있는걸 확인할 수 있다. 들어가보자
기본적인 대시보드 설정이 다되어 있어서 참편한 것 같다.
자기가 원하는 보고싶은 메트릭 설정도 가능하고, 다른 대시보드나 데이터 전송 매개체에도 연동이 가능하니까 활용을 해보느것도 좋을 것 같다.