원인

jemalloc 설치가 되지 않아 발생

 

해결

jemalloc 설치

  centOS 7.0 이하 : yum -y install jemalloc

  centOS 7.0 이상 : yum -y install epel-release

                               yum -y install varnish

jemalloc make

  redis 폴더의 deps로 이동

  make hiredis jemalloc linenoise lua

redis install

  redis 폴더의 src로 이동

  make & make install

MongoDB의 쓰기( UPDATE와 DELETE ) 오퍼레이션은 도큐먼트 단위의 원자성( Atomicity )만 제공한다.

하나의 쓰기 오퍼레이션으로 여러 도큐먼트를 변경하거나 삭제하더라도, MongoDB 서버는 내부적으로 하나의 트랜잭션으로 하나의 도큐먼트만 처리하는 방식으로 작동한다.

 

그래서 MongoDB 서버에서 일반적으로 쓰기 오퍼레이션으로 여러 도큐먼트를 변경하면, 오퍼레이션이 완료되기도 전에 먼저 변경된 데이터들은 다른 컨넥션에서 즉시 조회를 할 수 있게 된다.

 

 

만약 하나의 UPDATE나 DELETE 명령이 완료되기 전까지는 다른 커넥션에서 변경 내용을 확인하지 못하게 하려면, 격리된 UPDATE 또는 DELETE 또는 REMOVE 명령을 사용해야 한다.

 

다음 예제는 UPDATE와 REMOVE 명령을 사용하는 방법을 보여주고 있다.

UPDATE 명령과 REMOVE 명령 모두 업데이트 대상 도큐먼트를 검색하는 조건과 함께 "$isolated : 1" 옵션을 사용하면 된다.

mongo> db.users.remove( { score : { $lt : 50 }, $isolated : 1 } );

mongo> db.users.update(
      { score : { $gt : 90 }, $isolated : 1 }
    , { $set : { grade : "A" } }
    , { multi : true }
);

 

MongoDB 서버는 UPDATE나 REMOVE 명령에 $isolated 옵션을 사용하면, 데이터 변경 작업이 완료될 때까지 다른 컨넥션이 변경 중인 데이터를 조회할 수 없다.

 

즉 UPDATE나 REMOVE 명령이 10건의 도큐먼트를 변경해야 하는데, 작업 도중 에러가 발생하면 MongoDB 서버가 이미 처리된 도큐먼트에 대해서 롤백을 수행하거나 하지는 않는다.

 

$isolated 옵션은 정상적으로 처리될 때에만 필요한 격리 수준을 보장해 준다.

 

※ 주의

MongoDB의 $isolated 옵션은 꼭 필요한 경우에만 제한적으로 사용할 것을 권장한다. MongoDB 서버는 $isolated 옵션을 사용한 업데이트 명령의 격리 수준을 보장하기 위해서 업데이트 대상 컬렉션에 대해서 쓰기 잠금( Exclusive Lock )을 걸고 처리를 한다. 이는 MongoDB 엔진이 컬렉션 레벨의 잠금을 걸기 때문에 MMAPv1 스토리지 엔진뿐만 아니라 도큐먼트 레벨의 잠금을 지원하는 WiredTiger 스토리지 엔진에서도 동일하게 작동한다. 즉 $isolated 옵션을 설정한 UPDATE나 REMOVE 명령이 수행되는 동안에는 다른 컨넥션에서 어떤 쿼리나 데이터 변경 명령을 실행하지 못한다. 만약 읽고 쓰기가 빈번하게 실행되는 컬렉션에 대해서 $isolated 옵션을 설정한 UPDATE나 DELETE 명령이 실행되면 다른 컨넥션의 수많은 쿼리나 업데이트 명령들이 일시적으로 처리를 멈추게 되고, 응용 프로그램은 데이터베이스의 응답을 받지 못해서 더 많은 쓰레드나 컨넥션을 생성하면서 처리 불가 상태로 빠지게 될 가능성이 높다.

 

참고 : https://secretartbook.tistory.com/6

-- 모든 config 값 조회
-- 아래 리스트의 실제 설정 값은 생략하였고, 4.0.11 기준
127.0.0.1:6379> config get *
  1) "dbfilename"
  3) "requirepass"
  5) "masterauth"
  7) "cluster-announce-ip"
  9) "unixsocket"
 11) "logfile"
 13) "pidfile"
 15) "slave-announce-ip"
 17) "maxmemory"
 19) "proto-max-bulk-len"
 21) "client-query-buffer-limit"
 23) "maxmemory-samples"
 25) "lfu-log-factor"
 27) "lfu-decay-time"
 29) "timeout"
 31) "active-defrag-threshold-lower"
 33) "active-defrag-threshold-upper"
 35) "active-defrag-ignore-bytes"
 37) "active-defrag-cycle-min"
 39) "active-defrag-cycle-max"
 41) "auto-aof-rewrite-percentage"
 43) "auto-aof-rewrite-min-size"
 45) "hash-max-ziplist-entries"
 47) "hash-max-ziplist-value"
 49) "list-max-ziplist-size"
 51) "list-compress-depth"
 53) "set-max-intset-entries"
 55) "zset-max-ziplist-entries"
 57) "zset-max-ziplist-value"
 59) "hll-sparse-max-bytes"
 61) "lua-time-limit"
 63) "slowlog-log-slower-than"
 65) "latency-monitor-threshold"
 67) "slowlog-max-len"
 69) "port"
 71) "cluster-announce-port"
 73) "cluster-announce-bus-port"
 75) "tcp-backlog"
 77) "databases"
 79) "repl-ping-slave-period"
 81) "repl-timeout"
 83) "repl-backlog-size"
 85) "repl-backlog-ttl"
 87) "maxclients"
 89) "watchdog-period"
 91) "slave-priority"
 93) "slave-announce-port"
 95) "min-slaves-to-write"
 97) "min-slaves-max-lag"
 99) "hz"
101) "cluster-node-timeout"
103) "cluster-migration-barrier"
105) "cluster-slave-validity-factor"
107) "repl-diskless-sync-delay"
109) "tcp-keepalive"
111) "cluster-require-full-coverage"
113) "cluster-slave-no-failover"
115) "no-appendfsync-on-rewrite"
117) "slave-serve-stale-data"
119) "slave-read-only"
121) "stop-writes-on-bgsave-error"
123) "daemonize"
125) "rdbcompression"
127) "rdbchecksum"
129) "activerehashing"
131) "activedefrag"
133) "protected-mode"
135) "repl-disable-tcp-nodelay"
137) "repl-diskless-sync"
139) "aof-rewrite-incremental-fsync"
141) "aof-load-truncated"
143) "aof-use-rdb-preamble"
145) "lazyfree-lazy-eviction"
147) "lazyfree-lazy-expire"
149) "lazyfree-lazy-server-del"
151) "slave-lazy-flush"
153) "maxmemory-policy"
155) "loglevel"
157) "supervised"
159) "appendfsync"
161) "syslog-facility"
163) "appendonly"
165) "dir"
167) "save"
169) "client-output-buffer-limit"
171) "unixsocketperm"
173) "slaveof"
175) "notify-keyspace-events"
177) "bind"

-- maxmemory 설정을 조회
127.0.0.1:6379> config get maxmemory

-- maxmemory를 4G로 설정
127.0.0.1:6379> config set maxmemory 4G

-- config set으로 설정한 정보를 conf 파일에 작성
127.0.0.1:6379> config rewrite

참고자료

https://redis.io/commands/config-get

 

CONFIG GET – Redis

The CONFIG GET command is used to read the configuration parameters of a running Redis server. Not all the configuration parameters are supported in Redis 2.4, while Redis 2.6 can read the whole configuration of a server using this command. The symmetric c

redis.io

http://redisgate.kr/redis/server/config_get.php

 

CONFIG GET Redis

config_get CONFIG GET 레디스 서버 구성 정보 조회 실행중인 서버에서 구성 정보를 조회한다. 버전 2.6 부터 거의 모든 파라미터를 조회할 수 있다. 구성정보 또는 파라미터는 redis.conf 파일에 지정된

redisgate.kr


to Top