[python] boto모듈을 이용해 s3 backup (upload)

from boto.s3.connection import S3Connection

# S3 account

AWS_ACCESS_KEY_ID = ‘엑세스키’

AWS_ACCESS_KEY_SECRET = ‘시크릿키’

# make connection

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_ACCESS_KEY_SECRET)

# backup target BUCKET

bucket_name = ‘버킷명’

bucket = conn.get_bucket(bucket_name)

# BACKUP DIR and target DIR

backup_dir =’/backup/로컬백업폴더’

target_dir = ‘버킷하위디렉터리명’

# TIME setting to target

import time

utime = time.strftime(‘%Y-%m-%d’)

dest_dir = target_dir+’/’+utime

# search FUNCTION DEF

import os.path, os

def find(inputdir):

return [os.path.join(path, file)

for (path, dirs, files) in os.walk(inputdir)

for file in files]

# Search

listfile=find(backup_dir)

# upload

from boto.s3.key import Key

for list in listfile:

#print(list)

uploadkey = dest_dir+list

print(‘upload files to ‘+bucket_name+’ bucket\n’+’dir = ‘+uploadkey+’\n’)

k = Key(bucket)

k.key = uploadkey

k.set_contents_from_filename(list)

print ‘upload FILES finish’

# END

[protocol] HTTP 1.1 status code

HTTP 1.1 status codes [TOP]

100 : Continue

101 : Switching protocols

200 : OK, 에러없이 전송 성공

201 : Created, POST 명령 실행 및 성공

202 : Accepted, 서버가 클라이언트 명령을 받음

203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부만 전송

204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음

205 : Reset content

206 : Partial content

300 : Multiple choices, 최근에 옮겨진 데이터를 요청

301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음

302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시

303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음

304 : Not modified

305 : Use proxy

400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음

401 : Unauthorized, 클라이언트의 인증 실패

402 : Payment required, 예약됨

403 : Forbidden, 접근이 거부된 문서를 요청함

404 : Not found, 문서를 찾을 수 없음

405 : Method not allowed, 리소스를 허용안함

406 : Not acceptable, 허용할 수 없음

407 : Proxy authentication required, 프록시 인증 필요

408 : Request timeout, 요청시간이 지남

409 : Conflict

410 : Gone, 영구적으로 사용할 수 없음

411 : Length required

412 : Precondition failed, 전체조건 실패

413 : Request entity too large,

414 : Request-URI too long, URL이 너무 김

415 : Unsupported media type

500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)

501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함

502 : Bad gateway, 서버의 과부하 상태

503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태

504 : Gateway timeout

505 : HTTP version not supported

[etc] redis 개요 – 스크랩

http://www.dbguide.net/db.db?cmd=view&boardUid=186829&boardConfigUid=9&categoryUid=216&boardIdx=156&boardStep=1

레디스 개요

앞서 NoSQL에 대해 알아 보았겠지만, RDBMS와 비교해 다시 한 번 정리해 보자. NoSQL은 관계형 데이터베이스(RDB)의 표 형태 관계들이 아닌, 다른 형태로 데이터를 저장ㆍ조회할 수 있는 메커니즘을 제공하는 모든 데이터베이스를 칭한다(http://en.wikipedia.org/wiki/NoSQL). 아래 표와 같이 크게 4가지 형태로 분류할 수 있다. 이중 레디스(Redis: Remote Dictionary Server)는 Key-Value Store로 분류된다.

[표 Ⅱ-3-1] NoSQL의 유형과 특징

Column-Oriented

Store

    • Accumulo, Cassandra, Druid, HBase 
    • 하나의 키에 여러 개의 컬럼 이름과 값의 쌍으로 이뤄진 데이터를 저장 및 조회 
    • 컬럼은 컬럼 이름, 컬럼 값, 타임스탬프(버전) 등으로 구성되며, 컬럼의 집합을 Row라 하며 Row Key로 식별

Document-Oriented

Store

    • Clusterpoint, Apache CouchDB, Couchbase, MarkLogic, MongoDB 
    • ‘키-값’ 구조를 확장한 것으로, 하나의 키에 하나의 구조화한 문서(JSON, BSON, XML 등)를 저장ㆍ조회

Key-value Store

    • Dynamo, FoundationDB, MemcacheDB, Redis, Riak, FairCom c-treeACE 
    • 가장 기본적인 형태의 NoSQL로 ‘키-값’ 구조로 데이터를 저장ㆍ조회

Graph Database

    • Allegro, Neo4J, InfiniteGraph, OrientDB, Virtuoso, Stardog
    • 노드(Vertex)와 관계(Edge)를 사용해 데이터를 저장ㆍ조회, 관계는 속성이라는 부가정보를 가짐

Ben Scofield의 데이터베이스 유형 간 비기능 품질 특성 비교를 따르면, Key-Value Store는 기능ㆍ확장성ㆍ유연성 면에서 매우 높은 품질을 가지면서도 구성 복잡도가 매우 낮음을 알 수 있다.

[표 Ⅱ-3-2] NoSQL 유형 간 비교

데이터 모델

성능

확장성

유연성

복잡도

기능성

Key–Value Store

hjgh

hjgh

high

none

variable (none)

Column-Oriented Store

high

high

moderate

low

minimal

Document-Oriented Store

high

variable (high)

high

low

variable (low)

Graph Database

variable

variable

high

high

graph theory

Relational Database

variable

variable

low

moderate

relational algebra

반면 Eric Brewer의 CAP 원칙(1999)을 따르면, 분산 컴퓨터 시스템은 아래 세 가지의 비기능 품질 속성을 동시에 모두 만족시킬 수 없으며, 최대 두 가지만 동시에 만족시킬 수 있다.

      • Consistency: 모든 노드들에게 동시에 동일한 데이터 조회 보장
      • Availability: 성공 또는 실패를 막론하고 모든 요청에 대한 응답을 보장
      • Partition Tolerance: 미리 예측할 수 없는 데이터 손실 또는 시스템 구성 요소 중 일부의 실패(Failure)에도 전체 시스템은 항상 정상 작동함을 보장

또한 Nathan Hurst의 ‘Visual Guide of NoSQL System’에서 확인해 보면 레디스는 데이터 일관성(Consistency)과 Partition Tolerance를 동시에 만족시키지만, 데이터 가용성(Availability)에 대한 지원은 부족해 구성 및 운영 시 이에 대한 고려가 필요함을 알 수 있다.

MongoDB 데이터 구조

[그림 Ⅱ-3-1] Visual Guide to NoSQL Systems

Redis(Remote Dictionary Server)를 간단히 살펴보면 다음 표와 같다.

[표 Ⅱ-3-3] 레디스 개요

구분

내용

개발자(사)

Salvatore Sanfilippo

최초 배포일

2009년 04월 10일

최신 안정 배포판

2.8.14(2014년09월 10일 기준)

구현 언어

ANSI C

지원 운영체계

크로스플랫폼

유형

Key–value stores

라이선스

BSD

웹 사이트

http://www.redis.io

      • 선택적인 데이터 지속성과 함께 메모리 상에 키-값 쌍을 저장하는 오픈소스 소프트웨어다.
        (
        www.wikipedia.org)
      • ANSI C로 작성돼 ANSI C 컴파일러가 동작하는 다양한 환경에 설치와 실행이 가능하다. 
      • 트위터, 기트허브, 핀터레스트, 인스타그램, 텀플러, 네이버 라인 등 대용량 서비스 레퍼런스가 있다. 
      • 인메모리 자료구조(Data Structure) 저장소다. 즉 기본 데이터 저장소는 메모리다.
      1. – Simple String: Key-Value Store
      2. – List
      3. – Set
      4. – Sorted Set
      5. – Hash 
      • 읽기 성능 향상을 위한 마스터/슬레이브 서버 복제(Replication)를 지원한다. 
      • 쓰기 성능 향상을 위한 데이터 샤딩(Sharding)을 지원한다.
      • 데이터 영속성(Persistency)을 지원한다.
      1. – 스냅샷: 특정 시점의 메모리의 내용을 *.rdb 파일로 디스크에 저장
      2. – AOF(Append Only File): 수행된 레디스 명령어들을 파일 형태로 디스크에 저장 
      • 서버 간 이벤트 공유를 위한 Publish/Subscribe 기능 지원 
      • 마스터/슬레이브 불문하고 레디스 서버는 단일 스레드로 동작(1개의 CPU에서 동작)
      • 100,000QPS(Query Per Second)의 고성능

다음은 배치도(Deployment Diagram)형태의 레디스 기반 시스템 아키텍처 사례다.

배치도(Deployment Diagram)형태의 레디스 기반 시스템 아키텍처 사례

[그림 Ⅱ-3-2] 레디스 아키텍처 사례(배치도)

위 아키텍처 배치도 사례 내 주요 구성요소들은 다음과 같다.

구성요소

설명

Web app

Web Browser 기반 사용자 클라이언트

Load Balancer

Web 서버로 향하는 워크로드를 분산시켜 성능/안정성을 향상시키는 네트워크 장비(L4 Switch)

Web Socket Server

Web Server

Redis

메시징 및 데이터 캐싱 용도로 사용

Data Layer

RDBMS로의 접근 경로 제공 (ODBC, JDBC, ADO .NET 등)

Application Layer

Business Application 탑재 및 접근 경로 제공

Persistent RDBMS

하드디스크 기반의 관계형 데이터베이스 (Oracle, MySQL, 등)

레디스 설치

가상머신 소프트웨어는 Virtual Box를 사용해도 무방하고 게스트 OS는 레디스가 공식 지원하는 Unix, Linux, MacOS 중에서 하나를 선택해 설치한다. 윈도우용 레디스는 https://github.com/dmajkic/redis/downloads에서 내려 받아 설치할 수 있지만, 개발 또는 학습 용으로만 사용하기를 권장한다.

Ubuntu의 터미널에서 아래의 명령을 수행해 레디스 설치 파일을 다운로드하고 설치한다.

배치도(Deployment Diagram)형태의 레디스 기반 시스템 아키텍처 사례

다음 명령으로 레디스 서버를 기동한다.

배치도(Deployment Diagram)형태의 레디스 기반 시스템 아키텍처 사례

배치도(Deployment Diagram)형태의 레디스 기반 시스템 아키텍처 사례

[그림 Ⅱ-3-3] 레디스 서버 기동화면

레디스가 기동 되면 [그림 Ⅱ-3-3]과 같은 화면이 출력된다 레디스는 기본적으로 싱글스레드를 사용하기 때문에 PID 하나를 사용하고 6379포트를 사용하여 클라이언트와 통신한다. 레디스를 설치하고 서버를 기동한 후 내장된 명령행(CLI) 클라이언트를 통해 다음과 같이 정상적으로 동작하는지를 확인할 수 있다.

내장된 명령행(CLI) 클라이언트

[Note]

레디스 명령행은 대소문자를 구분하지 않으며 명령행에 사용하는 명령어들의 인자값들은 정규표현식을 인식한다.

레디스 환경 설정

레디스 환경설정에는 다음 두 가지 방법이 있다.

[표 Ⅱ-3-4] 레디스 환경 설정 방법

환경설정방법

형식

설명

redis.conf

설정 파일

    • 레디스 서버 인스턴스 기동 시 적용 
    • 파일 수정 후 레디스 서버 재기동 시 변경내역 반영

config set

런타임 명령어

    • 변경 내역이 현재 동작중인 서버에 즉시 반영(레디스서버인스턴스 재기동 시 변경 설정값이 저장되지 않으므로, 필요한 경우 반드시 redis.conf 파일에 사전 반영해 둔다.)

2014년 9월10일 현재, 주석을 제거한 redis.conf 파일의 내용은 다음과 같다. 해당 설정 항목을 일일이 소개하기에는 지면 제한으로 어려워, 레디스 기반 시스템 아키텍처 설계 시 필수적으로 고려해야 하는 복제(Replication), 샤딩(Sharding), 스냅샷(Snapshot), AOF를 위주로 살펴본다. 독자가 향후 이 파일의 주석과 함께 관련 문서들을 더 폭넓게 살펴봄으로써 레디스 구성 및 설정에 대한 지식을 넓힐 수 있다. redis.conf 파일의 최신본은 http://download.redis.io/redis-stable/redis.conf에서 내려 받을 수 있다.

주석을 제거한 redis.conf 파일의 내용

주석을 제거한 redis.conf 파일의 내용

주석을 제거한 redis.conf 파일의 내용

주석을 제거한 redis.conf 파일의 내용

레디스 설정 파일 내 메모리 크기 등을 지정하기 위한 단위 사용 시 대소문자를 구분하지 않는다.

[표 Ⅱ-3-5] 레디스 환경설정 파일 숫자 단위

표현

설명

1k

1,000바이트

1kb

1,024바이트

1m

1,000,000바이트

1mb

1,024×1,024바이트

1g

1,000,000,000바이트

1gb

1,024× 1,024×1,024바이트

레디스 설정 항목

레디스 설정 및 관리 작업에 참조할 수 있도록, 설정 파일 내 각 설정 항목들을 알아보자. 해당 내용은 본 교재의 내용을 충분히 살펴보고, 레디스의 기본 구조와 메커니즘에 대해 이해한 후 다시 살펴볼 필요가 있다.

General

설정항목

설정사례

설명

daemonize

No

레디스는 기본적으로 daemon으로 동작하지 않음

pidfile

/var/run/redis.pid

레디스가 daemon으로 동작할 때, pid[process id] 파일을 기록하는 기본 위치(별도 파일 지정 가능)

port

6379

기본 포트 번호(별도 포트번호 지정 가능)

bind

127.0.0.1

특정 네트워크 I/F 지정(미지정 시 모든 네트워크 I/F 사용)

unixsocket

/tmp/redis.sock

특정 UNIX 소켓 지정(미지정 시 UNIX 소켓을사용 안함)

unixsocketperm

755

timeout

0

    • 특정 시간(Second) 클라이언트 미동작 시 연결 종료 
    • 0은 timeout 미적용을 의미함

tcp-keepalive

60

특정 시간(Second) 클라이언트 미동작 시 TCP ACK 전송

loglevel

notice

debug(가장 상세한 로그) / verbose / notice / warning(중요 또는 심각한 메시지만 기록)

logfile

stdout

    • 별도 파일 지정 필요 
    • 레디스가 daemon으로 동작 시 이 값이 stdout이면 /dev/null 보내짐(미기록)

syslog-enabled

no

yes로 지정한 경우 OS syslog 활용(syslog 설정 조정 필요)

syslog-ident

redis

syslog 사용 시 log identity 지정

syslog-facility

local0

User 또는 local0 ~ local7 사이의 값을 지정해야 함

Snapshotting

설정항목

설정사례

설명

save

900 1

900초(15분) 이후 1개의 쓰기 발생

save

300 10

300초(3분) 이후 10개의 쓰기 발생

save

60 10000

60초 이후 10,000개의 쓰기 발생 시 디스크에 데이터 복제

stop-writes-onbgsave-error

yes

    • RDB 스냅샷 중 쓰기요청 수행 중단옵션. 
    • 레디스 서버 및 Disk 지속성에 대한 적절한 모니터링 체계를 갖췄다면 ‘no’로 지정해 사용가능

rdbcompression

yes

dump.rdb 파일을 LZF로 압축

rdbchecksum

yes

    • CRC64로 Checksum 값 생성후 dump.rdb 파일에 추가 
    • 데이터영속성 보장이 강화되나 10% 정도의 성능오버헤드 발생

dbfilename

dump.rdb

변경 지정 가능

dir

./

dump.rdb 파일과 AOF 파일 생성 위치

Replication

설정항목

설정사례

설명

slaveof

<masterip>

<masterport>

복제 대상 마스터 노드의 IP 주소와 포트 번호를 명기

slave-serve-stale-data

yes

    • Master노드와 연결 단절 또는 Replication 진행중일 때 ‘yes’(기본값)로 지정 시 클라이언트의 요청에 항시 응답. • ‘no’로 지정시 info/slaveof 명령 외의 클라이언트 요청 명령에 ‘SYNC
    • with master in progress’ 에러 메시지 출력

slave-read-only

yes

권장 기본 값

repl-ping-slaveperiod

10

슬레이브 노드가 마스터 노드에게 정기적으로 ping을 보내는 간격 (초)

repl-timeout

60

Bulk transfer I/O, Master Data, Ping Response에 대한 timeout 값(부적절한 timeout 발생을 방지하기 위해 repl-ping-slave-period보다 반드시 큰 값이어야 함)

repl-disable-tcp-nodelay

no

    • ‘no’ – 대역폭을 최대한 활용한 Replication 데이터 전송 모드 
    • ‘yes’ – TCP 패킷 개수를 제한해 대역폭 소모를 줄이는 Replication 데이터 전송 모드

repl-backlog-size

1mb

    • backlog는 슬레이브 노드 연결 단절 시 슬레이브 노드에 전송할 데이터를 임시 저장하는 버퍼
    • 단절 시 재연결된 슬레이브 노드의 Full Resync를 방지하고 Partial Resynch로 대신할 수 있도록 함.이 크기를 크게 할 수록 슬레이브 노드의 연결 단절 여유 시간을 더 확보할 수 있음.

repl-backlog-ttl

3600

    • 3600초(60분) 동안 연결이 끊어진 슬레이브 노드의 재연결이 이루어지지 않은 경우 해당 슬레이브 노드를 위한 backlog 파일을 삭제.
    • ‘0’으로 지정 시 backlog를 삭제하지 않음.

slave-priority

100

Redis Sentinel이 마스터 노드 장애 시 슬레이브 노드들 중 마스터 노드 선택 기준 값(적은 숫자가 더 높은 우선 순위를 가짐)

min-slaves-to-write

0

마스터 노드가 쓰기 요청을 수용하기 위한 최소 연결 슬레이브 노드개수(충분한 개수의 슬레이브 노드가 없어서 데이터 복제본을 유지할 수 없으면 쓰기 결과가 유실될 수 있음)

min-slaves-max-lag

10

최소 연결 슬레이브 노드 개수에 모자랄 때 슬레이브 노드들의 연결을 기다리는 시간(Second)

Security

설정항목

설정사례

설명

requirepass

foobared

클라이언트에게 명령 요청 시 패스워드를 입력하도록 강제

renamecommand

CONFIG

b840fc02d524045429941cc15f59e41cb7be6c52

명령어 치환. 다음의 경우 해당 명령어 사용을 거부하게 됨

(예: rename-command CONFIG “”)

LIMITS

설정항목

설정사례

설명

maxclients

10000

접속 클라이언트 개수 제한

maxmemory

<bytes>

메모리 사용 제한

maxmemory-policy

volatile-lru

사용 메모리가 maxmemory에서 지정한 값을 넘을 때 메모리 관리 정책

    • volatile-lru: (기본 값)expire set에 포함된 Key들을 LRU(Least Recently Used) 정책에 의거 삭제 
    • allkeys-lru: 모든 Key들에 LRU 정책적용 
    • volatile-random: expire set에 포함된 Key들을 무작위로 삭제 
    • allkeys-random: 모든 Key들을 무작위로삭제 
    • volatile-ttl: 가장적은잔여 TTL(Time To Live) 값을 가지고 있는 Key를 삭제
    • noeviction: 어떤 Key도 삭제하지 않고 쓰기 요청에 대한 에러를 반환

maxmemory-samples

3

LRU 또는 최소 TTL 정책을 적용해 Key 삭제 전에 유사한 조건을 가진 Key들을 선택한 뒤, 최종적으로 삭제 대상 Key를 선정하기 위한 선택 범위 지정(샘플링 개수)

APPEND ONLY MODE

설정항목

설정사례

설명

appendonly

yes

AOF 파일 사용 여부

appendfilename

“appendonly.aof”

AOF 파일 이름 지정

appendfsync

always

운영체제의 fsync( )에 의한 지연된 쓰기 옵션 (메모리 -> Disk)

    • no:fsync()사용없이 즉시 쓰기, 가장 빠름.
    • always:항상 fsync( ) 사용, 느리지만 안전함. 
    • everysec:매 초 마다 fsync( )를 호출

no-appendfsync-on-rewrite

no

쓰기 명령에 대한 fsync( ) 리턴 지연 시간이 너무 길어지면 운영체제의 간섭이 있을 수 있으므로, 스냅샷 생성을 위한 BGSAVE 또는 AOF 파일 기록을 위한 BGREWRITEAOF가 실행되고 있을 때는 fsync( )의 호출을 블록킹 함

auto-aof-rewrite-percentage

100

AOF 파일 초기화 및 재기록 시작을 위해 최초 AOF 파일의 크기를 기준으로 사용 비율을 지정(‘0’으로 지정 시 AOF 파일 초기화 없음)

auto-aof-rewrite-min-size

64mb

AOF 파일 초기화 및 재기록 시작을 위해 파일 크기를 지정(‘0’으로 지정 시 AOF 파일 초기화 없음)

LUA SCRIPTING

설정항목

설정사례

설명

lua-time-limit

5000

5,000초까지 Lua 스크립트 실행 미종료 시 에러 메시지 리턴(‘0’으로 지정 시 실행 시간 무제한)

SLOW LOG

설정항목

설정사례

설명

slowlog-log-slower-than

10000

지정된 시간을 넘어 실행이 완료되지 않은 명령들을 Slow Log에 기록함.micro second 단위(1,000,000 = 1 초)

LATENCY MONITOR

설정항목

설정사례

설명

latency-monitor-threshold

0

    • (milli second) Redis Latency Monitor 서브 시스템이 지연 명령을 추적ㆍ관리하는 기준 시간 지정 
    • ‘LATENCY’ 명령으로 관련 데이터를 출력할 수 있음. • 레디스 실행 중에는 ‘CONFIG SET latency-monitor-threshold <milliseconds>‘으로 레디스를 실시간 모니터링할 수 있음

EVENT NOTIFICATION

설정항목

설정사례

설명

notify-keyspace-events

“”

(레디스의 이벤트 notification 옵션을 아래의 키워드로 설정)

    • ” “: notification 비활성화 
    • K:Keyspace 이벤트, published with __keyspace@__ prefix. 
    • E:Keyevent 이벤트, published with __keyevent@__ prefix. 
    • g:데이터 타입이 지정돼 있지 않은 일반 명령어(예: DEL, EXPIRE, RENAME 등)
    • $: String 명령어 
    • l:List 명령어 
    • s: Set 명령어 
    • h:Hash 명령어
    • z: Sorted set 명령어 
    • x:Expired 이벤트 (events generated every time a key expires)
    • e: Evicted 이벤트 (events generated when a key is evicted for maxmemory) 
    • A: g$lshzxe 혼합 옵션 (예: “AKE”는 모든 이벤트를 의미함) ※ http://redis.io/topics/notifications 추가 참조

LUA SCRIPTING

설정항목

설정사례

설명

lua-time-limit

5000

5,000초까지 Lua 스크립트 실행 미종료 시 에러 메시지 리턴(‘0’으로 지정 시 실행 시간 무제한)

ADVANCED CONFIG

설정항목

설정사례

설명

hash-max-ziplist-entries

512

해시 값이 512개를 넘지 않고 그 중 가장 큰 해시 값의 크기가 64바이트를 넘지 않을 경우, ziplist 형식으로 압축해 메모리 절약

hash-max-ziplist-value

64

list-max-ziplist-entries

512

List가 512개를 넘지 않고 그 중 가장 큰 List의 크기가 64바이트를 넘지 않을 경우, ziplist 형식으로 압축해 메모리 절약

list-max-ziplist-value

64

set-max-intset-entries

512

Set의 크기가 512를 넘지 않는 경우 intset 형식으로 압축해 메모리 절약

zset-max-ziplist-entries

128

정렬된 Set 내 항목 개수가 128개를 넘지 않고 각 항목의 크기가 64바이트를 넘지 않을 경우, ziplist 형식으로 압축해 메모리 절약

zset-max-ziplist-value

64

hll-sparse-max-bytes

3000

    • HyperLogLog의 sparse representation 한계. 이 값을 넘으면 dense representation이 적용 됨. dense representation이 더 효율적이 되는 한계점인 16,000 이상의 값 부여는 무의미 
    • CPU 사용률보다 메모리 공간 효율성이 더 중요할 경우 10,000정도의 값을 부여할 수 있음

activerehashing

yes

    • “no”: 레디스 기본 옵션인 lazy rehashing 기능 사용 
    • “yes”: 실시간 요구사항이 존재하고 지속적으로 메모리 자원을 최적화해야 할 경우 사용(1초당 1millisecond의 CPU 타임을 해시 테이블 재계산에 할당)

hz

10

    • Redis 백그라운드 타스크 실행 주기 
    • 0~500사이의 값을 부여할 수 있음 
    • 더 높은 숫자는 Redis의 반응 시간을 줄여주지만 CPU를 더 많이 점유하게 됨 (최대 100까지를 권장)

aof-rewrite-incremental-fsync

yes

“yes”로 지정 시, AOF 파일 기록을 위한 Redis child 프로세스가 fsync( )를 활용 데이터를 32 MB 단위로 전송 반영 함.

client-output-buffer-limit

<class> 

<hardlimit>

<softlimit>

<softseconds>

클라이언트 time out 시간 지정

      • <class> 3가지 클라이언트 유형
      1. – normal : MONITOR포함 일반 클라이언트
      2. – slave : slave 클라이언트
      3. – pubsub : 하나 이상의 pubsub channel 또는 pattern에 등록한 클라이언트
      • <hardlimit> 클라이언트
      1. – output buffer의 크기가 지정된 크기를 넘는 경우 즉시 종료 
      • <softlimit> 클라이언트
      1. – output buffer의 크기가 지정된 크기를 넘는 경우 soft second 동안 대기 후 종료
      • <softseconds> 클라이언트
      1. – softlimit대기 시간

hardlimit/softlimit/softsecond의 값을 “0”으로 지정하는 경우 클라이언트 out buffer 크기에 제한을 두지 않음

[지정 사례]

client-output-buffer-limitnormal000

client-output-buffer-limitslave256mb64mb60

client-output-buffer-limitpubsub32mb8mb60

레디스 실습

레디스는 스토리지에 저장되는 일반 RDB와 두 가지 차이점이 있다. 첫 번째 NoSQL을 지원하는 key-value로 데이터를 관리하며. 두 번째 스토리지가 아닌 메모리에서 데이터를 관리한다는 점이다.

이 두 가지 차이점을 생각하며 레디스에서 데이터를 다루는 방법을 실습해 보도록 하자.

레디스의 기본사용법

데이터 입력

데이터를 레디스에 입력하기 위해서는 set명령어를 사용한다. 레디스 클라이언트 명령행에서 데이터 입력을 실습해 보자.

set명령어

      1. set 명령어를 사용해 data1 “key” mydata1 “value” 레디스에 저장한다.
      2. keys 명령어를 사용하여 data1 key 있는지 확인한다.
      3. get 명령어를 사용하여 data1 value값을 확인한다. mydata1 value 저장 되어 있는 것을 확인할 있다.

여러 건의 데이터 입력

mset을 사용하여 여러 건의 데이터를 입력해보자.

mset을 사용하여 여러 건의 데이터를 입력

      1. mset 여러 건의 데이터를 입력하는 명령어이다. mset으로 입력시 항상 key1 value1 key2 value2 형식으로 입력하며 key value 쌍이 맞아야 한다.
      2. keys명령어를 사용하여 key 정확히 저장되었는지 확인할 있다.
      3. get명령어를 사용하여 data1 value 확인할 있다. 그런데 data1 value값이 변한 것을 있다. 레디스는 초기에 multi 선언을 하지 않으면 트랜잭션을 일으켜 데이터를 commit한다.
      4. mget 명령어로 여러 개의 키에 할당된 값을 조회할 있다.

트랜잭션관리

레디스에서 트랜잭션을 관리하기 위해서는 multi 명령어를 사용한다.

multi 명령어

multi 명령어를 사용하고 data1에 mydata4를 저장하면 “QUEUED” 상태가 된다.

현재 세션에서 get 명령어로 데이터를 조회해 보고 터미널을 새로 열어 데이터를 조회해 보자

데이터를 조회

현재 세션에서는 상태가 “QUEUED”로 조회되고 새로운 터미널에서 조회하면 이전에 입력한 데이터인 mydata0이 조회된다.

레디스의 트랜잭션 실행 명령어인 exec를 사용하여 데이터를 commit하고 현재 세션의 데이터와 다른 터미널에서도 데이터가 변했는지 확인해 보자.

레디스의 트랜잭션 실행 명령어인 exec

두 개의 세션에서 모두 데이터가 commit 된 것을 확인할 수 있다.

데이터 타입

레디스는 String, List, Hash, Set, Stored set의 데이터타입을 지원한다.

String

String 타입은 레디스의 가장 기본적인 데이터타입이다. binary형태로 저장되기 때문에 데이터의 포맷에 관계없이 (동영상이나 이미지 같은 데이터도 상관없이) 저장할 수 있다. 또한 문자열과 정수형을 자동으로 구분하기 때문에 해당 key에 대한 데이터 형태는 각 key의 value를 판단하여 레디스에서 자동으로 인식하게 된다.

String

String 타입의 데이터를 추가하는 것에 대하여 알아보자. key-value 데이터베이스에서 데이터를 추가하는 것은 스키마를 가지고 있는 RDB와는 다르게 데이터 건수를 늘리는 것이 아니라 특정 key에 대한 value의 값을 더하는 것이다.

String 타입의 데이터를 추가

append명령어를 사용하여 데이터를 추가 하였다. 결과는 이전에 입력한 “11a”에 입력한 문자열 “12a”가 추가 되어 “11a12a”로 값이 저장된 것을 확인 하였다.

List

List 타입은 String 타입의 데이터가 생성된 순서대로 정렬된 리스트라 이해하면 된다.

List 타입으로 데이터를 생성해 보자. List 타입의 데이터 입력은 push명령어를 사용한다. rpush는 오른쪽으로 데이터를 추가하고 lpush명령은 왼쪽으로 데이터를 추가한다. 데이터를 조회하기 위해서는lrange 명령어를 사용하여 범위 값을 지정하여 지정된 범위내의 데이터 값을 조회할 수 있다.

List

리스트의 데이터를 삭제해 보자. lrem 명령어를 사용하여 “d”를 삭제하였다.

lrem 명령어를 사용하여 “d”를 삭제

Set

Set 타입은 먼저 String 타입에서 데이터 입력을 위해 사용하는 set명령과는 상관이 없다. Set 타입은 String 타입의 데이터가 순서에 관계없이 집합된 형태이다. Set 타입에서는 Set내에서 데이터의 추가, 삭제 및 테스트가 가능하다.

Set 타입으로 데이터를 입력해 보자. sadd 명령어를 사용하여 데이터를 입력한다. smembers 명령어를 사용하여 데이터를 조회한다. Set 데이터타입의 특이한 점은 key에 대하여 중복된 값을 입력하여도 데이터의 값을 중복으로 저장하지 않는다는 것이다.

Set

Sinter를 사용하여 교집합을 구해보자. Sinter는 RDB의 조인과 유사하게 사용할 수 있다.

Sinter를 사용하여 교집합 구해보자

Hash

Hash 타입은 여러 개의 key들과 value들이 구조화 된 타입이라 할 수 있다. 레디스에서 Hash 데타입은 RDB의 테이블과 가장 유사한 데이터처럼 보이지만 RDB 측면에서 보면 단 하나의 로우만 갖는 테이블처럼 보일 것이다.

Hash 타입으로 이름, 나이, 성별을 가지고 있는 데이터 오브젝트를 만들어보자. hmset 명령어를 사용하여 emp라는 오브젝트에 name, age, gender의 필드를 만들고 데이터를 입력하였다. hmget명령어를 사용하여 데이터를 조회한다.

Hash

Sorted Set

Sorted Set 타입은 Set 타입과 유사하지만 각각의 값에 스코어가 추가 된다. 스코어를 이용하기 때문에 Set 타입보다 데이터의 입력, 추가, 삭제에서 훨씬 좋은 성능을 보장한다.

Sorted Set 타입으로 데이터를 입력해 보자. zadd 명령어를 사용하여 데이터를 입력한다. zrange 명령어를 사용하여 입력한 데이터를 조회한다. zrange명령어에 withscores 옵션을 사용하면 입력시 저장한 score값도 함께 조회할 수 있다.

Sorted Set

[etc] Mail Server SPF (메일서버 등록)

메일서버등록제(SPF: Sender Policy Framework)

메일서버 정보를 사전에 DNS에 공개 등록함으로써 수신자로 하여금 이메일에 표시된 발송자 정보가 실제 메일서버의 정보와 일치하는지를 확인할 수 있도록 하는 인증기술

* 대다수 스팸발송자가 자신의 신원을 감추기 위하여 발송자 주소나 전송경로를 허위로 표기하거나 변경하는 경우가 많다는데 착안

SPF를 이용한 이메일 인증절차:

발신자 : 자신의 메일서버 정보와 정책을 나타내는 SPF 레코드를 해당 DNS에 등록

수신자 : 이메일 수신시 발송자의 DNS에 등록된 SPF 레코드를 확인하여 해당 이메일에 표시된 발송IP와 대조하고 그 결과값에 따라 수신여부를 결정

(메일서버나 스팸차단솔루션에 SPF 확인기능이 설치되어 있어야 함)

SPF 개발 및 도입현황:

1998년 Paul Vixie의 ‘Repudiating Mail From’에서 처음으로 아이디어가 제안된 이후 Pobox.com의 Meng Weng Wong에 의해 SPF가 개발됨

2004년 2월 IETF(Internet Engineering Task Force)에 공식 RFC(Request For Comments)로 제안되었으며, 2004년 12월 SPF의 모든 기술적 내용들이 최종 완성됨

SPF는 타 인증기술에 비해 적용이 용이하고 호환성이 좋으며 오픈소스를 기반으로 하므로 전 세계적으로 폭넓은 지지기반을 확보하고 있음

한국을 비롯한 미국, 캐나다, 일본 등 여러 국가들이 정부차원에서 사업자들을 대상으로 SPF 레코드 출판 및 확인기능 도입을 통한 스팸차단 활용을 적극 권고하고 있음

[aws] autoscale control

# AutoScaling Process Enable

aws –profile hong –region us-east-1 autoscaling resume-processes –auto-scaling-group-name web-server

 

# AutoScaling Process Disable

aws –profile hong –region us-east-1 autoscaling suspend-processes –auto-scaling-group-name web-server

 

 

# Group Name Query

aws –profile test –region ap-northeast-2 –output json autoscaling describe-tags –query ‘Tags[?Key==`Name`].Value’

 

 

[etc] wordpress 호스트명 변경

mysql> UPDATE wp_options SET option_value = replace(option_value, ‘http://hongblog.jinstalk.com‘, ‘http://blog.hongstalk.com‘) WHERE option_name = ‘home’ OR option_name = ‘siteurl’;

Query OK, 0 rows affected (0.00 sec)

Rows matched: 2 Changed: 0 Warnings: 0

mysql> UPDATE wp_posts SET guid = replace(guid, ‘http://hongblog.jinstalk.com’,’http://blog.hongstalk.com‘);

Query OK, 0 rows affected (0.02 sec)

Rows matched: 964 Changed: 0 Warnings: 0

mysql> UPDATE wp_posts SET post_content = replace(post_content, ‘http://hongblog.jinstalk.com‘, ‘http://blog.hongstalk.com‘);

Query OK, 0 rows affected (0.05 sec)

Rows matched: 964 Changed: 0 Warnings: 0

mysql> UPDATE wp_postmeta SET meta_value = replace(meta_value,’http://hongblog.jinstalk.com’,’http://blog.hongstalk.com’);

Query OK, 0 rows affected (0.01 sec)

Rows matched: 686 Changed: 0 Warnings: 0

[win] 리모트 서버 정보 확인방법

[원격지 서버 확인법]

systeminfo

systeminfo /s 호스트명 /fo csv /nh >> c:\Users\%whoami%\Desktop\systeminfo.csv

Wmi into

wmic /node:원격지호스트명 ComputerSystem get Manufacturer, Model

파일로 떨구기

for /l %i in (100,1,200) do systeminfo /s server-%i /fo csv /nh >> c:\Users\%whoami%\Desktop\cmsystem.csv

드라이버 버전 확인

reg query \\server-240\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007\ /v “DriverVersion”

reg query \\server-240\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007\ /v “DriverDate”

원격지 파일 복사

for /f %i in (E:\Manage\scripts\Hosts\webserver-group.host) do xcopy /y /f E:\Dist\Web\config.conf \\%i\c$\web\config\setting.ini

for /f %i in (E:\Manage\scripts\Hosts\gameserver-group.host) do xcopy /y /f E:\Dist\Game\config\gameconfig.conf \\%i\c$\game\config\setting.ini