리눅스

[draft] 우분투 24.04에서 Redis Cluster를 구성하는 방법

변군Dev 2025. 8. 31. 21:34
728x90

우분투 24.04에서 Redis Cluster를 구성하는 방법

구성 환경

서버 이름 아이피 주소 구분 비고
node1 192.168.10.101 redis-server Redis Port 6381, 6382, 6383
node2 192.168.10.102 redis-server Redis Port 6381, 6382, 6383

1. 필요 패키지 설치

sudo apt update
sudo apt install -y curl gnupg lsb-release

2. 커널/시스템 튜닝

Swap 비활성화

  • Redis는 메모리 기반 DB라 swap이 발생하면 지연이 심해집니다.
sudo swapoff -a

Overcommit Memory

  • Redis는 fork()로 RDB/AOF 스냅샷을 뜨는데, Linux 기본 overcommit_memory=0이면 fork 실패 가능성이 있습니다.
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Transparent Huge Pages (THP) 비활성화

  • THP는 큰 페이지 메모리 할당 시 성능에 도움을 주지만, Redis에서는 성능 저하/지연을 유발합니다.
cat /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local

파일 디스크립터 제한

cat <<EOF | sudo tee -a /etc/security/limits.conf

*       soft    nproc   unlimited
*       hard    nproc   unlimited
*       soft    nofile  65536
*       hard    nofile  65536
EOF

TCP 커널 파라미터

  • 네트워크 튜닝으로 동시 연결 안정성 강화
cat <<EOF | sudo tee -a /etc/sysctl.conf

# Redis kernel tuning
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=15
EOF
sudo sysctl -p

3-1. Redis Server 설치

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install -y redis-server
redis-server --version
Redis server v=8.2.1 sha=00000000:1 malloc=jemalloc-5.3.0 bits=64 build=a29002d62758b90f
sudo systemctl disable --now redis-server

3-2. Redis Server 설정

설정 디렉토리

sudo cp /etc/redis/redis.conf /etc/redis/redis-6381.conf
sudo cp /etc/redis/redis.conf /etc/redis/redis-6382.conf
sudo cp /etc/redis/redis.conf /etc/redis/redis-6383.conf

6381 포트 설정

sudo sed -i -e 's@^port .*@port 6381@' /etc/redis/redis-6381.conf
sudo sed -i -e 's@^dbfilename .*@dbfilename dump-6381.rdb@' /etc/redis/redis-6381.conf
sudo sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-6381.log@' /etc/redis/redis-6381.conf
sudo sed -i -e 's@^pidfile .*@pidfile /run/redis-6381/redis-server.pid@' /etc/redis/redis-6381.conf

6382 포트 설정

sudo sed -i -e 's@^port .*@port 6382@' /etc/redis/redis-6382.conf
sudo sed -i -e 's@^dbfilename .*@dbfilename dump-6382.rdb@' /etc/redis/redis-6382.conf
sudo sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-6382.log@' /etc/redis/redis-6382.conf
sudo sed -i -e 's@^pidfile .*@pidfile /run/redis-6382/redis-server.pid@' /etc/redis/redis-6382.conf

6383 포트 설정

sudo sed -i -e 's@^port .*@port 6383@' /etc/redis/redis-6383.conf
sudo sed -i -e 's@^dbfilename .*@dbfilename dump-6383.rdb@' /etc/redis/redis-6383.conf
sudo sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-6383.log@' /etc/redis/redis-6383.conf
sudo sed -i -e 's@^pidfile .*@pidfile /run/redis-6383/redis-server.pid@' /etc/redis/redis-6383.conf

3-3. Redis Server 서비스 등록(systemd)

템플릿 서비스 파일 생성

더보기

---

cat /usr/lib/systemd/system/redis-server@.service
# Templated service file for redis-server(1)
#
# Each instance of redis-server requires its own configuration file:
#
#   $ cp /etc/redis/redis.conf /etc/redis/redis-myname.conf
#   $ chown redis:redis /etc/redis/redis-myname.conf
#
# Ensure each instance is using their own database:
#
#   $ sed -i -e 's@^dbfilename .*@dbfilename dump-myname.rdb@' /etc/redis/redis-myname.conf
#
# We then listen exlusively on UNIX sockets to avoid TCP port collisions:
#
#   $ sed -i -e 's@^port .*@port 0@' /etc/redis/redis-myname.conf
#   $ sed -i -e 's@^\(# \)\{0,1\}unixsocket .*@unixsocket /run/redis-myname/redis-server.sock@' /etc/redis/redis-myname.conf
#
# ... and ensure we are logging, etc. in a unique location:
#
#   $ sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-myname.log@' /etc/redis/redis-myname.conf
#   $ sed -i -e 's@^pidfile .*@pidfile /run/redis-myname/redis-server.pid@' /etc/redis/redis-myname.conf
#
# We can then start the service as follows, validating we are using our own
# configuration:
#
#   $ systemctl start redis-server@myname.service
#   $ redis-cli -s /run/redis-myname/redis-server.sock info | grep config_file
#
#  -- Chris Lamb <lamby@debian.org>  Mon, 09 Oct 2017 22:17:24 +0100
[Unit]
Description=Advanced key-value store (%I)
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)

[Service]
Type=notify
ExecStart=/usr/bin/redis-server /etc/redis/redis-%i.conf
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis-%i
RuntimeDirectoryMode=2755

UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/run/redis-%i

NoNewPrivileges=true
CapabilityBoundingSet=CAP_SYS_RESOURCE
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true

# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target

---

서비스 등록 및 실행

Redis Server 서비스 시작

sudo systemctl daemon-reload

인스턴스 실행

sudo systemctl status redis-server@6381.service
sudo systemctl status redis-server@6382.service
sudo systemctl status redis-server@6383.service

인스턴스 상태 확인

sudo systemctl status redis-server@6381.service
sudo systemctl status redis-server@6382.service
sudo systemctl status redis-server@6383.service
redis-cli -p 6381 info | grep config_file
redis-cli -p 6382 info | grep config_file
redis-cli -p 6383 info | grep config_file
sudo -u redis /usr/bin/redis-server /etc/redis/redis-6381.conf --loglevel debug
redis-cli -s /run/redis/6381/redis-server.sock info | grep config_file
sudo netstat -tulnp | grep -E '6381|6382|16381|16382'
728x90

4-1. Redis Cluster 생성

더보기

---

redis-cli 설치

sudo apt install -y redis-tools

---

클러스터 생성

export REDISCLI_AUTH=user_redis_password
redis-cli -p 6381 ping
redis-cli --cluster create \
192.168.50.101:6381 \
192.168.50.101:6382 \
192.168.50.101:6381 \
192.168.50.102:6382 \
192.168.50.102:6381 \
192.168.50.102:6382 \
--cluster-replicas 1
  • --cluster-replicas 1 : 각 마스터당 1개의 슬레이브를 배치
  • 명령 실행 시 확인 메시지에 yes 입력

4-2. 클러스터 상태 확인

redis-cli -c -p 6381 cluster nodes

Redis 서버 패키지 삭제

sudo apt purge -y redis-server redis-tools

5. 클러스터 상태 확인

클러스터 상태 확인

redis-cli --cluster check 192.168.0.231:6379

노드 정보 확인

redis-cli -h 192.168.0.231 -p 6379 cluster nodes

클러스터 정보 확인

redis-cli -h 192.168.0.231 -p 6379 cluster info

6. 테스트

클러스터 모드 동작 확인

redis-cli -c -h 192.168.0.232 -p 6381 set mykey1 "Hello, Redis Cluster!"
redis-cli -c -h 192.168.0.234 -p 6382 get mykey1

VIP 연결 확인

redis-cli -h 192.168.0.231 -p 6379 set mykey2 "Hello, Redis VIP!"
redis-cli -h 192.168.0.231 -p 6379 set mykey2

 

참고URL

- 변군이글루 : 우분투 24.04에 최신 버전의 Redis 서버를 설치하는 방법

- 변군이글루 : 우분투 24.04에서 rc.local을 활성화하는 방법

- 변군이글루 : 우분투에서 스왑 메모리를 비활성화하는 방법

 

728x90