Redis Start Redis Server 레디스 시작하기

<< Download & Install Redis Server Architecture Overview >>

시작하기

redis-server 시작하기

    $ src/redis-server  redis.conf
    Redis 5.0.0 (00000000/0) 64 bit

    Running in standalone mode
    Port: 6379
    PID: 3461

          http://redis.io
    3461:M 02 Jan 13:58:59.582 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    3461:M 02 Jan 13:58:59.582 # Server started, Redis version 4.0.6
    3461:M 02 Jan 13:58:59.582 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    3461:M 02 Jan 13:58:59.582 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
    3461:M 02 Jan 13:58:59.582 * The server is now ready to accept connections on port 6379
  • 몇 개 경고 메시지가 나오긴 했지만 잘 실행됐다.
  • 레디스 서버 시작 시 경고 메시지 없애는 방법
  • 레디스 서버 메시지 로그 파일로 보내기
  • 레디스 서버 백그라운드로 시작하기

redis-cli 시작하기

  • 레디스 클라이언트를 시작해서, 간단한 저장과 조회를 실행해 보자.

redis-server 중지하기

  • 레디스 클라이언트에서 shutdown을 입력한다.
  • 레디스 서버에서는 다음과 같은 메시지가 나온다.

레디스 서버 시작 시 경고 메시지 없애는 방법

리눅스 버전 확인하기

[root]# cat /etc/*-release
[root]# grep . /etc/*-release
[root]# uname -a

경고 메시지는 리눅스 버전에 따라 약간 다를 수 있습니다.

TCP backlog

3461:M 02 Jan 13:58:59.582 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

TCP backlog는 레디스 서버의 초당 클라이언트 연결 개수입니다.   레디스 서버에서는 511을 설정했는데, 리눅스 설정은 128로 되어 있으니 리눅스 설정 값을 증가시키라는 메시지입니다.   TCP backlog 즉, somaxconn은 네크워크 관련 커널 파라미터로서 listen()으로 바인딩 된 서버 소켓에서 accept()를 기다리는 소켓 개수(queue)입니다.   TCP/IP 통신 Listen(), Accept() 관련 설명은 여기를 보세요.

Somaxconn 확인과 설정 (root user)

[root]# sysctl -a |grep somaxconn
net.core.somaxconn = 128
[root]# sysctl -w net.core.somaxconn=65535       설정  
net.core.somaxconn = 65535
[root]# cat /proc/sys/net/core/somaxconn       확인  
65535

리부팅 후에도 변경한 값이 적용될 수 있도록 sysctl.conf 파일을 수정한다.

[root]# vi /etc/sysctl.conf
net.core.somaxconn = 65535

Somaxconn은 hard limit로 크게 설정해도 메모리를 사용하지 않습니다.   실제 메모리 사용량은 레디스 서버에서 설정한 TCP backlog 값 511입니다.   참고로 아파치 웹 서버의 backlog 기본값도 511입니다.   리눅스 서버 TCP 네트워크 성능 관련 커널 파라미터는 여기를 참조하세요.
레디스 클라이언트에 관한 정보는 INFO clients CLIENT list 명령을 실행해서 볼 수 있습니다.

Overcommit_memory

3461:M 02 Jan 13:58:59.582 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.   To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

Overcommit_memory는 가상 메모리 사용 관련 커널 파라미터입니다.   아래와 같이 세 개의 값이 있습니다. 레디스 서버는 메모리 데이터베이스이기 때문에 1로 설정할 것으로 권장합니다.
참고 자료: Overcommit 설명

0 - Heuristic overcommit handling.
1 - Always overcommit.
2 - Don't overcommit.

Overcommit_memory 확인과 설정 (root user)

[root]# sysctl -a |grep overcommit_memory
vm.overcommit_memory = 0
[root]# sysctl -w vm.overcommit_memory=1       설정  
vm.overcommit_memory = 1
[root]# cat /proc/sys/vm/overcommit_memory       확인  
1

리부팅 후에도 변경한 값이 적용될 수 있도록 sysctl.conf 파일을 수정한다.

[root]# vi /etc/sysctl.conf
vm.overcommit_memory = 1

Transparent Huge Pages (THP)

3461:M 02 Jan 13:58:59.582 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

리눅스에서는 대량 메모리를 할당하기 위해서 거대 페이지(huge page)를 사용합니다. Huge pages는 부팅 시 할당해야 합니다. 리눅스에서는 이를 효과적으로 관리하기 위해서 Transparent Huge Pages (THP)를 도입했습니다.   THP는 huge pages의 생성, 관리, 사용의 대부분을 자동화하는 추상화 계층입니다. 그런데 메모리를 많이 사용하는 서버 소프트웨어에서는 성능을 저하시키는 요인이 되기도 합니다.

레디스에서는 필요에 따라 자식 프로세스를 생성해서 데이터를 디스크에 저장하는데 이때 메모리 페이지 복제가 발생하면, Hage pages는 메모리를 많이 사용하는 요인이 되고, 성능을 느리게 만듭니다.   그래서 THP를 사용하지 않게(disable) 설정합니다.

THP (Transparent Huge Pages) 확인과 설정 (root user)

[root]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

리부팅 후에도 변경한 값이 적용될 수 있도록 이 명령을 /etc/rc.local 파일에 넣는다.

[root]# vi /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled

CentOS 7에서는 부팅 시 rc.local이 자동 실행되지 않는다. 아래와 같이 설정해야 한다.

[root]# chmod u+x /etc/rc.d/rc.local
[root]# systemctl start rc-local       여기서는 rc.local이 아니고 rc-local이다.  

자 이제 레디스 서버를 다시 시작해 보면 경고 메시지가 없는 깔끔한 화면이 나온다.   서버 리부팅은 하나만 더 변경하고 하자.

Max number of open files

클라이언트 개수가 많아지거나 레디스 서버를 여러 개 띄우다 보면 다음과 같은 메시지를 만난다.

# You requested maxclients of 10000 requiring at least 10032 max file descriptors.
# Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
# Current maximum open files is 1024. maxclients has been reduced to 992 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

이 메시지는 레디스 로고 위에 나타난다.   메시지 내용은 "레디스(redis.conf)에서 maxclients 10000으로 설정되어 있으므로 최대 오픈 파일 개수는 적어도 10032 여야 되므로 레디스 서버는 10032로 설정해야 하는데 OS(리눅스) 제한으로 설정할 수 없다. 리눅스의 최대 오픈 파일 개수(현재 설정값)는 1024이므로 maxclients를 992로 줄이거나, 'ulimit -n' 명령으로 리눅스 설정을 변경해야 한다."는 것이다.
리눅스에서 파일의 의미는 실제 파일은 물론이고 네트워크/소켓 접속도 파일로 취급한다. 설정값 변경은 레디스의 maxclients 값을 줄이는 방법과 리눅스의 max open files(nofile)을 변경하는 방법이 있다. 이 두가지를 다 하도록 한다.
먼저 redis.conf의 maxclients 10000을 예상 클라이언트 수에 맞게 적절히 조정한다. 참고로 레디스 버전 2.4까지는 128이였고, 2.6부터 10000으로 증가되었다.

maxclients 1128

다음은 리눅스의 현재 설정값을 확인한다.

[root]# ulimit -n
1024

65536으로 변경한다.

[root]# ulimit -n 65536

참고로 시스템 최대 설정값은 이렇게 확인한다.

[root]# cat /proc/sys/fs/file-max
384024

현재 운영중인 레디스 서버에 적용된 값을 확인하고 재시작하지 않고 변경하려면 다음과 같이 한다.

[root]# prlimit --pid <pid> --nofile
RESOURCE DESCRIPTION SOFT HARD UNITS
NOFILE max number of open files 1024 1024
[root]# prlimit --pid <pid> --nofile=65536

리부팅 후에도 변경한 값이 적용될 수 있도록 '/etc/security/limits.conf' 파일에 다음 내용을 입력한다.   처음 컬럼은 User를 나타낸다. 레디스를 실행하는 User가 redis이면 redis를 입력하고 root면 root를 입력한다.   *를 입력하면 모든 User에게 적용된다.   꼭 필요한 것은 아니지만 리부팅 후에도 잘 적용되는 확인하기 위해서 서버를 리부팅한다.

[root]# vi /etc/security/limits.conf
redis soft nofile 65536
redis hard nofile 65536

Max number of processes

레디스 서버는 여러 개 프로세스를 사용하지 않으므로 이 값은 특별히 신경쓰지 않아도 된다.   하지만 나중에 발생할 수도 있는 문제에 대비하기 위해서 알아보자.
레디스 서버는 평상시에는 1개 프로세스로 운영되고 자식 프로세스가 필요할 때는 부모 프로세스 포함해서 최대 2개의 프로세스가 동시에 뜬다. 그런데 여기서 process는 쓰레드(thread)까지 포함해서 계산한다. 리눅스에서는 쓰레드를 Light Weight Process라고 한다. 레디스 서버는 메인 쓰레드를 포함해서 4개 쓰레드로 운영된다.
먼저 현재 설정값을 확인한다.

[root]# ulimit -u
1024

4096으로 변경한다.

[root]# ulimit -u 4096

시스템 최대 설정값은 확인

[root]# cat /proc/sys/kernel/pid_max
32768

현재 운영중인 레디스 서버에 적용된 값을 확인하고 재시작하지 않고 변경하려면 다음과 같이 한다.

[root]# prlimit --pid <pid> --nproc
RESOURCE DESCRIPTION SOFT HARD UNITS
NPROC max number of processes 1024 31681
[root]# prlimit --pid <pid> --nproc=4096

리부팅 후에도 변경한 값이 적용될 수 있도록 '/etc/security/limits.conf' 파일에 다음 내용을 입력한다.

[root]# vi /etc/security/limits.conf
redis soft nproc 4096
redis hard nproc 4096

레디스 서버 메시지를 로그 파일로 보내기

  • redis.conf 에서 logfile 에 파일명을 입력한다.
  • logfile redis.log
  • 로그 파일의 위치를 지정하기 위해서 working directory를 지정하는 것이 좋다.
  • dir /redis/log/
  • 이제 레디스 서버를 시작하면 메시지가 화면에 나오지 않고 log 파일에 기록된다.
  • log 파일 내용을 실시간으로 보고 싶으면 tail -f redis.log 를 사용한다.

레디스 서버 백그라운드로 시작하기

  • 레디스 서버를 그냥 시작하면 시작한 터미널에서 Ctrl+C를 입력하면 레디스 서버가 죽는다. 이런 일이 일어나는 것을 방지하기 위해서 백그라운드로 실행하기 권장한다.   redis.conf 파일에 daemonize yes로 설정한다. 이 경우 위에서 설명한 logfile을 꼭 지정하기 바랍니다.   지정하지 않으면 서버 로그가 날아간다.

레디스 서버 시작 명령을 alias 지정하자

  • 레디스 서버를 여러 대 운영하려면 각각 시작시 redis.conf 파일을 지정해야 한다. 이를 좀 간단히 하기 위해서 .bashrc 파일에 alias를 지정하자. 레디스 클라이언트도 alias로 지정하자.
  • alias rs='/redis-4.0.6/src/redis-server /redis-4.0.6/redis.conf'
    alias rc='/redis-4.0.6/src/redis-cli -p 6379'
  • source .bashrc 로 적용하자. 이제 간단히 rs 명령으로 레디스 서버를 실행하고, rc로 레디스 클라이언드를 실행할 수 있다.

보안 관련 파라미터

  • BIND: 클라이언트가 접속할 서버의 IP를 입력한다.
  • PROTECTED-MODE: 보안 접속 여부(yes/no)를 설정한다.

레디스 서버 로그 간단한 설명

3461:M 02 Jan 13:58:59.582 # Server started, Redis version 4.0.6
  • 3461: Process id
  • M: 레디스 서버 프로세스의 역할을 나타낸다. 역할(role)이 마스터(Master)이다.
  • S: 역할이 슬레이브(Slave)이다. 슬레이브는 마스터의 실시간 백업 서버(Real-Time Backup Server)이다.   마스터/슬레이브의 역할은 운영 중 변경할 수 있다.
  • C: 레디스 서버 프로세스에서 RDB 파일 생성 시 또는 AOF Rewrite 시 자식 프로세스를 생성하는데 이 프로세스를 C로 표시한다.
  • X: 센티널은 X로 표시된다.

Child Process 확인

  • Child Process가 실행 중 일 때 ps 명령으로 확인할 수 있다.
  • 구분은 CMD와 NLWP개수(1개)로 확인할 수 있다. CMD에 세 가지가 표시된다.
    • redis-aof-rewrite
    • redis-rdb-bgsave
    • redis-rdb-to-slaves: replication 용으로 RDB 파일을 생성할 때



<< Download & Install Redis Server Start Redis Server Architecture Overview >>

질문하거나 댓글을 보려면 클릭하세요.  댓글수 :    조회수 :

Email 답글이 올라오면 이메일로 알려드리겠습니다.