낙관적 잠금(optimistic lock)은 자주 경합되지 않을 것을 가정하고, 최대한 잠금을 나중에 하는 것을 의미한다. 


사용자가 A 트랜잭션에서 데이터를 수정했는데 B 트랜잭션에서 그 데이터가 변경되었다는 것을 트랜잭션에서 알면 사용자는 수동으로 작업을 진행한다.


일래스틱서치는 낙관적 잠금을 지원하며, 낙관적 잠금은 타임스탬프로 구현되어 있다.

http://knight76.tistory.com/entry/elasticsearch-%EB%82%99%EA%B4%80%EC%A0%81-%EB%8F%99%EC%8B%9C-%EC%A0%9C%EC%96%B4-optimistic-concurrency-control



레디스도 낙관적 잠금을 지원한다. WATCH 커맨드를 사용하여, 지켜볼 키가 변경되는지 안되는지 를 확인할 수 있다. 

http://redis.io/topics/transactions


Posted by '김용환'
,


redis 3.0.2를 설치한 후 redis-cluster를 실행해 보았다.



$ cd /redis/utils/create-cluster 

$  ./create-cluster start

Starting 30001

Starting 30002

Starting 30003

Starting 30004

Starting 30005

Starting 30006


$  ./create-cluster create

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

127.0.0.1:30001

127.0.0.1:30002

127.0.0.1:30003

Adding replica 127.0.0.1:30004 to 127.0.0.1:30001

Adding replica 127.0.0.1:30005 to 127.0.0.1:30002

Adding replica 127.0.0.1:30006 to 127.0.0.1:30003

M: b3e66f40c1244f067f9d0fb384b6c75ac171cc6b 127.0.0.1:30001

   slots:0-5460 (5461 slots) master

M: 1f21f2256aab75b314735541c15f5ef13a1eac01 127.0.0.1:30002

   slots:5461-10922 (5462 slots) master

M: 904fa5f6b48b026eddfd4a05f314acc9653037a6 127.0.0.1:30003

   slots:10923-16383 (5461 slots) master

S: 5f76009149e4c5f61d3a7b7b6da7de6fd63f626d 127.0.0.1:30004

   replicates b3e66f40c1244f067f9d0fb384b6c75ac171cc6b

S: df5a45440f01b19a40859bd28c4735a32eb4f686 127.0.0.1:30005

   replicates 1f21f2256aab75b314735541c15f5ef13a1eac01

S: 4f2a7f567602ab7ee3a3f2d928f837c30eee7b13 127.0.0.1:30006

   replicates 904fa5f6b48b026eddfd4a05f314acc9653037a6

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join..

>>> Performing Cluster Check (using node 127.0.0.1:30001)

M: b3e66f40c1244f067f9d0fb384b6c75ac171cc6b 127.0.0.1:30001

   slots:0-5460 (5461 slots) master

M: 1f21f2256aab75b314735541c15f5ef13a1eac01 127.0.0.1:30002

   slots:5461-10922 (5462 slots) master

M: 904fa5f6b48b026eddfd4a05f314acc9653037a6 127.0.0.1:30003

   slots:10923-16383 (5461 slots) master

M: 5f76009149e4c5f61d3a7b7b6da7de6fd63f626d 127.0.0.1:30004

   slots: (0 slots) master

   replicates b3e66f40c1244f067f9d0fb384b6c75ac171cc6b

M: df5a45440f01b19a40859bd28c4735a32eb4f686 127.0.0.1:30005

   slots: (0 slots) master

   replicates 1f21f2256aab75b314735541c15f5ef13a1eac01

M: 4f2a7f567602ab7ee3a3f2d928f837c30eee7b13 127.0.0.1:30006

   slots: (0 slots) master

   replicates 904fa5f6b48b026eddfd4a05f314acc9653037a6

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.



$ redis-cli -c -h localhost -p 30001

localhost:30001> set hello world

OK

localhost:30001> set foo bar

-> Redirected to slot [12182] located at 127.0.0.1:30003

OK

127.0.0.1:30003> get foo

"bar"

127.0.0.1:30003> get hello

-> Redirected to slot [866] located at 127.0.0.1:30001

"world"

127.0.0.1:30001>



'Redis' 카테고리의 다른 글

[redis] BRPOP, BLPOP, BRPOPLPUSH  (0) 2016.03.02
[redis] 낙관적 잠금(optimistic lock)  (0) 2016.02.29
[redis] AOF (append-only-file)  (0) 2016.02.10
[redis] twemproxy 설치 / 예제  (0) 2016.02.10
[redis] RDB  (1) 2016.02.09
Posted by '김용환'
,


참조 : redis의 rdb 

http://knight76.tistory.com/entry/redis-RDB



AOF 사용으로 변경하면(appendonly yes), 레디스가 변경 커맨드를  받을 때마다, AOF 파일에 커맨드를 추가(append)한다. 레디스에서 AOF를 사용하는 것으로 변경한 후, 레디스를 재시작하면, 레디스는 AOF의 나열된 모든 커맨드를 순서대로 실행하여 복구할 수 있다. AOF는 RDB 스냅샷의 대안이다.


RDB 파일은 바이너리 파일인 반면, AOF는 읽을 수 있는 로그 파일이며, 손상이 발생하면 식별이 어려운 점이 있다. AOF 파일을 에디터로 쉽게 열어볼 수도 있고, 내부의 구조를 이해할 수 있다. 


redis.conf를 수정해서 appendonly yes로 변경하고, redis서버를 재시작한다.



$ redis-cli -p 6379 set a 1

OK

$ redis-cli -p 6379 set b 2

OK

$ redis-cli -p 6379 get a

"1"

$ redis-cli -p 6379 get b

"2"

$ cat appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

a

$1

1

*3

$3

set

$1

b

$1

2



redis에 손상된 AOF 파일을 확인하고 쉽게 고칠 수 있는 redis-check-aof라는 툴이 있다. 

$ ls -al src/redis-check-aof

redis-check-aof


appendonly.aof 파일에서 다음 라인을 수정하고 redis-check-aof 툴을 사용한다.


$ vi appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

a

$1

1

*3

$3

set

$1

b

$1 --> $로 수정

2



파일을 수정후 체크하면 다음과 같이 not valid가 뜬다.


$ ./src/redis-check-aof appendonly.aof

0x              49: Expected \r\n, got: 320d

AOF analyzed: size=76, ok_up_to=50, diff=26

AOF is not valid



수정을 하고 싶다면 다음과 같이 --fix 옵션을 추가한다.


$ ./src/redis-check-aof --fix appendonly.aof

0x              49: Expected \r\n, got: 320d

AOF analyzed: size=76, ok_up_to=50, diff=26

This will shrink the AOF from 76 bytes, with 26 bytes, to 50 bytes

Continue? [y/N]: y

Successfully truncated AOF




파일을 살펴보면, 문제가 된 커맨드는 aof 파일에서 삭제되었다.


$ cat appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

a

$1

1





redis-check-aof 툴의 단점은 성능이 떨어지고, 추가 디스크 공간이 필요하다.


AOF는 여러 옵션을 통해 자동으로 또는 BGREWRITEAOF 커맨드를 통해 수동으로 AOF의 좀 더 작은 버전으로 최적화될 수 있다. 다.


AOF 관련 설정이다.


  • appendonly: AOF를 사용(yes) 또는 사용 금지(no)를 설정한다. 디폴트는 no이다.
  • appendfilename: AOF 파일 이름이다.
  • appendfsync: 레디스는 주요 프로세스에서 fsync()를 수행하기 위해 백그라운드 쓰레드를 사용한다. 
    • no: fsync()를 실행하지 않는다.
    • always: 모든 쓰기 작업마다 fsync()를 실행한다. 
    • everysec: 매 초마다 fsync()를 실행한다.
  • no-appendfsync-on-rewrite: 사용 가능한 값은 yes와 no이다.  기본 값은 no이다. appendfsync 정책을 everysec 또는 always로 설정하고 백그라운드 저장 또는 AOF 로그를 저장하고 있는 상태에서, 레디스의 fsync() 시스템 호출이 길어진다면, 많은 디스크 I/O로 레디스가 블럭될 것이다
  • auto-aof-rewrite-percentage: 해당 옵션의 사용 가능한 값은 0에서 100까지의 값을 가진다. 기본 값은 100이다. AOF 크기가 명세한 퍼센트까지 도달하면, 암묵적으로 BGREWRITEAOF 커맨드를 실행하여, 자동으로 로그 파일을 rewrite한다. 
  • auto-aof-rewrite-min-size: 해당 옵션은 rewrite된 AOF의 최소 크기이다. 기본 값은 67,108,864 바이트이다. 명세한 auto-aof-rewrite-percentage 값을 초과하면, 명세한 최소 크기가 도달 할 때까지 AOF rewrite를 안하게 한다.
  • aof-load-truncated: 해당 옵션의 사용 가능한 값은 yes와 no이다. 크래쉬가 발생할 경우, AOF가 일부만 남을 수 있는데, 해당 옵션은 에러 시 시작 또는 종료시 레디스가 truncated AOF를 로드할 것인지 명세한다. 해당 옵션의 값이 yes이면, 레디스는 잘려진 파일(truncated file)을 로드하고 에러 메시지를 출력한다. 해당 옵션의 값이 no이면, 레디스는 에러로 종료할 것이고, 짤린 파일을 로드하지 않을 것이다.
  • dir: AOF(또는 RDB 파일)의 디렉토리 위치를 명세한다.



 

모든 커맨드를 실행해야 하는 AOF보다 RDB가 빠르다. 또한 레디스 설정에서 RDB와 AOF 둘 다 설정하면 AOF가 우선순위가 높다. 내구성을 완벽하게 지원해야 한다면, AOF와 RDB 둘 다 설정하는 것이 좋다. 



'Redis' 카테고리의 다른 글

[redis] 낙관적 잠금(optimistic lock)  (0) 2016.02.29
[redis] 3.0에 있는 redis cluster 실행해보기  (0) 2016.02.15
[redis] twemproxy 설치 / 예제  (0) 2016.02.10
[redis] RDB  (1) 2016.02.09
[펌] redis의 persistence에 대한 내용  (0) 2016.02.09
Posted by '김용환'
,

twemproxy(트웸프록시)에 대한 예시이다.

redis나 memcached 프로토콜을 지원하며, consistent hashing을 지원하는 툴로서, 많이 사용하고 있다. 



트웸프록시 tar 압축 파일을 다운받으려면, https://github.com/twitter/twemproxy에 방문하여 “To build twemproxy from distribution tarball”를 찾은 후, distribution tarball 링크를 클릭하면 tar 압축 파일을 구글 드라이브로 볼 수 있다. 구글 드라이브에서 다운받을 수 있는 tar 압축 파일을 다운받는다.


$ tar -zxf nutcracker-0.4.1.tar.gz

$ cd nutcracker-0.4.1

$ ./configure

$ make


트웸프록시의 binary인 nutcracker이 정상적으로 실행되는지 확인한다.


$ ./src/nutcracker --help

This is nutcracker-0.4.1


Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]

                  [-c conf file] [-s stats port] [-a stats addr]

                  [-i stats interval] [-p pid file] [-m mbuf size]


Options:

  -h, --help             : this help

  -V, --version          : show version and exit

  -t, --test-conf        : test configuration for syntax errors and exit

  -d, --daemonize        : run as a daemon

  -D, --describe-stats   : print stats description and exit

  -v, --verbose=N        : set logging level (default: 5, min: 0, max: 11)

  -o, --output=S         : set logging file (default: stderr)

  -c, --conf-file=S      : set configuration file (default: conf/nutcracker.yml)

  -s, --stats-port=N     : set stats monitoring port (default: 22222)

  -a, --stats-addr=S     : set stats monitoring ip (default: 0.0.0.0)

  -i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)

  -p, --pid-file=S       : set pid file (default: off)

  -m, --mbuf-size=N      : set size of mbuf chunk in bytes (default: 16384 bytes)



설정 파일은 conf/nutcracker.yml이고, 야믈(yaml) 파일이다.


$ cat conf/nutcracker.yml

alpha:

  listen: 127.0.0.1:22121

  hash: fnv1a_64

  distribution: ketama

  auto_eject_hosts: true

  redis: true

  server_retry_timeout: 2000

  server_failure_limit: 1

  servers:

   - 127.0.0.1:6379:1


beta:

  listen: 127.0.0.1:22122

  hash: fnv1a_64

  hash_tag: "{}"

  distribution: ketama

  auto_eject_hosts: false

  timeout: 400

  redis: true

  servers:

   - 127.0.0.1:6380:1 server1

   - 127.0.0.1:6381:1 server2

   - 127.0.0.1:6382:1 server3

   - 127.0.0.1:6383:1 server4


gamma:

  listen: 127.0.0.1:22123

  hash: fnv1a_64

  distribution: ketama

  timeout: 400

  backlog: 1024

  preconnect: true

  auto_eject_hosts: true

  server_retry_timeout: 2000

  server_failure_limit: 3

  servers:

   - 127.0.0.1:11212:1

   - 127.0.0.1:11213:1


delta:

  listen: 127.0.0.1:22124

  hash: fnv1a_64

  distribution: ketama

  timeout: 100

  auto_eject_hosts: true

  server_retry_timeout: 2000

  server_failure_limit: 1

  servers:

   - 127.0.0.1:11214:1

   - 127.0.0.1:11215:1

   - 127.0.0.1:11216:1

   - 127.0.0.1:11217:1

   - 127.0.0.1:11218:1

   - 127.0.0.1:11219:1

   - 127.0.0.1:11220:1

   - 127.0.0.1:11221:1

   - 127.0.0.1:11222:1

   - 127.0.0.1:11223:1


omega:

  listen: /tmp/gamma

  hash: hsieh

  distribution: ketama

  auto_eject_hosts: false

  servers:

   - 127.0.0.1:11214:100000

   - 127.0.0.1:11215:1


distribution: ketama는 consistent hashing을 쓰겠다는 의미이다.

설정은 alpha부터 omega까지 있다. 다중 레디스를 쓰는지에 대한 설정을 가진다. 분산방법, timeout 등 설정이 있다.


설정 파일이 정상인지 체크하려면 -t를 추가한다.


$ ./src/nutcracker -t -c conf/nutcracker.yml

nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok



만약 아래 에러가 발생해도 이슈는 없다. 디폴트로 22121 포트이다.

nc_connection.c:374 recv on sd 6 failed: Connection refused

nc_connection.c:374 recv on sd 7 failed: Connection refused


데몬으로 실행하려면 -d를 커맨드 라인에 추가한다.

그리고, pid 파일이나 로그 파일도 지정할 수 있다. 




이제, alpha 버전인 기준으로 6379 포트만 띄운 redis만 테스트해본다.



창 하나를 띄워 redis 데몬을 실행한다.

127.0.0.1:6379> monitor

OK



nutcracker의 22121 포트로 데이터를 보낸다.


$ redis-cli -p 22121 set key value

OK



이미 띄워놓은 MONITOR 창에서 정상적으로 결과를 확인한다.


1455010283.355070 [0 127.0.0.1:55737] "set" "key" "value"




다음은 redis 인스턴스를 여러 대를 잘 처리하는지 살펴본다.


레디스 서버를 3 개의 포트로 띄운다. flushdb로 깔끔히 데이터를 정리한다.


$ ./src/redis-server --port 6379 --daemonize yes

$ ./src/redis-server --port 6380 --daemonize yes

$ ./src/redis-server --port 6381 --daemonize yes



conf/nutcracker.yml 파일에서 alpha 설정 밑에 6380과 6381을 추가한 후 재시작한다.


$ vi conf/nutcracker.yml 

alpha:

  listen: 127.0.0.1:22121

  hash: fnv1a_64

  distribution: ketama

  auto_eject_hosts: true

  redis: true

  server_retry_timeout: 2000

  server_failure_limit: 1

  servers:

   - 127.0.0.1:6379:1

   - 127.0.0.1:6380:1

   - 127.0.0.1:6381:1

...
$ ./src/nutcracker  -c conf/nutcracker.yml



트웸프록시 설정이 제대로 되었는지 확인한다.

$ telnet 127.0.0.1 22222 2> /dev/null | tail -n 1 | jq '.'

{


  "alpha": {

    "client_eof": 0,

    "client_err": 0,

    "client_connections": 0,

    "server_ejects": 0,

    "forward_error": 0,

    "fragments": 0,

    "127.0.0.1:6379": {

      "server_eof": 0,

      "server_err": 0,

      "server_timedout": 0,

      "server_connections": 0,

      "server_ejected_at": 0,

      "requests": 0,

      "request_bytes": 0,

      "responses": 0,

      "response_bytes": 0,

      "in_queue": 0,

      "in_queue_bytes": 0,

      "out_queue": 0,

      "out_queue_bytes": 0

    },

    "127.0.0.1:6380": {

      "server_eof": 0,

      "server_err": 0,

      "server_timedout": 0,

      "server_connections": 0,

      "server_ejected_at": 0,

      "requests": 0,

      "request_bytes": 0,

      "responses": 0,

      "response_bytes": 0,

      "in_queue": 0,

      "in_queue_bytes": 0,

      "out_queue": 0,

      "out_queue_bytes": 0

    },

    "127.0.0.1:6381": {

      "server_eof": 0,

      "server_err": 0,

      "server_timedout": 0,

      "server_connections": 0,

      "server_ejected_at": 0,

      "requests": 0,

      "request_bytes": 0,

      "responses": 0,

      "response_bytes": 0,

      "in_queue": 0,

      "in_queue_bytes": 0,

      "out_queue": 0,

      "out_queue_bytes": 0

    }

  },





트웸프록시 포트로 데이터를 저장해본다.

$ redis-cli -p 22121 set key value

$ redis-cli -p 22121 set key1 value

$ redis-cli -p 22121 set key2 value

$ redis-cli -p 22121 set akey yvalue


결과는 다음과 같다.


6379 포트 위의 레디스


127.0.0.1:6379>

127.0.0.1:6379> keys *

(empty list or set)

127.0.0.1:6379> monitor

OK

1455030738.382162 [0 127.0.0.1:56016] "set" "akey" "yvalue"




6380 포트 위의 레디스


127.0.0.1:6380> keys *

(empty list or set)

127.0.0.1:6380> monitor

OK





6381 포트 위의 레디스


127.0.0.1:6381> keys *

(empty list or set)

127.0.0.1:6381> monitor

OK

1455030017.397192 [0 127.0.0.1:55987] "set" "key" "value"

1455030688.255451 [0 127.0.0.1:55987] "set" "key1" "value"

1455030690.631344 [0 127.0.0.1:55987] "set" "key2" "value"



제대로 읽기도 잘한다.

$ redis-cli -p 22121 get key2

"value"



트웸프록시를 통해 다양하게 저장한다.

트웸프록시가 SPOF 가 될 수 있으니, L4나 HA_PROXY를 이용해서 여러 대의 트웸프록시를 바인딩할 수 있다.



참고로, info 커맨드를 이용하면 연결이 종료된다.


$ redis-cli -p 22121 info

Error: Server closed the connection





twemproxy의 해싱 알고리즘은 다양하다. libmemcached가 사실상 consistent hashing의 대표적인 알고리즘이므로 crc32로 써도 무관하다.


hash: The name of the hash function. Possible values are:

  • one_at_a_time
  • md5
  • crc16
  • crc32 (crc32 implementation compatible with libmemcached)
  • crc32a (correct crc32 implementation as per the spec)
  • fnv1_64
  • fnv1a_64
  • fnv1_32
  • fnv1a_32
  • hsieh
  • murmur
  • jenkins


그리고, 배포방식은 3가지가 존재한다.


distribution: The key distribution mode. Possible values are:

  • ketama
  • modula
  • random



자세한 내용은 아래를 참조한다.

https://github.com/twitter/twemproxy

https://github.com/twitter/twemproxy/blob/master/notes/recommendation.md




'Redis' 카테고리의 다른 글

[redis] 3.0에 있는 redis cluster 실행해보기  (0) 2016.02.15
[redis] AOF (append-only-file)  (0) 2016.02.10
[redis] RDB  (1) 2016.02.09
[펌] redis의 persistence에 대한 내용  (0) 2016.02.09
[펌] stunnel과 redis 설정  (0) 2016.01.28
Posted by '김용환'
,

[redis] RDB

Redis 2016. 2. 9. 09:55



RDB는 특정 시점에 저장된 레디스 인스턴스 바이너리이다. RDB 파일의 내부 구조는 레디스 메모리(in-memory) 구조와 매우 비슷하다. RDB 압축 파일을 만들기 위해 LZF 압축을 사용할 수 있다. LZF 압축은 압축 시 아주 작은 메모리 요구사항을 가진 빠른 압축 알고리즘이다. 따라서, 레디스와 효율적으로 동작한다. 


특정 시간, 즉 매 시간, 매 일, 매 주, 매 달마다 RDB 파일을 저장할 수 있기 때문에, RDB의 백업과 복구를 할 수 있다. 


SAVE 커맨드는 RDB 파일을 즉시 생성하지만, 스냅샷(snapshot) 과정에서 레디스 서버를 블럭시키기 때문에 조심히 써야 한다. 대신 BGSAVE 커맨드(백그라운드 저장)를 사용해야 한다. BGSAVE 커맨드는 SAVE 커맨드의 기능과 동일하지만, 자식 프로세스로 실행하기 때문에 레디스를 블럭시키지 않는다.


백그라운드 저장 시 성능 저하를 피하기 위해 redis-server는  자식 프로세스(fork)를 생성한다. 그래서, redis-server 프로세스는 어떠한 디스크 I/O 작업을 수행하지 않는다. redis-server가 쓰기를 받고 있다면, 자식 프로세스는 변경된 메모리 페이지를 복사한다. 복사된 메모리로 인해 총 사용 메모리가 증가될 수 있다(레디스는 copy-on-write를 사용한다.)


http://knight76.tistory.com/entry/%ED%8E%8C-copy-on-write-%EB%B0%9C%EB%B2%88%EC%97%AD


기본 레디스 설정 파일은 레디스 소스 코드 디렉토리에 있으며, 백그라운드 저장을 수행하는 save 지시자를 통해 디스크에 데이터를 저장할 수 있는 3 가지 스냅샷 규칙을 가진다.


여전히 최신 버전인 3.0.2에서도 snashotting 설정은 다음과 같이 존재한다. 


################################ SNAPSHOTTING  ################################

#

# Save the DB on disk:

#

#   save <seconds> <changes>

#

#   Will save the DB if both the given number of seconds and the given

#   number of write operations against the DB occurred.

#

#   In the example below the behaviour will be to save:

#   after 900 sec (15 min) if at least 1 key changed

#   after 300 sec (5 min) if at least 10 keys changed

#   after 60 sec if at least 10000 keys changed

#

#   Note: you can disable saving completely by commenting out all "save" lines.

#

#   It is also possible to remove all the previously configured save

#   points by adding a save directive with a single empty string argument

#   like in the following example:

#

#   save ""


save 900 1

save 300 10

save 60 10000



# The filename where to dump the DB

dbfilename dump.rdb



첫 번째 초(second) 안에 쓰기 작업한 Y 개(amount)가 레디스 인스턴스에서 발생하면, .rdb 파일을 생성한다. 

- save  900 1 - 적어도 하나의 쓰기 작업이 실행되면, 매 900 초마다 디스크에 .rdb 파일에 저장한다.

save  300 10 - 적어도 10 개의 쓰기 작업이 실행되면, 매 300 초마다 디스크에 .rdb 파일을 저장한다.

- save 60 10000 0 적어도 10,000 개의 쓰기 작업이 실행되면, 매 60 초마다 디스크에 .rdb 파일을 저장한다.


스냅샷의 개별 실행 간격이 30 초 미만이 되지 않도록 하는 것을 save 지시자를 사용 할 것을 추천한다. 이 이유는 리눅스 디폴트 설정과 관련되어 있다.


http://knight76.tistory.com/entry/%ED%8E%8C-redis%EC%9D%98-persistence%EC%97%90-%EB%8C%80%ED%95%9C-%EB%82%B4%EC%9A%A9


RDB 파일 이름은 dbfilename 지시자 기반이며, 기본 설정은 dump.rdb이다.



스냅샷 설정을 하지 않으면 디스크에 전혀 저장하지 않는다는 것을 의미한다. 

하지만, 디폴트 설정이 스냅샷 설정(save)로 되어 있어서 RDB 저장을 한다. redis 클라이언트로 본 설정은 다음과 같다.


127.0.0.1:6379> config get save

1) "save"

2) "3600 1 300 100 60 10000"



스냅샷 설정을 하지 않으려면, redis.conf 파일에 모든 save 지시자를 삭제하거나 주석을 달고, 레디스 서버를 재시작해야 한다. 커맨드 라인 옵션 또는 CONFIG SET 커맨드로 스냅샷을 하지 않도록 설정할 수 있다.


127.0.0.1:6379> config set save ""
OK
127.0.0.1:6379> config get save
1) "save"
2) ""




주요 레디스 프로세스가 특정 이유로 멈추는 일이 발생하면, 데이터베이스에 최근에 작성된 데이터를 잃어버릴 수 있다. 즉 개런티를 하지 않는다.

http://oldblog.antirez.com/post/redis-persistence-demystified.html


RDB는 스냅샷을 생성하는 시간마다 레디스 주요 프로세스는 디스크에 데이터를 저장하기 위해 자식 프로세스를 생성하기 위해 fork()를 실행한다. 밀리세컨드(ms) 또는 몇 초(second) 동안 레디스 인스턴스가 서비스 중인 클라이언트를 멈추게 할 수 있다.


RDB 관련 지시자에 대한 설명이다.


- stop-writes-on-bgsave-error: 해당 옵션의 사용 가능한 값은 yes나 no이다. 마지막 백그라운드 저장이 실패되면, 해당 옵션은 레디스가 쓰기 작업을 받는 것에 대해 멈출 지 결정한다. 백그라운드 저장이 성공한 후에, 레디스는 다시 쓰기 작업을 받는다.

- rdbcompression: 해당 옵션의 사용 가능한 값은 yes나 no이다. 해당 옵션을 yes로 설정하면, 레디스는 .rdb 파일에 대해 LZF 압축을 사용한다. 기본 값은 yes이다.

- rdbchecksum: 해당 옵션의 사용 가능한 값은 yes나 no이다. yes라 설정하면 레디스는 .rdb 파일의 마지막에 체크섬(checksum)을 저장하고, .rdb 파일을 로딩하기 전에 체크섬을 수행한다. RDB 체크섬이 .rdb 파일에 저장된 체크섬과 일치하지 않으면, 레디스를 시작하지 않는다. 기본 값은 yes이다.

- dbfilename: 해당 옵션은 .rdb파일을 명세한다. 기본값은 dump.rdb이다.

- save : 해당 옵션은 초와 변경 수 기반으로 스냅샷 주기를 설정한다. 해당 옵션을 여러 번 명세할 수 있다. 여러 시간대를 명세할 수 있다. 기본 값은 ‘save 3600 1’, ‘save 300 100’, ‘save 60 10000’이다.

- dir :해당 옵션은 AOF와 RDB 파일의 디렉토리 위치를 명세한다.




Posted by '김용환'
,



레디스 저장(persistence)에 대한 설명은 redis 를 만든 antirez의 글을 보는 게 가장 좋은 것 같다.
출처 : http://oldblog.antirez.com/post/redis-persistence-demystified.html



처음에 OS와 디스크에 대한 설명을 진행하며, 메모리 데이터를 디스크에 저장하는 방식에서 놓칠 수 있는 부분을 설명한다. posix의 write, fsync에 대한 설명을 얘기한다. 파일 쓰기가 30초라는 부분을 설명한다. 


 For instance Linux by default will actually commit writes after 30 seconds. This means that if there is a failure, all the data written in the latest 30 seconds can get potentially lost. 


이 부분은 추후 AOF 스냅샷의 appendfsync 설명시 다시 나온다.

appendfsync no

In this configuration Redis does not perform fsync(2) calls at all. However it will make sure that clients not using pipelining, that is, clients that wait to receive the reply of a command before sending the next one, will receive an acknowledge that the command was executed correctly only after the change is transfered to the kernel by writing the command to the AOF file descriptor, using the write(2) system call.

Because in this configuration fsync(2) is not called at all, data will be committed to disk at kernel's wish, that is, every 30 seconds in most Linux systems.



디스크 저장시 발생할 수 있는 오류(data corruption)에 대한 데이터 복구에 대한 설명이 나온다. 

2.6부터 추가된 AOF에 대한 설명과 pipeline에 대한 설명이 있다. 


지금은 너무 평범하지만, 당시만 해도 관련 정보가 없어서 커뮤니티에서 이런 저런 얘기가 있었다.(댓글 만 봐도 당시 상황이 짐작된다)


antirez의 글을 통해 데이터베이스의 완벽성이 당연히 redis에 있지는 않지만, 노력했다는 것들을 좀 유추할 수 있었고, 간결함(simplicity)에 최선을 다한 느낌이 있어서 참 좋았다.






'Redis' 카테고리의 다른 글

[redis] twemproxy 설치 / 예제  (0) 2016.02.10
[redis] RDB  (1) 2016.02.09
[펌] stunnel과 redis 설정  (0) 2016.01.28
[redis] 커맨드 이름 변경하기 (rename-command)  (0) 2016.01.28
[redis] AUTH 커맨드  (0) 2016.01.28
Posted by '김용환'
,



http://bencane.com/2014/02/18/sending-redis-traffic-through-an-ssl-tunnel-with-stunnel/


https://redislabs.com/kb/read-more-ssl



'Redis' 카테고리의 다른 글

[redis] RDB  (1) 2016.02.09
[펌] redis의 persistence에 대한 내용  (0) 2016.02.09
[redis] 커맨드 이름 변경하기 (rename-command)  (0) 2016.01.28
[redis] AUTH 커맨드  (0) 2016.01.28
[펌] fork와 Redis 클라우드  (0) 2016.01.25
Posted by '김용환'
,


redis 명령어 중 상용환경에서 조심스럽게 처리해야 하는 명령어가 있다.


FLUSHDB/FLUSHDB,  KEYS, SAVE는 성능, CONFIG는 보안, 

DEBUG는 안정성(debug segfault)에 영향을 준다. 


해당 커맨드를 redis 클라이언트에서 다른 이름으로 변경(rename)한다면, 관리자 외에는 쓰지 못할 것이다.



redis.conf 파일에 다음을 추가하고, redis-server redis.conf로 실행한다.


rename-command FLUSHDB a1

rename-command FLUSHALL a2

rename-command KEYS a3

rename-command DEBUG a4

rename-command SAVE a5



redis-cli 테스트 결과는 다음과 같다. rename-command로 일부 커맨드가 실행되지 않도록 하였다. 

이름이 변경된 커맨드만 실행 가능하다.


127.0.0.1:6379> flushdb

(error) ERR unknown command 'flushdb'

127.0.0.1:6379> save

(error) ERR unknown command 'save'

127.0.0.1:6379> keys

(error) ERR unknown command 'keys'

127.0.0.1:6379> a1

OK




Posted by '김용환'
,

[redis] AUTH 커맨드

Redis 2016. 1. 28. 01:10



redis.conf에 requirepass 주석을 지우고, redis-server를 실행한다.


$ vi redis.conf

#requirepass foobared

requirepass foobared


수정한 레디스 설정파일로 실행한다.


$ redis-server redis.conf



redis-cli로 AUTH 커맨드를 실행해야 커맨드를 실행할 수 있다.


127.0.0.1:6379> set a 1

(error) NOAUTH Authentication required.

127.0.0.1:6379> AUTH foobared

OK

127.0.0.1:6379> set a 1

OK




Posted by '김용환'
,


Redis의 AOF와 RDB는 백업을 할 때, fork를 사용한다. 레디스에서 fork 사용시(with copy-on-write) 자식 프로세스가 새로 생성된다.  아마존 클라우드 장비의 fork 시간을 관련한 재미있는 자료가 있다. (Redis cloud의 장점을 설명한 글이지만, fork time이 얼마나 영향을 주는지 백업에 대한 테스트가 필요할 수 있다는 점에서 펌질했다.)


출처 : 

https://redislabs.com/blog/testing-fork-time-on-awsxen-infrastructure



Instance typeMemory limitMemory usedMemory usage (%)Fork time
m1.small1.7 GB1.22 GB71.76%0.76 sec
m1.large7.5 GB5.75 GB76.67%1.98 sec
m1.xlarge15 GB11.46 GB76.40%3.46 sec
m2.xlarge34 GB24.8 GB72.94%5.67 sec
cc1.4xlarge23. GB18.4 GB80.00%0.22 sec




Posted by '김용환'
,