Redis Start Redis Server 레디스 시작하기

Redis Server Course Redis Technical Support Redis Enterprise Server

시작하기

redis-server 시작하기

$ src/redis-server  redis.conf
Redis 5.0.5 (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 5.0.0
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=4096       설정  
net.core.somaxconn = 4096
[root]# cat /proc/sys/net/core/somaxconn       확인  
4096

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

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

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

tcp_max_syn_backlog 설정

[root]# sysctl -a |grep tcp_max_syn_backlog
net.core.somaxconn = 256
[root]# sysctl -w net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.tcp_max_syn_backlog = 4096
[root]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
4096
[root]# vi /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 4096

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): CentOS 7/8

[root]# vi /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never"
[root]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
...
done

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

[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 2019 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 파일을 생성할 때
  • 쓰레드 확인

부팅 시 레디스 서버가 자동 시작할 수 있도록 등록하기

스크립트 파일 준비

CentOS 7을 기준으로 작성하였습니다.
/redis/redis-6.0.9 디렉토리에 설치되어 있다고 가정합니다.
스크립트 파일 선두에 #!/bin/sh - 가 반드시 포함되어야 합니다.

redis-start.sh

[root]# vi /redis/redis-start.sh
#!/bin/sh -
/redis/redis-6.0.9/src/redis-server /redis/redis-6.0.9/redis.conf

redis-stop.sh

[root]# vi /redis/redis-stop.sh
#!/bin/sh -
/redis/redis-6.0.9/src/redis-cli -p 6379 shutdown

작성한 스크립트를 실행할 수 있도록 모드 변경

[root]# chmod +x /redis/redis*.sh

서비스 파일 등록

아래 디렉토리에 서비스 파일을 작성합니다.
CentOS 7/8: /usr/lib/systemd/system
Ubuntu 18: /usr/systemd/system

[root]# vi /usr/lib/systemd/system/redis.service
# Systemd unit file for Redis-Server

[Unit]
Description=Redis Enterprise Server
Wants=network-online.target
After=syslog.target network.target network-online.target

[Service]
User=redis
Type=forking
ExecStartPre=/bin/sleep 10
ExecStart=/app/redis/start.sh
ExecStop=/app/redis/stop.sh
WorkingDirectory=/app/redis

[Install]
WantedBy=multi-user.target

부팅 시 레디스 서버가 시작할 수 있도록 활성화합니다.

[root]# systemctl enable redis.service

리부팅합니다.

[root]# reboot

부팅 후 레디스 서버가 잘 시작했는지 확인합니다.

[root]# systemctl status redis

다음은 간단한 systemctl 명령입니다.

  • systemctl option [service]
  • systemctl daemon-reload 설정 변경 반영
  • systemctl start/stop redis 레디스 서버 시작/중지
  • systemctl enable/disable redis 부팅 시 레디스 서버 시작 활성화/비활성화
  • systemctl status redis 레디스 서버 상태 보기
서비스 명에서 '.service'는 생략할 수 있습니다.

서버 로그

자동 재시작을 설정하고 systemctl start redis로 시작하면 아래와 같은 로그가 나옵니다.
# Increased maximum number of open files to 10032 (it was originally set to 1024).
열린 파일의 최대 수를 10032개로 늘렸습니다(원래 1024로 설정됨).
  • systemctl을 사용했을 때의 특성으로 보입니다.
  • ulimit -n 이 65536으로 되어 있어도 나옵니다.
  • 알림 정보이므로 별도의 조치를 취할 필요가 없습니다.

커널 값 변경

TCP backlog: somaxconn, tcp_max_syn_backlog, netdev_max_backlog

  • TCP backlog는 레디스 서버의 클라이언트 연결 큐(queue) 개수입니다.
  • 레디스 서버에서는 511을 설정했는데, 리눅스 설정은 128로 되어 있으니 리눅스 설정 값을 증가시키라는 메시지입니다.
  • 해당 리눅스 파라미터: somaxconn은 네크워크 관련 커널 파라미터로서 listen()으로 바인딩 된 서버 소켓에서 accept()를 기다리는 소켓 개수(queue)입니다.
  • tcp backlog와 somaxconn 중 작은 값을 적용
  • 리눅스 내부적으로 (511+1) 2의 제곱수 -> 512
tcpip flow
  TCP/IP 통신 함수 사용 순서

Somaxconn

  • default: 128 (CentOS 7/8)
  • 범위: 1024 이상
  • 권장 값: 8192
  • net.core.somaxconn=8192

tcp_max_syn_backlog

  • default: 2048 (CentOS 7/8)
  • 범위: 2048 이상
  • 권장 값: 8192
  • net.ipv4.tcp_max_syn_backlog=8192

netdev_max_backlog

  • 네트워크 장치 별 queue의 크기
  • NIC(network interface card): 1Gbps NIC가 여러 개 이거나 10Gbps NIC를 사용하면 default 1000이 충분하지 않을 수 있으니 늘려주세요.
  • default: 1000 (CentOS 7/8)
  • 범위: 2048 이상
  • 권장 값: 32768
  • net.core.netdev_max_backlog=32768

/etc/sysctl.conf

net.core.somaxconn=8192
net.ipv4.tcp_max_syn_backlog=8192
net.core.netdev_max_backlog=32768

Transparent Huge Pages (THP)

  • THP는 기존 4KB 크기의 페이지 대신 2MB 크기의 페이지를 동적으로 할당하여 사용하는 기능이며 RHEL 6 이후 기본으로 활성화 되어있습니다.
  • THP는 huge pages의 생성, 관리, 사용의 대부분을 자동화하는 추상화 계층입니다.
  • 2mb = 4kb * 500
  • 예) 오라클 SGA 10Gb 할당: 4kb * 2,500,000 = 10Gb
    2mb * 5,000 = 10Gb
    10Gb 할당 후 오라클은 내부적으로 8kb 단위로 사용한다.
  • 레디스는 필요할 때마다 작은 단위로 메모리 할당 요청(malloc)
  • 원래 THP 기능의 의도와는 달리 오히려 시스템 성능이 저하되는 경우가 많아 이 옵션을 disable 시키는 것을 권장합니다.
  • THP는 커널 설정과 tuned 설정에 의해 활성화되므로 이 2 가지를 모두 비활성화 시킬 필요가 있습니다.
  • 커널 설정 변경
    [root]# vi /etc/default/grub
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never"
    [root]# grub2-mkconfig -o /boot/grub2/grub.cfg
    Generating grub configuration file ...
    ...
    done
  • Tuned 설정 변경
    [root]# tuned-adm active -> Current active profile: virtual-guest
    [root]# mkdir /etc/tuned/thpnever -> 임의 디렉토리명 지정
    [root]# vi /etc/tuned/thpnever/tuned.conf
    [main]
    include=virtual-guest
    [vm]
    transparent_hugepages=never
    [root]# chmod +x /etc/tuned/thpnever/tuned.conf
    [root]# tuned-adm profile thpnever
  • 확인
    # reboot
    # cat /proc/cmdline
    BOOT_IMAGE=/vmlinuz-3.10.0-957.5.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never
    # grep Huge /proc/meminfo
    AnonHugePages: 0 kB
    HugePages_Total: 0
    HugePages_Free: 0
    HugePages_Rsvd: 0
    HugePages_Surp: 0
    Hugepagesize: 2048 kB

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

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

혹시 처음이세요?
레디스게이트에는 레디스에 대한 많은 정보가 있습니다.
레디스 소개, 명령어, SQL, 클라이언트, 서버, 센티널, 클러스터 등이 있습니다.
혹시 필요한 정보를 찾기 어려우시면 redisgate@gmail.com로 메일 주세요.
제가 찾아서 알려드리겠습니다.
 
close
IP를 기반으로 보여집니다.